Поля, определенные модулями, не попадают в конфиг файлы сайта, и их не получается настроить привычным способом. В данном случае, требуется как то указать TMGMT модулю, что не нужно переводить поле view_mode.
Чтобы предотвратить проблему, можно воспользоваться зацепкой, предоставляемой tmgmt_content — hook_tmgmt_translatable_fields_alter. Пример реализации:
1 2 3 4 5 6 7 8 9 |
/** * Removes view mode from translatable_fields. */ function HOOK_tmgmt_translatable_fields_alter(\Drupal\Core\Entity\ContentEntityInterface $entity, array &$translatable_fields) { if ($entity->getEntityTypeId() == 'menu_link_content') { unset($translatable_fields['view_mode']); } } |
Но обычно это половина проблемы, т.к. исправлять это начинают уже после того, как tmgmt был использован для перевода пунктов меню, заодно и переведя значения поля view_mode.
Проявляется проблема при попытке рендеринга меню в виде Illegal mix of collations ошибки базы данных (например):
Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (ascii_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation ‘=’: SELECT «name», «data» FROM «config» WHERE «collection» = :collection AND «name» IN ( :names__0 ); Array ( [:collection] => [:names__0] => core.entity_view_display.menu_link_content.main.par défaut ) in Drupal\Core\Config\DatabaseStorage->readMultiple() (line 111 of core/lib/Drupal/Core/Config/DatabaseStorage.php).
Придется собрать (агрегировать) все переводы значения view_mode (используете шаблон):
1 2 3 4 |
SELECT COUNT(*) as CNT, view_mode FROM menu_link_content_data WHERE view_mode NOT IN ('default', 'VIEW_MODE_1', 'VIEW_MODE_2', ... ) GROUP BY view_mode |
А потом написать HOOK_update_N для вашего модуля, чтобы исправить переведенные значения на изначальные (шаблон):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php /** * Fix view_mode field values. */ function HOOK_update_10001() { // добавьте сюда ваши пары значений, перевод -> правильный ключ. $fixes = [ 'standard' => 'default', 'padrão' => 'default', 'por defecto' => 'default', 'par défaut' => 'default', ]; foreach ($fixes as $key => $value) { $query = \Drupal::database()->update('menu_link_content_data'); $query->fields([ 'view_mode' => $value, ]); $query->condition('view_mode', $key); $query->execute(); } } |
Можно обойтись и без хука — сделать это вручную, через drush sqlq или используя интерфейс базы данных. Но если исправлять нужно в нескольких базах, то HOOK будет удобнее.