Пользовательское поле

    Пример добавления пользовательского поля в форму заказа

    Например, вы хотите добавить обязательное поле "Город". Первым делом создайте чанк с содержимым файла assets/plugins/commerce/templates/front/order_form.tpl и укажите имя этого чанка в параметре formTpl при вызове сниппета Order.

    Добавьте поле в чанк:

    <div class="form-group">
        <input class="input" type="text" name="city" placeholder="Город" value="[+city.value+]">
        [+city.error+]
    </div>

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

    Для проверки поля нужно добавить правила валидации в вызов сниппета Order, они идентичны правилам FormLister. Минимальное правило будет таким:

    "!city": {
        "lengthBetween": {
            "params": [2, 255],
            "message": "Название города должно быть длинной от 2 до 255 символов"
        }
    }

    Теперь нужно решить вопрос с отображением в списке заказов и просмотре заказа. Для этого создайте плагин и привяжите его к событиям OnManagerBeforeOrdersListRender и OnManagerBeforeOrderRender:

    switch ($modx->event->name) {
        case 'OnManagerBeforeOrdersListRender': {
            // добавляем столбец в таблицу заказов
            $params['columns']['city'] = [
                'title' => 'Город',
                'content' => function($data, $DL, $eDL) {
                    return !empty($data['fields']['city']) ? $data['fields']['city'] : '';
                },
                'sort' => 50,
            ];
            break;
        }
    
        case 'OnManagerBeforeOrderRender': {
            // добавляем поле на страницу просмотра заказа
            $params['groups']['payment_delivery']['fields']['city'] = [
                'title' => 'Город',
                'content' => function($data) {
                    return !empty($data['fields']['city']) ? $data['fields']['city'] : '';
                },
                'sort' => 20,
            ];
            break;
        }
    }

    Теперь нужно добавить поле на страницу редактирования заказа. Для этого добавим в плагин обработку события OnManagerBeforeOrderEditRender:

    switch ($modx->event->name) {
        case 'OnManagerBeforeOrderEditRender': {
            unset($params['fields']['delivery_method']);
            $params['fields']['city'] = [
                'title' => 'Город',
                'content' => function($data) {
                    $value = !empty($data['fields']['city']) ? $data['fields']['city'] : '';
                    return '<input type="text" class="form-control" name="order[fields][city]" value="' . htmlentities($value) . '">';
                },
                '!rules' => [
                    'lengthBetween' => [
                        'params'  => [2, 255],
                        'message' => 'Название города должно быть длинной от 2 до 255 символов',
                    ],
                ],
                'sort' => 40,
            ];
            break;
        }
    }

    Осталось вывести поле в письме-уведомлении. Для этого нужно скопировать в чанк содержимое стандартного письма из файла assets/plugins/commerce/lang/russian-UTF8/order_report.tpl и добавить имя этого чанка в параметре reportTpl при вызове сниппета Order.

    В чанке для вывода поля используйте [+order.fields.city+].