backend_prod_presave

Срабатывает перед сохранением товара в новом редакторе товара. Позволяет изменить сохраняемые свойства товара или вернуть сообщение об ошибке — в этом случае товар не сохранится, а пользователь увидит это сообщение в панели управления. Если нужно, можно изменить стандартный способ и место отображения сообщения об ошибке, зарегистрировав обработчик события wa_after_save в JavaScript-коде плагина. В противном случае сообщение будет показано в стандартном месте внизу страницы.

Доступен начиная с версии 8.19.0.

Shop-Script
Входящие параметры
передаются по ссылке
$params['product'] shopProduct Объект свойств товара, которые ещё не были изменены в ходе сохранения.
$params['data'] array Сохраняемые свойства товара. Могут различаться в зависимости от текущего раздела редактора товара. Передаются по ссылке.
$params['content_id'] string Идентификатор текущей вкладки редактора товара.
… код плагина …
Результат работы плагина
$return['errors']

Массив сообщений об ошибках.
$result['errors']['text'] string Текст сообщения об ошибке.

Shop-Script

Пример кода плагина

PHP

public function backendProdPreSave($params)
{
    /** @var shopProduct $product */
    $product = $params['product'];
    $content_id = $params['content_id'];

    $errors = [];

    if ($content_id == 'sku') {
        $data = $params['data'];
        foreach(ifset($data, 'skus', []) as $sku_id => $sku) {
            // Additional SKU price fields validation
            $price_field_id = 'myplugin_price';

            if (ifset($sku, 'additional_prices', $price_field_id, 0) < 10) {
                $errors[] = [
                    'id' => 'plugin_price_error',
                    "name" => "product[skus][{$sku_id}][additional_prices][{$price_field_id}]",
                    'text' => _wp('My plugin’s price value must be equal to or greater than 10.'),
                    'data' => [
                        'sku_id' => (int) $sku_id,
                        'sku_sku' => $sku['sku'],
                        'field_id' => $price_field_id,
                    ],
                ];
            }

            // Other additionl SKU fields validation
            $textarea_field_id = 'myplugin_textarea';

            if (mb_strlen(ifempty($sku, 'additional_fields', $textarea_field_id, '')) < 2) {
                $errors[] = [
                    'id' => 'plugin_field_error',
                    "name" => "product[skus][{$sku_id}][additional_fields][{$textarea_field_id}]",
                    'text' => _wp('My plugin’s textarea value must be 2 or more characters long.'),
                    'data' => [
                        'sku_id' => (int) $sku_id,
                        'sku_sku' => $sku['sku'],
                        'field_id' => $textarea_field_id,
                    ],
                ];
            }

        }
    }

    if ($content_id == 'general' || $content_id == 'sku') {
        $myplugin_post_values = waRequest::post('myplugin', [], waRequest::TYPE_ARRAY_TRIM);
        $some_field_value = ifset($myplugin_post_values, 'some_value', '');

        if (!strlen($some_field_value)) {
            // Each error is available as an object in the event.server_errors array
            // in a 'wa_after_save' event handler for '#js-product-general-section' and similar elements.

            // You can arbitrarily use 'id', 'plugin', and 'name' values of each error in your JavaScript code
            // to show its message in a custom way instead of the default error block at the page bottom.

            // 'id' value must always be 'plugin_error'
            $errors[] = [
                'id'   => 'plugin_error',
                'plugin' => $this->id,
                'name' => 'some_value_error',
                'text' => _w('My plugin’s validation message.')
            ];
        }
    }

    return [
        'errors' => $errors,
    ];
}