Стандартный сниппет BabelTranslation как-то нестабильно работает. Я написал ему замену под названием LexUrl.
Способ вызова следующий:
<!-- после первой открывающей квадратной скобки убрать пробел нулевой ширины! -->
[[LexUrl &id=`ресурс` &key=`язык`]]
В случае некорректного вызова возвращается Id текущего ресурса, а в логи попадает предупреждающее сообщение
Таким, образом, если вообще не указать ни одного параметра, то вызов будет эквивалентен:
<!-- после первой открывающей квадратной скобки убрать пробел нулевой ширины! -->
[[*id]]
//
// LexUrl - замена BabaelTranslation
//
// @param id = необязательный: если указан - ищется перевод к указанному id, если не указан - id считается текущего ресурса
// @param key = необязательный: если указан - ищется перевод для указанного cultureKey, если не указан - ищется для текущего
//
// в случае ошибки или ненайденных контекстов/ресурсов - возвращается id вызываемой страницы, а в журнал пишется ошибка
//
$err = $modx->resource->get('id');
$babel = $modx->getService('babel', 'Babel', $modx->getOption('babel.core_path', null, $modx->getOption('core_path').'components/babel/').'model/babel/', $scriptProperties);
// * * * * * * Убеждаемся, что babel и babel TV загружены
if (!($babel instanceof Babel) || !$babel->babelTv) {
$modx->log(MODX_LOG_LEVEL_ERROR, 'Расширение "Babel" не установлено или недоступно', 'FILE', '"Сниппет LexUrl"');
return $err;
}
// * * * * * * Получаем свойства сниппета
$id = $modx->getOption('id', $scriptProperties);
$key = $modx->getOption('key', $scriptProperties);
// * * * * * * Проверяем id
if ($id == '') {
if (!empty($modx->resource) && is_object($modx->resource)) {
$id = $modx->resource->get('id');
} else {
$modx->log(MODX_LOG_LEVEL_ERROR, 'Id ресурса не задано и не удалось определить текущий', 'FILE', '"Сниппет LexUrl"');
return $err;
}
} else {
if (intval($id) > 0) {
$id = $modx->getObject('modResource', intval($id));
if (empty($id)) {
$modx->log(MODX_LOG_LEVEL_ERROR, 'Id ресурса отсутствует', 'FILE', '"Сниппет LexUrl"');
return $err;
} else {
$id = $id->id;
}
} else {
$modx->log(MODX_LOG_LEVEL_ERROR, 'Id ресурса задано неверно', 'FILE', '"Сниппет LexUrl"');
return $err;
}
}
// * * * * * * Проверяем key
if (empty($key)) {
$key = $modx->getOption('cultureKey');
} else {
if (empty($babel->getContextKey($key))) {
$modx->log(MODX_LOG_LEVEL_ERROR, 'Key задано неверно', 'FILE', '"Сниппет LexUrl"');
return $err;
}
}
// * * * * * * Определяем идентификаторы переведенного ресурса
$idx = $babel->getContextKey($key);
$linked = $babel->getLinkedResources($id);
foreach($linked as $k => $v) {
if ($k == $idx) return $v;
}
$modx->log(MODX_LOG_LEVEL_ERROR, 'Перевод для ресурса '.$id.' на язык '.$key.' не найден', 'FILE', '"Сниппет LexUrl"');
return $err;