Всего 123 803 комментария

Алексей Смирнов
08 апреля 2024, 21:38
0
Если вы переносили — проверьте исходящую версию Mysql и ту на которую переносите.
Если переносите на более низкую, есть риски что у вас еще и индексы слетели. Поэтому при экспорте нужно поменять совместимость БД, но тут лишь гуглить. Или переносить частями БД если она большая.
Кстати табличку сессий можно очистить перед переносом.
serdeles
08 апреля 2024, 21:38
0
К сожалению, не помогло.
Через конфигуратор — это в смысле заполнять поля через интерфейс MIGX?
Алексей Смирнов
08 апреля 2024, 21:29
0
Попробуйте поле назвать без больших букв. вместо prodImg например image
и вообще советую делать через конфигуратор родной MIGX — полезная штука.
Николай Савин
08 апреля 2024, 21:15
0
При переносе слетает автоинкремент. Для решения вопроса нужно
1. Удалить все записи с ID = 0 или руками их поменять, если таких немного
2. Установить для поля ID индекс primaryKey + автоинкремент
Сергей Лим
08 апреля 2024, 18:08
0
Столкнулся с такой же ошибкой. Не известна причина?
Артур Шевченко
08 апреля 2024, 17:18
0
попробуй такой чанк письма
{set $fields = $fields | replace: '"' : '"' | fromJSON}
{set $fieldsAliases = $fieldsAliases | replace: '"' : '"' | fromJSON}
{set $questions = $fields['questions'] | fromJSON}
{set $answers = $fields['answers'] | fromJSON}
<h3>{$_pls['savedForm.form']}</h3>

{if $questions && ($questions | count)}
    {foreach $questions as $i => $question}
        <p><strong>{$question}</strong>: {$answers[$i] | join: ', '}</p>
    {/foreach}
{else}
    {foreach $fields as $k => $v}
        {if !($k in list ['fields', 'fieldsAliases'])}
            <p><strong>{$fieldsAliases[$k] ?: $k}</strong>: {$v | join: ', '}</p>
        {/if}
    {/foreach}
{/if}
Арман
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.