From 6cc0a910d2a09e452a494c59add96bff1e3940a3 Mon Sep 17 00:00:00 2001 From: Max Shinn Date: Sat, 25 Dec 2010 08:02:06 -0600 Subject: [PATCH] Individual photo page --- .../GNUsocialPhotos/GNUsocialPhotosPlugin.php | 12 +- plugins/GNUsocialPhotos/actions/photo.php | 103 ++++++++++++++++++ .../GNUsocialPhotos/actions/photoupload.php | 21 +++- .../classes/gnusocialphoto.php | 10 +- 4 files changed, 137 insertions(+), 9 deletions(-) create mode 100644 plugins/GNUsocialPhotos/actions/photo.php diff --git a/plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php b/plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php index deddd502aa..4843119557 100644 --- a/plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php +++ b/plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php @@ -51,6 +51,10 @@ class GNUsocialPhotosPlugin extends Plugin include_once $dir . '/lib/photolib.php'; include_once $dir . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; break; + case 'PhotoAction': + include_once $dir . '/lib/photolib.php'; + include_once $dir . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; + break; default: break; } @@ -66,11 +70,14 @@ class GNUsocialPhotosPlugin extends Plugin array(new ColumnDef('notice_id', 'int(11)', null, false), new ColumnDef('album_id', 'int(11)', null, false), new ColumnDef('uri', 'varchar(512)', null, false), - new ColumnDef('thumb_uri', 'varchar(512)', null, false))); + new ColumnDef('thumb_uri', 'varchar(512)', null, false), + new ColumnDef('title', 'varchar(512)', null, false), + new ColumnDef('photo_description', 'text', null, false))); $schema->ensureTable('GNUsocialPhotoAlbum', array(new ColumnDef('album_id', 'int(11)', null, false, 'PRI', null, null, true), new ColumnDef('profile_id', 'int(11)', null, false), - new ColumnDef('album_name', 'varchar(256)', null, false))); + new ColumnDef('album_name', 'varchar(256)', null, false), + new ColumnDef('album_description', 'text', null, false))); } @@ -78,6 +85,7 @@ class GNUsocialPhotosPlugin extends Plugin { $m->connect(':nickname/photos', array('action' => 'photos')); $m->connect('main/uploadphoto', array('action' => 'photoupload')); + $m->connect(':nickname/photo/:photoid', array('action' => 'photo')); return true; } diff --git a/plugins/GNUsocialPhotos/actions/photo.php b/plugins/GNUsocialPhotos/actions/photo.php new file mode 100644 index 0000000000..3c2014eb8c --- /dev/null +++ b/plugins/GNUsocialPhotos/actions/photo.php @@ -0,0 +1,103 @@ +. + * + * @category Widget + * @package GNU Social + * @author Ian Denhardt + * @author Sean Corbett + * @author Max Shinn + * @copyright 2010 Free Software Foundation, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +include_once INSTALLDIR . '/actions/conversation.php'; +include_once INSTALLDIR . '/classes/Notice.php'; + +class PhotoAction extends Action +{ + var $user = null; + + function prepare($args) + { + parent::prepare($args); + + $args = $this->returnToArgs(); + $username = $args[1]['nickname']; + $this->photoid = $args[1]['photoid']; + if (common_valid_profile_tag($username) == 0) { + $this->user = null; + } else { + $this->user = Profile::staticGet('nickname', $username); + } + $this->photo = GNUsocialPhoto::staticGet('notice_id', $this->photoid); + + $this->notice = Notice::staticGet('id', $this->photoid); + $notices = Notice::conversationStream((int)$this->photoid-1, null, null); //Why do I have to do -1? + + $this->conversation = new ConversationTree($notices, $this); + return true; + + } + + function handle($args) + { + parent::handle($args); + $this->showPage(); + } + + function title() + { + if (empty($this->user)) { + return _m('No such user.'); + } else if (empty($this->photo)) { + return _m('No such photo.'); + } else if (!empty($this->photo->title)) { + return $this->photo->title; + } else { + return sprintf(_m("%s's Photo."), $this->user->nickname); + } + } + + function showLocalNav() + { + $nav = new GNUsocialPhotoNav($this); + $nav->show(); + } + + function showContent() + { + if(empty($this->user)) { + return; + } + + $this->elementStart('a', array('href' => $this->photo->uri)); + $this->element('img', array('src' => $this->photo->uri)); + $this->elementEnd('a'); + $this->element('p', array(), $this->photo->photo_description); + //This is a hack to hide the top-level comment + //$this->element('style', array(), "#notice-{$this->photoid} div { display: none } #notice-{$this->photoid} ol li div { display: inline }"); + $this->conversation->show(); + } +} diff --git a/plugins/GNUsocialPhotos/actions/photoupload.php b/plugins/GNUsocialPhotos/actions/photoupload.php index b4e7771a18..358c99f49c 100644 --- a/plugins/GNUsocialPhotos/actions/photoupload.php +++ b/plugins/GNUsocialPhotos/actions/photoupload.php @@ -64,9 +64,20 @@ class PhotouploadAction extends Action $this->elementStart('form', array('enctype' => 'multipart/form-data', 'method' => 'post', 'action' => common_local_url('photoupload'))); + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); $this->element('input', array('name' => 'photofile', 'type' => 'file', 'id' => 'photofile')); + $this->elementEnd('li'); + //$this->element('br'); + $this->elementStart('li'); + $this->input('phototitle', "Title", $this->trimmed('phototitle'), "The title of the photo. (Optional)"); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->textarea('photo_description', "Description", $this->trimmed('photo_description'), "A description of the photo. (Optional)"); + $this->elementEnd('li'); + $this->elementEnd('ul'); $this->submit('upload', _('Upload')); $this->elementEnd('form'); } @@ -129,6 +140,9 @@ class PhotouploadAction extends Action return; } + $title = $this->trimmed('phototitle'); + $photo_description = $this->trimmed('photo_description'); + common_log(LOG_INFO, 'upload path : ' . $imagefile->filepath); $filename = $cur->nickname . '-' . common_timestamp() . sha1_file($imagefile->filepath) . image_type_to_extension($imagefile->type); @@ -140,12 +154,9 @@ class PhotouploadAction extends Action // TODO: proper multiple album support $album = GNUsocialPhotoAlbum::staticGet('profile_id', $profile_id); - if(!$album) { + if(!$album) $album = GNUsocialPhotoAlbum::newAlbum($profile_id, 'Default'); - GNUsocialPhoto::saveNew($profile_id, $album->album_id, $thumb_uri, $uri, 'web', false); - } else { - GNUsocialPhoto::saveNew($profile_id, $album->album_id, $thumb_uri, $uri, 'web', false); - } + GNUsocialPhoto::saveNew($profile_id, $album->album_id, $thumb_uri, $uri, 'web', false, $title, $photo_description); } } diff --git a/plugins/GNUsocialPhotos/classes/gnusocialphoto.php b/plugins/GNUsocialPhotos/classes/gnusocialphoto.php index 3df160822b..5e6a63b44c 100644 --- a/plugins/GNUsocialPhotos/classes/gnusocialphoto.php +++ b/plugins/GNUsocialPhotos/classes/gnusocialphoto.php @@ -39,6 +39,8 @@ class GNUsocialPhoto extends Memcached_DataObject public $album_id; // int(11) public $uri; // varchar(512) public $thumb_uri; // varchar(512) + public $title; // varchar(512) + public $photo_description; // text /** @@ -71,7 +73,9 @@ class GNUsocialPhoto extends Memcached_DataObject return array('notice_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, 'album_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, 'uri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, - 'thumb_uri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL); + 'thumb_uri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, + 'title' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, + 'photo_description' => DB_DATAOBJECT_TXT + DB_DATAOBJECT_NOTNULL); } function keys() @@ -89,12 +93,14 @@ class GNUsocialPhoto extends Memcached_DataObject return array(false, false, false); } - function saveNew($profile_id, $album_id, $thumb_uri, $uri, $source, $insert_now) + function saveNew($profile_id, $album_id, $thumb_uri, $uri, $source, $insert_now, $title = null, $photo_description = null) { $photo = new GNUsocialPhoto(); $photo->thumb_uri = $thumb_uri; $photo->uri = $uri; $photo->album_id = $album_id; + if(!empty($title)) $photo->title = $title; + if(!empty($photo_description)) $photo->photo_description = $photo_description; if($insert_now) { $notice = Notice::saveNew($profile_id, $uri, $source);