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
$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"
- * poll="http://..../poll/...."
- * selection="3" />
- *
- * "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 <poll><option/><option/></poll>
- // @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;
}
$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:data xmlns:poll="http://apinamespace.org/activitystreams/object/poll"
- * question="Who wants a poll question?"
- * option1="Option one"
- * option2="Option two"
- * option3="Option three"></poll:data>
- *
- * "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 <poll><option/><option/></poll>
- // @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)) {
+ /**
+ * <poll:poll xmlns:poll="http://apinamespace.org/activitystreams/object/poll">
+ * <poll:question>Who wants a poll question?</poll:question>
+ * <poll:option>Option one</poll:option>
+ * <poll:option>Option two</poll:option>
+ * <poll:option>Option three</poll:option>
+ * </poll:poll>
+ */
+ $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:response xmlns:poll="http://apinamespace.org/activitystreams/object/poll">
+ * 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