Замена сниппета BabelTranslation на LexUrl :: Cетевой уголок Majestio

Замена сниппета BabelTranslation на LexUrl


Cниппет LexUrl

Стандартный сниппет 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;
Рейтинг: 0/5 - 0 голосов