DARTHARTH

Мультирегиональность с преффиксом в ЧПУ на Drupal 7 — часть 2

Продолжаем костылить. В прошлой части мы «сделали» смену городов через языки + написали простое условие для тепла темы с заменой данных. В этой части мы немного углубимся в тему регионов. Допустим для большего удобства у нас будут типы материалов «Город» с наборами полей для каждого города. Т.е. мы будем создавать нодыдля отдельных городов с которых будут одни и те же поля. Такой вариант нам поможет меньше путаться в данных городов и будет более аккуратно, чем скидывать в одну ноду новые и новые поля, при добавлении новых городов для сайта.

Поля для типа материала делаете какие вам нужно (под данные которые будут меняться в зависимости от выбранного города), но одно поле должно быть точно — поле текста в которое мы будем вбивать транслит города, который обязательно должен будет совпадать с префиксом языка-города из прошлой части. Делаем это для того, что бы можно было связать данные из ноды с выбранным городом.

Создадим для примера пару нод с данными. Теперь переходим в template.php нашей темы. Если еще нет, создаем функцию для контактов

function themes_contacts() {
   global $language_content;
   $language_prefix = $language_content->prefix;
}

в результате в $language_prefix у нас будет выводиться префикс активного региона на сайте (активного префикса языка).

Добавим немного кода для сбора данных наших нод городов

$field_translit = 'field_translit';
$field_phones = 'field_phones';
$entity_type = 'city';

$query = 'SELECT n.title AS city_name,
   t.'.$field_translit.'_value AS city_prefix, 
   p.'.$field_phones.'_value AS city_phone
FROM {node} n
   LEFT JOIN {field_data_'.$field_translit.'} t ON n.nid = t.entity_id
   LEFT JOIN {field_data_'.$field_phones.'} p ON n.nid = p.entity_id
   WHERE n.type = :type ';

$citys = db_query($query, array(':type' => $entity_type))->fetchAll();

Сдесь мы определеяем поля, которые будут вытягиваться из базы с данными. В строке

$entity_type = 'city';

мы указываем тип материала, ноды которого нужно вывести.

По итогу в массиве $citys у нас будет сборная солянка данных нод городов. Теперь же добавим переменные для вывода этих данных и условие вывода для каждого города.

$output['phones'] = '';

foreach ($citys as $key => $value){
   if ($language_prefix == $value->city_prefix){
      $output['phones'] = $value->city_phone;
   }
}

Сдесь мы проверяем совпадает ли префикс языка с транслитом города. В случае совпадения переменной для вывода мы применяем значение поля из ноды.

На сайте же мы можем сделать просто вывод или в блоке, или в шаблоне темы

<?php echo themes_contacts()['phones']; ?>

В конце немного дополним код функции выводом поля incity в котором мы добавим вывод видоизменения имени города, например «в Москве» или «в Белгороде»

function themes_contacts() {
   global $language_content;
   $language_prefix = $language_content->prefix;

   $field_incity = 'field_incity';
   $field_translit = 'field_translit';
   $field_phones = 'field_phones';
   $entity_type = 'city';
	
   $query = 'SELECT n.title AS city_name,
      i.'.$field_incity.'_value AS incity,
      t.'.$field_translit.'_value AS city_prefix, 
      p.'.$field_phones.'_value AS city_phone
   FROM {node} n
   LEFT JOIN {field_data_'.$field_incity.'} i ON n.nid = i.entity_id
   LEFT JOIN {field_data_'.$field_translit.'} t ON n.nid = t.entity_id
   LEFT JOIN {field_data_'.$field_phones.'} p ON n.nid = p.entity_id
   WHERE n.type = :type ';

   $citys = db_query($query, array(':type' => $entity_type))->fetchAll();
	
   $output['phones'] = '';
   $output['incity'] = '';
	
   foreach ($citys as $key => $value){
      if ($language_prefix == $value->city_prefix){
         $output['phones'] = $value->city_phone;
	 $output['incity'] = $value->incity;
      }
   }
}

Думаю к этому времени у нас уже стоят модули Token, Entity tokens и ставим Custom tokens. Переходим в Структура — Custom tokens и добавляем кастомный токен (admin/structure/token-custom/add)

с текстом PHP

<?php
   global $theme;
   $output = '';
   if ($theme == 'themes') {
      $output = themes_contacts()['incity'];
   }
   return $output;
?>

Таким образом у нас в списке токенов будет наш токен, выводящий имя города

которое мы можем выводить в полях метатэгов и везде, где можно вывести токен.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll Up