X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fmicroappplugin.php;h=53fe5e9995eab4d7bf467c7015d769c8122dbd04;hb=945920f24dba53d8367160b221bc842db0768fc4;hp=0b02f5da52ea1d991c16ed7ff9d46b20d464451e;hpb=b54a9f389cacd6b4efd5499316a10729e89e2578;p=quix0rs-gnu-social.git diff --git a/lib/microappplugin.php b/lib/microappplugin.php index 0b02f5da52..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,258 +48,90 @@ 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, $options); - 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 - */ - - function onNoticeDeleteRelated($notice) - { - if ($this->isMyNotice($notice)) { - $this->deleteRelated($notice); - } - - return true; - } - - /** - * Output the HTML for this kind of object in a list - * - * @param NoticeListItem $nli The list item being shown. + * All micro-app classes must override this method. * - * @return boolean hook value + * @return string */ - - 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 appTitle(); /** - * Render a notice as one of our objects + * When building the primary notice form, we'll fetch also some + * alternate forms for specialized types -- that's you! * - * @param Notice $notice Notice to render - * @param ActivityObject &$object Empty object to fill + * 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 - */ - - function onStartActivityObjectFromNotice($notice, &$object) - { - if ($this->isMyNotice($notice)) { - $object = $this->activityObjectFromNotice($notice); - return false; - } - - return true; - } - - /** - * Handle a posted object from PuSH - * - * @param Activity $activity activity to handle - * @param Ostatus_profile $oprofile Profile for the feed + * All micro-app classes must override this method. * - * @return boolean hook value + * @param HTMLOutputter $out + * @return Widget */ - - function onStartHandleFeedEntryWithProfile($activity, $oprofile) - { - if ($this->isMyActivity($activity)) { - - $actor = $oprofile->checkAuthorship($activity); - - if (empty($actor)) { - throw new ClientException(_('Can\'t get author for activity.')); - } - - $object = $activity->objects[0]; - - $options = array('uri' => $object->id, - 'url' => $object->link, - 'is_local' => Notice::REMOTE_OMB, - 'source' => 'ostatus'); - - $this->saveNoticeFromActivity($activity, $actor); - - return false; - } - - return true; - } + abstract function entryForm($out); /** - * Handle a posted object from Salmon - * - * @param Activity $activity activity to handle - * @param mixed $target user or group targeted * - * @return boolean hook value */ - - function onStartHandleSalmonTarget($activity, $target) - { - 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(_("Object 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); - - $object = $activity->objects[0]; - - $options = array('uri' => $object->id, - 'url' => $object->link, - 'is_local' => Notice::REMOTE_OMB, - 'source' => 'ostatus'); - - $this->saveNoticeFromActivity($activity, $actor, $options); - - return false; - } - - return true; + public function newFormAction() { + // such as 'newbookmark' or 'newevent' route + return 'new'.$this->tag(); } /** - * Handle object posted via AtomPub + * Output the HTML for this kind of object in a list * - * @param Activity &$activity Activity that was posted - * @param User $user User that posted it - * @param Notice &$notice Resulting notice + * @param NoticeListItem $nli The list item being shown. * * @return boolean hook value */ - - function onStartAtomPubNewActivity(&$activity, $user, &$notice) + function onStartShowNoticeItem(NoticeListItem $nli) { - if ($this->isMyActivity($activity)) { - - $options = array('source' => 'atompub'); + if (!$this->isMyNotice($nli->notice)) { + return true; + } - $this->saveNoticeFromActivity($activity, - $user->getProfile(), - $options); + // 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; - return false; - } + $adapter->showNotice(); + $adapter->showNoticeAttachments(); + $adapter->showNoticeFooter(); - return true; + return false; } /** - * Handle object imported from a backup file + * Given a notice list item, returns an adapter specific + * to this plugin. * - * @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) + * @param NoticeListItem $nli item to adapt * - * @return boolean hook value + * @return NoticeListItemAdapter adapter or null */ - - function onStartImportActivity($user, $author, $activity, $trusted, &$done) + function adaptNoticeListItem($nli) { - if ($this->isMyActivity($activity)) { - - $obj = $activity->objects[0]; - - $options = array('uri' => $object->id, - 'url' => $object->link, - 'source' => 'restore'); - - $saved = $this->saveNoticeFromActivity($activity, - $user->getProfile(), - $options); - - if (!empty($saved)) { - $done = true; - } - - return false; - } - - return true; + return null; } function onStartShowEntryForms(&$tabs) { - $tabs[$this->tag()] = $this->appTitle(); + $tabs[$this->tag()] = array('title' => $this->appTitle(), + 'href' => common_local_url($this->newFormAction()), + ); return true; } function onStartMakeEntryForm($tag, $out, &$form) { - $this->log(LOG_INFO, "onStartMakeEntryForm() called for tag '$tag'"); - if ($tag == $this->tag()) { $form = $this->entryForm($out); return false;