Entity Translation и XML sitemap: вывод только переведенных материалов


38

Суть проблемы: Есть система региональных поддоменов, основанных на Entity Translation. Для перевода доступны только НЕКОТОРЫЕ типы материалов. Часть остается непереведенными, т.е. на поддоменах недоступна. Необходимо генерировать карту сайта для каждого поддомена. После включения модуля XML sitemap internationalization в админке (admin/config/search/xmlsitemap) можно создавать карты сайта для различных поддоменов (различных языков). Но непереведенные материалы по умолчанию имеют язык UND (LANGUAGE_NONE) и попадают в карту сайта для поддоменов. А нам нужно их исключить из регионов и оставить только в основном языке.

Немного теории

После настройки модуля XML sitemap, происходит составление базовой таблицы (`xmlsitemap`). Этот процесс очень похож на индексацию поисковыми модулями (типа Search API). Перестроить базовую таблицу можно в админке (admin/config/search/xmlsitemap/rebuild). И уже потом на основании данной таблицы идет формирование карты сайта для каждого языка (хранятся в виде текстового файла). Этот процесс запускается на основной странице настроек (admin/config/search/xmlsitemap) и называется - "Обновление закешированных сайтов".

Решение

Теперь, зная теорию, становится понятно, в какой момент нам нужно влезть в работу системы, что бы повлиять на результат (основная идея Друпал). Для каждого языка модуль XML sitemap формирует список основных материалов из базовой таблицы (создается SQL запрос). И нам дается возможность повлиять на этот запрос перед его выполнением. Итак, вся суть статьи - hook_query_xmlsitemap_generate_alter (основан на hook_query_TAG_alter).

Привожу код своего решения:

/**
 * Implements hook_query_TAG_alter().
 *
 */
function MYMODULE_query_xmlsitemap_generate_alter($query) {
  $sitemap = $query->getMetaData('sitemap');

  if (!isset($sitemap->context['language'])) {
    return;
  }

  //Получаем информацию о языках: текущий язык и язык по умолчанию
  $current = $sitemap->context['language'];
  $default = language_default('language');

  //Пропускаем изменения для основного домена (там нас все устраивает)
  if ($current == $default) {
    return;
  }

  //Удаляем старый conditions по языку
  $where = & $query->conditions();
  foreach ($where as $key => $cond) {
    if (is_array($cond)) {
      if ($cond['field'] == 'x.language') {
        unset($where[$key]);
      }
    }
  }

  //Дальше будем учить XML Sitemap общаться с модулем Entity Translation
  //Отдельно список условий для node
  $query->innerJoin('entity_translation', 'et', 'x.id=et.entity_id');
  $node_condition = db_and();
  $node_condition->condition('x.type', 'node');
  $node_condition->condition('et.status', 1);
  $node_condition->condition('et.entity_type', 'node');
  $node_condition->condition('et.language', $current);

  //Отдельно список условий для taxonomy_term
  $term_condition = db_and();
  $term_condition->condition('x.type', 'taxonomy_term');
  $term_condition->condition('et.status', 1);
  $term_condition->condition('et.entity_type', 'taxonomy_term');
  $term_condition->condition('et.language', $current);

  //Условия для всего остального (можно менять на свой вкус)
  $normal_condition = db_and();
  $normal_condition->condition('x.type', 'node', '<>');
  $normal_condition->condition('x.type', 'taxonomy_term', '<>');
  $normal_condition->condition('x.language', array($current, LANGUAGE_NONE));

  $condition = db_or();
  $condition->condition($node_condition);
  $condition->condition($term_condition);
  $condition->condition($normal_condition);
  $query->condition($condition);
  //Если установлен модуль devel, можно просмотреть запрос (при выполнении обновления кешированных файлов карты сайта)
  //  dpm((string)$query);
}

Мне данное решение помогло - теперь в карте сайта для поддоменов присутствуют ТОЛЬКО те материалы и термины, для которых есть перевод.

Добавить комментарий
Может быть интересно

Порядок действий для установки Solr на сервере с Centos 7

4
Модуль Migrate это фреймворк для миграции (импорта) данных в Drupal из любых источников.
1

В данной статье будет теория про механизм, который использует модуль migrate при импорте материалов в Друпал из различных источников.

2

Несколько способов как в twig объединить несколько строк в одну

3
Снова возвращаемся к migrate. Довольно удобный фреймворк для импорта данных в Друпал. Один из распространенных форматов источника для импорта - CSV. Поддерживается migrate из коробки. Описание и примеры работы с классом MigrateSourceCSV можно найти на drupal.org.
2