Дмитрий Кондаков

Дмитрий Кондаков

С нами с 28 февраля 2013; Место в рейтинге пользователей: #234
Александр
14 июля 2024, 12:55
6
+3
RewriteCond %{REQUEST_URI} ^/assets/images/products/[0-9]+/[^/]+\.(jpg|jpeg|png|gif|webp)$ [NC]
RewriteRule .* - [F]
Запрещает доступ ко всем изображениям в папке галереи товара, но не запрещает к вложенным в подпапках
Тодор
20 декабря 2021, 18:49
4
+3
Убери
'sort'=>'resource|menuindex:asc',
оставь только
'sortby' => 'CASE `Data`.`vendor` WHEN 7 THEN 1 ELSE 0 END ASC, msProduct.id',
Сергей Лим
07 декабря 2019, 17:13
1
+2
Оптимизированный код jivosite (Дает +30 к мобильной версии и немного к пк версии)
{ignore} 
<!-- BEGIN JIVOSITE CODE {literal} -->
<script type='text/javascript'>
(function(){ document.jivositeloaded=0;var widget_id = 'ВАШ_ID';var d=document;var w=window;function l(){var s = d.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '//code.jivosite.com/script/widget/'+widget_id; var ss = document.getElementsByTagName('script')[0]; ss.parentNode.insertBefore(s, ss);}//эта строка обычная для кода JivoSite
function zy(){
    //удаляем EventListeners
    if(w.detachEvent){//поддержка IE8
        w.detachEvent('onscroll',zy);
        w.detachEvent('onmousemove',zy);
        w.detachEvent('ontouchmove',zy);
        w.detachEvent('onresize',zy);
    }else {
        w.removeEventListener("scroll", zy, false);
        w.removeEventListener("mousemove", zy, false);
        w.removeEventListener("touchmove", zy, false);
        w.removeEventListener("resize", zy, false);
    }
    //запускаем функцию загрузки JivoSite
    if(d.readyState=='complete'){l();}else{if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}
    //Устанавливаем куку по которой отличаем первый и второй хит
    var cookie_date = new Date ( );
    cookie_date.setTime ( cookie_date.getTime()+60*60*28*1000); //24 часа для Москвы
    d.cookie = "JivoSiteLoaded=1;path=/;expires=" + cookie_date.toGMTString();
}
if (d.cookie.search ( 'JivoSiteLoaded' )<0){//проверяем, первый ли это визит на наш сайт, если да, то назначаем EventListeners на события прокрутки, изменения размера окна браузера и скроллинга на ПК и мобильных устройствах, для отложенной загрузке JivoSite.
    if(w.attachEvent){// поддержка IE8
        w.attachEvent('onscroll',zy);
        w.attachEvent('onmousemove',zy);
        w.attachEvent('ontouchmove',zy);
        w.attachEvent('onresize',zy);
    }else {
        w.addEventListener("scroll", zy, {capture: false, passive: true});
        w.addEventListener("mousemove", zy, {capture: false, passive: true});
        w.addEventListener("touchmove", zy, {capture: false, passive: true});
        w.addEventListener("resize", zy, {capture: false, passive: true});
    }
}else {zy();}
})();</script>
<!-- {/literal} END JIVOSITE CODE -->


{/ignore}
mngatoff
02 декабря 2019, 02:23
6
+7
достаточно триггернуть событие change на input:count, и запрос отправится стандартными средствами минишопа.

я вот так делаю (немного вырвано из контекста, но принцип ясен):
<script>
$(document)
    .on('click touchend', countButton, function (e) { // где countButton - кнопки плюс и минус
        e.preventDefault();
        var $container = $(this).closest('.ms2_form'),
        $count = $container.find('[name="count"]'),
        num = $count.val();
        if (isNaN(num) === false) { // страховочка от, например, пустого поля
            num = parseInt(num, 10);
            switch ($(this).data('ms2-count')) { // соответственно, у кнопок должен быть атрибут data-ms2-count="plus или minus"
                case 'plus':
                    num = num + 1;
                    $count.val(num);
                    break;
                case 'minus':
                    if (num <= 1) return;
                    num = num - 1;
                    $count.val(num);
                    break;
            }
        } else {
            return false;
        }
        $count.trigger('change'); // инициализируем отправку на сервер.
    })
    .on('change keypress keyup', '.ms2_form [name="count"]', function() {
        if ($(this).val().match(/\D/)) {
            this.value = $(this).val().replace(/\D/g,''); // следим на лету, чтобы в поле были только цифры
        }
        if (parseInt($(this).val(), 10) < 1) {
            this.value = 1; // следим на лету, чтобы в поле было не меньше единицы
        }
    });
</script>
Павел Голубев
07 октября 2019, 17:56
3
+2
У TinyMCE Rich Text Editor есть баг. Если link_tag_scheme = abs, то некорректно вставляет ссылки на ресурсы и картинки.

Лечится так:
1. В системных настройках, в пространство имен tinymcerte добавляем tinymcerte.convert_urls = false
2. В файле core/components/tinymcerte/model/tinymcerte/events/tinymcerteonrichtexteditorinit.class.php:70 добавляем
'convert_urls' => $this->tinymcerte->getOption('convert_urls', array(), true) == 1,
3. Готово
Дмитрий Танцирев
12 сентября 2019, 10:00
2
+1
1. Откройте файл: "/{core_path}/components/yandexmaps/tv/input/tpl/tv.yandexMaps.input.tpl

2. Вырежьте из 108-ой строки:
window.suggestView = new ymaps.SuggestView('suggest', {literal}{'results':'9'}{/literal});
3.1 И вставьте её перед: (примерно 180-я строка)
suggestView.events.add('select', function (e) {
3.2 Таким вот образом:
var suggestView = new ymaps.SuggestView('suggest', {'results':'9'});
Игорь
20 марта 2019, 14:53
1
+2
Я бы написал сниппет, который сортирует массив объектов по нужному полю и передал $rows в него.
Примерно так:

function mySort($f1,$f2)
   {
      if($f1->tagname < $f2->tagname) return -1;
      elseif($f1->tagname > $f2->tagname) return 1;
      else return 0;
   }
 
   // uasort – сортирует массив, используя пользовательскую функцию mySort
   uasort($arr,"mySort");
   print_r($arr);
Баха Волков
11 февраля 2019, 16:23
3
+5
Позвольте переписать ваш чанк ajaxForms:

{'!AjaxForm' | snippet : [
    'form' => $form,
    'hooks' => $hooks !: 'email,FormItSaveForm',
    'emailSubject' => $emailSubject !: 'Тема письма',
    'emailTo' => $emailTo !: $_modx->config.callback_email,
    'validationErrorMessage' => $validationErrorMessage !: 'В форме содержатся ошибки!',
    'successMessage' => $successMessage !: '<div class="name">Спасибо</div><p>Ваше сообщение успешно отправлено</p>',
    'vTextMaxLength' => $vTextMaxLength !: '<div>Проверьте правильность заполнения</div>',
    'vTextMinLength' => $vTextMinLength !: '<div>Проверьте правильность заполнения</div>',
    'vTextRequired' => $vTextRequired !: 'Это поле обязательно для заполнения',
    'validate' => $validate !: 'name:required',
    'formName' => $formName !: 'Имя формы',
    'formFields' => $formFields !: 'name,pageId,pagetitle,email,message,file',
]}

Так ведь намного лучше
Николай
11 февраля 2019, 16:04
4
+1
Выложу свой способ управления множеством форм для сниппета ajaxForm, может пригодится.

Создаём чанк ajaxForms:

{if !$form} {set $form = ''}{/if}
{if !$hooks} {set $hooks = 'email,FormItSaveForm'}{/if}
{if !$emailSubject} {set $emailSubject = 'Тема письма'}{/if}
{if !$emailTo} {set $emailTo = $_modx->config['callback_email']}{/if}
{if !$validationErrorMessage} {set $validationErrorMessage = 'В форме содержатся ошибки!'}{/if}
{if !$successMessage} {set $successMessage = '<div class="name">Спасибо</div><p>Ваше сообщение успешно отправлено</p>'}{/if}
{if !$vTextMaxLength} {set $vTextMaxLength = '<div>Проверьте правильность заполнения</div>'}{/if}
{if !$vTextMinLength} {set $vTextMinLength = '<div>Проверьте правильность заполнения</div>'}{/if}
{if !$vTextRequired} {set $vTextRequired = 'Это поле обязательно для заполнения'}{/if}
{if !$validate} {set $validate = 'name:required'}{/if}
{if !$formFields} {set $formFields = 'name,pageId,pagetitle,email,message,file'}{/if}
{if !$formName} {set $formName = 'Имя формы'}{/if}
{if !$validationErrorMessage} {set $validationErrorMessage = 'В форме содержатся ошибки!'}{/if}

[[!ajaxForm?
	&form=`{$form}`
	&hooks=`{$hooks}`
	&emailSubject=`{$emailSubject}`
	&emailTo=`{$emailTo}`
	&validationErrorMessage=`{$validationErrorMessage}`
	&successMessage=`{$successMessage}`
	&vTextMaxLength=`{$vTextMaxLength}`
	&vTextMinLength=`{$vTextMinLength}`
	&vTextRequired=`{$vTextRequired}`
	&validate=`{$validate}`
	&validationErrorMessage=`{$validationErrorMessage}`
	&formName=`{$formName}`
	&formFields=`{$formFields}`
	&fieldNames=`{$fieldNames}
    `
]]

Это единый чанк, в котором вызывается сниппет ajaxForm с необходимыми параметрами.

В моём случае каждая отдельная форма — это отдельный чанк. Если эти чанки мало чем различаются, то можно использовать extends из fenom, переписывая лишь изменяющиеся значения, а остальное не трогать.

И далее в шаблоне страницы вызов нужной формы:

{include 'ajaxForms' 
    form='callback'
    emailSubject='Обратный звонок'
    validate='name:required,phone:required'
    formFields='name,phone,pagetitle'
    formName='Обратный звонок'
}

В нём мы подменили значения, передающиеся в чанк ajaxForm.

Пример чанка callback с формой:

<div style="display: none;" id="{block 'id'}callback{/block}" class="popup">
    <div class="title">{block 'title'}Заказать обратный звонок{/block}</div>
    <div class="desc">{block 'desc'}Оставьте заявку, и мы свяжемся с вами в самое ближайшее время{/block}</div>
    <form role="form" method="POST" action="[[~[[*id]]]]" enctype="multipart/form-data">
        <input type="hidden" name="pagetitle" value="[[*pagetitle]] ([[*id]])">
            
        <input type="text" name="name" value="[[!+fi.name]]" placeholder="Ваше имя" required="required" />
        <span class="error error_name">[[+fi.error.name]]</span>
        
        <input type="tel" name="phone" value="[[!+fi.phone]]" placeholder="Ваш телефон" required="required" />
        <span class="error error_phone">[[+fi.error.phone]]</span>
        
        <div class="privacy">Отправляя заявку, Вы соглашаетесь на обработку персональных данных
согласно <a href="{29|url}">Пользовательскому соглашению</a></div>
        
        <button class="button-yellow" type="submit" value="{md5(rand())}" name="submit">Отправить</button>
    </form>
</div>

Если нужно вызвать похожую форму но с другим заголовком и другими параметрами, то создадим чанк question, который наследует чанк callback:

{extends 'callback'}

{block 'id'}question{/block}
{block 'title'}Задать вопрос{/block}
{block 'desc'}Задайте свой вопрос, и мы с вами свяжемся{/block}

И вызов этой формы в шаблоне страницы:

{include 'ajaxForms' 
    form='question'
    emailSubject='Задать вопрос'
    validate='name:required,phone:required'
    formFields='name,phone,pagetitle'
    formName='Задать вопрос'
}

Таким образом, для всех форм мы можем задать единые параметры вызова сниппета ajaxForm, и при необходимости перезаписать их. А также под каждую форму либо создать отдельные чанки, либо унаследовать от одного чанка кучу других с индивидуальными параметрами.

Дополнительно я скрываю уведомления jgrowl js-скриптом:

$(document).on('af_complete', function(event, response) {
    if (response.success) {
        $.fancybox.close();

        $.fancybox.open({
        	src  : '#popup-success',
        	type : 'inline',
        	opts : {
        		afterShow : function( instance, current ) {
        			// console.info( 'done!' );
        		}
        	}
        });
    } else {
        for (var prop in response.data) {}
    }
    response.message='';
});

Все уведомления об ошибках показываются под полями форм, в коде span c классом error. А если форма успешно отправлена, то с помощью скрипта выше мы скрываем popup-форму, если она была открыта, и показываем другое popup-окно:

<div style="display: none;" id="popup-success" class="popup">
    <div class="title">Данные успешно отправлены</div>
    <div class="success">
        <img src="/assets/img/success.png" alt="">
    </div>
</div>

Оно же всплывает и при отправке обычных не popup-форм. Да, насчёт popup-окон, актуально при использовании flexbox3.
Алексей
10 декабря 2018, 16:48
1
0
Мне ещё помогла данная команда определить зараженный файлы:
find -newerct "1 Sep 2018" ! -newerct "10 Dec 2018" -ls
Запускать из консоли. Просто смотрим дату создания файла с вирусом, и в корневой директории доступной для php запускаем из командной строки пользователя данную команду с разбегом ±месяц. Видимо вирус не удосужился заменить дату создания файлов, поэтому его можно вычислить.
Ну а эта команда покажет список файлов созданных между 1 сентября 2018 года и 10 декабря 2018 года.