[Мультиязычность] Скрипт массовой связки разных языковых версий (в разных контекстах) по URI [Babel]

Надо добавить мультиязычность на сайт через Babel. Для этого была сделана русская версия (в контексте web) и затем сделаны ее копии (en и de).

Далее нужно было связать все версии языков ресурсов между собой. Что их объединяет? Общий URI (часть URL после доменного имени).

  1. Нажимаем в админке пункт меню:
    «Управление > Очистить кэш > Обновить URI-ссылки»
  2. Делаем бэкап таблицы `modx_site_tmplvar_contentvalues` базы данных
  3. Устанавливаем пакет Console, просто вставляем туда код ниже
  4. Меняем в `$babel_TV_ID` ID TV поля `babelLanguageLinks` на свой
  5. И нажимаем «Выполнить»
<?php






$babel_TV_ID = 0;  // ЗДЕСЬ ВАШ ID TV-ПОЛЯ `babelLanguageLinks`







if (!is_int($babel_TV_ID) || $babel_TV_ID < 1) die('Замените $babel_TV_ID на свой ID TV-поля babelLanguageLinks');

$arr = [];

$resources = $modx->query("SELECT id,context_key,uri FROM modx_site_content")->fetchAll(PDO::FETCH_ASSOC);
foreach ($resources as $res) {
	$arr[ $res['uri'] ][ $res['context_key'] ] = $res['id'];
}

foreach ($arr as $uri => $contexts) {
	$pair = [];
	foreach ($contexts as $ctx => $res) {
		$pair[] = "$ctx:$res";
	}
	$pair = implode(';', $pair);
	foreach ($contexts as $ctx => $res) {
		$modx->exec("INSERT INTO modx_site_tmplvar_contentvalues (tmplvarid,contentid,value) VALUES ($babel_TV_ID, $res, '$pair')");
	}
}
Fullstack
27 февраля 2021, 23:04
modx.pro
7
1 310
+9

Комментарии: 3

Fullstack
27 февраля 2021, 23:06
+1
Не мог написать в «Готовые решения» из-за недостаточного рейтинга.
Но скрипт очень нужный, чтобы им не поделиться.
Просто проверьте, что тут ничего такого нет.
И переместите в нужный раздел =)
Спасибо
Aleksandr Huz
06 марта 2021, 22:36
0
$tvName = 'babelLanguageLinks';
if(!$tv = $modx->getobject('modTemplateVar', ['name' => $tvName])) {
    die("TV c именем {$tvName} не найдено");
}
$babel_TV_ID = $tv->get('id');
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3