diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index 925d6d3ae4..b8c78680a0 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -309,6 +309,54 @@ abstract class Managed_DataObject extends Memcached_DataObject return common_database_tablename($this->tableName()); } + /** + * Returns an object by looking at the primary key column(s). + * + * Will require all primary key columns to be defined in an associative array + * and ignore any keys which are not part of the primary key. + * + * Will NOT accept NULL values as part of primary key. + * + * @param array $vals Must match all primary key columns for the dataobject. + * + * @return Managed_DataObject of the get_called_class() type + * @throws NoResultException if no object with that primary key + */ + static function getByPK(array $vals) + { + $classname = get_called_class(); + var_dump($classname); + + $pkey = static::pkeyCols(); + if (is_null($pkey)) { + throw new ServerException("Failed to get primary key columns for class '{$classname}'"); + } + + $object = new $classname(); + foreach ($pkey as $col) { + if (!array_key_exists($col, $vals)) { + throw new ServerException("Missing primary key column '{$col}'"); + } elseif (is_null($vals[$col])) { + throw new ServerException("NULL values not allowed in getByPK for column '{$col}'"); + } + $object->$col = $vals[$col]; + } + if (!$object->find(true)) { + throw new NoResultException($object); + } + return $object; + } + + static function getByID($id) + { + if (empty($id)) { + throw new ServerException('Empty ID on lookup'); + } + // getByPK throws exception if id is null + // or if the class does not have a single 'id' column as primary key + return static::getByPK(array('id' => $id)); + } + /** * Returns an ID, checked that it is set and reasonably valid * diff --git a/classes/Notice.php b/classes/Notice.php index f9d80c1289..9246c26919 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -313,16 +313,6 @@ class Notice extends Managed_DataObject return $notice; } - public static function getById($id) - { - $notice = new Notice(); - $notice->id = $id; - if (!$notice->find(true)) { - throw new NoResultException($notice); - } - return $notice; - } - /** * Extract #hashtags from this notice's content and save them to the database. */ @@ -2761,7 +2751,7 @@ class Notice extends Managed_DataObject if (empty($this->reply_to)) { throw new NoParentNoticeException($this); } - return self::getById($this->reply_to); + return self::getByID($this->reply_to); } /** diff --git a/plugins/ActivityVerb/actions/activityverb.php b/plugins/ActivityVerb/actions/activityverb.php index 0abfacd645..45bb18be46 100644 --- a/plugins/ActivityVerb/actions/activityverb.php +++ b/plugins/ActivityVerb/actions/activityverb.php @@ -50,7 +50,7 @@ class ActivityverbAction extends ManagedAction throw new ServerException('A verb has not been specified.'); } - $this->notice = Notice::getById($this->trimmed('id')); + $this->notice = Notice::getByID($this->trimmed('id')); if (!$this->notice->inScope($this->scoped)) { // TRANS: %1$s is a user nickname, %2$d is a notice ID (number). diff --git a/plugins/Share/SharePlugin.php b/plugins/Share/SharePlugin.php index b5643c1d09..c337efbaec 100644 --- a/plugins/Share/SharePlugin.php +++ b/plugins/Share/SharePlugin.php @@ -161,7 +161,7 @@ class SharePlugin extends ActivityVerbHandlerPlugin public function extendActivity(Notice $stored, Activity $act, Profile $scoped=null) { // TODO: How to handle repeats of deleted notices? - $target = Notice::getById($stored->repeat_of); + $target = Notice::getByID($stored->repeat_of); // TRANS: A repeat activity's title. %1$s is repeater's nickname // and %2$s is the repeated user's nickname. $act->title = sprintf(_('%1$s repeated a notice by %2$s'),