Совместил «translit» и «yTranslit»

Еж+уж=?
Итак для начала — МОДХ открыл для себя совсем недавно, около месяца назад. Многое еще не понятно, потихоньку копаюсь. Дошел до плагинов генерации УРЛов (псевдонимов), таких как
«translit» «yTranslit»
Идея перевода Яндексом понравилась, но проблема что не все слова переводит. Те если написать аббревиатуру с цифрами, то уже не переведет и вернет кириллицу. И если объединить два плагина в один то идеально дополнят друг друга. С чем не справится «yTranslit» докончит «translit».

Но так как еще плохо разобрался в МОДХ, как создавать плагины еще темный лес, поэтому пока простое решение. Устанавливаем сразу два этих плагина, но так чтоб в настройках был указан «translit».
Далее файл:
\core\components\translit\model\modx\translit\modtransliterate.class.php
меняем на приведенный в конце статьи. И все работает. В смысле теперь всегда Алиас будет на латинице — даже если яндекс закапризничал

<?php
/**
 * A transliteration service implementation class for MODx Revolution.
 *
 * @package modx
 * @subpackage translit
 */
class modTransliterate {

    /**
     * A reference to the modX instance communicating with this service instance.
     * @var modX
     */
    public $modx = null;
    /**
     * A collection of options.
     * @var array
     */
    public $options = array();

    /**
     * Constructs a new instance of the modTransliterate class.
     *
     * Use modX::getService() to get an instance of the translit service; do not manually construct this class.
     *
     * @param modX &$modx A reference to a modX instance.
     * @param array $options An array of options for configuring the modTransliterate instance.
     */
    public function __construct(modX &$modx, array $options = array()) {
        $this->modx = & $modx;
        $this->options = $options;
    }

    /**
     * Translate a string using a named transliteration table.
     *
     * @param string $string The string to transliterate.
     * @param string $table A named transliteration table to use.
     * @return string The translated string.
     */
    public function translate($string, $table) {
    	if (empty($string)) return $string;
    	
    	// если русские слова - на перевод в яндекс
		if (preg_match('#(\b[а-яё]+\b)#iu', $string)) 	$string = $this->yandex($string);

		$filePath = dirname(__FILE__) . '/tables/' . $table . '.php';
        if (is_file($filePath)) {
            $table = include $filePath;
            if (is_array($table) && !empty($table)) {
                $string = strtr($string, $table);
            }
        }
        return $string ;
    }


    /**
     * перевод яндексом.
     *
     * @string string $string строка перевода
     * @return string переведенная строка.
     */
    private function yandex($string) {

        $trim = $this->modx->getOption('friendly_alias_trim_chars', null, '/.-_', true);
        $string = str_replace(str_split($trim), ' ', $string);

        $service = $this->modx->getOption('friendly_alias_ytranslit_url', null,
            'https://translate.yandex.net/api/v1.5/tr.json/translate?key=[[+key]]&lang=ru-en&text=', true);
        $key = trim($this->modx->getOption('friendly_alias_ytranslit_key', null, ''));

        if (empty($key)) {
            $this->modx->log(modX::LOG_LEVEL_ERROR,
'[yTranslit] You must specify the API key! Please, get it from http://api.yandex.ru/key/form.xml?service=trnsl.');
            return $string;
        }

        $request = str_replace('[[+key]]', $key, $service) . urlencode($string);
		if (function_exists('curl_init')) {
			$url = parse_url($request);
			parse_str($url['query'], $params);
                /** @var modRestCurlClient $client */
			$client = $this->modx->getService('rest.modRestCurlClient');
			$result = $client->request(
				$url['scheme'] . '://' . $url['host'],
				$url['path'],
				'GET',
				$params,
				array(
'curlopt_timeout' => $this->modx->getOption('friendly_alias_ytranslit_timeout', null, 1, true),
'curlopt_returntransfer' => 1,
				)
			);
		}
		else {
			$result = file_get_contents($request);
        }

		$arr = $this->modx->fromJSON($result);

		if (!is_array($arr)) {
			$this->modx->log(modX::LOG_LEVEL_ERROR,
				"[yTranslit] Service unavailable.\nRequest: $request.\nResponse: $result");
		}
		elseif ($arr['code'] != 200 || empty($arr['text'][0])) {
			$this->modx->log(modX::LOG_LEVEL_ERROR,
				'[yTranslit] Service returned an error. ' . print_r($arr, true));
            }
		else {
			$string = $arr['text'][0];
		}
		return $string;
    }

}
den
den
05 февраля 2016, 16:03
modx.pro
3
4 152
+2

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

Владимир
05 февраля 2016, 22:53
2
+1
если задать двум статьям одинаковый ТИТЛ, то и Алиас, будет одинаков
— просто установите CustomUrls, настройте правило, например, [[+id]]-[[+alias]], что добавит в url значение ID и адрес документа всегда будет уникальным.
    den
    den
    05 февраля 2016, 23:33
    +1
    о, спасибо! все больше удивляет этот движок, своими возможностями. )
    а я мучался, сейчас попробуем…
      den
      den
      06 февраля 2016, 20:29
      0
      установил, полазил в настройках, почитал доки, попробовал в действии — именно то что надо.
      исходя из этого подредактировал текст статьи, оставив только совмещение яндекса с транслитом.
      следующий этап усовершенствования, если все же руки дойдут создать плагин — сделать включение яндекса в настройках.
      а сам плагин создать чисто для учебных целей, понять как это делается — в принципе…
      Роман Садоян
      07 февраля 2016, 01:20
      +1
      Далее файл:
      \core\components\translit\model\modx\translit\modtransliterate.class.php
      меняем на приведенный в конце статьи. И все работает.
      Случаем не из DLE ли ты к нам пришел?))
      Так делать не желательно, т.к. при обновлении компонента translit все изменения пропадут.
        Воеводский Михаил
        07 февраля 2016, 01:41
        0
        В теории все правильно. Но в случае translit вариант обновления компонента крайне маловероятен. Посмотри на дату его выпуска )
          den
          den
          08 февраля 2016, 16:58
          0
          Да из ДЛЕ )))
          сейчас на модх пытаюсь перенести сайт. активно изучаю, порог входа намного выше обычных движков.
          den
          den
          08 февраля 2016, 16:59
          0
          и всеж таки перенесли в раздел вопросы… мда… ну и ладно…
            Василий Наумкин
            08 февраля 2016, 17:03
            +1
            Раздел «Новые дополнения и их версии» нужен для описания новых дополнений и их версий. А «Вопросы» — чтобы задавать вопросы.

            Ты что делаешь в своей заметке — анонсируешь новое дополнение, или задаешь вопрос?

            UPD. Смотрю, вопрос из заметки уже исчез. Тогда можешь перенести её в «Готовые решения».
              Николай
              10 мая 2017, 09:43
              0
              Извините, что пишу суда, но я уже не знаю что делать возникает вот такая ошибка в «ytranslit»
              /core/components/ytranslit/model/modx/ytranslit/modtransliterate.class.php : 60) PHP warning: str_split() expects parameter 1 to be string, array given
              Из за этой ошибки не всегда убирает лишние знаки, например точки с запятой
              Вот тут открыл обсуждение https://modx.pro/help/12093/
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            9