backend_prod_presave

Triggered before a product is saved in the product editor in the new interface (2.0). Allows changing of product properties before they are saved or returning an error message, which will interrupt the saving of a product and will show the error message to a user. If necessary, you can change the way your error messages are displayed by registering a handler for the wa_after_save event in plugin’s JavaScript code.

Shop-Script

Input (passed by reference)

$params['product'] shopProduct Object of product properties before they have been modified by saving.
$params['data'] array Product data to be saved. The data content in various product editor tabs may differ. Available by reference for modification.
$params['content_id'] string Identifier of the current product editor tab.
… your plugin code …

Output

$return['errors']
Массив сообщений об ошибках.
$result['errors']['text'] string Error message text.
Shop-Script

Plugin code example

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,
    ];
}