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.
This commit is contained in:
parent
3146c9fae8
commit
a9d589dbdc
|
@ -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"
|
||||
* 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;
|
||||
}
|
||||
|
@ -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: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
|
||||
|
|
Loading…
Reference in New Issue
Block a user