forked from GNUsocial/gnu-social
		
	Merge branch 'noticetitle' into 0.9.x
This commit is contained in:
		
							
								
								
									
										21
									
								
								EVENTS.txt
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								EVENTS.txt
									
									
									
									
									
								
							| @@ -1045,3 +1045,24 @@ StartActivityEnd: before the closing </entry> in a notice activity entry (last c | ||||
| EndActivityEnd: after the closing </entry> in a notice activity entry | ||||
| - &$notice: notice being output | ||||
| - &$xs: XMLStringer for output | ||||
|  | ||||
| StartNoticeSaveWeb: before saving a notice through the Web interface | ||||
| - $action: action being executed (instance of NewNoticeAction) | ||||
| - &$authorId: integer ID of the author | ||||
| - &$text: text of the notice | ||||
| - &$options: additional options (location, replies, etc.) | ||||
|  | ||||
| EndNoticeSaveWeb: after saving a notice through the Web interface | ||||
| - $action: action being executed (instance of NewNoticeAction) | ||||
| - $notice: notice that was saved | ||||
|  | ||||
| StartRssEntryArray: at the start of copying a notice to an array | ||||
| - $notice: the notice being copied | ||||
| - &$entry: the entry (empty at beginning) | ||||
|  | ||||
| EndRssEntryArray: at the end of copying a notice to an array | ||||
| - $notice: the notice being copied | ||||
| - &$entry: the entry, with all the fields filled up | ||||
|  | ||||
| NoticeDeleteRelated: at the beginning of deleting related fields to a notice | ||||
| - $notice: notice being deleted | ||||
|   | ||||
| @@ -204,10 +204,18 @@ class NewnoticeAction extends Action | ||||
|             $options = array_merge($options, $locOptions); | ||||
|         } | ||||
|  | ||||
|         $notice = Notice::saveNew($user->id, $content_shortened, 'web', $options); | ||||
|         $author_id = $user->id; | ||||
|         $text      = $content_shortened; | ||||
|  | ||||
|         if (isset($upload)) { | ||||
|             $upload->attachToNotice($notice); | ||||
|         if (Event::handle('StartNoticeSaveWeb', array($this, &$author_id, &$text, &$options))) { | ||||
|  | ||||
|             $notice = Notice::saveNew($user->id, $content_shortened, 'web', $options); | ||||
|  | ||||
|             if (isset($upload)) { | ||||
|                 $upload->attachToNotice($notice); | ||||
|             } | ||||
|  | ||||
|             Event::handle('EndNoticeSaveWeb', array($this, $notice)); | ||||
|         } | ||||
|         Event::handle('EndSaveNewNoticeWeb', array($this, $user, &$content_shortened, &$options)); | ||||
|  | ||||
|   | ||||
| @@ -121,16 +121,19 @@ class Notice extends Memcached_DataObject | ||||
|             $deleted->insert(); | ||||
|         } | ||||
|  | ||||
|         // Clear related records | ||||
|         if (Event::handle('NoticeDeleteRelated', array($this))) { | ||||
|  | ||||
|         $this->clearReplies(); | ||||
|         $this->clearRepeats(); | ||||
|         $this->clearFaves(); | ||||
|         $this->clearTags(); | ||||
|         $this->clearGroupInboxes(); | ||||
|             // Clear related records | ||||
|  | ||||
|         // NOTE: we don't clear inboxes | ||||
|         // NOTE: we don't clear queue items | ||||
|             $this->clearReplies(); | ||||
|             $this->clearRepeats(); | ||||
|             $this->clearFaves(); | ||||
|             $this->clearTags(); | ||||
|             $this->clearGroupInboxes(); | ||||
|  | ||||
|             // NOTE: we don't clear inboxes | ||||
|             // NOTE: we don't clear queue items | ||||
|         } | ||||
|  | ||||
|         $result = parent::delete(); | ||||
|  | ||||
|   | ||||
| @@ -462,66 +462,71 @@ class ApiAction extends Action | ||||
|  | ||||
|     function twitterRssEntryArray($notice) | ||||
|     { | ||||
|         $profile = $notice->getProfile(); | ||||
|  | ||||
|         $entry = array(); | ||||
|  | ||||
|         // We trim() to avoid extraneous whitespace in the output | ||||
|         if (Event::handle('StartRssEntryArray', array($notice, &$entry))) { | ||||
|  | ||||
|         $entry['content'] = common_xml_safe_str(trim($notice->rendered)); | ||||
|         $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content)); | ||||
|         $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id)); | ||||
|         $entry['published'] = common_date_iso8601($notice->created); | ||||
|             $profile = $notice->getProfile(); | ||||
|  | ||||
|         $taguribase = TagURI::base(); | ||||
|         $entry['id'] = "tag:$taguribase:$entry[link]"; | ||||
|             // We trim() to avoid extraneous whitespace in the output | ||||
|  | ||||
|         $entry['updated'] = $entry['published']; | ||||
|         $entry['author'] = $profile->getBestName(); | ||||
|             $entry['content'] = common_xml_safe_str(trim($notice->rendered)); | ||||
|             $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content)); | ||||
|             $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id)); | ||||
|             $entry['published'] = common_date_iso8601($notice->created); | ||||
|  | ||||
|         // Enclosures | ||||
|         $attachments = $notice->attachments(); | ||||
|         $enclosures = array(); | ||||
|             $taguribase = TagURI::base(); | ||||
|             $entry['id'] = "tag:$taguribase:$entry[link]"; | ||||
|  | ||||
|         foreach ($attachments as $attachment) { | ||||
|             $enclosure_o=$attachment->getEnclosure(); | ||||
|             if ($enclosure_o) { | ||||
|                  $enclosure = array(); | ||||
|                  $enclosure['url'] = $enclosure_o->url; | ||||
|                  $enclosure['mimetype'] = $enclosure_o->mimetype; | ||||
|                  $enclosure['size'] = $enclosure_o->size; | ||||
|                  $enclosures[] = $enclosure; | ||||
|             $entry['updated'] = $entry['published']; | ||||
|             $entry['author'] = $profile->getBestName(); | ||||
|  | ||||
|             // Enclosures | ||||
|             $attachments = $notice->attachments(); | ||||
|             $enclosures = array(); | ||||
|  | ||||
|             foreach ($attachments as $attachment) { | ||||
|                 $enclosure_o=$attachment->getEnclosure(); | ||||
|                 if ($enclosure_o) { | ||||
|                     $enclosure = array(); | ||||
|                     $enclosure['url'] = $enclosure_o->url; | ||||
|                     $enclosure['mimetype'] = $enclosure_o->mimetype; | ||||
|                     $enclosure['size'] = $enclosure_o->size; | ||||
|                     $enclosures[] = $enclosure; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!empty($enclosures)) { | ||||
|             $entry['enclosures'] = $enclosures; | ||||
|         } | ||||
|  | ||||
|         // Tags/Categories | ||||
|         $tag = new Notice_tag(); | ||||
|         $tag->notice_id = $notice->id; | ||||
|         if ($tag->find()) { | ||||
|             $entry['tags']=array(); | ||||
|             while ($tag->fetch()) { | ||||
|                 $entry['tags'][]=$tag->tag; | ||||
|             if (!empty($enclosures)) { | ||||
|                 $entry['enclosures'] = $enclosures; | ||||
|             } | ||||
|         } | ||||
|         $tag->free(); | ||||
|  | ||||
|         // RSS Item specific | ||||
|         $entry['description'] = $entry['content']; | ||||
|         $entry['pubDate'] = common_date_rfc2822($notice->created); | ||||
|         $entry['guid'] = $entry['link']; | ||||
|             // Tags/Categories | ||||
|             $tag = new Notice_tag(); | ||||
|             $tag->notice_id = $notice->id; | ||||
|             if ($tag->find()) { | ||||
|                 $entry['tags']=array(); | ||||
|                 while ($tag->fetch()) { | ||||
|                     $entry['tags'][]=$tag->tag; | ||||
|                 } | ||||
|             } | ||||
|             $tag->free(); | ||||
|  | ||||
|         if (isset($notice->lat) && isset($notice->lon)) { | ||||
|             // This is the format that GeoJSON expects stuff to be in. | ||||
|             // showGeoRSS() below uses it for XML output, so we reuse it | ||||
|             $entry['geo'] = array('type' => 'Point', | ||||
|                                   'coordinates' => array((float) $notice->lat, | ||||
|                                                          (float) $notice->lon)); | ||||
|         } else { | ||||
|             $entry['geo'] = null; | ||||
|             // RSS Item specific | ||||
|             $entry['description'] = $entry['content']; | ||||
|             $entry['pubDate'] = common_date_rfc2822($notice->created); | ||||
|             $entry['guid'] = $entry['link']; | ||||
|  | ||||
|             if (isset($notice->lat) && isset($notice->lon)) { | ||||
|                 // This is the format that GeoJSON expects stuff to be in. | ||||
|                 // showGeoRSS() below uses it for XML output, so we reuse it | ||||
|                 $entry['geo'] = array('type' => 'Point', | ||||
|                                       'coordinates' => array((float) $notice->lat, | ||||
|                                                              (float) $notice->lon)); | ||||
|             } else { | ||||
|                 $entry['geo'] = null; | ||||
|             } | ||||
|  | ||||
|             Event::handle('EndRssEntryArray', array($notice, &$entry)); | ||||
|         } | ||||
|  | ||||
|         return $entry; | ||||
|   | ||||
| @@ -169,7 +169,8 @@ class NoticeForm extends Form | ||||
|     function formData() | ||||
|     { | ||||
|         if (Event::handle('StartShowNoticeFormData', array($this))) { | ||||
|             $this->out->element('label', array('for' => 'notice_data-text'), | ||||
|             $this->out->element('label', array('for' => 'notice_data-text', | ||||
|                                                'id' => 'notice_data-text-label'), | ||||
|                                 sprintf(_('What\'s up, %s?'), $this->user->nickname)); | ||||
|             // XXX: vary by defined max size | ||||
|             $this->out->element('textarea', array('id' => 'notice_data-text', | ||||
|   | ||||
							
								
								
									
										282
									
								
								plugins/NoticeTitle/NoticeTitlePlugin.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								plugins/NoticeTitle/NoticeTitlePlugin.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,282 @@ | ||||
| <?php | ||||
| /** | ||||
|  * StatusNet - the distributed open-source microblogging tool | ||||
|  * Copyright (C) 2010, StatusNet, Inc. | ||||
|  * | ||||
|  * A plugin to add titles to notices | ||||
|  * | ||||
|  * PHP version 5 | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * @category  NoticeTitle | ||||
|  * @package   StatusNet | ||||
|  * @author    Evan Prodromou <evan@status.net> | ||||
|  * @copyright 2010 StatusNet, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
| if (!defined('STATUSNET')) { | ||||
|     // This check helps protect against security problems; | ||||
|     // your code file can't be executed directly from the web. | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| define('NOTICE_TITLE_PLUGIN_VERSION', '0.1'); | ||||
|  | ||||
| /** | ||||
|  * NoticeTitle plugin to add an optional title to notices. | ||||
|  * | ||||
|  * Stores notice titles in a secondary table, notice_title. | ||||
|  * | ||||
|  * @category  NoticeTitle | ||||
|  * @package   StatusNet | ||||
|  * @author    Evan Prodromou <evan@status.net> | ||||
|  * @copyright 2010 StatusNet, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
| class NoticeTitlePlugin extends Plugin | ||||
| { | ||||
|     /** | ||||
|      * Database schema setup | ||||
|      * | ||||
|      * Add the notice_title helper table | ||||
|      * | ||||
|      * @see Schema | ||||
|      * @see ColumnDef | ||||
|      * | ||||
|      * @return boolean hook value; true means continue processing, false means stop. | ||||
|      */ | ||||
|  | ||||
|     function onCheckSchema() | ||||
|     { | ||||
|         $schema = Schema::get(); | ||||
|  | ||||
|         // For storing titles for notices | ||||
|  | ||||
|         $schema->ensureTable('notice_title', | ||||
|                              array(new ColumnDef('notice_id', | ||||
|                                                  'integer', | ||||
|                                                  null, | ||||
|                                                  true, | ||||
|                                                  'PRI'), | ||||
|                                    new ColumnDef('title', | ||||
|                                                  'varchar', | ||||
|                                                  Notice_title::MAXCHARS, | ||||
|                                                  false))); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Load related modules when needed | ||||
|      * | ||||
|      * @param string $cls Name of the class to be loaded | ||||
|      * | ||||
|      * @return boolean hook value; true means continue processing, false means stop. | ||||
|      */ | ||||
|  | ||||
|     function onAutoload($cls) | ||||
|     { | ||||
|         $dir = dirname(__FILE__); | ||||
|  | ||||
|         switch ($cls) | ||||
|         { | ||||
|         case 'Notice_title': | ||||
|             include_once $dir . '/'.$cls.'.php'; | ||||
|             return false; | ||||
|         default: | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Provide plugin version information. | ||||
|      * | ||||
|      * This data is used when showing the version page. | ||||
|      * | ||||
|      * @param array &$versions array of version data arrays; see EVENTS.txt | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onPluginVersion(&$versions) | ||||
|     { | ||||
|         $url = 'http://status.net/wiki/Plugin:NoticeTitle'; | ||||
|  | ||||
|         $versions[] = array('name' => 'NoticeTitle', | ||||
|                             'version' => NOTICE_TITLE_PLUGIN_VERSION, | ||||
|                             'author' => 'Evan Prodromou', | ||||
|                             'homepage' => $url, | ||||
|                             'rawdescription' => | ||||
|                             _m('Adds optional titles to notices')); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show title entry when showing notice form | ||||
|      * | ||||
|      * @param Form $form Form being shown | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onStartShowNoticeFormData($form) | ||||
|     { | ||||
|         $form->out->element('style', | ||||
|                             null, | ||||
|                             'label#notice_data-text-label { display: none }'); | ||||
|         $form->out->element('input', array('type' => 'text', | ||||
|                                            'id' => 'notice_title', | ||||
|                                            'name' => 'notice_title', | ||||
|                                            'size' => 40, | ||||
|                                            'maxlength' => Notice_title::MAXCHARS)); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validate notice title before saving | ||||
|      * | ||||
|      * @param Action  $action    NewNoticeAction being executed | ||||
|      * @param integer &$authorId Author ID | ||||
|      * @param string  &$text     Text of the notice | ||||
|      * @param array   &$options  Options array | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onStartNoticeSaveWeb($action, &$authorId, &$text, &$options) | ||||
|     { | ||||
|         $title = $action->trimmed('notice_title'); | ||||
|         if (!empty($title)) { | ||||
|             if (mb_strlen($title) > Notice_title::MAXCHARS) { | ||||
|                 throw new Exception(sprintf(_m("Notice title too long (max %d)", | ||||
|                                                Notice_title::MAXCHARS))); | ||||
|             } | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Save notice title after notice is saved | ||||
|      * | ||||
|      * @param Action $action NewNoticeAction being executed | ||||
|      * @param Notice $notice Notice that was saved | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onEndNoticeSaveWeb($action, $notice) | ||||
|     { | ||||
|         if (!empty($notice)) { | ||||
|  | ||||
|             $title = $action->trimmed('notice_title'); | ||||
|  | ||||
|             if (!empty($title)) { | ||||
|  | ||||
|                 $nt = new Notice_title(); | ||||
|  | ||||
|                 $nt->notice_id = $notice->id; | ||||
|                 $nt->title     = $title; | ||||
|  | ||||
|                 $nt->insert(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the notice title in lists | ||||
|      * | ||||
|      * @param NoticeListItem $nli NoticeListItem being shown | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onStartShowNoticeItem($nli) | ||||
|     { | ||||
|         $title = Notice_title::fromNotice($nli->notice); | ||||
|  | ||||
|         if (!empty($title)) { | ||||
|             $nli->out->element('h4', array('class' => 'notice_title'), $title); | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the notice title in RSS output | ||||
|      * | ||||
|      * @param Notice $notice Notice being shown | ||||
|      * @param array  &$entry array of values used for RSS output | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onEndRssEntryArray($notice, &$entry) | ||||
|     { | ||||
|         $title = Notice_title::fromNotice($notice); | ||||
|  | ||||
|         if (!empty($title)) { | ||||
|             $entry['title'] = $title; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the notice title in Atom output | ||||
|      * | ||||
|      * @param Notice      &$notice Notice being shown | ||||
|      * @param XMLStringer &$xs     output context | ||||
|      * @param string      &$output string to be output as title | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onStartActivityTitle(&$notice, &$xs, &$output) | ||||
|     { | ||||
|         $title = Notice_title::fromNotice($notice); | ||||
|  | ||||
|         if (!empty($title)) { | ||||
|             $output = $title; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove title when the notice is deleted | ||||
|      * | ||||
|      * @param Notice $notice Notice being deleted | ||||
|      * | ||||
|      * @return boolean hook value | ||||
|      */ | ||||
|  | ||||
|     function onNoticeDeleteRelated($notice) | ||||
|     { | ||||
|         $nt = Notice_title::staticGet('notice_id', $notice->id); | ||||
|  | ||||
|         if (!empty($nt)) { | ||||
|             $nt->delete(); | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										138
									
								
								plugins/NoticeTitle/Notice_title.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								plugins/NoticeTitle/Notice_title.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Data class for notice titles | ||||
|  * | ||||
|  * PHP version 5 | ||||
|  * | ||||
|  * @category Data | ||||
|  * @package  StatusNet | ||||
|  * @author   Evan Prodromou <evan@status.net> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | ||||
|  * @link     http://status.net/ | ||||
|  * | ||||
|  * StatusNet - the distributed open-source microblogging tool | ||||
|  * Copyright (C) 2010, StatusNet, Inc. | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| if (!defined('STATUSNET')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; | ||||
|  | ||||
| /** | ||||
|  * Data class for notice titles | ||||
|  * | ||||
|  * @category Action | ||||
|  * @package  StatusNet | ||||
|  * @author   Evan Prodromou <evan@status.net> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | ||||
|  * @link     http://status.net/ | ||||
|  * | ||||
|  * @see      DB_DataObject | ||||
|  */ | ||||
|  | ||||
| class Notice_title extends Memcached_DataObject | ||||
| { | ||||
|     const MAXCHARS = 255; | ||||
|  | ||||
|     public $__table = 'notice_title'; // table name | ||||
|     public $notice_id;                         // int(4)  primary_key not_null | ||||
|     public $title;                             // varchar(255) | ||||
|  | ||||
|     /** | ||||
|      * Get an instance by key | ||||
|      * | ||||
|      * This is a utility method to get a single instance with a given key value. | ||||
|      * | ||||
|      * @param string $k Key to use to lookup (usually 'user_id' for this class) | ||||
|      * @param mixed  $v Value to lookup | ||||
|      * | ||||
|      * @return Notice_title object found, or null for no hits | ||||
|      * | ||||
|      */ | ||||
|  | ||||
|     function staticGet($k, $v=null) | ||||
|     { | ||||
|         return Memcached_DataObject::staticGet('Notice_title', $k, $v); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * return table definition for DB_DataObject | ||||
|      * | ||||
|      * DB_DataObject needs to know something about the table to manipulate | ||||
|      * instances. This method provides all the DB_DataObject needs to know. | ||||
|      * | ||||
|      * @return array array of column definitions | ||||
|      */ | ||||
|  | ||||
|     function table() | ||||
|     { | ||||
|         return array('notice_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, | ||||
|                      'title' => DB_DATAOBJECT_STR); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * return key definitions for DB_DataObject | ||||
|      * | ||||
|      * @return array list of key field names | ||||
|      */ | ||||
|  | ||||
|     function keys() | ||||
|     { | ||||
|         return array_keys($this->keyTypes()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * return key definitions for Memcached_DataObject | ||||
|      * | ||||
|      * @return array list mapping field names to key types | ||||
|      */ | ||||
|  | ||||
|     function keyTypes() | ||||
|     { | ||||
|         return array('notice_id' => 'K'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Magic formula for non-autoincrementing integer primary keys | ||||
|      * | ||||
|      * @return array magic three-false array that stops auto-incrementing. | ||||
|      */ | ||||
|  | ||||
|     function sequenceKey() | ||||
|     { | ||||
|         return array(false, false, false); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get a notice title based on the notice | ||||
|      * | ||||
|      * @param Notice $notice Notice to fetch a title for | ||||
|      * | ||||
|      * @return string title of the notice, or null if none | ||||
|      */ | ||||
|  | ||||
|     static function fromNotice(Notice $notice) | ||||
|     { | ||||
|         $nt = Notice_title::staticGet('notice_id', $notice->id); | ||||
|         if (empty($nt)) { | ||||
|             return null; | ||||
|         } else { | ||||
|             return $nt->title; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user