listClass = $list_class; $this->itemClass = $item_class; $this->fields = $fields; } /** * Return a string representing the source. * * @return string */ public function __toString() { return (string) $this->listClass; } /** * Returns a list of fields available to be mapped from the source query. * Since we can't reliably figure out what "fields" are in the source, * it's up to the implementing Migration constructor to fill them in. * * @return array * Keys: machine names of the fields (to be passed to addFieldMapping) * Values: Human-friendly descriptions of the fields. */ public function fields() { return $this->fields; } /** * It's the list class that knows how many records are available, so ask it. * * @return int */ public function computeCount() { // @API: Support old count method for now. if (method_exists($this->listClass, 'computeCount')) { return $this->listClass->computeCount(); } else { return $this->listClass->count(); } } /** * Implementation of MigrateSource::performRewind(). * * @return void */ public function performRewind() { // If there isn't a specific ID list passed in, get it from the list class. if ($this->idList) { $this->idsToProcess = $this->idList; } else { $this->idsToProcess = $this->listClass->getIdList(); } $this->idIterator = ($this->idsToProcess instanceof Iterator) ? $this->idsToProcess : new ArrayIterator($this->idsToProcess); $this->idIterator->rewind(); } /** * Implementation of MigrateSource::getNextRow(). * * @return null|stdClass */ public function getNextRow() { $row = NULL; while ($this->idIterator->valid()) { $ids = $this->idIterator->current(); $this->idIterator->next(); // Skip empty IDs if (empty($ids)) { continue; } // Got a good ID, get the data and get out. $row = $this->itemClass->getItem($ids); if ($row) { // No matter what $ids is, be it a string, integer, object, or array, we // cast it to an array so that it can be properly mapped to the source // keys as specified by the map. This is done after getItem is called so // that the ItemClass doesn't have to care about this requirement. $ids = (array) $ids; foreach (array_keys($this->activeMap->getSourceKey()) as $key_name) { // Grab the first id and advance the array cursor. Then save the ID // using the map source key - it will be used for mapping. list(, $id) = each($ids); $row->$key_name = $id; } break; } } return $row; } /** * Overrides MigrateSource::hash(). */ protected function hash($row) { // Let the item class override the default hash function. if (method_exists($this->itemClass, 'hash')) { $hash = $this->itemClass->hash($row); } else { $hash = parent::hash($row); } return $hash; } }