\n"; $str .= "
".$title.":
\n"; $str .= "
".Markdown($value)."
\n"; $str .= "
\n"; } return $str; } public function show() { global $MEMBERS_DIR; $str = "
\n"; $str .= "
" . htmlspecialchars_decode($this->name, ENT_QUOTES) . "
\n"; $str .= " \"member\"image."\"/>\n"; $str .= $this->showTag("Member Since", "startyear", $this->startyear); $str .= $this->showTag("Quit", "stopyear", $this->stopyear); foreach($this->tags as $name => $val) { $str .= $this->showTag($this->tagnames[$name], $name, $val); } $str .= "
\n"; $str .= "
\n"; return $str; } public function write($fp) { fwrite($fp, " id . "\"\n"); fwrite($fp, " name=\"" . $this->name . "\"\n"); fwrite($fp, " image=\"" . $this->image . "\"\n"); fwrite($fp, " startyear=\"" . $this->startyear . "\"\n"); fwrite($fp, " stopyear=\"" . $this->stopyear . "\">\n"); foreach($this->tags as $name => $val) { fwrite($fp, " \n"); } fwrite($fp, " \n"); } public function Member($id, $name, $image, $startyear, $stopyear, $tags, $tagnames) { $this->id = $id; $this->name = $name; $this->image = $image; $this->startyear = $startyear; $this->stopyear = $stopyear; $this->tags = $tags; $this->tagnames = $tagnames; } } class Members { private $file; private $members = array(); private $tags = array(); // Admin config public $admin_title = "Members"; public $admin_submodules = array("Add Member" => "add", "Edit Member" => "edit", "Tag Editor" => "tags"); public function admin_add($action, $vars) { global $MEMBERS_DIR; switch($action) { case "add": $tags = $this->getTagsFromArray($vars, "tags_"); $member = new Member($this->getNextID(), $vars["name"], $vars["image"], $vars["startyear"], $vars["stopyear"], $tags, $this->tags); echo "\"" .$member->name . "\" has now been added."; $this->add($member); $this->write(); break; case "preview": $tags = $this->getTagsFromArray($vars, "tags_"); $member = new Member($this->getNextID(), $vars["name"], $vars["image"], $vars["startyear"], $vars["stopyear"], $tags, $this->tags); echo "

Looking ok?

"; $form = new Form("add"); $form->addWidget(new Hidden($vars)); $form->addWidget(new Button("yes")); $form->render(); $form = new Form("retry"); $form->addWidget(new Hidden($vars)); $form->addWidget(new Button("no")); $form->render(); echo "
\n"; echo "
\n"; echo $member->show(); echo "
\n"; echo "
\n"; break; case "retry": $name = $vars["name"]; $image = $vars["image"]; $startyear = $vars["startyear"]; $stopyear = $vars["stopyear"]; $tags = $this->getTagsFromArray($vars, "tags_"); default: $form = new Form("preview"); $form->addWidget(new LineEdit("Name", "name", $name)); $form->addWidget(new LineEdit("Start Year", "startyear", $startyear)); $form->addWidget(new LineEdit("Stop Year (if no longer a member)", "stopyear", $stopyear)); foreach($this->tags as $id => $title) { $form->addWidget(new TextEdit($title, "tags_".$id, $tags[$id])); } $form->addWidget(new ImageComboBox("Image", "image", $image, new Icons($MEMBERS_DIR."/"))); $form->addWidget(new Button("Add member")); $form->render(); break; } } public function admin_edit($action, $vars) { global $MEMBERS_DIR; switch($action) { case "add": $tags = $this->getTagsFromArray($vars, "tags_"); $this->members[$vars["memberid"]]->show(); $this->members[$vars["memberid"]]->name = $vars["name"]; $this->members[$vars["memberid"]]->image = $vars["image"]; $this->members[$vars["memberid"]]->startyear = $vars["startyear"]; $this->members[$vars["memberid"]]->stopyear = $vars["stopyear"]; $this->members[$vars["memberid"]]->tags = $tags; $this->write(); echo "\"" . $this->members[$vars["memberid"]]->name . "\" has now been edited."; break; case "preview": $tags = $this->getTagsFromArray($vars, "tags_"); $member = new Member($vars["memberid"], $vars["name"], $vars["image"], $vars["startyear"], $vars["stopyear"], $tags, $this->tags); echo "

Looking ok?

"; $form = new Form("add"); $form->addWidget(new Hidden($vars)); $form->addWidget(new Button("yes")); $form->render(); $form = new Form("retry"); $form->addWidget(new Hidden($vars)); $form->addWidget(new Button("no")); $form->render(); echo "
\n"; echo "
\n"; echo $member->show(); echo "
\n"; echo "
\n"; break; case "edit": case "retry": if(isset($vars["name"])) $name = $vars["name"]; else $name = $this->members[$vars["memberid"]]->name; if(isset($vars["image"])) $image = $vars["image"]; else $image = $this->members[$vars["memberid"]]->image; if(isset($vars["startyear"])) $startyear = $vars["startyear"]; else $startyear = $this->members[$vars["memberid"]]->startyear; if(isset($vars["stopyear"])) $stopyear = $vars["stopyear"]; else $stopyear = $this->members[$vars["memberid"]]->stopyear; // HACK, this should work, but we should check on the tags_ vars instead. if(isset($vars["name"])) $tags = $this->getTagsFromArray($vars, "tags_"); else $tags = $this->members[$vars["memberid"]]->tags; $form = new Form("preview"); $form->addWidget(new Hidden($vars)); $form->addWidget(new LineEdit("Name", "name", $name)); $form->addWidget(new LineEdit("Start Year", "startyear", $startyear)); $form->addWidget(new LineEdit("Stop Year (if no longer a member)", "stopyear", $stopyear)); foreach($this->tags as $id => $title) { $form->addWidget(new TextEdit($title, "tags_".$id, $tags[$id], 2)); } $form->addWidget(new ImageComboBox("Image", "image", $image, new Icons($MEMBERS_DIR."/"))); $form->addWidget(new Button("Preview")); $form->render(); break; case "select": default: $memberlist = array(); foreach($this->members as $member) { $memberlist[$member->name] = sprintf("%d", $member->id); } $form = new Form("edit"); $form->addWidget(new ComboBox("Edit this member:", "memberid", "", $memberlist)); $form->addWidget(new Button("Edit...")); $form->render(); break; } } public function admin_tags($action, $vars) { global $GLOBALS; switch($action) { case "update": $taglist = $GLOBALS["taglist"]; $this->tags = ListEditor::splitValues($taglist); $this->write(); break; default: $form = new Form("update"); $form->addWidget(new ListEditor("Tags", "taglist", new LineEdit("Title (must not contain ':')", "title"), new LineEdit("ID (must only contains letters a-z)", "id"), $this->tags)); $form->addWidget(new Button("Update")); $form->render(); break; } } public function getTagsFromArray($array, $prefix) { $out = array(); foreach($array as $name => $value) { if(strpos($name, $prefix) !== FALSE && strpos($name, $prefix) == 0) $out[substr($name, strlen($prefix))] = $value; } return $out; } public function admin($sub, $action, $vars) { switch($sub) { case "add": $this->admin_add($action, $vars); break; case "edit": $this->admin_edit($action, $vars); break; case "tags": $this->admin_tags($action, $vars); break; } } public function run($params) { foreach($params as $param) { switch($param) { case "all": $str = ""; foreach($this->members as $member) { $str .= $member->show(); } return $str; case "old": $str = ""; foreach($this->members as $member) { if($member->stopyear) $str .= $member->show(); } return $str; default: case "current": $str = ""; foreach($this->members as $member) { if($member->stopyear == "") $str .= $member->show(); } return $str; } } return $str; } public function add($member) { $key = $member->id; $this->members[$key] = $member; } public function getNextID() { $maxid = -1; foreach($this->members as $member) { if($member->id > $maxid) $maxid = $member->id; } return $maxid + 1; } public function write() { $fp = fopen($this->file, "w"); fwrite($fp, "\n"); fwrite($fp, "tags), ENT_QUOTES, "UTF-8")."\">\n"); foreach($this->members as $member) { $member->write($fp); } fwrite($fp, "\n"); fclose($fp); } private function read() { $dom = new DomDocument; $dom->preserveWhiteSpace = FALSE; $dom->load($this->file); $ts = $dom->getElementsByTagName('members'); foreach($ts as $t) { $this->tags = unserialize(htmlspecialchars_decode($t->getAttribute('tags'), ENT_QUOTES)); } $params = $dom->getElementsByTagName('member'); foreach ($params as $param) { $tags = array(); $ps = $param->getElementsByTagName('tag'); foreach ($ps as $p) { $tags[$p->getAttribute('name')] = $p->getAttribute('value'); } $member = new Member($param->getAttribute('id'), $param->getAttribute('name'), $param->getAttribute('image'), $param->getAttribute('startyear'), $param->getAttribute('stopyear'), $tags, $this->tags); $this->add($member); } } public function Members($file) { $this->file = $file; if(file_exists($file)) $this->read(); } } function members_init() { global $DATA_DIR; return new Members($DATA_DIR . "/members.xml"); } ?>