minishop2 и смена названия товара

Приветствую!

Вопрос такой, есть товар например «Дверь», у него есть выбор опций, размер цвет и т.д.
При добавлении в корзину хочу чтобы цвет размер попадали в название товара и сохранялись при заказе, т.е. в админке, чтобы тоже отображалось такое же название. Пока чтобы опции в строку джойнились
например «Дверь, Белый, 2000х800»
В будущем хочу чтобы дополнительные товары тоже были в названии.

Как мне сказали бухгалтера закон после нг выходит, типа надо все в одну строку, а точнее в одну позицию в чеке. Отсюда и загвоздка, т.к. в онлайн оплате все по отдельности выходит. Я использую сбер-эквайринг, туда опции не передаются.
Тут два варианта, либо править дополнение от Ильи mspSberbank, либо докручивать minishop2 и изначально пользователю показывать похожее название товара или вот в момент написания идея пришла, при создании заказа переназначить название.

пробовал плагине пробовал msOnBeforeAddToCart, но он все равно не сохраняет

Подскажите где(как) лучше реализовать? расширить класс(корзины, заказа)? или можно в плагине все это переиначить
Константин Ильин
29 декабря 2020, 10:07
modx.pro
787
0

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

Наумов Алексей
29 декабря 2020, 10:30
0
Совсем недавно сталкивался, тоже самое хотел сделать, на событии msOnBeforeAddToCart задать товару в корзине name.

Не получилось, сразу в нескольких местах выскочили проблемы, ни сниппет msCart, ни чанки не готовы к такому повороту событий) все равно во многих местах тащится родной pagetitle от товара… я в итоге забил, и вместо вывода pagetitle в заказе вызываю каждый раз свой сниппет, который динамически формирует название товара.

А вообще идея здравая: сделать возможность подменить name у товара в корзине.
    Константин Ильин
    29 декабря 2020, 10:50
    0
    На счет вывода названия, сидел думал вспомнил, что везде тянется pagetitel и тоже пришел к выводу что придется шаманить самому. Выводить это одно, но вот еще в заказ должно сохранятся, и тут я уже вроде решение нашел, на событие создания заказа, там писать свой код который переделывает name

    В консоли попробовал этот скрипт, думаю вот оно решение. Как сделаю, выложу, может кому надо будет :)
    if ($order = $modx->getObject('msOrder', 6)) {
    	$products = $order->getMany('Products');
    	foreach ($products as $product) {
    	    $p = $product->toArray();
    		$arr[] =  $p;
    		if($p['product_id'] == 19){
    		    $product->set('name', 'TEST');
    		    $product->save();
    		}	
    	}
    }
    Артур Шевченко
    29 декабря 2020, 13:35
    0
    Написать плагин самая здравая идея. В нём менять name, а в корзине выводить как обычно, ибо даже в стандартном чанке опции джойняться. В документации написано как можно менять значения у товаров в корзине.
      Константин Ильин
      02 февраля 2021, 19:21
      +1
      @Иван Бочкарев, можете создать(PR) на будущее, чтобы в корзине хранилось название товара, чтобы его можно было видоизменять как угодно и в заказе после оно использовалось.

      Пример проблемы:
      Товар «Машина 2115», человек добавляет в корзину вместе с опциями, среди них например Цвет «Красный».
      В корзине/заказе название товара и опции отдельно отображаются, далее в интернет эквайринг идет только название «Машина 2115», но цвет надо тоже отобразить в чеке, допустим другие опции не надо, но именно цвет надо. Т.е. должно было бы отображаться «Машина 2115, цвет Красный» х 1

      Уже для программистов не составит труда, написать условия для изменения названия на основе опций, в плагине на событии msOnAddToCart

      Сейчас я сделал после создания заказа приписать опции(пока условия не требуются). Все работает, но это влечет за собой переработку шаблонов корзины, письма.
      case 'msOnChangeOrderStatus':
              if ($status == 1) { 
                  $orderArray = $order->toArray();
                  if(strtotime($orderArray['createdon'])+15 > time() ){
                  	$products = $order->getMany('Products');
                  	foreach ($products as $product) {
                  	    $p = $product->toArray();
                  		$newName = $p['name'];
                  		if(!empty($p['options'])){
                  		    foreach($p['options'] as $option => $value){
                  		        $newName .= ', '.$value;
                  		    }
                  		}
                  		$product->set('name', $newName);
                  		$product->save();
                  	}
                  }
              }
          break;
      Если есть такая возможность по времени, было бы круто иметь такую фичу, ну если поддержите данную затею.
        Николай Савин
        02 февраля 2021, 20:28
        0
        создать(PR) на будущее
        Пожелание о будущей доработке называется issue

        А в чем проблема уже сейчас обзывать товар как угодно в момент его добавления в корзину? Его название после добавления в корзину к товару уже никак не привязано и там может быть написано все что угодно.
          Константин Ильин
          02 февраля 2021, 23:05
          0
          Пожелание о будущей доработке называется issue
          точно, затупил.

          Его название после добавления в корзину к товару уже никак не привязано и там может быть написано все что угодно.
          В сессии хранится тока id опции цена, но названия нет. Получается он дергает товар при выводе корзины.
          Или я чего то не знаю.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6