Андрей

Андрей

С нами с 22 сентября 2014; Место в рейтинге пользователей: #169
Андрей
05 февраля 2021, 14:12
0
Выкладываю свой полный код, помогите понять почему msOptionPrice своим плагином перебивает мой, приоритеты у моего стоят выше

<?php
$plamgasCatsId = 10535;
$target = 6;

switch ($modx->event->name) {
	
	case 'msOnBeforeAddToCart':
		
    
	$products = $modx->getObject('msProduct', $product->get('id'));
	

    		if ($products->get('parent') == $plamgasCatsId) {
    			
    			$price_product_id = $products->get('price_id_product');
				$para = $products->get('para')[0];

    			foreach ($price_product_id as $product_id) {
					$res = $modx->getObject('msProduct',$product_id);
						if ($res) {
							$price_sostav = $res->get('price');
							$price_sum += $price_sostav;
							if ($para[0] == 1) {
								$price_sum = $price_sum*2;
							}
						}
				}
				
				$price_sale = $price_sum * 0.95;
    			
    		}
    		
    		else {
    			
    				$pids = $modx->getParentIds($products->get('id'), 10, array('context' => 'web'));
	    			if (in_array($target, $pids)) {
	    				$price_sale = $product->get('price') * 0.95;
	    			}
	    			
	    		
    		}
    		
    		$product->set('price', $price_sale);
    
    break;

}
Андрей
05 февраля 2021, 13:39
0
Принцип такой:
Свой модификатор обходит значения опции и по названию находит ID ресурсов.
Далее из них формируются табы
{var $tabs = $_modx->getResources(
                        [
                            'published' => 1,
                            'deleted' => 0,
                            'id:IN' => $_modx->resource.color|getPageIDsByPagetitle,
                        ],
                        [
                        'class_key' => 'msCategory',
                        'sortby' => 'menuindex',
                        'sortdir' => 'ASC',
                        'limit' => 0,
                        'select' => 'id,pagetitle'
                        ]
                    )}

                    <ul class="fabric-tabs">
                        {foreach $tabs as $tab}
                            <li class="tab-link {$tab@index == 0 ? 'current' : ''}" data-tab="tab-{$tab.id}">{$tab.pagetitle}</li>
                        {/foreach}
                    </ul>
А уже внутри таба выдергиваются ресурсы (ткани) и их галереи
Вот кусок кода, в котором немного иная логика — ценник единый на все товары и поэтому задается в TV поле категории. А мне нужно сейчас перевести ее на модификации
{if $.post.id != ''}
    {'!pdoResources'|snippet:[
        'parents' => $.post.id,
        'class' => 'msProduct'
        'where' => ['class_key' => 'msProduct'],
        'limit' => 0,
        'leftJoin' => [
            'TVCategory' => [
                'class' => 'modTemplateVarResource',
                'on' => 'msProduct.parent = TVCategory.contentid AND TVCategory.tmplvarid = 6',
            ],
            "fabricType" => [
                "class" => "msProductOption",
                "on" => "fabricType.key = 'tkan_type' and fabricType.product_id = msProduct.id"
            ]
        ],
        'select' => 'msProduct.id,parent,pagetitle,TVCategory.value as category_price, fabricType.value as fabric_type',
        'tpl' => '@INLINE
            <div class="select-color-gallery" data-type="{$fabric_type}">
                {$category_price|setPlaceholder:"category_price"}
                {"!msGallery"|snippet:[
                    "product" => $id,
                    "tpl" => "tpl.selectFabric",
                ]}
            </div>
        ',
    ]}
{/if}
Андрей
05 февраля 2021, 12:58
0
Те же, и называются также. Но в дере допустим 13 категорий, а у товаров может быть только 8, значит в опции у него будет до 8 категории значения.
Хотя это редко. В основном везде у всех полный перечень. да и опции ввелись только из-за того, что наценка разная от товара к товару.
Андрей
05 февраля 2021, 12:51
0
нет, ткани могут быть только в одной категории.
Андрей
05 февраля 2021, 12:46
0
Да, все верно
Андрей
05 февраля 2021, 10:03
0
))
Обычные модификации не подходят, ввиду крайне не удобного администрирования.
Попытаюсь объяснить подробнее:
Мебель, выбор ткани или выбор цвета.
Цвета и ткани делятся на ценовые категории, внутри каждой много делений по названиям тканей, а каждая ткань в свою очередь представляет из себя множество фото в разных цветовых решениях.
Категории тканей — это у нас категории товаров. Сама ткань — ресурс (товар), фото тканей — галерея изображений.
Суть в том, что в зависимости от товара наценка на категории тканей разная. Поэтому вводим такую опцию — Категории тканей, которая содержит просто перечисление категорий (категория 1, категория2, категория 3 и т.д.), а в модификациях мы указываем наценку, допустим: кат1 — 0, кат 2 — +500, кат 3 + 1000 и.т.д
При нажатии на сайте ссылки выбор ткани всплывает модальное окно в которое подгружаются только те ресурсы, названия родителя которых совпадают с значениями опций (где-то может быть 5 категорий ткани, где-то 8) и они раскидываются по вкладкам (табам), каждый таб — отдельная категория ткани. и вот сюда мне нужно погрузить наценку категории, а для этого — получить модификации продукта по опции Категория тканей и соответственно наценку на каждое из значений опции
Андрей
04 февраля 2021, 23:29
0
Не уверен))
Суть такова: внутри товара я получаю некий ресурс — в галерее которых цвета.
В тоже время у этого товара есть опция, в модификациях которой указана наценка.

Проще говоря, есть группы лдсп и на каждую группу по названию (категория 1, категория 2 и т.д.) есть наценка. Вот ее и нужно подтянуть.
Андрей
04 февраля 2021, 19:11
0
Ставил бОльший приоритет. И штука в том что в одном коде одна часть товаров нормально работает:
$products = $modx->getObject('msProduct', $product->get('id'));
	

    		if ($products->get('parent') == $plamgasCatsId) {
    			
    			$price_product_id = $products->get('price_id_product');
				$para = $products->get('para')[0];

    			foreach ($price_product_id as $product_id) {
					$res = $modx->getObject('msProduct',$product_id);
						if ($res) {
							$price_sostav = $res->get('price');
							$price_sum += $price_sostav;
							if ($para[0] == 1) {
								$price_sum = $price_sum*2;
							}
						}
				}
				
				$price_sale = $price_sum * 0.95;
    			$product->set('price', $price_sale);
				//$product->set('price', $price_sum);

    			
    		}
А другая часть, которая должна применять скидку к товарам одной категории — не работает

else {
    			
    				$pids = $modx->getParentIds($products->get('id'), 10, array('context' => 'web'));
	    			if (in_array($target, $pids)) {
	    				$price_sale = $product->get('price') * 0.95;
	    			}
	    		
    		}
    		
    		$product->set('price', $price_sale);
Андрей
04 февраля 2021, 18:55
0
Добавил такие строки:
$returned_values = & $modx->event->returnedValues;
$values =  $modx->event->params['data'];
$returned_values['price'] = $price_sale;
все равно не меняет ценник.
Я тут плагины поотключал и выяснил что при отключении плагина msOptionPrice все работает. Но вот где он ценник перебивает ума не приложу
Андрей
04 февраля 2021, 18:39
0
А так он меняет ценник в самой карточке товара, а нужно чтобы в корзине при добавлении
Андрей
04 февраля 2021, 16:40
0
Масса вопросов даже тут не решенных… точно не до Тостера, тут бы все решить
Андрей
04 февраля 2021, 16:39
0
Выяснилось что вообще никаким товарам цен не меняется кроме одной категории…
Почему-то не работает лаже скрипт из документации
case 'msOnBeforeAddToCart':
    $product->set('price', 5555);
    break;
Как выяснить причину?
Андрей
02 февраля 2021, 13:48
0
А как это сделать?
Андрей
02 февраля 2021, 00:28
0
Товаров 3-4к, фото примерно 1-3 в каждом.
А как поправить скрипт, чтобы он брал товары одной категории, вместе с ее подкатегориями?
Андрей
01 февраля 2021, 23:51
0
Не, это не вариант… он по 12 часов работает и не факт что сделает.
Может версия php пониже нужна?
Андрей
01 февраля 2021, 23:18
0
Админка должна работать или можно запустить и выйти?
Андрей
01 февраля 2021, 23:07
0
Я пробовал скрипт от хорошего человека. И почему-то раньше он работал безукоризненно.
Теперь и он отдает ошибки:
Fatal error: Uncaught Error: Call to a member function set() on null in /core/components/minishop2/processors/mgr/gallery/generate.class.php:45 Stack trace: #0 /core/model/modx/modprocessor.class.php(177): msProductFileGenerateProcessor->process() #1 /core/model/modx/modx.class.php(1764): modProcessor->run() #2 /core/components/console/processors/exec.class.php(24): eval()'d code(14): modX->runProcessor('mgr/gallery/gen...', Array, Array) #3 /core/components/console/processors/exec.class.php(24): eval() #4 /core/model/modx/modprocessor.class.php(177): ConsoleExecProcessor->process() #5 /core/model/modx/modx.class.php(1764): modProcessor->run() #6 /core/model/modx/modconnectorresponse.class.php(144): modX->runProcessor('exec', Array, Array) #7 /core/model/modx/modconnectorrequest.class.php(86): modConnectorResponse->outputContent(Array) #8 /core/model/modx/modconnectorrequest.class.php(73): modConnectorRequest->prepareResponse(Array) #9 /manager/components/console/connectors/console.php(11): modConnectorRequest->handleRequest(Array) #10 {main} thrown in /core/components/minishop2/processors/mgr/gallery/generate.class.php on line 45
Андрей
01 февраля 2021, 22:56
0
Запускаю в консоли сервера, через SSH
Андрей
01 февраля 2021, 22:25
0
<?php
define('MODX_API_MODE', true);
require 'index.php'; // Этот файл лежит в корне сайта

$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

// Проходимся по всем товарам
$products = $modx->getIterator('msProduct', array('class_key' => 'msProduct'));
foreach ($products as $product) {
    // Получаем оригиналы их картинок
    $files = $product->getMany('Files', array('parent' => 0));
    foreach ($files as $file) {
        // Затем получаем их преью
        $children = $file->getMany('Children');
        foreach ($children as $child) {
            // Удаляем эти превью, вместе с файлами
            $child->remove();
        }
        // И генерируем новые
        $file->generateThumbnails();

        // Если это первый файл в галерее - обновляем ссылку на превью товара
        /** @var msProductData $data */
        if ($file->get('rank') == 0 && $data = $product->getOne('Data')) {
            $thumb = $file->getFirstThumbnail();
            $data->set('thumb', $thumb['url']);
            $data->save();
        }
    }
}

echo microtime(true) - $modx->startTime;
Андрей
08 января 2021, 16:37
0
Добрый день. Подскажите, а если вообще разделитель не нужен? пусть будет номер заказа и без слеша сразу месяц и год. Как сделать?