Користувацьке поле

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

    Наприклад, ви хочете додати обов'язкове поле "Місто". Насамперед створіть чанк із вмістом файлу 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+].