Klike

Klike

С нами с 14 января 2015; Место в рейтинге пользователей: #48
Володя
23 ноября 2016, 23:10
1
0
вызов mFilter2 самый обычный
вот пример набросал, тут чанк продукта и вызов
gist.github.com/vgrish/78f506cf2fbb940acad3dd9d57ed49cb
DocentBF
25 июня 2016, 20:36
4
+4
Можно переписать метод mSearch2.handleSort или подключить к mFilter2 cвой скрипт фронтенда или переопределить метод в другом js файле, например как-то так:
if (typeof(mSearch2) !== "undefined") {
mSearch2.initialized = false;
mSearch2.handleSort = function() {
    var params = this.Hash.get();
    if (params.sort) {
            var sorts = params.sort.split(mse2Config.values_delimeter);
            for (var i = 0; i < sorts.length; i++) {
                var tmp = sorts[i].split(mse2Config.method_delimeter);
                if (tmp[0] && tmp[1]) {
                    $('#mse2_sort option[data-sort="' + tmp[0] + '"][value="' + tmp[1] + '"]').attr('selected', 'selected').trigger('change');
                }
            }
        }
        $(document).off('click', this.options.sort_link);
        $(document).on('change', '#mse2_sort', function() {
            var selected = $(this).find('option:selected');
            var sort = selected.data('sort');
            sort += mse2Config.method_delimeter + selected.val();
            mse2Config.sort = (sort != mse2Config.start_sort) ? sort : '';
            var params = mSearch2.getFilters();
            mSearch2.Hash.set(params);
            mSearch2.load(params);
        });
    }
    mSearch2.initialize('body');
}
а select представить например так:
<select id="mse2_sort">
    <option value="asc" data-sort="resource|pagetitle">по умолчанию</option>
    <option value="asc" data-sort="ms|price">по возрастанию цены</option>
    <option value="desc" data-sort="ms|price">по убыванию цены</option>
</select>
Сергей Шлоков
23 апреля 2016, 11:10
5
+3
Я для себя сделал такой плагин. Сильно не заморачивался. Просто скопировал код из Ace.
<?php
switch ($modx->event->name) {
    case 'OnDocFormPrerender':
        if (!$modx->controller->resourceArray) {
            return;
        }
        $field = 'modx-resource-introtext';
        $mimeType = $modx->getObject('modContentType', $modx->controller->resourceArray['content_type'])->get('mime_type');
        if ($mimeType == 'text/html' && $modx->getOption('pdotools_fenom_parser')) {
            $mimeType = 'text/x-smarty';
        }
		$modxTags = 1;
		$script = "MODx.ux.Ace.replaceComponent('$field', '$mimeType', $modxTags);";
		$script .= "MODx.ux.Ace.replaceTextAreas(Ext.query('.modx-richtext'));";
		$modx->controller->addHtml('<script>Ext.onReady(function() {' . $script . '});</script>');
        break;
    default:
        return;
}
Александр
25 марта 2016, 18:00
1
0
Может кому интересно и пригодиться в работе.

1. Пишем простой сниппет:
<?php
switch ($value){
    case "черный":
        echo "#000";
        break;
    case "коньячный" :
        echo '#5c1b1d';
        break;
    case "бордовый":
        echo "#a50022";
        break;
}
2. В tpl.msOptions.row:
<li>
    <div style="width:25px; height:25px; background:[[color? &value=`[[+value]]`]]";>
</li>
И теперь можем писать текст цвета в поле «Цвет» в карточке товара.
Алексей
08 февраля 2016, 16:37
3
+2
у меня никаких особых защит не стоит — ни капчи, ни текстовых вопросов.
защита серверная.
Все дело в спам-программах — они сначало пытаются понять, с каким движком имеют дело, а только потом уже заспамиться\зарегистрировать пользователя\оставить ссылку, делают они это по следующим признакам:
1. наличие footprint'а в файле html
Powered by wordpress
Powered by joomla
Этот пункт не относится к MODX — пропускаем
2. ломятся по известным адресам (папкам)
/bitrix/
/user/
/users/
/registrate/
/login/
И так далее — тут они понимают, битрикс ли это или форум phpbb, или что там еще.
Вот этот пункт интересен.
В nginx вешаем правило
location ~* ^/(blocks|bitrix|user|users|registrate|login|node|netcat|wp-admin|wp-content|wordpress|engine|blocks|administrator|PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2)(|/) {
	try_files $uri =404;
}
— исключительно чтобы не нагружать php5-fpm\hhvm демон спамными запросами, динамический бэкэнд и там отдаст 404 ошибку т.к. этих папок нет.
Потом ставим fail2ban, и организуем следующий jail:
/etc/fail2ban/filter.d/nginx-noscript.conf
[INCLUDES]
before = common.conf

[Definition]
failregex = 	
		^[^ ]* <HOST> -.*"GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi).*" 404
		^[^ ]* <HOST> -.*"GET.*/(blocks|bitrix|user|users|registrate|login|node|netcat|wp-admin|wp-content|wordpress|engine|blocks|administrator|PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2).*" 404
		^[^ ]* <HOST> -.*"GET.*" 403
		^[^ ]* <HOST> -.*"GET.*" 401
		^[^ ]* <HOST> -.*"GET.*" 444
ignoreregex =
и в файле:
/etc/fail2ban/filter.d/jail.conf
[nginx-noscript]
enabled = true
port = http,https
#action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript 
logpath = /var/log/nginx*/*access*.log
maxretry = 3
bantime = 600
Таким образом, любой, кто запросит подобные расположения папок: example.com/bitrix более 3 раз (maxretry = 3), попадет в бан по IP адресу на 10 минут (bantime = 600)
При такой защите не только у спам-программ отпадает охота сканить ваш сайт, но и у тех, кто делает это вручную.
+Абсолютная неуязвимость к программам определяющих на какой CMS ваш сайт
+Практически никакого спама (только если форма отправки сообщений висиь на главной страничке)
+Разгрузка динамического бэкэнда php5-fpm\hhvm от ненужных запросов

Все эти интересные пути запрашиваются тысячами, обнаружить их можно анализируя логи через удобный интерфейс piwik, который называется log analizator, серверный скрипт, написанный на питоне. Смотрит все логи nginx и строит по ним всякие графики, пободно yandex.metrika, только по логам а не через прикрепляемый javascript (хотя такая возможность тоже есть). Тут же можно следить, как часто робот яндекса\гугла посещает ваш сайт.
Abu
Abu
20 января 2016, 20:55
1
0
Сделал такой плагинчик на OnDocFormPrerender, для родителя id=5 скрывать цену и артикул, case 26 скрывать introtext. Работает и при создании товаров.

<?php
switch($modx->event->name) {
    case 'OnDocFormPrerender': 
        if($mode == modSystemEvent::MODE_NEW) {
           $s = intval($_REQUEST['parent']);
        } else {
                    $s = $resource->get('parent'); //родитель товара
        }

        switch($s) {
        case 5: 
            $modx->regClientStartupHTMLBlock('
           
            <script type="text/javascript">
                Ext.onReady(function () {
                     var divs= Ext.get("modx-resource-main-left").child("fieldset");
                     divs.hide();
                });
            </script>
                        
            ');
            break;
        case 26: 
            $modx->regClientStartupHTMLBlock('
           
            <script type="text/javascript">
                Ext.onReady(function () {
                     var divs= Ext.get("x-form-el-modx-resource-introtext").parent();
                     divs.hide();
                     
                     var vendors = Ext.get("x-form-el-modx-resource-vendor").parent();
                     vendors.hide();
                });
            </script>
                        
            ');
            break;

        default: ; 
        }     
    break;  
}
Володя
09 июля 2015, 09:18
2
+1
примитивный пример:
Создать сниппет — QveryCustom
вызов
[[!QveryCustom?
&QveryCustom=`[[*pagetitle]]`
]]
код сниппета
$_REQUEST['QveryCustom'] = $QveryCustom;
return '';
вызов mSearch2
[[!mSearch2?
&queryVar=`QveryCustom`
]]
все, радуемся…
Василий Наумкин
30 мая 2015, 17:37
1
0
Через xPDO выбрать объекты msProductFile, сравнить с чем нужно и сделать remove() — это удалит основной файл и все его превьюшки.
Сергей Фещуков
18 апреля 2015, 08:58
1
+1
Кому интересно, предлагаю свой вариант подобного сниппета, но только тут несколько отличий:
1. Можно указать любого пользователя, а не текущего.
2. Если несколько полей или указан параметр toPh, то всё сохраняется в плейсхолдерах.
3. Если указано одно поле, оно и выводится при вызове сниппета.
<?php
if ( empty($id) ) return false;
$fields = empty($fields) ? array('fullname') : explode(',', trim($fields));
$toPh = empty($toPh) ? false : true;
$user = $modx->getObject('modUser', intval($id));
$profile = $user->getOne('Profile');
foreach ($fields as $field) {
    $field = trim($field);
    $return[$field] = $profile->get($field);
}
if ($toPh || count($return) > 1) $modx->toPlaceholders($return, 'user.'.$id);
else return $return[$field];

А ваш сниппет можно было уместить в несколько строк:
<?php
$profile = $modx->user->getOne('Profile');
$value = $profile ? $profile->get($field) : '';
return empty($value) ? '' : $value;