Как каналы решают, собирается ли он создавать новую (или обновлять существующую) сущность?


Я использую каналы для сопоставления файла CSV с объектами пользователей и установки параметра "Обновить существующих пользователей". Все идет отлично, за исключением поля Телефон... в нынешнем виде телефонный модуль не поддерживает каналы.

Существует исправление, которое работает для сохранения номера телефона при создании нового пользователя, но не при обновлении существующего пользователя.

Вот пример CSV (исключая заголовки для простоты) для нового пользователя:

demo,[email protected],1234567890

Вот пример CSV для обновления того же пользователя:

demo,[email protected],4567890123

При изменении значения телефонного номера в CSV-файле и повторном запуске его через импортера, каналы (или кто-то другой?) не видит никаких входящих изменений, которые нужно применить, поэтому он полностью пропускает импорт, говоря:

"There are no new users."

Я просматривал API каналов , чтобы посмотреть, какие крючки доступны, и подумал, что hook_feeds_presave() было бы неплохо, так как это говорит о "пропуске" сущности, но этот крючок срабатывает только при создании нового пользователя.

Функция hook_feeds_before_update() вызывается каждый раз, но я не вижу способа указать каналам, изменилось ли значение, и продолжить или пропустить.

Я предполагаю, что мне нужно расширить патч с помощью крючков/других, чтобы принять простое решение для каналов, псевдокод, например

...
// If telephone number has changed, tell feeds its OK to update.
if ($feed_item_value != $entity->{$field_name}['und'][o]['value']) {
  $feeds->update = TRUE;
}
else {
  $feeds->update = FALSE;
}
...

Как модуль, предоставляющий поле, сообщает каналам, что он обнаруживает изменение значения поля и для обновления сущности? Или каналы и внутренняя система сущностей автоматически делают это?

 2
Author: kiamlaluno, 2014-10-29

1 answers

Модуль Feeds использует объект FeedsProcessor для определения того, что он называет целями сопоставления для сущности, чтобы определить, какие поля уникальны, а какие могут быть дополнительно установлены уникальными в пользовательском интерфейсе параметров сопоставления импортера каналов. Затем он использует метод existingEntityId, чтобы определить, являются ли цели сопоставления уникальными.

В случае пользователей метод hook_feeds_plugins для модуля feeds указывает каналам использовать класс FeedsUserProcessor. У этого класса есть метод с именем getMappingTargets говорит, что необязательными уникальными полями могут быть имя и почта. В пользовательском интерфейсе сопоставления для импортера пользовательских каналов (администратор/структура/каналы/пользователь/сопоставление) вы можете задать уникальное имя и/или почту. Метод existingentityid в FeedsUserProcessor.inc определяет, найдено ли уникальное значение. Если это так, и импортер настроен на замену или обновление существующих пользователей, то запись каналов будет обновлена.

Если вы действительно хотели работать с номером телефона в качестве уникального поля, прикрепленного для пользователя затем вы используете реализацию hook_feeds_plugins, определяете свой собственный процессор Feedsprocessor и расширяете процессор FeedsUserProcessor, перезаписываете getMappingTargets, чтобы добавить поле в качестве записи optional_unique, и перезаписываете существующий идентификатор, чтобы найти других пользователей с соответствующим номером телефона.

Однако, похоже, вам не нужно этого делать. Убедитесь, что импорт пользовательских каналов настроен на обновление существующих пользователей и что он правильно читает csv-файл.

Я пошел дальше и включил телефон, установил исправление, о котором вы упомянули, и смог увидеть, как пользователь был создан, а затем обновлен другим номером телефона. Мой файл импорта выглядел так:

name,mail,telephone
demo,[email protected],1234567890

И затем это:

name,mail,telephone
demo,[email protected],4567890123

А вот экспорт импорта корма:

$feeds_importer = new stdClass();
$feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
$feeds_importer->api_version = 1;
$feeds_importer->id = 'user';
$feeds_importer->config = array(
  'name' => 'User import',
  'description' => 'Import users from CSV file.',
  'fetcher' => array(
    'plugin_key' => 'FeedsFileFetcher',
    'config' => array(
      'direct' => FALSE,
      'allowed_extensions' => 'txt csv tsv xml opml',
      'directory' => 'public://feeds',
      'allowed_schemes' => array(
        0 => 'public',
      ),
    ),
  ),
  'parser' => array(
    'plugin_key' => 'FeedsCSVParser',
    'config' => array(
      'delimiter' => ',',
      'no_headers' => 0,
    ),
  ),
  'processor' => array(
    'plugin_key' => 'FeedsUserProcessor',
    'config' => array(
      'bundle' => 'user',
      'roles' => array(
        3 => 0,
      ),
      'update_existing' => '1',
      'status' => '1',
      'mappings' => array(
        0 => array(
          'source' => 'name',
          'target' => 'name',
          'unique' => 0,
        ),
        1 => array(
          'source' => 'mail',
          'target' => 'mail',
          'unique' => 1,
        ),
        2 => array(
          'source' => 'telephone',
          'target' => 'field_telephone:url',
          'unique' => FALSE,
        ),
      ),
      'defuse_mail' => 0,
      'update_non_existent' => 'skip',
      'input_format' => 'plain_text',
      'skip_hash_check' => 0,
    ),
  ),
  'content_type' => '',
  'update' => 0,
  'import_period' => '-1',
  'expire_period' => 3600,
  'import_on_create' => 1,
  'process_in_background' => 0,
);
 3
Author: Evil E, 2014-11-03 20:46:43