Александр · 14 июля 2024, 12:55 RewriteCond %{REQUEST_URI} ^/assets/images/products/[0-9]+/[^/]+\.(jpg|jpeg|png|gif|webp)$ [NC] RewriteRule .* - [F]Запрещает доступ ко всем изображениям в папке галереи товара, но не запрещает к вложенным в подпапках Вопросы / Запретить доступ к основным изображениям Minishop через .htaccess 3 +3 6
Тодор · 20 декабря 2021, 18:49 Убери 'sort'=>'resource|menuindex:asc',оставь только 'sortby' => 'CASE `Data`.`vendor` WHEN 7 THEN 1 ELSE 0 END ASC, msProduct.id', Вопросы / [mFilter2] Как выводить сначала товары с определённым свойством? 11 +3 4
Сергей Лим · 07 декабря 2019, 17:13 Оптимизированный код 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} Вопросы / Делимся приемами оптимизации под Google PageSpeed 33 +2 1
mngatoff · 02 декабря 2019, 02:23 достаточно триггернуть событие 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> Готовые решения / Плюс и минус в каунте корзины MS2 13 +7 6
Павел Голубев · 07 октября 2019, 17:56 У 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. Готово Пошаговые инструкции / Установка, настройка и кастомизация редактора TinyMCE Rich Text Editor 29 +2 3
Дмитрий Танцирев · 12 сентября 2019, 10:00 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'}); Новые дополнения и их версии / [YandexMaps] Создаём объекты на Яндекс Картах из ресурсов со множеством опций 196 +1 2
Игорь · 20 марта 2019, 14:53 Я бы написал сниппет, который сортирует массив объектов по нужному полю и передал $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); Вопросы / [РЕШЕНО]Как сортировать данную конструкцию? 7 +2 1
Баха Волков · 11 февраля 2019, 16:23 Позвольте переписать ваш чанк 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', ]} Так ведь намного лучше Готовые решения / Хватить это терпеть! Или зачем столько чанков в FormIt!? 21 +5 4
Николай · 11 февраля 2019, 16:04 Выложу свой способ управления множеством форм для сниппета 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. Готовые решения / Хватить это терпеть! Или зачем столько чанков в FormIt!? 21 +1 4
Алексей · 10 декабря 2018, 16:48 Мне ещё помогла данная команда определить зараженный файлы: find -newerct "1 Sep 2018" ! -newerct "10 Dec 2018" -lsЗапускать из консоли. Просто смотрим дату создания файла с вирусом, и в корневой директории доступной для php запускаем из командной строки пользователя данную команду с разбегом ±месяц. Видимо вирус не удосужился заменить дату создания файлов, поэтому его можно вычислить. Ну а эта команда покажет список файлов созданных между 1 сентября 2018 года и 10 декабря 2018 года. Безопасность / Лечение зараженных сайтов на modhost.pro 80 0 1
Возможно ли реализовать возможность предоплаты за доставку на сайте? У меня Робокасса, у них вроде есть docs.robokassa.ru/ru/iframe
Редизайн сообщества На больших экранах основной текст статьи я бы сделал 18 px. Да и текст комментариев можно таким сделать. Для меня лично 16 — мелковато на больших экранах (в комментариях вообще 15 ...
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска события поставить ниже чем orderUI, после
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Дополнение доступно modstore.pro/packages/photos-and-files/imageoptimizer
Localizator3 для MODX 3: перевод полей и TV без отдельного context на язык, Vue 3 + PrimeV... Добавил localizator3_default_language
msInShopNotify Начиная с версии 3.0.0-beta добавлена поддержка MiniShop3 Минимальные требования: PHP 8.4 MODX 3.2 MiniShop3
MaxNotify Обновление 1.2.0-pl (03.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет `maxNotifyFormIt`; — добавлены уведомления о заявках SendIt через hook-...
[msBonus2] 1.3.0 Бонус-коды, уведомления о сгорании и совместимость с msMultiCurre... Да, планируется. Даже чуть больше, чем просто бонусная система)
оставь только
я вот так делаю (немного вырвано из контекста, но принцип ясен):
Лечится так:
1. В системных настройках, в пространство имен tinymcerte добавляем tinymcerte.convert_urls = false
2. В файле core/components/tinymcerte/model/tinymcerte/events/tinymcerteonrichtexteditorinit.class.php:70 добавляем
3. Готово
2. Вырежьте из 108-ой строки:
3.1 И вставьте её перед: (примерно 180-я строка)
3.2 Таким вот образом:
Примерно так:
Так ведь намного лучше
Создаём чанк ajaxForms:
Это единый чанк, в котором вызывается сниппет ajaxForm с необходимыми параметрами.
В моём случае каждая отдельная форма — это отдельный чанк. Если эти чанки мало чем различаются, то можно использовать extends из fenom, переписывая лишь изменяющиеся значения, а остальное не трогать.
И далее в шаблоне страницы вызов нужной формы:
В нём мы подменили значения, передающиеся в чанк ajaxForm.
Пример чанка callback с формой:
Если нужно вызвать похожую форму но с другим заголовком и другими параметрами, то создадим чанк question, который наследует чанк callback:
И вызов этой формы в шаблоне страницы:
Таким образом, для всех форм мы можем задать единые параметры вызова сниппета ajaxForm, и при необходимости перезаписать их. А также под каждую форму либо создать отдельные чанки, либо унаследовать от одного чанка кучу других с индивидуальными параметрами.
Дополнительно я скрываю уведомления jgrowl js-скриптом:
Все уведомления об ошибках показываются под полями форм, в коде span c классом error. А если форма успешно отправлена, то с помощью скрипта выше мы скрываем popup-форму, если она была открыта, и показываем другое popup-окно:
Оно же всплывает и при отправке обычных не popup-форм. Да, насчёт popup-окон, актуально при использовании flexbox3.
Запускать из консоли. Просто смотрим дату создания файла с вирусом, и в корневой директории доступной для php запускаем из командной строки пользователя данную команду с разбегом ±месяц. Видимо вирус не удосужился заменить дату создания файлов, поэтому его можно вычислить.
Ну а эта команда покажет список файлов созданных между 1 сентября 2018 года и 10 декабря 2018 года.