0.00
97 читателей, 78 топиков

Как перевести заголовок страницы в ЧПУ на английском языке. Идея и исполнение для дальнейшей разработки.

Проблема

Довольно часто на сайтах можно встретить ЧПУ смешанного типа. Допустим, «site.ru/news/ekonomika/obama-prinyal-zakon.hyml»
Мы видим в этом УРЛ смешение транслита и нормального перевода. Не знаю как вам, но меня это зачастую коробит. Хочется однообразия — или везде перевод, или везде транслит.

Как поступал

Брал в файлике структуру сайта, загонял в переводчик и уже оттуда копировал-вставлял англоязычные термины в админку. Брр.

Как решить проблему

Будем писать плагин автоматического перевода pagetitle.
Итак, для начала нам нужно зайти на Яндекс.Апи переводчика и получить себе ключ.
Дальше ползём в админку MODx и создаём плагин. Я назвал его yandexTranslation. В «Системных событиях» отмечаем галочку «OnDocFormRender».
Код плагина:

global $e;
$e = &$modx->Event;
$e->output('<!-- yandexTranslation --->
<script>
    window.$j = jQuery.noConflict();
    key="ВАШ КЛЮЧ АПИ";
    source=$j("input[name=\'pagetitle\']");
    result=$j("input[name=\'alias\']");
    url=\'https://translate.yandex.net/api/v1.5/tr.json/translate\';
    function get_translate(source,result,key,debugTxt){
        if(source.val().length>0)
            {
                $j.ajax({
			type:\'POST\',
			url: url,
			cache: false,
			data:{
				key:key,
				text:source.val(),
				lang:\'ru-en\'
				},
			success:function(data){
				responseStatus=data[\'code\'];
				if (responseStatus==200)
				{
				    responseText=data[\'text\'][0];
				}
				else
				{
				    responseText=\'Error! \' + responseStatus;
				}
				re=/[^a-zа-я]/g;
                		responseText=responseText.toLowerCase();
				responseText =  responseText.replace(re,"-",responseText);
				result.val(responseText);
			},
			error: function (xhr, ajaxOptions, thrownError) {
				alert(\'Error ajax\');
			}
			});
		}
		else
		{
			source.css(\'border\',\'1px solid red\');
		}
	};
    $j(source).bind(\'blur change click\',function(){
        get_translate(source,result,key,"change");
    });			
</script>
<!-- // yandexTranslation --->');

Что делает:

При событиях blur change click на поле pagetitle отправляет аякс-запрос на сервер перевода, получает ответ, слегка форматирует его и устанавливает в поле alias
Вместо тысячи слов:

P.S.
Это не готовый модуль, а просто идея для дальнейшей разработки. Тем не менее, он упростил жизнь контент-менеджера примерно в два раза.
В светлом будущем надеюсь на подобный функционал уже в боевой версии MODx.

[EVO] Плиточная галерея из вордпресса

С таким выводом картинок я столкнулся при переносе сайта с вордпресса на MODX. Описание алгоритма найти не удалось, долго возиться с этим сайтом тоже не хотелось, поэтому я взял готовый код для вордпресса.
Получился такой сниппет для использования с MultiPhotos SimpleGallery — github.com/Pathologic/tiledphotos

Вызов сниппета:
[[tiledphotos? &width=`540` &margin=`2` &css=`1`]]

width — максимальная ширина блока, в котором выводятся картинки, margin — расстояние между картинками, css — подключает стили из вордпресса.

Дополнительно можно использовать параметр &k — это коэффициент увеличения размеров превьюшки (не знаю, зачем я его использовал) и параметр $thumbOptions — дополнительные параметры для phpthumb (по умолчанию — zc=C).

Шаблоны для вывода обрабатываются так же, как в DocLister, стартовый набор — в коде сниппета.

В шаблоне groupTpl можно задавать ширину в процентах с помощью плейсхолдера [+rel.width+]. Стили в комплекте вроде бы изменены под этот случай.

Так как картинки добываются в конечном итоге с помощью DocLister, то для пагинации и т.п. нужно использовать параметры DocLister.

Выглядит так:

Или так — зависит от ширины блока и разнообразия размеров картинок:

[EVO] Рейтинг для товара с JotX

Добрый день.
Сегодня написал сниппет который выводит рейтинг для товара с использованием JotX.
Наверняка можно лучше сделать, но на скорую руку меня вполне устроил.

Логика
Пользователь оставляя комментарий к товару оценивает его.

Использование
1. Устанавливаем JotX и правим один из трех файлов assets/snippets/jot/configs добавля, ну например select (в моем случае это tree.config.php)

[+form.guest:is=`1`:then=`
		<div class="jot-controls">
			<div class="jot-input-prepend">
				Отцените товар 
				<select name="zvezda">
					<option value="0" disabled selected>Выбор</option>
					<option value="1">1</option>
					<option value="2">2</option>
					<option value="3">3</option>
					<option value="4">4</option>
					<option value="5">5</option>				
				</select>
			</div>
		</div>
	`+]

2. Создаем сниппет show-rating

<?php
/*
* show-rating
*
* Рейтинг товара для JotX
*
* [[show-rating? &docid=`[*id*]` &customfields=`zvezda`]]
*
* &docid - ID документа
* &customfields - название кастомного поля которое было выбранно в JotX
*
* Author:
*       darksmoke from modx.im
*       dsmoke(at)ukr.net
*/

$docid= $modx->db->escape($docid); 

$res = $modx->db->query("SELECT `jot_fields`.label, `jot_fields`.content FROM `jot_content` RIGHT JOIN `jot_fields`  ON `jot_content`.`id`= `jot_fields`.`id` WHERE `jot_content`.`uparent`='". $docid ."' ");

$count = $modx->db->getRecordCount($res);

if($count >= 1) { 
	while( $row = $modx->db->getRow( $res ) ){
		if($row['label'] == $customfields)
			$r+= $row['content'];
	}
	$raiting = round($r/$count,1);  
	$output = '<div class="myraiting'.round($raiting).'"><span>рейтинг '.$raiting.'<span></div>';
} else { 
	// нет рейтинга
	$output = '<div class="myraiting0"></div>';
}

return $output;
?>

3. Вызываем JotX что бы можно было голосовать за товар
[[JotX? &config=`tree` &customfields=`zvezda`]]

4. вставляем в шаблон вывод рейтинга
[[show-rating? &docid=`[*id*]` &customfields=`zvezda`]]

С помощью css приводим результат в нужный вид.

Разрядность числа. Отступ в тысячных.

Добрый день.
Дизайнер нарисовал макет где цена должна выглядеть так
1 000 руб.
а не так
1000 руб.
.
Думал сначала регуляркой сделать, а потом нашел функцию number_format().

Получился сниппет в одну строку

<?php
/*
* number_format
*
* Делает отступ в числе, например: 1 000, 53 592
*
* [[number_format? &num=`ЧИСЛО` &razryd=`КОЛ-ВО СИМВОЛОВ ПОСЛЕ ЗАПЯТОЙ` &seperator=`РАЗДЕЛИТЕЛЬ`]]
*
* Author:
*       darksmoke from modx.im
*       dsmoke(at)ukr.net
*/
if(is_numeric($num) && is_numeric($razryd))
        return $num = number_format($num, $razryd, $seperator, ' ');
?>

Ничего военного, но мне на будущее, может новичкам тоже.

Bootstrap Generator

Привет всем! Только что закончил работу над веб-приложением, который назвал Bootstrap Generator. Делал это приложение для себя, но позже решил выложить на общее пользование.

С помощью этого приложения каждый может быстро и просто создать кастомизированный простой HTML шаблон на основе Twitter Bootstrap с использованием набора иконок Font Awesome.

Пример того, что можно получить на выходе здесь — bootgen.fantomslim.ru/demo/

Пользуйтесь, кто хочет!

P.S.: В 12 ночи удаляю все шаблоны созданные за предыдущий день. Привязка шаблона идет к сессии браузера, так что после завершения сессии можете потерять настройки, которые были внесены!

Перенос документов с joomla на modx (evo + revo)

Я думаю, что многие задавались таким вопросом, а рабочего решения в сети нет и не было.

Скрипт переноса данных из joomla (начиная с 1.5) в ваш modx (evo или revo, поддержка всех версий)


что может:
  1. отфильтровать статьи по статусу и по категории которой они принадлежат.
  2. экспортировать документы в csv с сохранением урлов (просто алиас или вариация id+alias, в зависимости от

Читать дальше →

[EVO] Сниппет посещаемости страницы на основе Google Analytics

Встал вопрос о выводе количества посещаемости страницы, информации по этому вопросу было не много, были решения, использующие стандартные возможности modx, но они были не точными, поэтому решил воспользоваться данными из Google Analytics.

Надеюсь сниппет будет полезен не только мне.

Сниппет выводит данные об уникальных посещениях страницы:
Читать дальше →

[EVO] Вывод материала в ditto при условии checkbox в TV

Добрый день!
Никак не могу найти решения вопроса:
Необходимо вывести на главной странице материалы, в которых отмечен checkbox «На главную»
Предполагаю проще всего сделать через ditto, но если варианты лучше, то значит по другому.

Небольшая мелочь для MultiTV

В MultiTV в ориентации horizontal есть такой параметр как 'width'.

Вот тут например, если кто не понял о чем я.

$settings['display'] = 'horizontal';
$settings['fields'] = array(
	'event' => array(
		'caption' => 'Event',
		'type' => 'date',
		'width' => '150'
	),
        ...
        ...


У ориентации vertical ее нет.
Чтобы добавить такой параметр я привел ниже описание.

Читать дальше →

[REVO] GridEditor - альтернатива дереву ресурсов MODx

MODx прекрасен, но иногда дерево ресурсов (resource tree) начинает раздражать.
Особенно для больших сайтов. Или для каталогов. И хочется получить обычный табличный способ редактирования. Плюс хочется массовых операций, массового редактирования ресурсов и т.п.

Один из вариантов решения это компонент GridEditor. Его текущая версия доступна тут github.com/alanpich/grideditor

Для установки скачиваем пакет отсюда (на момент написания топика 1.0 rc1): github.com/downloads/alanpich/grideditor/grideditor-1.0-rc1.transport.zip

В итоге получаем возможность редактировать страницы примерно в таком виде. Сам grid можно настраивать. Описание параметров там же.



Еще один способ кроме этого — использовать MIGXdb, как описано тут

Этот вариант я еще не пробовал, попробую — опишу
UPD: попробовал, описал: modx.im/blog/research/1845.html
UPD2: Спасибо Pathologic, за наводку, опробовал еще и Collections и его собрата GridClassKey.