Владимир Викторович Доморецкий

Владимир Викторович Доморецкий

С нами с 14 декабря 2012; Место в рейтинге пользователей: #685
Для новых документов такое решение может и пойдет, но для ресурсов которые уже созданы, это дублирование. Ведь можно добавить флажок в системных настройках «использовать язык по умолчанию для стандартных полей ресурса». Либо расширить плагин или сниппет, который может на прямую запросы строить без обязательной привязке к класу «localizatorContent» (к примеру если вызывать pdoPage c ajax button, то пагинация не работает, говорит что не знает про класс localizatorContent при нажатии на кнопку «Подгрузить еще», а это из-за расширения стандартного pdoFetch — если вызывать сниппет pdoPage без leftjoin, select, where). Просто хочеться чуть больше гибкости, чтобы сайт который уже работает с 1000 новостями не перебивать через скрипты тупо дублируя их еще в одной таблице для стандартного языка (ru) и для английского языка (en). Ведь никто не будет переводить старые новости, а просто оставит старые как есть, причем на двух языках, но не выводить их не правильно, и дублировать не правильно.
У меня есть мой сниппет HistoryMod (один из елементов самописного дополнения), который отлично работает с Fenom.
Решил добавить фильтр через выпадающий список по годам.
Обрабатываю акцию вот так:
if(!empty($_POST['selYear'])){
	    $params = array();
            $params['type'] = $_POST['type'];
            $params['year'] = $_POST['selYear'];
            $params['tpl'] = 'tpl.full';
            $res = $modx->runSnippet('HistoryMod', $params);
	    }
результат приходит правильно, но в шаблоне не обрабатываются феном теги, а модикса обрабатываются ({dt_item} — не работает, [[+dt_item]] — работает).
В настройках pdoTools все включено.
Шаблон с моими феном тегами tpl.full:
<div class="month">{$dt_item | date : 'F'}</div>
Напомню: изначально феном теги обрабатываются. Страница загрузилась, все хорошо. Выбираю из выпадающего списка год, запрос уходит куда нужно, скрипт обрабатывается, но феном теги перестают работать.
Выходит что вызывать свой сниппет в сниппете нельзя?
Или что еще нужно сделать чтобы
$modx->runSnippet('HistoryMod', $params);
начал работать с тегами Fenom?
При отмене оплаты не редиректит на страницу указанную в системных натсройках. Всегда перенаправляет в корзину. Что делать? Дружественные урлы включены.
А если используют прокси для спама?)
<form name="myform" novalidate>
Вы пытаетесь сфокусироваться на поле которое скрыли. Увы вангующих нет.
А кто-то ковырял migxLoopCollection + Fenom при использовании MIGXdb и multiple formtabs?
Есть три конфигурации для мультиформ, одна основная, которая указывается в тв для ресурса и две как переключатели.
Столкнулся с такой проблемой что путем:
{set $rows = json_decode($_modx->resource.mytvname, true)}

выводятся только поля основной migx конфигурации.
А вот когда использую сниппет:
[[migxLoopCollection?
                &classname=`myclass`
                &packageName=`mypackage`
                &limit=`0`
                &debug=`0`
            ]]
Выводит все поля всех связанных конфигураций. Вывести бы все поля через Fenom, было бы идеально.
Настройки в источнике файлов проведите, там basePath
/assets/uploads/ и basePathRelative — Да, baseUrl/assets/uploads/ и
baseUrlRelative — Да.

Я сейчас использую CKEditor
siteStatistics 2.2.1-pl
С чем может быть связана ошибка в логах?
Ошибка:
[full_path]/core/xpdo/om/xpdoobject.class.php : 1452) Error 23000 executing statement:
INSERT INTO `modx_stat_page_statistics` (`rid`, `user_key`, `date`, `month`, `year`, `views`) VALUES (3, '68c21c6a42ceb97531b59a6a7c572c72', '2018-12-17', '2018-12', '2018', 1)
Array
(
    [0] => 23000
    [1] => 1062
    [2] => Duplicate entry '3-68c21c6a42ceb97531b59a6a7c572c72-2018-12-17' for key 'PRIMARY'
)
Визов сниппета:
[[!siteStatistics? &mode=`site` &countby=`day`]]
Чанк tpl.siteStatistics
<div class="site-statistics" title="Статистика за день">
	<div class="stat-left-side"><i class="icon-pie-chart"></i></div>
	<div class="stat-right-side">
	    [[!siteOnlineUsers? &tpl=`tpl.mySOU`]]<i class="stat-icon icon-users" title="онлайн (за 5 м)"></i>
		[[+users]]<i class="stat-icon icon-users" title="пользователи"></i>
		[[+views]]<i class="stat-icon icon-eye" title="просмотры"></i>
	</div>
</div>
Чанк tpl.mySOU(pdoFenom):
{set $users = $_pls['stat.online_users']}
{set $guest = $_pls['stat.online_guests']}
{set $result = $users + $guest}
{$result}
Небольшой фикс для мультиязычных сайтов. Проблема в том что на других контекстах сниппет возвращал некорректный текст для «5 часа назад». Заходим в core/components/dateago/include/declension.php
ищем строчку 19:
if ($lang == 'ru') {
Изначально не разобрался и написал Василию не правильное решение, но сегодня решил по другому — заменяем строчку на:
$ctxKey = $modx->context->key;
$ctx = $modx->getContext($ctxKey);
$curLang = $ctx->getOption('cultureKey', null, 'default');

if($lang == $curLang){
На самом деле проще убрать этот блок проверки вовсе, либо проверять как if($lang != 'test'), либо просто добавить в условие:
if ($lang == 'ru' || $lang == 'de' || $lang == 'en') {
...
}
Думаю стоит добавить в вызове как сниппета так и модификатора возможность указания тех языков, которые хочешь обрабатывать в данном условии.
Я установил дополнение modHelpers, теперь все формы защищаю от CSRF. Так вот в этом дополнении есть замечательный механизм генерации самого CSRF токена и его проверки. Дополнительная защита от более продвинутых «хацкеров».
Если интересно, можете почитать тут.
Алексей. Подскажите, правильно ли я понимаю, если мне нужно добавить проверку CSRF токена, после нажатия на кнопку «Отправить» то необходимо внести изменения в "assets/components/easycomm/action.php"?
Если да, то как я понял добавлять проверку нужно перед $easyComm->createMessage($_POST); как-то так:
switch ($action) {
    case 'message/create':
	if(checkCsrfToken()){
        	$response = $easyComm->createMessage($_POST);
	}
        break;
    default:
        $response = $modx->toJSON(array('success' => false, 'message' => $modx->lexicon('ec_unknown_action')));
}
Или есть более изящный способ? Может быть плагин на одно из событий easyComm?
Нельзя ставить в форме такие конструкции:
pattern="^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+\\.[a-z]{2,4}$"
Парсер pdoTools ругается на все что в фигурных скобках)
Плагин на событие OnFileManagerUpload
<?php
// проверяем нужное событие
if ($modx->event->name != 'OnFileManagerUpload') {return;}

// подключаем phpthumb
require_once MODX_CORE_PATH.'model/phpthumb/phpthumb.class.php';

// параметры загружаемого файла
$file = $modx->event->params['files']['file'];
$directory = $modx->event->params['directory'];

// получаем media source
$ms = $modx->event->params['source'];
if($ms == null){
	return;
}

// настройки media source
$msProperties = $ms->get('properties');
$directory = $msProperties['basePath']['value'].$directory;

// на всякий случай проверяем наличие // и заменяем на /
$directory = str_replace('//', '/', $directory);

// настройки плагина
$config = array(
        $directory => array(
		'src' => array('w' => 1280,'h' => 1024,'zc' => 0,'q' => 80, 'fltr' => 'wmi|/watermark/logo.png|BR|50|5'),
		),
);

// смотрим, что при загрузке не возникло ошибок
if ($file['error'] != 0) {
	//fwrite($handle,"Ошибка при загрузке файлов \n");
	return;
}

$name = $file['name'];
$extensions = explode(',', $modx->getOption('upload_images'));

// проверям, что наша категория задана в настройках плагина
if (array_key_exists($directory, $config)) {
	$config = $config[$directory];
} else {
	return;
}

// путь к файлу, имя файла, расширение
$filename = MODX_BASE_PATH.$directory.$name;
$def_fn = pathinfo($name, PATHINFO_FILENAME);

$ext = pathinfo($name, PATHINFO_EXTENSION);

// проверяем, что расширение файла задано в настройках MODX, как изображение
if (in_array($ext, $extensions)) {
	$sizes = getimagesize($filename);
	$format = substr($sizes['mime'],6);

	// бежим по всем полям массива с конфигом
	foreach($config as $imgKey =>$imgConfig){
		$options = '';
		if($imgKey == 'src'){
		  // для ключа src имя файла совпадает с исходным
		  $imgName = $filename;
		} else {
		// формируем имя файла
		  $imgName = MODX_BASE_PATH.$directory.$def_fn.$imgKey.'.'.$ext;
		}

		// создаем объект phpThumb..
		$phpThumb = new phpThumb();
		// ..и задаем параметры
		$phpThumb->setSourceFilename($filename);
		foreach ($imgConfig as $k => $v) {
			$phpThumb->setParameter($k, $v);
		}

		// генерируем файл
		if ($phpThumb->GenerateThumbnail()) {
			if ($phpThumb->RenderToFile($imgName)) {
			    //$source->renameObject($imgName, $newName);
				// устанавливаем права на файл, это опционально, зависит от сервера
				//chmod($imgName, 0666);
			}
		}
	}
} else { 
    return;
}
Этот плагин выкладывал Безумкин Василий, вот только не помню где.
Не забудьте поменять настройки плагина под ваши потребности. Там не только ватермарк накладывается но и ресайз изображения делается. Вы можете оставить только наложения ватермарка.
else для данного случая не нужно.
<base href="/" />
И старайтесь для такой мультиязычности использовать ссылки типа:
&scheme=`full`
{1 | url : ['scheme' => 'full'] }
{$_modx->makeUrl(1,'','','full')}
Две строчки кода) Я просто допилил немного компонент, вывожу еще дату ответа, и дату редактирования ответа, если редактирование было. Добавил проверку поля почты, раньше можно было вводить что душе угодно. :)
Доброго времени. Возник вопрос: при мультиязычном сайте на трех контекстах для перевода использую словари (управление словарями — easycomm), при этом элементы формы все переводятся но сообщения об ошибке нет, почему?)

На примере!
При пустом поле на:
— русской версии: «Ваше имя» выводит сообщение «Вы не указали Ваше имя»;
— английской версии: «Your name» выводит сообщение «Вы не указали Ваше имя»( а должно «You did not enter your name»);
При этом в управлении словарями все переведено.
А никто не задумывался, как построить такой компонент для мультиязычных сайтов? Представте что у пользователя сайт на трех языках, получается что введенная инфа в таблице на русском будет выводиться и на всех трех языках на русском. Печалька :)
Выход пока один:
Ставим в вызове pdoPage
&processTVs=`0`
и в чанке где ссылка на изображение ручками пишем:
<img src="assets/img/[[+image]]" alt="">