Вопросы

как в ajaxForm и formit сделать проверку расширения файла?

MODX Revolution 2.7.3-pl

Создал сниппет formit2checkfile:
<?php
// инициализируем переменную output, отвечающую за результат работы валидатора, со значением true
$output = true;
// разрешённые расширения файлов
$allowedExt = array('jpg','png','pdf');

// имя файла
$fileName = basename( $_FILES[$key]['name'] );

// расширение файла
$fileExt = mb_strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
// если имя файла не пустое
if ($fileName != '') {
  if(!in_array($fileExt, $allowedExt)) {
    // файл имеет недопустимый тип
    $errorMsg = 'Файл ' . $fileName . ' имеет не разрешённый тип.';
    $validator->addError($key, $errorMsg);
    $output = false; // возвращаем false
  }
}
return $output;
В вызове формы прописал 'customValidators' => 'formit2checkfile', и 'validate' => 'upload:formit2checkfile',
{'!ajaxForm'|snippet:[
                'snippet'=>'FormIt',
                'hooks' => 'spam,email',
                'emailSubject' => 'Новое сообщение из формы обратной связи',
                'customValidators' => 'formit2checkfile',
                'validate' => 'email:email:required,work_phone:blank,upload:formit2checkfile',
                'form' => 'tpl.form',
            	'emailTpl' => 'tpl.form2mail'
            ]}
При наличии всего этого форма отправляется с любым типом файла.
Не понимаю, где ещё что-то надо прописать?

upd.
c php у меня никак, т.ч. пришлось выкручиваться «html костылём»:
accept=".jpg,.jpeg,.png,.pdf"
Андрей
23 октября 2020, 21:59
modx.pro
1 248
0

Как получить значение всех TV-полей ресурса одним SQL-запросом?

Задача решается в лоб, если значения TV-полей хранятся именно в виде нужных значений.

select t2.name, t2.caption, t2.description, t1.value

from modx_site_tmplvar_contentvalues as t1
left join modx_site_tmplvars as t2 on t1.tmplvarid = t2.id

where t1.contentid = :resourceId

Если TV представляет собой список значений значение1==1||значение2==2||значение3==3, то в TV будет хранится цифры 1,2,3 а нам нужны значения значение1, значение2, значение3. Тогда задачу можно решить так

select
t2.name, t2.caption, t2.description, if(t2.elements like concat('%==', t1.value, '%'), REGEXP_SUBSTR(t2.elements, concat('[:lower:]+(?=\={2}', t1.value, ')')), t1.value) as value

from modx_site_tmplvar_contentvalues as t1
left join modx_site_tmplvars as t2 on t1.tmplvarid = t2.id

where

t1.contentid = :resourceId
Но работать это будет только в MySql8, т.к. начиная с 8 версии появилась функция REGEXP_SUBSTR.
Павел Голубев
23 октября 2020, 15:59
modx.pro
1 703
0

Совместить вкладки товара minishop2 в одну

Для товара нужны только несколько полей: Заголовок, Содержимое, Цена и Фото. И они находятся все в разных вкладках. Менеджер очень ленивый и хочет при заполнении видеть в админке их сразу без переключения.
Spirit_Ninja
23 октября 2020, 00:56
modx.pro
1
1 134
+1

Отключение ajax в пагинации mFilter2.

Добрый день,

В продолжение моего вопроса от 21.10.

Подскажите, есть ли возможность отключить ajax в пагинации mFilter2.

Непосредственного параметра ajax не обнаружил.

Спасибо.
Василий Королев
ВК
22 октября 2020, 17:59
modx.pro
913
0

Не приходит заявка на почту, не редиректит после заказа shopkeeper

Добрый день! Установлен shopkeeper3-3.2.7-pl3, ничего не менялось, но перестали приходить заказы на почту и админу и клиенту, плюс перестал работать редирект на страницу «Спасибо за заказ» (21626), и почему-то при оформлении заказа в графах уже стоят данные администратора. В админке заказы отображаются. Где искать проблему, подскажите, пожалуйста!
Екатерина
22 октября 2020, 12:53
modx.pro
1 019
0

MIGX вывод нескольких pagetitle из выбранных в TV ресурсов

Добрый день!
Делаю прейскурант в MIGX и через TV выбора ресурсов (специалистов, оказывающих услуги из раздела «Специалисты») «Список (множественный выбор)» по возможным значениям
@SELECT pagetitle, id FROM modx_site_content WHERE parent=2
В колонках MIGX создал отдельную колонку, которая берет значения из вкладки, где происходит выбор специалистов через указанное TV, и вывод колонки делаю this.renderChunk и вызов (по заветам Bruno вот отсюда
[[migxLoopCollection? 
&classname=`modResource`
&where=`{"id:IN":[ [[+doctors]] ]}`
&tpl=`@CODE:[[+pagetitle]]<br />`
]]
Проблема такая: если в том TV выбран только один ресурс, то его pagetitle выводит ОК, если более одного, то выводят pagetitle вообще всех ресурсов (колонка где «Мануальная терапия» — там выбран один параметр, гигантская колонка со всем споподряд — .там выбрано два специалиста.
yadi.sk/i/mBhHLS9Dm24Z2Q
Памагити…
Серый
22 октября 2020, 12:00
modx.pro
863
0

про Redis

Господа и дамы.
Буду рад если поделитесь своими знаниями насчет работы базы redis.
В mysql у нас есть сервис mysql-server и возможность создать большое количество именованных баз данных, к которым мы потом подключаемся.
Правильно я понимаю что redis-server не имеет разделения на отдельные базы? Просто все примеры использования которые я вижу, в них просто подключаются к сервису redis через определенный порт и записывают туда ключ-значение. Но разве это не означает что эти данные будут доступны всему серверу. К примеру на сервере работает два сайта. Каждый из них хочет работать с redis, но поскольку нет отдельно базы в redis для первого сайта и отдельно — для второго, то вся информация получается у них общая?
И навереное только docker позволит запустить два разных контейнера на разных портах, что позволит работать каждому сайту со своем базой.
Или я в корне не прав и у redis есть инструменты для разделения на несколько баз?
Спасибо.
Александр Мельник
21 октября 2020, 17:48
modx.pro
860
0

ajaxMode pdopage Подгружает товары сверху

При клике на «Загрузить ещё» товары подгружаются выше, приходится листать вверх чтобы увидеть загруженные товары.
Как исправить? Чтобы товары подгружались ниже.

xn---24-6cdimhonav5ak8a3b6ed5c.xn--p1ai/
Максим
21 октября 2020, 16:24
modx.pro
864
0

[РЕШЕНО] Плагин msOnBeforeCreateOrder иногда не срабатывает

Всем привет!

Есть задача: при попытке оформления нового заказа в minishop2, если заказчик уже есть в БД и у него есть хотя бы один заказ, выдавать предупреждение и не оформлять текущий заказ. Казалось бы, достаточно простая задача, был написан плагин на событие msOnBeforeCreateOrder
<?php
if ($modx->event->name == 'msOnBeforeCreateOrder') {
    $arr = $order->get();
    $email = str_replace(' ', '', $arr['email']);
    $user = $modx->getObject('modUserProfile', ['email' => $email]);
    if(is_object($user)) {	   
    	$user_id = $user->internalKey;
    	$orders = $modx->getCollection('msOrder', ['user_id' => $user_id]);
    	if (count($orders) > 0) {    	   
    	    $modx->event->output('пользователь с email '.$arr['email'].' уже зарегистрирован! Попробуйте ввести другой email');
    	}
    }
}
Плагин срабатывает корректно, но в списке заказов увидел, что у пары пользователей есть более одного заказа.

Что-то не так в коде плагина? Я пытался воспроизвести эту ситуацию — но всё норм, плагин не пропускает повторный заказ моего пользователя.
Alexey
21 октября 2020, 09:51
modx.pro
1
1 602
+1