Евгений Шеронов

Евгений Шеронов

С нами с 20 мая 2015; Место в рейтинге пользователей: #30
Fi1osof
05 января 2016, 14:41
3
+6
Сорри за долгий ответ, отвлекся.

Но по моему, дело в том, что теги Fenom на странице отрабатывают после процессинга документа
Все верно. Из-за этого и была проблема. Дело в том, что $modx->regClientStartupScript() и подобные методы работают со свойствами самого $modx, а вот при сохранении кеша используются свойства самого ресурса. А так, как в отработанных уже после процессинга тегах выполняется типа $modx->regClientStartupScript() (который устанавливает свойства для $modx, но не устанавливает их для $modx->resource), то при генерации кеша документа этих скриптов в кеше просто нет. joxi.ru/4Ak3wb9tMX8nGA
Решение: пишем плагин на событие OnBeforeSaveWebPageCache, простейший вид:
$modx->resource->_jscripts = $modx->jscripts;
$modx->resource->_sjscripts = $modx->sjscripts;
$modx->resource->_loadedjscripts = $modx->loadedjscripts;
И тогда при генерации кеша документа будут сохранены все скрипты. joxi.ru/LmGVQx0uRJN1Xr
При чем это будет выполняться только при первом заходе на страницу. Когда документ уже закеширован будет, это не будет выполняться.

UPD: Может даже имеет смысл это в ядро запулить (то есть код кешманагера поправить), так как очень похоже на багу самого MODX-а. Какая-то глупость в двух отдельных сущностях хранить эти переменные и создавать/получать в разных местах на разных этапах.
Денис Богдановский
15 декабря 2015, 16:33
1
0
Володя, подскажи, а как правильно плейсходлеры обозначить в вызове сниппета, что бы превью одного размера относились к разным изображениям?

[[!pdoPage?
	&element=`msProducts`
	&loadModels=`ms2gallery`
	&tpl=`_tpl.msProducts.row`
	&includeThumbs=`440x586`
	&leftJoin=`{
		"440x586": {"class":"msResourceFile","alias":"440x586", "on": "440x586.resource_id = modResource.id AND 440x586.path LIKE '%/440x586/' AND 440x586.rank=0"}
		,"440x586": {"class":"msResourceFile","alias":"440x586", "on": "440x586.resource_id = modResource.id AND 440x586.path LIKE '%/440x586/' AND 440x586.rank=1"}
	}`
	
	&select=`{
		"modResource":"*"
		,"440x586":"440x586.url as 440x586"
		,"440x586":"440x586.url as 440x586"
	}`

]]
Понимаю что as 440x586 в &select=` для второго изображения нужно заменить на что то типа as 440x586_2, как это задать в &leftJoin=` не понимаю.
Дмитрий
17 ноября 2015, 23:30
1
+1
Нашел решение! Оставлю тут, может кому пригодится.
В файле core/components/minishop2/model/minishop2/msproductdata.class.php 48 строку, вот эту:

if (!empty($value) || (is_array($options) && array_key_exists($key, $options))) {
меняем на
if (!empty($value)) {

После чего в таблицу базы ms2_product_options прекращают сохранятся дополнительные поля с пустыми значениями. И соответственно пропадают пустые опции в админке.
Точно гарантировать, что это не сломает ничего другого я не могу, но пока по всем моим тестам работает так как надо. Да и чисто технически хранить для каждого товара все его пустые доп. поля как-то не логично…
Максим
07 октября 2015, 13:52
8
+2
Может быть кому-то пригодится простенький сниппет для вызова mFilter2, который дописывает в параметр filters имена назначенных для категории опций — эти опции выводятся в фильтре чекбоксами:
<?php
$catid = $modx->resource->id;
$q = $modx->newQuery('msCategoryOption');
$q->select(array(
    'msCategoryOption.category_id',
    'msCategoryOption.option_id',
    'mso.key'
    ));
$q->where(array(
    'msCategoryOption.category_id' => $catid
    )
    );
$q->leftJoin('msOption','mso','msCategoryOption.option_id = mso.id');
$q->prepare();
$q->stmt->execute();
$options = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
$_options = array();
foreach ($options as $option) {
    $_options[] = 'msoption|'.$option['key'];
}
$_options = implode(',',$_options);
$scriptProperties['filters'] = implode(',',array($scriptProperties['filters'],$_options));
return $modx->runSnippet('mFilter2',$scriptProperties);
Максим Кузнецов
06 октября 2015, 17:48
1
0
Понимаете правильно, это какая-то каша.

Допустим, у вас есть сниппет pdoResources на странице вида site.ru/catalog. Ссылки с заранее определенными способами фильтрации будут выглядеть примерно вот так:
site.ru/catalog?sortby=rating&dir=ASC
site.ru/catalog?sortby=pagetitle&dir=DESC
… и так далее.

Все, что идет после site.ru/ — это get-параметр ссылки и его нам необходимо перехватывать, чтобы отдавать сниппету, выводящему ресурсы.

Мы можем создать простой сниппет GET со следующим содержанием:
<?php
	return $_GET[$get];

И вместе с данным сниппетом преобразовывать вывод ресурсов на странице примерно таким образом:

[[!pdoResources? &sortby=`[[!GET:default=`pagetitle`? &get=`sortby`]]` &sortdir=`[[!GET:default=`DESC`? &get=`dir`]]`]]

Минус данного решения в том, что пользователь может вбить свое значение в адрес ссылки, допустим: site.ru/catalog?sortby=TEST&dir=BANAN, в результате чего на странице сниппет вернет ошибку.

Поэтому, напишем свой сниппет pdoResourcesWithSort:

<?php
	//получаем значение требуемых get-параметров
	$sortby = $_GET[$sortbyGet];
	$sortdir = $_GET[$sortdirGet];
	
	//сверяем их со списком разрешенных полей для сортировки (дополнить по вкусу)
	$allowSortBy = array('pagetitle', 'publishedon', 'createdon');
	if (!in_array($sortby, $allowSortBy)) {
		//если совпадений нет - выставляем значение сортировки по умолчанию
		$sortby = 'pagetitle';
	}
	
	$allowSortDir = array('ASC', 'DESC');
	if (!in_array($sortdir, $allowSortDir)) {
		$sortdir = 'ASC';
	}

	//теперь вызываем pdoResources с отфильтрованными параметрами сортировки
	//дописать требуемые параметры вызова сниппета при необходимости
	$pdoParams = array();
	$pdoParams['sortby'] = $sortby;
	$pdoParams['sortdir'] = $sortdir;
	
	//возвращаем результат выполнения сниппета
	return $modx->runSnippet('pdoResources', $pdoParams);

Вызывается как-то так: [[!pdoResourcesWithSort? &sortbyGet=`sortby` &sortdirGet=`dir`]]
Василий Столейков
04 сентября 2015, 12:48
1
0
Ошибки и пустой экран, если пользователь неавторизован. Добавил проверку в сниппет:
<?php
$user = $modx->getObject('modUser', $input);
if($user) {
    $profile = $user->getOne('Profile');
    $extended = $profile->get('extended');
}
if($extended[$options]) {
    return $extended[$options];
}
else {
    return ' ';
}
Максим Кузнецов
28 июля 2015, 00:26
2
+3
1) По пунктам:
— При регистрации через Login нужно заносить пользователя в определенную группу (Users).
— Выставить группе анонимных пользователей права Load only на все контексты, где нужно запрашивать авторизацию
— Добавить в системной настройке unauthorized_page (403 ошибка) айди страницы с формой авторизации

После чего всех неавторизованных пользователей, при запросе на закрытую страницу, будет перебрасывать на страницу авторизации.

//Примечание: для альтернативы, если не нужна переадресация, можно создать простой сниппет (допустим, getAccess) и вызывать его на каждой странице.

Сниппет getAccess:
<?php
	$user = (!empty($userId)) ? $modx->getObject('modUser', $userId) : $modx->user;

	if (is_object($user) && $modx->user->isAuthenticated('web')) {
		return $content;
	}
	else {
		return $modx->getChunk('название_чанка');
	}
— соответственно, нужно создать чанк с формой авторизации и обозначить для сниппета параметр &content, в котором будет храниться html-код.

Пример:
<html>
	<head>
		[[$meta]]
	</head>
	<body>
		[[!getAccess? &content=`
			//ваш хтмл-код
		`]]
	</body>
</html>
(как альтернатива, можно переписать строчку сниппета «return $content» на «return $modx->getChunk($content);» — в таком случае, при вызове в поле &content нужно будет указывать название чанка, который отобразится авторизованному пользователю).

Из минусов такого метода — поисковые системы проиндексируют кучу дублей одинаковых страниц с формой авторизации.

2. modstore.pro/packages/ecommerce/payandsee — может быть, это вам поможет? В противном случае — придется настраивать свои сниппеты, завязанные на extend-полях пользователя.
Володя
25 апреля 2015, 15:22
3
+1
сделай так
<?php
switch ($modx->event->name) {

	case 'OnDocFormPrerender':

        if ($mode !== 'upd' || empty($id)) {return '';}
        if (!$modx->getObject('msProduct', $id) && !$modx->getObject('msCategory', $id)) {return '';}

        $modx->controller->addHtml('
		<script type="text/javascript">
			Ext.onReady(function() {
				var buttons = Ext.getCmp("modx-action-buttons");
				if (!buttons) {return;}
                    		for (i in buttons.items.items) {
                        		var button = buttons.items.items[i];
                        		if ("button" !== button.xtype) {continue;}
                        		if ("update" == button.process || "resource/update" == button.process) {
                            			button.enable();
                        		}
                    		}
			});
		</script>');

	break;

}
Ганин Роман
24 апреля 2015, 22:57
11
+2
Начало разработки — за пределами MODX. Вёрстка (БЭМ) шаблонов, чанков и страниц в Sublime Text 3 с использованием Gulp-задач для автокомпиляции с использованием пре- и постпроцессоров (ускоряют разработку в 4-5 раз), зависимости: bower, для UI-тестов адаптивности: BrowserSync. Минификация стилей и скриптов на клиенте (прекратите вешать эту задачу на MinifyX/сервер!). Кодстайл: CSScomb и JSCS + JSLint. В дальнейшем можно настроить автоматическую выгрузку по SFTP скомпилированных файлов прямо на сервер. Шаблонизация на клиенте легко настраивается с помощью gulp-rigger, gulp-file-include или gulp-include-source. За счет вотчеров скорость просто реактивная. Особенно удобно, если монитора два и больше — в одном мониторе код проекта, в остальных — мгновенный результат (страница обновляется быстрее, чем я успеваю перевести взгляд с одного монитора на другой или переключиться на новый раб. стол).
Инициализация сервера: ansible, установка MODX: Gitify, импорт настроек: Teleport. Импорт уже подготовленных чанков, tpl-ек занимает минуты, нет необходимости заниматься «клавадрочерством» с Ctrl+Tab (переключиться на фронтенд-вкладку), Ctrl/Cmd+R (обновить страницу), чтобы просмотреть результат — всё уже оттестированно на этапе вёрстки. Остаётся только настроить магию сниппетов и оформить Custom Forms. Дальше — оверлокинг с XDebug, debugParser, BloodLine и Chrome DevTools.
Максим
21 марта 2015, 13:27
1
0
Есть еще такое исправление, пока не принятое: github.com/Qwarble/revolution/commit/df1902d5b68e02d760842c19f3a6e647f38ff6ab