Совместил «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;
}
}
Комментарии: 9
если задать двум статьям одинаковый ТИТЛ, то и Алиас, будет одинаков— просто установите CustomUrls, настройте правило, например, [[+id]]-[[+alias]], что добавит в url значение ID и адрес документа всегда будет уникальным.
о, спасибо! все больше удивляет этот движок, своими возможностями. )
а я мучался, сейчас попробуем…
а я мучался, сейчас попробуем…
установил, полазил в настройках, почитал доки, попробовал в действии — именно то что надо.
исходя из этого подредактировал текст статьи, оставив только совмещение яндекса с транслитом.
следующий этап усовершенствования, если все же руки дойдут создать плагин — сделать включение яндекса в настройках.
а сам плагин создать чисто для учебных целей, понять как это делается — в принципе…
исходя из этого подредактировал текст статьи, оставив только совмещение яндекса с транслитом.
следующий этап усовершенствования, если все же руки дойдут создать плагин — сделать включение яндекса в настройках.
а сам плагин создать чисто для учебных целей, понять как это делается — в принципе…
Далее файл:Случаем не из DLE ли ты к нам пришел?))
\core\components\translit\model\modx\translit\modtransliterate.class.php
меняем на приведенный в конце статьи. И все работает.
Так делать не желательно, т.к. при обновлении компонента translit все изменения пропадут.
В теории все правильно. Но в случае translit вариант обновления компонента крайне маловероятен. Посмотри на дату его выпуска )
Да из ДЛЕ )))
сейчас на модх пытаюсь перенести сайт. активно изучаю, порог входа намного выше обычных движков.
сейчас на модх пытаюсь перенести сайт. активно изучаю, порог входа намного выше обычных движков.
и всеж таки перенесли в раздел вопросы… мда… ну и ладно…
Раздел «Новые дополнения и их версии» нужен для описания новых дополнений и их версий. А «Вопросы» — чтобы задавать вопросы.
Ты что делаешь в своей заметке — анонсируешь новое дополнение, или задаешь вопрос?
UPD. Смотрю, вопрос из заметки уже исчез. Тогда можешь перенести её в «Готовые решения».
Ты что делаешь в своей заметке — анонсируешь новое дополнение, или задаешь вопрос?
UPD. Смотрю, вопрос из заметки уже исчез. Тогда можешь перенести её в «Готовые решения».
Извините, что пишу суда, но я уже не знаю что делать возникает вот такая ошибка в «ytranslit»
Вот тут открыл обсуждение https://modx.pro/help/12093/
/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/
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.