X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fmicroappplugin.php;h=53fe5e9995eab4d7bf467c7015d769c8122dbd04;hb=10f2cde0b1d75fa023b00400162cb525e8719514;hp=1cdbe965e6c043a745a1a604cf349c9e5020f585;hpb=17db6cce3d85fd464529443076466045fcba467a;p=quix0rs-gnu-social.git diff --git a/lib/microappplugin.php b/lib/microappplugin.php index 1cdbe965e6..53fe5e9995 100644 --- a/lib/microappplugin.php +++ b/lib/microappplugin.php @@ -4,7 +4,7 @@ * Copyright (C) 2011, StatusNet, Inc. * * Superclass for microapp plugin - * + * * PHP version 5 * * This program is free software: you can redistribute it and/or modify @@ -39,8 +39,8 @@ if (!defined('STATUSNET')) { * * This class lets you define micro-applications with different kinds of activities. * - * The applications work more-or-less like other - * + * The applications work more-or-less like other + * * @category Microapp * @package StatusNet * @author Evan Prodromou @@ -48,228 +48,92 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - -abstract class MicroAppPlugin extends Plugin +abstract class MicroAppPlugin extends ActivityHandlerPlugin { - abstract function appTitle(); - abstract function tag(); - abstract function types(); - abstract function saveNoticeFromActivity($activity, $actor); - abstract function activityObjectFromNotice($notice); - abstract function showNotice($notice, $out); - abstract function entryForm($out); - abstract function deleteRelated($notice); - - function isMyNotice($notice) { - $types = $this->types(); - return in_array($notice->object_type, $types); - } - - function isMyActivity($activity) { - $types = $this->types(); - return (count($activity->objects) == 1 && - in_array($activity->objects[0]->type, $types)); - } - /** - * When a notice is deleted, delete the related objects + * Returns a localized string which represents this micro-app, + * to be shown to users selecting what type of post to make. + * This is paired with the key string in $this->tag(). * - * @param Notice $notice Notice being deleted - * - * @return boolean hook value + * All micro-app classes must override this method. + * + * @return string */ - - function onNoticeDeleteRelated($notice) - { - if ($this->isMyNotice($notice)) { - $this->deleteRelated($notice); - } - - return true; - } + abstract function appTitle(); /** - * Output the HTML for this kind of object in a list + * When building the primary notice form, we'll fetch also some + * alternate forms for specialized types -- that's you! * - * @param NoticeListItem $nli The list item being shown. + * Return a custom Widget or Form object for the given output + * object, and it'll be included in the HTML output. Beware that + * your form may be initially hidden. * - * @return boolean hook value + * All micro-app classes must override this method. + * + * @param HTMLOutputter $out + * @return Widget */ - - function onStartShowNoticeItem($nli) - { - if (!$this->isMyNotice($nli->notice)) { - return true; - } - - $out = $nli->out; - - $this->showNotice($notice, $out); - - $nli->showNoticeLink(); - $nli->showNoticeSource(); - $nli->showNoticeLocation(); - $nli->showContext(); - $nli->showRepeat(); - - $out->elementEnd('div'); - - $nli->showNoticeOptions(); - - return false; - } + abstract function entryForm($out); /** - * Render a notice as one of our objects - * - * @param Notice $notice Notice to render - * @param ActivityObject &$object Empty object to fill * - * @return boolean hook value */ - - function onStartActivityObjectFromNotice($notice, &$object) - { - if ($this->isMyNotice($notice)) { - $object = $this->activityObjectFromNotice($notice); - return false; - } - - return true; + public function newFormAction() { + // such as 'newbookmark' or 'newevent' route + return 'new'.$this->tag(); } /** - * Handle a posted object from PuSH + * Output the HTML for this kind of object in a list * - * @param Activity $activity activity to handle - * @param Ostatus_profile $oprofile Profile for the feed + * @param NoticeListItem $nli The list item being shown. * * @return boolean hook value */ - - function onStartHandleFeedEntryWithProfile($activity, $oprofile) + function onStartShowNoticeItem(NoticeListItem $nli) { - if ($this->isMyActivity($activity)) { - - $actor = $oprofile->checkAuthorship($activity); + if (!$this->isMyNotice($nli->notice)) { + return true; + } - if (empty($actor)) { - throw new ClientException(_('Can\'t get author for activity.')); - } + // Legacy use was creating a "NoticeListItemAdapter", but + // nowadays we solve that using event handling for microapps. + // This section will remain until all plugins are fixed. + $adapter = $this->adaptNoticeListItem($nli) ?: $nli; - $this->saveNoticeFromActivity($activity, $actor); + $adapter->showNotice(); + $adapter->showNoticeAttachments(); + $adapter->showNoticeFooter(); - return false; - } - - return true; + return false; } /** - * Handle a posted object from Salmon + * Given a notice list item, returns an adapter specific + * to this plugin. * - * @param Activity $activity activity to handle - * @param mixed $target user or group targeted + * @param NoticeListItem $nli item to adapt * - * @return boolean hook value + * @return NoticeListItemAdapter adapter or null */ - - function onStartHandleSalmonTarget($activity, $target) + function adaptNoticeListItem($nli) { - if ($this->isMyActivity($activity)) { - - $this->log(LOG_INFO, "Checking {$activity->id} as a valid Salmon slap."); - - if ($target instanceof User_group) { - $uri = $target->getUri(); - if (!in_array($uri, $activity->context->attention)) { - throw new ClientException(_("Bookmark not posted ". - "to this group.")); - } - } else if ($target instanceof User) { - $uri = $target->uri; - $original = null; - if (!empty($activity->context->replyToID)) { - $original = Notice::staticGet('uri', - $activity->context->replyToID); - } - if (!in_array($uri, $activity->context->attention) && - (empty($original) || - $original->profile_id != $target->id)) { - throw new ClientException(_("Bookmark not posted ". - "to this user.")); - } - } else { - throw new ServerException(_("Don't know how to handle ". - "this kind of target.")); - } - - $actor = Ostatus_profile::ensureActivityObjectProfile($activity->actor); - - $this->saveNoticeFromActivity($activity, $actor); - - return false; - } - - return true; + return null; } - /** - * Handle object posted via AtomPub - * - * @param Activity &$activity Activity that was posted - * @param User $user User that posted it - * @param Notice &$notice Resulting notice - * - * @return boolean hook value - */ - - function onStartAtomPubNewActivity(&$activity, $user, &$notice) + function onStartShowEntryForms(&$tabs) { - if ($this->isMyActivity($activity)) { - - $options = array('source' => 'atompub'); - - $this->saveNoticeFromActivity($activity, - $user->getProfile(), - $options); - - return false; - } - + $tabs[$this->tag()] = array('title' => $this->appTitle(), + 'href' => common_local_url($this->newFormAction()), + ); return true; } - /** - * Handle object imported from a backup file - * - * @param User $user User to import for - * @param ActivityObject $author Original author per import file - * @param Activity $activity Activity to import - * @param boolean $trusted Is this a trusted user? - * @param boolean &$done Is this done (success or unrecoverable error) - * - * @return boolean hook value - */ - - function onStartImportActivity($user, $author, $activity, $trusted, &$done) + function onStartMakeEntryForm($tag, $out, &$form) { - if ($this->isMyActivity($activity)) { - - $obj = $activity->objects[0]; - - $options = array('uri' => $bookmark->id, - 'url' => $bookmark->link, - 'source' => 'restore'); - - $saved = $this->saveNoticeFromActivity($activity, - $user->getProfile(), - $options); - - if (!empty($saved)) { - $done = true; - } - + if ($tag == $this->tag()) { + $form = $this->entryForm($out); return false; }