Skip to content
philcali edited this page Dec 12, 2011 · 5 revisions

In this section, I will create a fictitious plugin that reads in enrollment information from a set of pipe delimited files.

For convenience sake, I'll put the processors in processors.php and the provider in provider.php.

The Processors

<?php

abstract file_source {
  var $row_count;

  function __construct($path) {
    if (empty($this->row_count))
      throw new Exception("Source initialization exception in " . get_called_class());
    $this->file = $path;
  }
  abstract function transform($extracted);

  function extract($line) {
    return array_map("trim", explode("|", $line));
  }

  function is_valid($extracted) {
    return $this->row_count > count($line);
  }

  function process() {
    $lines = file($this->path);

    $transformed = array();
    foreach ($lines as $line) {
      $extracted = $this->extract($line);

      if (!$this->is_valid($line)) {
        continue;
      }
      
      $transformed[] = $this->transform($extracted);
    }

    return $transformed;
  }
}

class file_semesters extends file_source implements semester_processor {
  var $row_count = 4;

  function transform($extracted) {
    $semester = new stdClass;
    $semester->year = $extracted[0];
    $semester->name = $extracted[1];
    $semester->classes_start = $extracted[2];
    $semester->grades_due = $extracted[3];
    $semester->session_key = isset($extracted[4]) ? $extracted[4] : "";

    return $semester;
  }

  function semesters($time) {
    return $this->process();
  }
}

// Fill in other ones

I've intentionally left out the rest of the processors, because I think you can get the idea.

The Provider

class file_provider extends enrollment_provider {
  function __construct() {
    $files = array_keys($this->settings());

    foreach ($files as $filekey) {
      if (!file_exists($this->get_setting($filekey)))
        throw new Exception("File was not found for $filekey");
    }
  }

  function settings() {
    return array(
      "semesters" => "/path/to/semesters.txt",
      "courses" => "/path/to/courses.txt",
      "teachers" => "/path/to/teachers.txt",
      "students" => "/path/to/students.txt"
    );
  }

  function semester_source() {
    return new file_semesters($this->get_setting("semesters"));
  }

  function course_source() {
    return new file_courses($this->get_setting("courses"));
  }

  // etc
}

I've left out filling out teacher and student source, because the developer can choose either. Take a peek at the plugin API for more details regarding that.

Clone this wiki locally