Всего 122 790 комментариев

Арман
08 апреля 2024, 15:41
0
Моя форма
<form data-si-form="callback" data-si-preset="callback" class="p-4 p-md-5 border rounded-3 bg-primary bg-gradient">
          <div class="form-floating mb-3">
            <input name="phoneform" id="phoneform" type="tel" class="form-control" placeholder="+7 (XXX) XXX-XX-XX" pattern="(\+7|8)\s?[\(]?(\d{3})[\)]?\s?[\-]?(\d{3})[\-]?(\d{2})[\-]?(\d{2})" required>
            <p data-si-error="phoneform"></p>
            <label for="phoneform">Телефон</label>
          </div>
          <button class="w-100 btn btn-lg btn-light bg-gradient" type="submit">Жду звонка</button>
          <hr class="text-white my-4">
          <small class="text-white text-center">Свяжемся с вами в течении 1 минуты</small>
        </form>

То что находится в core/components/sendit/presets/sendit.inc.php
Добавил только callback остальное не трогал
<?php

return [
    'default' => [
        'validate' => 'phone:required,age:required,name:required,email:email:required,politics:checkbox:required',
        'fieldNames' => 'age==Возраст,name==Имя,phone==Телефон,email==Почта',
    ],
    'callback' => [
        'validate' => 'phoneform:required',
        'fieldNames' => 'phoneform==Телефон',
        'successMessage' => 'Форма отправлена!',
        'hooks' => 'email,FormItSaveForm',
        'emailTpl' => 'siDefaultEmail',
        'emailTo' => 'marketing@site.ru',
        'formName' => 'Форма по умолчанию',
        'emailSubject' => 'Письмо с сайта domain.ru',
    ],
    'search_something' => [
        'snippet' => '@FILE snippets/snippet.search.php'
    ],
    'check_something' => [
        'snippet' => 'checkSnippet'
    ],
    'check_code' => [
        'snippet' => 'code'
    ],
    'upload_file' => [
        'hooks' => '',
        'allowExt' => 'jpg,png,jpeg,webp,tiff,tif',
        'portion' => 0.1,
        'threadsQuantity' => 12,
    ],
    'upload_simple_file' => [
       'extends' => 'upload_file',
        'maxSize' => 1,
        'maxCount' => 2,
    ],
    'upload_drop_file' => [
        'extends' => 'upload_file',
        'maxSize' => 5,
        'maxCount' => 10,
    ],
    'form_with_file' => [
        'extends' => 'default',
        'validate' => 'name:required',
        'attachFilesToEmail' => 'files',
        'allowFiles' => 'filelist',
        'clearFieldsOnSuccess' => 1,
    ],

    'quiz' => [
        'validate' => 'phone:required,name:required,answers[*]:required,answers[7][]:checkbox:required,answers[3]:requiredIf=^answers[2]|Да^',
        'clearFieldsOnSuccess' => 0,
        'hooks' => 'FormItSaveForm,email',
        'fieldNames' => 'phone==Телефон,name==Имя',
    ],
    'register' => [
        'hooks' => 'Identification,FormItSaveForm,FormItAutoResponder',
        'method' => 'register',
        'successMessage' => 'Вы успешно зарегистрированы. Подтвердите email для активации учётной записи.',

        'fiarSubject' => 'Активация пользователя',
        'fiarFrom' => 'email@domain.ru',
        'fiarTpl' => 'siActivateEmail',

        'activation' => 1,
        'rememberme' => 1,
        'authenticateContexts' => 'web',
        'afterLoginRedirectId' => 5,
        'autoLogin' => 1,
        'redirectTo' => '',
        'passwordField' => '',
        'usernameField' => 'email',
        'usergroupsField' => '',
        'moderate' => '',
        'redirectTimeout' => 3000,
        'usergroups' => 2,
        'activationResourceId' => 1,
        'activationUrlTime' => 10800,
        'validate' => 'email:required,password:checkPassLength=^8^,password_confirm:passwordConfirm=^password^,politics:checkbox:required',
        'politics.vTextRequired' => 'Примите наши условия.',
        'password.vTextRequired' => 'Придумайте пароль.',
        'password.checkPassLength' => 'Пароль должен быть не менее 8 символов.',
    ],
    'auth' => [
        'successMessage' => 'Вы успешно авторизованы и будете перенаправлены в личный кабинет.',
        'validate' => 'email:required,password:required',
        'hooks' => 'Identification',

        'method' => 'login',

        'redirectTo' => 5,
        'redirectTimeout' => 3000,
        'usernameField' => 'email',

        'email.vTextRequired' => 'Укажите email.',
        'password.vTextRequired' => 'Введите пароль.',
        'errorFieldName' => 'errorLogin'
    ],
    'editpass' => [
        'hooks' => 'Identification',
        'method' => 'update',
        'successMessage' => 'Пароль изменён.',

        'validate' => 'password:required:minLength=^8^:regexp=^/\A[\da-zA-Z!#\?&]*$/^,password_confirm:password_confirm=^password^',

        'password.vTextRequired' => 'Придумайте пароль.',
        'password.vTextRegexp' => 'Пароль может содержать только цифры, латинские буквы и символы !,#,?,&',
        'password.vTextMinLength' => 'Пароль должен быть не менее 8 символов.',
    ],
    'dataedit' => [
        'hooks' => 'Identification',
        'method' => 'update',
        'successMessage' => 'Данные сохранены.',
        'clearFieldsOnSuccess' => 0,

        'validate' => 'email:required:email',
        'email.vTextRequired' => 'Укажите email.'
    ],
    'logout' => [
        'hooks' => 'Identification',
        'method' => 'logout',
        'successMessage' => 'До новых встреч!',
        'redirectTo' => 1,
        'errorFieldName' => 'errorLogout'
    ],
    'forgot' => [
        'hooks' => 'Identification,FormItSaveForm,FormItAutoResponder',
        'method' => 'forgot',
        'successMessage' => 'Новый пароль отправлен на ваш email',

        'usernameField' => 'email',
        'validate' => 'email:required:userNotExists',

        'fiarSubject' => 'Восстановление пароля',
        'fiarFrom' => 'email@domain.ru',
        'fiarTpl' => 'siResetPassEmail',

        'email.vTextRequired' => 'Укажите email.',
        'email.vTextUserNotExists' => 'Пользователь не найден',
    ],
    'custom' => [
        'extends' => 'onestepform',
        'snippet' => '@FILE snippets/test.php',
        'hooks' => '',
        'validate' => ''
    ],
    'sendcode' => [
        'hooks' => '',
        'snippet' => '@FILE snippets/smsauth/snippet.sendcode.php',
        'successMessage' => 'Код отправлен на номер {$phone}',
        'validate' => 'phone:required',
        'phone.vTextRequired' => 'Укажите телефон.'
    ],
    'checkcode' => [
        'hooks' => '',
        'successMessage' => '',
        'validate' => 'code:CheckCode',
        'validationErrorMessage' => 'Неверный код.',
    ],
    'sms_auth' => [
        'extends' => 'checkcode',
        'successMessage' => 'Вы успешно авторизованы.',
        'hooks' => 'SetUserFields,Identification',
        'method' => 'login',
        'redirectTo' => 5,
        'user_exist' => 1,
        'redirectTimeout' => 3000,
        'clearFieldsOnSuccess' => 1,
    ],
    'sms_register' => [
        'hooks' => 'SetUserFields,Identification',
        'method' => 'register',
        'successMessage' => 'Вы успешно зарегистрированы.',
        'activation' => 0,
        'autoLogin' => 1,
        'redirectTo' => 5,
        'redirectTimeout' => 3000,
        'usergroups' => 2,
        'validate' => 'fullname:required,phone:required,code:CheckCode',
        'fullname.vTextRequired' => 'Укажите ваше имя.',
        'clearFieldsOnSuccess' => 1,
    ],
];
Арман
08 апреля 2024, 15:39
0
Лежит в папке FormIt название сниппета так же FormIt.
Вот код который внутри:
<?php
/**
 * FormIt
 *
 * A dynamic form processing Snippet for MODx Revolution.
 *
 * @var modX $modx
 * @var array $scriptProperties
 *
 * @package formit
 */
use Sterc\FormIt;

$fi = new FormIt($modx, $scriptProperties);

$fi->initialize($modx->context->get('key'));
$fi->loadRequest();

$fields = $fi->request->prepare();

return $fi->request->handle($fields);
Николай Хохлунов
08 апреля 2024, 15:03
0
Проект бесплатный и судя по активности свою небольшую нишу занял, скорее у нашей команды немного фокус сменился, но проект не бросаем)
Илья
08 апреля 2024, 14:35
0
Я использую YandexMaps для вывода ресурсов на карте. Вывести изображение ресурса в балун просто в плейсхолдер типа {$medium} не возможно.
modx.pro/help/9334
Илья
08 апреля 2024, 10:51
0
Вот если бы кто подружил ms2Gallery и Яндекс.Карты чтобы в балун фотографии поддягивать.
vit
vit
08 апреля 2024, 10:45
0
Я сейчас вернусь де использую SEO Suite, как вы думаете лучше через него карту делать или через pdoTools?
Артур Шевченко
08 апреля 2024, 10:36
1
+1
<!-- parentRowTpl-->
<li class="[[+wf.classnames]]">
    <a class="nav-link px-0 align-middle" href="#submenu1" data-bs-toggle="collapse" title="[[+wf.title]]">
        <span class="ms-1 d-none d-sm-inline">[[+wf.linktext]]</span>
    </a>
    <ul id="submenu1" class="collapse nav flex-column ms-1" data-bs-parent="#menu">
        [[+wf.wrapper]]
    </ul>  
</li><!-- /parentRowTpl -->
<!-- innerTpl -->
    [[+wf.wrapper]]
<!-- /innerTpl -->
Ну и лучше использовать pdoTools, говорят они быстрее.
Артур Шевченко
08 апреля 2024, 10:18
0
Что за сниппет c id = 11?
vectorserver
08 апреля 2024, 09:41
0
Сергей, спасибо за статью, оптимизировал сниппет выше!
Сергей Шлоков
08 апреля 2024, 08:11
+1
Отличный пример как делать нельзя. Это максимально жесткий сценарий оверхеда нагрузки.
Подробности описаны мной тут.
Арман
08 апреля 2024, 04:22
0
[08-Apr-2024 04:14:56 Europe/Moscow] PHP Fatal error:  Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in /var/www/u1387551/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(487) : eval()'d code:20
Stack trace:
#0 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(215): Fenom\Template->{closure}(Array, Object(Fenom\Template))
#1 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(215): Closure->__invoke(Array, Object(Fenom\Template))
#2 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(492): Fenom\Render->display(Array)
#3 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(229): Fenom\Template->display(Array)
#4 /var/www/u1532978/data/www/site.ru/core/components/pdotools/src/Parsing/Fenom/Fenom.php(136): Fenom\Render->fetch(Array)
#5 /var/www/u1532978/data/www/site.ru/core/components/pdotools/src/CoreTools.php(418): ModxPro\PdoTools\Parsing\Fenom\Fenom->process(Array, Array)
#6 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt.php(341): ModxPro\PdoTools\CoreTools->getChunk('siDefaultEmail', Array)
#7 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Hook/Email.php(193): Sterc\FormIt->getChunk('siDefaultEmail', Array)
#8 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Hook.php(141): Sterc\FormIt\Hook\Email->process(Array)
#9 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Hook.php(107): Sterc\FormIt\Hook->load('email', Array, Array)
#10 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Request.php(402): Sterc\FormIt\Hook->loadMultiple(Array, Array)
#11 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Request.php(345): Sterc\FormIt\Request->runPostHooks()
#12 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Request.php(254): Sterc\FormIt\Request->postProcess()
#13 /var/www/u1532978/data/www/site.ru/core/cache/includes/elements/modx/revolution/modsnippet/11.include.cache.php(21): Sterc\FormIt\Request->handle(Array)
#14 /var/www/u1532978/data/www/site.ru/core/src/Revolution/modScript.php(88): include('/var/www/u13875...')
#15 /var/www/u1532978/data/www/site.ru/core/components/pdotools/src/CoreTools.php(358): MODX\Revolution\modScript->process(NULL)
#16 /var/www/u1532978/data/www/site.ru/core/components/sendit/model/sendit/sendit.class.php(391): ModxPro\PdoTools\CoreTools->runSnippet('FormIt', Array)
#17 /var/www/u1532978/data/www/site.ru/core/components/sendit/model/sendit/sendit.class.php(372): SendIt->runSnippet('FormIt')
#18 /var/www/u1532978/data/www/site.ru/assets/components/sendit/action.php(45): SendIt->process()
#19 {main}
  thrown in /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(487) : eval()'d code on line 20
Наумов Алексей
07 апреля 2024, 19:27
0
Ну… попробую описать) у меня в проекте очень длинный код и он делает не много не то, что вам нужно, поэтому всю портянку сюда не вставить.

0. на фронте добавляем поле для выбора ширины или ввода его вручную

1. Создадим плагин на событие msopOnAfterGetCost
if ($modx->event->name == 'msopOnAfterGetCost') {
    $isGetModificationAction = (isset($_REQUEST['action']) && $_REQUEST['action'] == "modification/get");
    $isCartAddAction = (isset($_REQUEST['ms2_action']) && $_REQUEST['ms2_action'] == "cart/add");
    
    // Обрабатываем только ajax запросы, в которых компонент msOptionsPrice2 отдает цену
    // Есть альтарнативный способ: проверять $_REQUEST['ms2_action'] !== cart/add
    if($isGetModificationAction || $isCartAddAction) {
    // здесь наш основной код
    // доступна переменная $modification
    // если пользователь выбрал определенную модификацию и у нее есть цена, то берем данные из нее
    if($modification['id']) {
    } else {
        // нет модификации, соответствующей переданным параметрам...
        // нужно высчитать цену, исходя из ширины вашего товара
        // ...
        // а вот тут мы вернем цену
        $modx->event->returnedValues['cost'] = ???;
    }
    
    
    }
}
2.
Олег Захаров
07 апреля 2024, 12:05
0
А как задать сортировку опций внутри категорий? Для тех кто не знает и чтобы сэкономить себе время и нервы подсказываю (сам долго тупил и не знал как настроить):
Чтобы опции внутри категории сортировались в нужном порядке, заходим в редактирование Категории товаров в Minishop и находим вкладку Настройки. Там должны быть опции категории. Перетаскиваем строки вверх вниз формируя нужную сортировку.
Поле rank у опций категории (таблица modx_ms2_category_options) по умолчанию стоит видимо 0, но после перетаскивания строк формируется последовательность сортировки.
Олег Захаров
06 апреля 2024, 22:31
+1
да правильно, поправил в ТС код.
Пример работы выложил тут https://dev445.gowindo.ru/dealers
Есть одна недоработка. Когда нажимаешь на метку, раскрывается всплывающая карточка организации (balloonContent). После закрытия карточки выведенный справа блок от метки iconContentLayout остается открытым (т.к. мышка оказывается за пределами границ иконки геометки myPlacemarkWithContent после закрытия balloonContent, но событие mouseleave не срабатывает). И показанный блок iconContentLayout не закрывается пока снова не наведешь мышку на метку и выйдешь за пределы метки (повторно вызвав срабатывание mouseenter и mouseleave). Надо бы доделать, повесить вызов кода либо событие на закрытие balloonContent, либо добавить событие потери фокуса после попадания мышки за пределы границ иконки геометки myPlacemarkWithContent. Пока лень думать над этим, т.к. пока Заказчику это не горит.
Дима Касаткин
06 апреля 2024, 22:07
+1
Благодарю за полезный материал!

Для тех, кто захочет воспользоваться решением, рекомендую заменить JS-комментарии (/* такие */) на fenom-комментарии ( {*на такие*} ) чтобы на фронтенд не выводить их!
Александр Мельник
06 апреля 2024, 15:34
0
Не очень в тему, но вдруг кому то будет полезно.
Недавно на одном из наших проектов (не MODX) столкнулись со «странным» поведением модуля доставки СДЕКа.
Не вдаваясь в нюансы, проблема оказалось в том, что СДЕК хранит много данных в сессии. Это и список pvz_list (пункты выдач) и почтоматы и так далее.
Сессии хранились в базе данных и длина эти данных стала превышать разрешенную для типа данных TEXT, изза чего вся сессия уничтожалась.
serdeles
06 апреля 2024, 10:31
0
Спасибо, попробую.
Артур Шевченко
06 апреля 2024, 09:45
0
Сделай просто тестовое поле и пишу туда путь к файлу.