id, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " title=\"" .
htmlspecialchars($this->title, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " image=\"" .
htmlspecialchars($this->image, ENT_QUOTES, "UTF-8") . "\"/>\n");
}
public function show()
{
$str = "
\n";
$str .= "
path . "/" . $this->image . "\" width=\"100\"/>
\n";
$str .= " " . $this->title . "\n";
$str .= "
\n";
return $str;
}
public function Photo($path, $id, $title, $image)
{
$this->path = $path;
$this->id = $id;
$this->title = $title;
$this->image = $image;
}
}
class Album {
public $id;
public $title;
public $copyright;
public $enabled;
public $photos = array();
public function add($photo)
{
$this->photos[$photo->id] = $photo;
}
public function write($fp)
{
fwrite($fp, " id, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " title=\"" .
htmlspecialchars($this->title, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " copyright=\"" .
htmlspecialchars($this->copyright, ENT_QUOTES, "UTF-8") . "\"\n");
fwrite($fp, " icon=\"" .
htmlspecialchars($this->icon, ENT_QUOTES, "UTF-8") . "\"\n");
if($this->enabled) fwrite($fp, " enabled=\"true\">\n");
else fwrite($fp, " enabled=\"false\">\n");
foreach($this->photos as $photo) {
$photo->write($fp);
}
fwrite($fp, " \n");
}
public function show()
{
$str = "\n";
$str .= "
getPath() . "/" . $this->photos[$this->icon]->image . "\" width=\"64\"/>\n";
$str .= "" . $this->title . "\n";
$str .= "
\n";
foreach($this->photos as $photo) {
$str .= $photo->show();
}
return $str;
}
public function getPath()
{
global $ALBUMS_DIR;
return $ALBUMS_DIR . "/" . $this->id;
}
public function getNextID()
{
$maxid = 0;
foreach($this->photos as $photo) {
if($photo->id > $nextid) $maxid = $photo->id;
}
return $maxid + 1;
}
public function Album($id, $title, $copyright, $icon, $enabled)
{
$this->id = $id;
$this->title = $title;
$this->copyright = $copyright;
$this->icon = $icon;
$this->enabled = $enabled == 'on';
}
}
function unpackImages($zipfile, $album)
{
if(is_uploaded_file($zipfile['tmp_name'])) {
echo "File ". $zipfile['name'] ." uploaded successfully.\n";
//
// Unzip file
//
// http://dk.php.net/manual/en/book.zip.php
$zip = new ZipArchive();
$zip->open($zipfile['tmp_name']);
$folder = $zipfile['tmp_name'].'.unzip';
$zip->extractTo($folder);
//
// Look at EXIF header (Image Description) and move images
//
// http://dk.php.net/manual/en/book.exif.php
if(!file_exists($album->getPath())) mkdir($album->getPath());
$imagefiles = array();
$d = opendir($folder);
while(false !== ($f = readdir($d))) {
if(!isJpeg($f)) continue;
array_push($imagefiles, $f);
}
sort($imagefiles);
foreach($imagefiles as $f) {
$tags = exif_read_data($folder . "/" . $f, "ANY_TAG");
rename($folder . "/" . $f, $album->getPath() . "/" . $f);
$photo = new Photo($album->getPath(), $album->getNextID(), $tags['ImageDescription'], $f);
$album->add($photo);
}
closedir($d);
//
// Clean up (recursively)
//
cleanUp($folder);
}
}
class Gallery {
private $file;
private $albums = array();
// Admin config
public $admin_title = "Gallery";
public $admin_submodules = array("New album" => "new",
"Edit album" => "edit",
"Delete album" => "delete");
public function admin_new($action, $vars)
{
global $ALBUMS_DIR;
switch($action) {
case "create":
$album = new Album($this->getNextID(), $vars['title'], $vars['copyright'], "1", $vars['enabled']);
unpackImages($_FILES['images'], $album);
$this->add($album);
$this->write();
echo $album->show();
break;
case "select":
default:
$form = new Form("create");
$form->addWidget(new LineEdit("Album title:", "title"));
$form->addWidget(new LineEdit("Album copyright:", "copyright"));
$form->addWidget(new CheckBox("Album enabled:", "enabled"));
$form->addWidget(new FileUpload("Select image archive:", "images", "application/zip"));
$form->addWidget(new Button("Create"));
$form->render();
break;
}
}
public function admin($sub, $action, $vars)
{
switch($sub) {
case "new":
$this->admin_new($action, $vars);
break;
case "edit":
$this->admin_new($action, $vars);
break;
case "delete":
$this->admin_new($action, $vars);
break;
}
}
public function run($params)
{
$str = "";
foreach($params as $param) {
switch($param) {
default:
foreach($this->albums as $album) {
$str .= $album->show();
}
break;
}
}
return $str;
}
public function add($album) {
$this->albums[$album->id] = $album;
}
public function getNextID()
{
$maxid = 0;
foreach($this->albums as $album) {
if($album->id > $nextid) $maxid = $album->id;
}
return $maxid + 1;
}
public function write()
{
$fp = fopen($this->file, "w");
fwrite($fp, "\n");
fwrite($fp, "\n");
foreach($this->albums as $album) {
$album->write($fp);
}
fwrite($fp, "\n");
fclose($fp);
}
private function read()
{
$dom = new DomDocument;
$dom->resolveExternals = FALSE;
$dom->substituteEntities = FALSE;
$dom->preserveWhiteSpace = FALSE;
$dom->load($this->file);
$gallery = $dom->documentElement;
// $this->width = $gallery->getAttribute('width');
foreach($gallery->childNodes as $albumElem) {
if($albumElem->tagName != "album") continue;
$album = new Album($albumElem->getAttribute('id'),
$albumElem->getAttribute('title'),
$albumElem->getAttribute('copyright'),
$albumElem->getAttribute('icon'),
$albumElem->getAttribute('enabled'));
foreach($albumElem->childNodes as $photoElem) {
if($photoElem->tagName != "photo") continue;
$photo = new Photo($album->getPath(),
$photoElem->getAttribute('id'),
$photoElem->getAttribute('title'),
$photoElem->getAttribute('image'));
$album->add($photo);
}
$this->add($album);
}
}
public function Gallery($file)
{
$this->file = $file;
if(file_exists($file)) $this->read();
}
}
function gallery_init()
{
global $DATA_DIR;
return new Gallery($DATA_DIR . "/gallery.xml");
}
?>