123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- <?php
- /**
- * @file
- * Support for poll nodes.
- *
- * Each poll node will have multiple choices, and multiple votes. It's
- * not practical to bring this information in through your migration's
- * source query, you need to pull it separately in prepareRow():
- *
- * @code
- * ...
- * $this->addFieldMapping('active')
- * ->defaultValue(1);
- * $this->addFieldMapping('runtime', 'seconds_to_run')
- * $this->addFieldMapping('choice', 'src_choices')
- * ->description('src_choices populated in prepareRow()');
- * $this->addFieldMapping('votes', 'src_votes')
- * ->description('src_votes populated in prepareRow()');
- * ...
- * public function prepareRow($row);
- * $choices = Database::getConnection('default', 'legacy')
- * ->select('src_poll_choice', 'c')
- * ->fields('c', array('choice_label', 'choice_order', 'choice_total))
- * ->condition('c.choiceid', $row->src_contentid);
- * ->execute();
- * $row->src_choices = array();
- * foreach ($choices as $choice) {
- * $row->src_choices[] = array(
- * 'chtext' => $choice->choice_label,
- * 'chvotes' => $choice->choice_total,
- * 'weight' => $choice->choice_order,
- * );
- * }
- * // Note that we won't know until much later what the chid is for each
- * // choice, so it's best to tie the votes to choices by text.
- * $query = Database::getConnection('default', 'legacy')
- * ->select('src_poll_vote', 'v')
- * ->fields('v', array('choice_uid', 'hostname', 'timestamp))
- * ->condition('v.choiceid', $row->src_contentid);
- * $votes = $query->innerJoin('src_poll_choice', 'c', 'v.choice_id=c.choice_id')
- * ->fields('c', array('choice_label'))
- * ->execute();
- * $row->src_votes = array();
- * foreach ($votes as $vote) {
- * $row->src_votes[] = array(
- * 'chtext' => $choice->choice_label,
- * 'uid' => $choice->choice_uid,
- * 'hostname' => $choice->hostname,
- * 'timestamp' => $choice->timestamp,
- * );
- * }
- * return TRUE;
- * }
- * @endcode
- */
- class MigratePollEntityHandler extends MigrateDestinationHandler {
- public function __construct() {
- $this->registerTypes(array('node'));
- }
- public function fields($entity_type, $bundle) {
- if ($bundle == 'poll') {
- $fields = array(
- 'active' => t('Poll: Active status'),
- 'runtime' => t('Poll: How long the poll runs for in seconds'),
- 'choice' => t('Poll: Choices. Each choice is an array with chtext, chvotes, and weight keys.'),
- 'votes' => t('Poll: Votes. Each vote is an array with chid (or chtext), uid, hostname, and timestamp keys'),
- );
- }
- else {
- $fields = array();
- }
- return $fields;
- }
- public function complete($entity, stdClass $row) {
- if ($entity->type == 'poll') {
- // Update settings overridden by !user_access('administer nodes') check in
- // poll_insert().
- db_update('poll')
- ->fields(array('active' => $entity->active))
- ->condition('nid', $entity->nid)
- ->execute();
- // Update vote summary count, again overridden by
- // !user_access('administer nodes') check in poll_insert().
- foreach ($row->choice as $choice) {
- // Have no mapping tracking for chid, so assume choice text is unique.
- db_update('poll_choice')
- ->fields(array('chvotes' => $choice['chvotes'], 'weight' => $choice['weight']))
- ->condition('nid', $entity->nid)
- ->condition('chtext', $choice['chtext'])
- ->execute();
- }
- // Insert actual votes.
- foreach ($row->votes as $vote) {
- $chid = $vote['chid'];
- if (!isset($chid)) {
- $result = db_select('poll_choice', 'pc')
- ->fields('pc', array('chid'))
- ->condition('pc.nid', $entity->nid)
- ->condition('pc.chtext', $vote['chtext'])
- ->execute();
- $chid = $result->fetchField();
- }
- db_insert('poll_vote')
- ->fields(array(
- 'chid' => $chid,
- 'nid' => $entity->nid,
- 'uid' => $vote['uid'],
- 'hostname' => $vote['hostname'],
- 'timestamp' => $vote['timestamp'],
- ))
- ->execute();
- }
- }
- }
- }
|