Вячеслав Варов

Вячеслав Варов

С нами с 06 сентября 2016; Место в рейтинге пользователей: #232
Вячеслав Варов
23 мая 2020, 21:22
0
+ очень долго сохраняются шаблоны страниц и чанки
Вячеслав Варов
03 ноября 2019, 10:33
0
Я использовал вывод опций через pdoResources, и это сработало
[[!pdoResources?
                    &tpl=`tpl.productOptions`
                    &parents=`[[*parent]]`
                    &class=`msProduct`
                    &leftJoin=`{
                        "Options": {
                            "class": "msProductOption",
                            "on": "msProduct.id = Options.product_id"
                        },
                        "captionOption": {
                            "class": "msOption",
                            "on": "Options.key = captionOption.key"
                        }
                    }`
                    &select=`{
                        "Options": "key,value",
                        "captionOption":"caption,measure_unit"
                    }`
                    &where=`["msProduct.id = [[*id]]"]`
                ]]
а в чанке вывода используем переменные {$key} {$value} {$caption} {$measure_unit}
Вячеслав Варов
03 ноября 2019, 10:31
0
Я использовал вывод опций через pdoResources, и это сработало
[[!pdoResources?
                    &tpl=`tpl.productOptions`
                    &parents=`[[*parent]]`
                    &class=`msProduct`
                    &leftJoin=`{
                        "Options": {
                            "class": "msProductOption",
                            "on": "msProduct.id = Options.product_id"
                        },
                        "captionOption": {
                            "class": "msOption",
                            "on": "Options.key = captionOption.key"
                        }
                    }`
                    &select=`{
                        "Options": "key,value",
                        "captionOption":"caption,measure_unit"
                    }`
                    &where=`["msProduct.id = [[*id]]"]`
                ]]
а в чанке вывода используем переменные {$key} {$value} {$caption} {$measure_unit}
Вячеслав Варов
27 октября 2019, 11:34
0
привет! получилось разобраться?
Вячеслав Варов
27 октября 2019, 00:56
0
не правильно определялась модификация, разобрался
Вячеслав Варов
26 октября 2019, 22:18
0
Привет! У меня вопрос по отображению превью модификации товара в корзине, почему-то при выводе товаров через msCart $product.options.modification тут пусто, и модификация не отображается, с чем это может быть связанно?
Вячеслав Варов
29 апреля 2019, 17:27
0
Дополнил скрипт, теперь при создании опции с типом number скрипт распознает ее и вместо вывода чекбоксами будет выводить ее бегунками от — до:) можно расширить функционал как душе угодно я добавил в getms2options.class.php switch по типу опции где помимо number можно указать и другие типы и следовательно шаблоны к ним:)

Шаг 3 заменил на это:
<?php
class customTvssComboGetMs2OptionsProcessor extends modObjectProcessor
{
    public $classKey = 'msOption';
    /** @var miniShop2 $ms2 */
    protected $ms2;
    /** @var tvSuperSelect $tvss */
    protected $tvss;

    /**
     * @return bool
     */
    public function initialize()
    {
        $this->ms2 = $this->modx->getService('minishop2', 'miniShop2', MODX_CORE_PATH . 'components/minishop2/model/minishop2/');
        $this->tvss = $this->modx->getService('tvsuperselect', 'tvSuperSelect',
            $this->modx->getOption('tvsuperselect_core_path', null, MODX_CORE_PATH . 'components/tvsuperselect/') . 'model/tvsuperselect/');

        return parent::initialize();
    }

    /**
     * @return string
     */
    public function process()
    {
        $query = trim($this->getProperty('query'));
        $limit = (int)$this->getProperty('limit', 0);
        $resource_id = (int)$this->getProperty('resource_id', 0);
        if (!$tv_id = (int)$this->getProperty('tv_id', 0)) {
            //
        }
        $q = $this->modx->newQuery($this->classKey);
        $q->select(array(
            "{$this->classKey}.key as `key`",
            "{$this->classKey}.caption as `caption`",
			"{$this->classKey}.type as `type`",
        ));
        if (!empty($query)) {
            $q->where(array(
                "{$this->classKey}.key:LIKE" => "%{$query}%",
                "OR:{$this->classKey}.caption:LIKE" => "%{$query}%"
            ));
        }
        $q->limit($limit);
        $q->sortby($this->classKey . '.key', 'ASC');
        
        $rows = array();
        if ($q->prepare() && $q->stmt->execute()) {
            if ($tmp = $q->stmt->fetchAll(PDO::FETCH_ASSOC)) {
                foreach ($tmp as $v) {
					switch ($v['type']) {
						case 'numberfield':
							$v['type'] = 'number';
							break;
						default:
							$v['type'] = '';
							break;
					}
                    
						
						if ($v['type'] != '') {
							$rows[] = array(
                        'display' => '(' . $v['key'] . ') <b>' . $v['caption'] . '</b>',
						'value' => $v['key'] . ':' .  $v['type'],
                    );
						} else {
							$rows[] = array(
                        'display' => '(' . $v['key'] . ') <b>' . $v['caption'] . '</b>',
						'value' => $v['key'],
                    );
						}
                }
            }
        }
        foreach ($rows as &$row) {
            if (empty($row['display'])) {
                $row['display'] = $row['value'];
            }
        }
        unset($row);

        return $this->outputArray($rows);
    }
}

return 'customTvssComboGetMs2OptionsProcessor';

Шаг 4 заменил на это:
{var $filters = []}

{* Мы можем указать свойства фильтра, которые отобразятся до опций, выбранных нами *}
{var $filters[] = 'ms|vendor:vendors'}
{var $filters[] = 'msop|price:number'}

{* Магия *}
{var $mfilter_options = $_modx->resource['mfilter_options']}
{if !is_array($mfilter_options)}
    {var $mfilter_options = ($mfilter_options | fromJSON)}
{/if}
{if $mfilter_options is empty}
    {foreach $_modx->getParentIds($_modx->resource['id']) as $parent_id}
        {if $parent_id == 0}
            {continue}
        {/if}
        {var $mfilter_options = ($parent_id | resource : 'mfilter_options')}
        {if !is_array($mfilter_options) AND $mfilter_options?}
            {var $mfilter_options = ($mfilter_options | fromJSON)}
        {/if}
        {if $mfilter_options?}
            {break}
        {/if}
        {unset $mfilter_options}
    {/foreach}
{/if}
{if $mfilter_options?}
    {foreach $mfilter_options as $v}
        {var $filters[] = ('msoption|' ~ $v)}
    {/foreach}
{/if}

{* Все параметры mFilter2 указываем тут *}
{var $options = [
          'element'=>'msProducts',
          'parents'=> $_modx->resource.id,
          'setTotal'=>'1',
          'totalVar'=>'total',
          'loadModels'=>'easycomm',
          'includeTVs'=>'smallDescription',
          'tplOuter'=>'tpl.catalogWrap',
          'tpl'=>'catalog.Row',
          'limit'=>'20',
          'ajaxMode'=>'button',
          'includeThumbs'=>'small',
          'filterOptions'=>'{
                    "more_tpl":"<button class=\"standart-button align-center how-more-button btn_more btn w-button\">Показать ещё 20 товаров<\/button>"
            }',
          'leftJoin'=>'{
	                "ecThread": {
		                "class": "ecThread",
	                	"on": "msProduct.id = ecThread.resource"
	            }
         }',
        'aliases'=>'
             ms|price==price,
             resource|parent==parent,
             ms|vendor==vendor
          ',
          'sortAliases'=>'{
          "ecThread":"ecThread"
          }',
          'sort'=>'ms|menuindex:asc',
          'suggestionsRadio'=>'vendor:vendors',
          'class'=>'msProduct',
          'filters' => ($filters | join : ','),
          'tplFilter.outer.msop|price'=>'tpl.mFilter2.filter.slider',
	      'tplFilter.row.msop|price'=>'tpl.mFilter2.filter.number',
          'tplFilter.outer.vendor'=>'tpl.mfilter2.filter.select',
          'tplFilter.row.vendor'=>'tpl.mfilter2.filter.option'
]}
{var $tplFilters = []}
{foreach $filters as $row}
        {if ':number' | in : $row}
            {* тут мы проверяем какого типа у нас опция  *}
            {var $row = $row | replace : ":number" : ""}
                {* удалив название типа из строки формируем шаблоны для вывода *}
                {set $tplFilters['tplFilter.outer.' ~ $row] = 'tpl.mFilter2.filter.slider'}
                {set $tplFilters['tplFilter.row.' ~ $row] = 'tpl.mFilter2.filter.number'}
        {/if}
{/foreach}

{* Соединяем два массива - один с опциями mfilter2 другой c нашими шаблонами  ОБЯЗАТЕЛЬНО должен быть включен параметр "использование PHP в FENOM, если кто знает как выполнить слияние двух массивов средствами Fenom иначе - поделитесь *} 
{set $options = array_merge($tplFilters, $options)}

{* Вывод mFilter2 *}
{'!mFilter2' | snippet : $options}
Вячеслав Варов
29 апреля 2019, 16:38
0
это можно сделать из админки и простому пользователю
Вячеслав Варов
29 апреля 2019, 16:37
0
получается не совсем универсально, ведь если появились опции новые пользователь не зайдет и не добавит сам шаблон
Вячеслав Варов
29 апреля 2019, 16:02
0
Сделал по интструкции но modx автоматически определяет фильтры как чекбоксы а надо бы слайдер и селекты такое уже не реализовать?
Вячеслав Варов
06 ноября 2018, 17:18
0
Чтобы simpleSearch искал по артикулу, необходимо его добавлять в таблицу modx_site_content, например задействать поле «Аннотация» для ключевых слов, туда вбивать артикул и другие параметры minishop2 необходимые для поиска
Вячеслав Варов
06 ноября 2018, 17:17
0
Чтобы simpleSearch искал по артикулу, необходимо его добавлять в таблицу modx_site_content, например задействать поле «Аннотация» для ключевых слов, туда вбивать артикул и другие параметры minishop2 необходимые для поиска
Вячеслав Варов
08 октября 2018, 12:53
0
Владимир, можно подробнее как это работает?

Я правильно понимаю что тут идет подмена полей мастера полями раба чтобы mfilter2 фильтровал по рабам а мастеров выводил всегда с различными полями?
Вячеслав Варов
07 октября 2018, 18:50
0
Проблема решена, все оказалось проще, нужно вместо innerJoin использовать leftJoin
Вячеслав Варов
07 октября 2018, 18:06
0
У меня получилось объединить, НО теперь выводятся только Мастер товары, а нужно чтобы выводились все включая товары вообще без связи кроме подчиненных товаров

[[!mfilter2?
          &element=`msProducts`
          &parents=`2`
          &loadModels=`easycomm`
          &tplOuter=`tpl.catalogWrap`
          &tpl=`catalog.Row`
          &limit=`20`
          &groupRows=`1`
          &aliases=`
             ms|price==price,
             resource|parent==parent,
             ms|vendor==vendor,
             msoption|space==space,
             msoption|width==width,
             msoption|power==power
          `
          &ajaxMode=`button`
          &includeThumbs=`small`
          &filterOptions=`{
          "more_tpl":"<button class=\"standart-button show-more-button btn_more btn w-button\">Показать ещё 20 товаров<\/button>"
          }`
          &showLog=`1`
          &leftJoin=`{
	"ecThread": {
		"class": "ecThread",
		"on": "msProduct.id = ecThread.resource"
	},
	"Link": {
	    "class": "msProductLink",
	    "on": "msProduct.id = Link.slave and Link.link = 5"
	}
}`

&innerJoin=`{
		"msProductSlave": {
		    "class":"msProductLink",
		    "alias":"msProductSlave",
		    "on":"msProduct.id = msProductSlave.master"
		}
}`
          &sortAliases=`{
          "ecThread":"ecThread"
          }`
          &sort=`ms|favorite:desc`
          &filters=`
          ms|vendor:vendors,
          ms|price:number,
          parent:categories,
          msoption|cable,
          msoption|space:number,
          msoption|width:number,
          msoption|power:number
          `
          &suggestionsRadio=`vendor:vendors`
          &class=`msProduct`
          &select=`{
          "Link": "slave",
          "msProduct": "*",
          "msProductSlave":"msProductSlave.slave as product_id"
          }`
          &where=`{
          "Link.slave:IS": null
          }`
          &tplFilter.row.price=`tpl.mFilter2.filter.number`
          &tplFilter.outer.price=`tpl.mFilter2.filter.minMax`
          &tplFilter.row.width=`tpl.mFilter2.filter.number`
          &tplFilter.outer.width=`tpl.mFilter2.filter.minMax`
          &tplFilter.row.power=`tpl.mFilter2.filter.number`
          &tplFilter.outer.power=`tpl.mFilter2.filter.minMax`
          &tplFilter.row.space=`tpl.mFilter2.filter.number`
          &tplFilter.outer.space=`tpl.mFilter2.filter.minMax`
          &tplFilter.outer.vendor=`tpl.mfilter2.filter.select`
          &tplFilter.row.vendor=`tpl.mfilter2.filter.option`
          ]]
Вячеслав Варов
25 сентября 2018, 22:20
0
да, суть в том чтобы это были разные товары, тоже хотел изначально опираясь на это расширение сделать но нет
Вячеслав Варов
25 сентября 2018, 18:37
0
надо попробовать, но как быть с товарами без групп
Вячеслав Варов
25 сентября 2018, 17:50
0
тут вся петрушка в том что выводятся все товары, последовательно, а должен только первый товар а остальные внутри него
Вячеслав Варов
20 сентября 2018, 18:20
0
Хорошо, в таком случае кто может сделать этот функционал за деньги и в какую сумму напишите в telegram Vyacheslav.y
Вячеслав Варов
20 сентября 2018, 13:25
+1
запустите перед всем этим сниппет через феном, результат впишите в переменную, полученные данные выведите в нужных местах используя ту самую переменную

либо запустить сниппет и получить id ресурсов, сделать его рандомным любым желаемым способом, и ниже в двух сниппетах pdoResources использовать &resources=`переменная с id`

тем самым вы «свяжете» два сниппета

Я бы воспользовался первым вариантом