From a9d589dbdcd19169a6e1900bf578fba6c5c5ec4e Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 11 Mar 2011 12:28:15 -0800 Subject: [PATCH] Poll plugin: switching Atom & JSON output to use new hooks & methods, much nicer output. Also switched types, which may break old entries. Beware! Input not yet updated. --- plugins/Poll/PollPlugin.php | 171 +++++++++++++++++++++++------------- 1 file changed, 112 insertions(+), 59 deletions(-) diff --git a/plugins/Poll/PollPlugin.php b/plugins/Poll/PollPlugin.php index 34c37eb526..78357457a6 100644 --- a/plugins/Poll/PollPlugin.php +++ b/plugins/Poll/PollPlugin.php @@ -48,8 +48,8 @@ class PollPlugin extends MicroAppPlugin const VERSION = '0.1'; // @fixme which domain should we use for these namespaces? - const POLL_OBJECT = 'http://apinamespace.org/activitystreams/object/poll'; - const POLL_RESPONSE_OBJECT = 'http://apinamespace.org/activitystreams/object/poll-response'; + const POLL_OBJECT = 'http://activityschema.org/object/poll'; + const POLL_RESPONSE_OBJECT = 'http://activityschema.org/object/poll-response'; /** * Database schema setup @@ -277,33 +277,15 @@ class PollPlugin extends MicroAppPlugin $object->link = $notice->bestUrl(); $response = Poll_response::getByNotice($notice); - if (!$response) { - common_log(LOG_DEBUG, "QQQ notice uri: $notice->uri"); - } else { + if ($response) { $poll = $response->getPoll(); - /** - * For the moment, using a kind of icky-looking schema that happens to - * work with out code for generating both Atom and JSON forms, though - * I don't like it: - * - * - * - * "poll:response": { - * "xmlns:poll": http://apinamespace.org/activitystreams/object/poll - * "uri": "http://..../poll/...." - * "selection": 3 - * } - * - */ - // @fixme there's no way to specify an XML node tree here, like - // @fixme there's no way to specify a JSON array or multi-level tree unless you break the XML attribs - // @fixme XML node contents don't get shown in JSON - $data = array('xmlns:poll' => self::POLL_OBJECT, - 'poll' => $poll->uri, - 'selection' => intval($response->selection)); - $object->extra[] = array('poll:response', $data, ''); + if ($poll) { + // Stash data to be formatted later by + // $this->activityObjectOutputAtom() or + // $this->activityObjectOutputJson()... + $object->pollSelection = intval($response->selection); + $object->pollUri = $poll->uri; + } } return $object; } @@ -318,41 +300,112 @@ class PollPlugin extends MicroAppPlugin $object->link = $notice->bestUrl(); $poll = Poll::getByNotice($notice); - /** - * Adding the poll-specific data. There's no standard in AS for polls, - * so we're making stuff up. - * - * For the moment, using a kind of icky-looking schema that happens to - * work with out code for generating both Atom and JSON forms, though - * I don't like it: - * - * - * - * "poll:response": { - * "xmlns:poll": http://apinamespace.org/activitystreams/object/poll - * "question": "Who wants a poll question?" - * "option1": "Option one" - * "option2": "Option two" - * "option3": "Option three" - * } - * - */ - // @fixme there's no way to specify an XML node tree here, like - // @fixme there's no way to specify a JSON array or multi-level tree unless you break the XML attribs - // @fixme XML node contents don't get shown in JSON - $data = array('xmlns:poll' => self::POLL_OBJECT, - 'question' => $poll->question); - foreach ($poll->getOptions() as $i => $opt) { - $data['option' . ($i + 1)] = $opt; + if ($poll) { + // Stash data to be formatted later by + // $this->activityObjectOutputAtom() or + // $this->activityObjectOutputJson()... + $object->pollQuestion = $poll->question; + $object->pollOptions = $poll->getOptions(); } - $object->extra[] = array('poll:poll', $data, ''); + return $object; } + /** + * Called when generating Atom XML ActivityStreams output from an + * ActivityObject belonging to this plugin. Gives the plugin + * a chance to add custom output. + * + * Note that you can only add output of additional XML elements, + * not change existing stuff here. + * + * If output is already handled by the base Activity classes, + * you can leave this base implementation as a no-op. + * + * @param ActivityObject $obj + * @param XMLOutputter $out to add elements at end of object + */ + function activityObjectOutputAtom(ActivityObject $obj, XMLOutputter $out) + { + if (isset($obj->pollQuestion)) { + /** + * + * Who wants a poll question? + * Option one + * Option two + * Option three + * + */ + $data = array('xmlns:poll' => self::POLL_OBJECT); + $out->elementStart('poll:poll', $data); + $out->element('poll:question', array(), $obj->pollQuestion); + foreach ($obj->pollOptions as $opt) { + $out->element('poll:option', array(), $opt); + } + $out->elementEnd('poll:poll'); + } + if (isset($obj->pollSelection)) { + /** + * + * poll="http://..../poll/...." + * selection="3" /> + */ + $data = array('xmlns:poll' => self::POLL_OBJECT, + 'poll' => $obj->pollUri, + 'selection' => $obj->pollSelection); + $out->element('poll:response', $data, ''); + } + } + + /** + * Called when generating JSON ActivityStreams output from an + * ActivityObject belonging to this plugin. Gives the plugin + * a chance to add custom output. + * + * Modify the array contents to your heart's content, and it'll + * all get serialized out as JSON. + * + * If output is already handled by the base Activity classes, + * you can leave this base implementation as a no-op. + * + * @param ActivityObject $obj + * @param array &$out JSON-targeted array which can be modified + */ + public function activityObjectOutputJson(ActivityObject $obj, array &$out) + { + common_log(LOG_DEBUG, 'QQQ: ' . var_export($obj, true)); + if (isset($obj->pollQuestion)) { + /** + * "poll": { + * "question": "Who wants a poll question?", + * "options": [ + * "Option 1", + * "Option 2", + * "Option 3" + * ] + * } + */ + $data = array('question' => $obj->pollQuestion, + 'options' => array()); + foreach ($obj->pollOptions as $opt) { + $data['options'][] = $opt; + } + $out['poll'] = $data; + } + if (isset($obj->pollSelection)) { + /** + * "pollResponse": { + * "poll": "http://..../poll/....", + * "selection": 3 + * } + */ + $data = array('poll' => $obj->pollUri, + 'selection' => $obj->pollSelection); + $out['pollResponse'] = $data; + } + } + + /** * @fixme WARNING WARNING WARNING parent class closes the final div that we * open here, but we probably shouldn't open it here. Check parent class