Динамическое изменение цены в minishop2

Приветствую, опыта в разработке у меня кот наплакал, поэтому не судите строго. Задача: изменять цену товара в зависимости от введенных на фронте данных. Другими словами на фронте будет реализован калькулятор который получает ширину и высоту от пользователя, цену из админки, обрабатывает и возвращает стоимость, проблема в том, что я не знаю как эти данные передать дальше, в частности в корзину. Есть плагин onBeforeAddCart или как-то так, суть в том, что в нём можно изменить цену, но как эту цену передать в плагин?
Артур
23 августа 2019, 10:18
modx.pro
230
0

Комментарии: 3

Максим
23 августа 2019, 10:58
0
Вы можете передать ее через и потом в плагине в реквесте ловить $_REQUEST['wtf']
Пример моего плагина для калькулятора:
<?php
if ($modx->event->name == 'msOnBeforeAddToCart') {
    
    $options = $product->loadData()->get('options');
    $arrProduct = $product->toArray();
    
    $op = array();
    /*foreach ($options as $key => $value) {
        $op[$key] = $arrProduct[$key.'.value'];
    }*/
    
    $op['width'] = $_REQUEST['custom_width_window_slider'];
    $op['height'] = $_REQUEST['custom_height_window_slider'];
    $op['w_profile'] = $_REQUEST['profile_name'];
    
    if (!empty($_REQUEST['options'])) {
        foreach ($modx->fromJSON($_REQUEST['options']) as $key => $value) {
            if (is_array($value)) {
                foreach ($value as $name => $prop) {
                    $op[$name] = $prop;
                }
            } else {
                $op[$key] = $value;
            }
        }
    }
    
    $values = & $modx->event->returnedValues;
    $values['options'] = $op;
    
    $product->set('price', $_REQUEST['price']);


    //$modx->log(modX::LOG_LEVEL_ERROR, $modx->event->name . '. Message: ' . print_r($op, true));
}

Вродь как все просто!
    Артур
    26 августа 2019, 16:56
    0
    Это вам спасибо, но чтобы лучше понимать ваш код: $_REQUEST это суперглобальная переменная в которой хранятся данные из карточки товара, а вот это ['custom_width_window_slider'] значение атрибута name нужного поля?
      Артур
      07 сентября 2019, 11:00
      0
      В общем долгое копание в поиске дало следующий результат.
      1. Нужно ставить своему плагину самый высокий приоритет.
      2. Для изменения цены подходит только плагин на событие msOnGetProductPrice
      3. ms2_price_snippet это штука действительно устаревший вариант.
      Вот рабочее решение, предельно простое как и сама задача
      <?php
      
      switch ($modx->event->name) {
      	case 'msOnGetProductPrice':
      
      	
      		// Плагин принимает:
      		// $product - объект msProductData
      		// $data - массив со свойствами товара, может отсутствовать
      		// $price - текущая цена товара
      
      		// Подключаем массив значений по ссылке - так удобнее
      		$values = & $modx->event->returnedValues;
      
      		// Цена может меняться несколькими плагинами сразу, поэтому проверяем:
      		if (isset($values['price'])) {
      			$price = $values['price'];
      		}
      
      		// Меняем цену:
      		$values['price'] = $_REQUEST['price'] / $_REQUEST['count'];
      		$modx->log(modX::LOG_LEVEL_ERROR, $modx->event->name . '. Цена2 ' . $values['price'] . print_r($values, true));
      	break;	
      }
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        3