/** * {@inheritdoc} */ public function process(FeedInterface $feed, ItemInterface $item, StateInterface $state) { $existing_entity_id = $this->existingEntityId($feed, $item); $skip_existing = $this->configuration['update_existing'] == static::SKIP_EXISTING; // Bulk load existing entities to save on db queries. if ($skip_existing && $existing_entity_id) { return; } // Delay building a new entity until necessary. if ($existing_entity_id) { $entity = $this->storageController->load($existing_entity_id); } $hash = $this->hash($item); $changed = $existing_entity_id && $hash !== $entity->get('feeds_item')->hash; // Do not proceed if the item exists, has not changed, and we're not // forcing the update. if ($existing_entity_id && !$changed && !$this->configuration['skip_hash_check']) { return; } // Build a new entity. if (!$existing_entity_id) { $entity = $this->newEntity($feed); } try { // Set field values. $this->map($feed, $entity, $item); $this->entityValidate($entity); // This will throw an exception on failure. $this->entitySaveAccess($entity); // Set the values that we absolutely need. $entity->get('feeds_item')->target_id = $feed->id(); $entity->get('feeds_item')->hash = $hash; $entity->get('feeds_item')->imported = REQUEST_TIME; // And... Save! We made it. $this->storageController->save($entity); // Track progress. $existing_entity_id ? $state->updated++ : $state->created++; } catch (\Exception $e) { $state->failed++; $state->setMessage($e->getMessage(), 'warning'); } }