/** * Computes the difference of the collection. * * @param CollectionInterface $collection The collection to compute the difference for. * * @return CollectionInterface The collection containing all the entries from this collection that are not present * in the given collection. */ public function diff($collection) { $diff = new DefaultCollection(); /** @var ModelInterface $localModel */ foreach ($this as $localModel) { /** @var ModelInterface $otherModel */ foreach ($collection as $otherModel) { if ($localModel->getProviderName() == $otherModel->getProviderName() && $localModel->getId() == $otherModel->getId()) { continue; } $diff->push($localModel); } } return $diff; }
/** * Apply sorting and persist all models. * * @param array $actions The actions collection. * @param ModelIdInterface $after The previous model id. * @param ModelIdInterface $into The hierarchical parent model id. * @param ModelIdInterface $parentModelId The parent model id. * @param array $items Write-back clipboard items. * * @return DefaultCollection|ModelInterface[] * * @throws DcGeneralRuntimeException When the parameters for the pasting destination are invalid. */ private function sortAndPersistModels(array $actions, ModelIdInterface $after = null, ModelIdInterface $into = null, ModelIdInterface $parentModelId = null, array &$items = array()) { $environment = $this->getEnvironment(); $dataDefinition = $environment->getDataDefinition(); $manualSorting = ViewHelpers::getManualSortingProperty($environment); /** @var DefaultCollection|ModelInterface[] $models */ $models = new DefaultCollection(); foreach ($actions as $action) { $models->push($action['model']); $items[] = $action['item']; } // Trigger for each model the pre persist event. foreach ($models as $model) { $event = new PrePasteModelEvent($environment, $model); $environment->getEventDispatcher()->dispatch($event::NAME, $event); } if ($after && $after->getId()) { $dataProvider = $environment->getDataProvider($after->getDataProviderName()); $previous = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($after->getId())); $this->pasteAfter($previous, $models, $manualSorting); } elseif ($into && $into->getId()) { $dataProvider = $environment->getDataProvider($into->getDataProviderName()); $parent = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($into->getId())); $this->pasteInto($parent, $models, $manualSorting); } elseif ($after && $after->getId() == '0' || $into && $into->getId() == '0') { if ($dataDefinition->getBasicDefinition()->getMode() === BasicDefinitionInterface::MODE_HIERARCHICAL) { foreach ($models as $model) { // Paste top means root in hierarchical mode! $this->setRootModel($model); } } $this->pasteTop($models, $manualSorting, $parentModelId); } elseif ($parentModelId) { if ($manualSorting) { $this->pasteTop($models, $manualSorting, $parentModelId); } else { $dataProvider = $environment->getDataProvider(); $dataProvider->saveEach($models); } } else { throw new DcGeneralRuntimeException('Invalid parameters.'); } // Trigger for each model the past persist event. foreach ($models as $model) { $event = new PostPasteModelEvent($environment, $model); $environment->getEventDispatcher()->dispatch($event::NAME, $event); } return $models; }
/** * @param VersionModel[] $versions * * @return DefaultCollection */ public function mapVersions($versions, $activeVersion = false) { $collection = new DefaultCollection(); foreach ($versions as $version) { $collection->push($this->mapVersion($version, $activeVersion)); } return $collection; }