Вывод полей второстепенной категории

Привет всем еще раз!

Такая нарисовалась проблема:
Есть товары, которые лежат сразу в нескольких категориях. Соответственно, одна у них основная, а остальные второстепенные (отмечены галочками на вкладке Категория).

Вывод на странице всех категорий через [[!msProducts?]].
КАТАЛОГ

[[!msProducts?
               &parents=`150`
               &limit=`0`
               &sortby=`{ "menuindex":"ASC" }`
               &tpl=`programs.row`
            ]]

[[!msProducts?
               &parents=`151`
               &limit=`0`
               &sortby=`{ "menuindex":"ASC" }`
               &tpl=`programs.row`
            ]]

[[!msProducts?
               &parents=`180`
               &limit=`0`
               &sortby=`{ "menuindex":"ASC" }`
               &tpl=`programs.row`
            ]]
Надо вывести в tpl pagetitle именно категории, указанной в [[!msProducts?]]. Если такая категория является основной — проблем нет. А вот если она дополнительная — то не выводится.

Спасибо огромное Павлу!

РЕШЕНИЕ:

Павел Романов

modx.pro/help/23970#comment-139307

Сделайте копию сниппета msProducts и перед этой строкой:
$output[] = $pdoFetch->getChunk($tpl, $row);
добавьте:
$row['parents'] = $scriptProperties['parents'];
Поменяйте вызовы msProducts на новый сниппет и теперь сможете в чанках использовать плейсхолдер [[+parents]], который будет выводить то, что указано в параметре &parents в вызове.
Для вывода в чанках именно pagetitle делайте так:

[[#[[+parents]].pagetitle]]
//или на Fenom
{$parents | resource : 'pagetitle'}
kudesia
17 мая 2023, 23:22
modx.pro
343
0

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

Артур Шевченко
17 мая 2023, 23:29
-1
Вы зачем спамите похожими вопросами? Предыдущий ваш вопрос был про это же, только с другого бока.
    kudesia
    17 мая 2023, 23:39
    0
    Тот вопрос про вывод всех категорий, а этот про одну второстепенную, конкретно указанную в [[!msProducts?]]
      Артур Шевченко
      17 мая 2023, 23:43
      0
      Я не понял задачу. Что за страница со второстепенными категориями?
        kudesia
        18 мая 2023, 00:03
        0
        Вот так может лучше

        joxi.ru/823NelZCwlwnym

        Вот нужно вывести pagetitle этот дополнительной, а не основной категории
    Тодор
    18 мая 2023, 00:18
    0
    getParentIds возвращает список ИДшек всех родителей ресурса. Только на него ни как не влияет категории отмеченные во вкладке Категории
      kudesia
      18 мая 2023, 16:02
      0
      у т.е. вообще нельзя вывести поле именно такой категории?
      Dan
      Dan
      18 мая 2023, 16:08
      0
      Но надо вывести в каждом товаре pagetitle такой категории. А выводится pagetitle только основной категории, а не той, что задана через [[!msProducts?]]
      Имеется в виду в карточке товара, находясь на странице категории, вывести название текущей открытой категории? Не совсем понятен вопрос.
      Если да, то может покажете как у вас в чанке выводится? Видимо просто
      {$parent | resource : 'pagetitle'}
      ?

      Просто в чанке укажите так:
      {$_modx->resource.pagetitle}
      если включен fenom, если нет, то
      [[*pagetitle]]
        kudesia
        18 мая 2023, 16:13
        +1
        {$parent | resource : 'pagetitle'}
        так выводится основная категория товара, а не та, что на странице вызывается.

        а на странице вызывается дополнительная категория

        Как вывести именно ту, которая в вызове msProduct участвует?
          Dan
          Dan
          18 мая 2023, 16:18
          0
          так выводится основная категория товара, а не та, что на странице вызывается.
          Как вывести именно ту, которая в вызове msProduct участвует?
          Если вы в момент вызова msProducts находитесь на странице нужной категории, то как я и писал выше, в чанке укажите
          {$_modx->resource.pagetitle}
          так выведется название текущей страницы, т.е. текущей открытой категории, а не основной родительской категории товара
            kudesia
            18 мая 2023, 16:21
            +1
            В вызове msProducts вы указываете parents — это основные родители, а не второстепенные.
            Вовсе нет. Выводит любой ресурс msCategory по умолчанию.
              Dan
              Dan
              18 мая 2023, 16:27
              -1
              Вообще не понимаю, что вы пишете. Причем тут msCategory, и где он выводится по умолчанию.
              Вы не понимаете как это работает.
              У каждого товара может быть ТОЛЬКО ОДНА основная категория, она указывается в бд в поле parent.
              При этом товар может быть в других категориях, которые могут не являться дочерними категориями его parent.
              В чанке parent — это то число, которое указано в бд у товара, а не то, что вы указали в parents при вызове сниппет msProducts
                kudesia
                18 мая 2023, 17:25
                0
                Я оговорилась: не msCategory, а сниппет msProducts
                  kudesia
                  18 мая 2023, 17:29
                  +1
                  В чанке parent — это то число, которое указано в бд у товара, а не то, что вы указали в parents при вызове сниппет msProducts
                  Так я Вам тоже самое и пишу. Что эта конструкция {$parent | resource: 'pagetitle'} не выведет то, что мне нужно, а выведет именно основного родителя.
                  А мне надо вывести именно ту категорию. которая в msProducts, как и писала об этом ранее и в самом вопросе.
                kudesia
                18 мая 2023, 16:25
                0
                {$_modx->resource.pagetitle}
                К сожалению — нет, в каталоге. Иначе, моего вопроса не возникло бы.

                Каталог с категориями.

                Есть категория id 150 в ней нет ни одного собственного товара.
                Но есть товары из других категорий, у которых id 150 отмечена во вкладке Категории.
                И при выводе в каталоге с категориями, id 150 выводит товары, в которых она отмечена. И без всяких дополнительных настроек, просто сниппетом msProduct

                Вы попробуйте сами.
                  Dan
                  Dan
                  18 мая 2023, 16:30
                  0
                  Какое название категории выводится в чанке, та и является основной для товара. Если это название категории с id 150, то значит у нее есть собственные товары и видимо все. Отсюда получается, что вы скорее всего неправильно свой каталог организовали.
                    kudesia
                    18 мая 2023, 17:31
                    0
                    Создайте в минишоп две категории.
                    В одной создайте товар, а другую отметьте в нем галочкой.

                    И вот выведите pagetitle этой другой категории.
                    Тогда Вы поймете, о чем я.

                    Мне не нужен pagetitle основной категории, я уже говорила, что мне нужен Pagetitle той категории, в которой выеден товар сниппетом msProducts, в данном случае id150 — она не его основная.
                      Dan
                      Dan
                      18 мая 2023, 17:38
                      0
                      Я прекрасно понимаю о чем вы и как это работает. Вы поймите, что этих вторичных категорий может быть несколько, поэтому должна быть какая то логика. Либо например вы находитесь на странице этой самой категории и в карточках товара нужно вывести ее название, либо вы хотите вывести название конкретной категории, id которой вы знаете заранее.
                      Если второй вариант, что довольно странно, то можно по той же аналогии, что и сейчас, просто вместо $parent в строке
                      {$parent | resource: 'pagetitle'}
                      укажите id этой категории

                      По хорошему стоит показать ваш вызов msProducts
                        kudesia
                        18 мая 2023, 18:06
                        0
                        Что вторичных категорий несколько это и так понятно.
                        Вот я вывожу в каталоге такую категорию. и вывожу в ней товары, но своих собственных товаров она не имеет., а только отмечена галкой в товарах других категорий. И таких Категорий на странице каталога несколько.

                        Вызов msProducts стандартный.

                        [[!msProducts?
                                       &parents=`150`
                                       &limit=`0`
                                       &sortby=`{ "menuindex":"ASC" }`
                                       &tpl=`programs.row`
                                    ]]
                        Так как мне вывести в товарах в &tpl=`programs.row` ее pagetitle?
                          kudesia
                          18 мая 2023, 18:09
                          0
                          просто вместо $parent в строке
                          {$parent | resource: 'pagetitle'}
                          укажите id этой категории
                          Так мне нужно как-то получить этот id, а не руками вписывать цифры, об этом и вопрос мой.
                            Dan
                            Dan
                            18 мая 2023, 18:11
                            0
                            Но вы же в msProducts напрямую указываете его, так укажите и в чанке.
                              kudesia
                              18 мая 2023, 18:12
                              0
                              Зачем мне для каждой категории создавать отдельный чанк tpl для вывода товаров. а не один универсальный?

                              50 категорий и 50 tpl? Отличающихся одной строкой?
                                Dan
                                Dan
                                18 мая 2023, 18:14
                                0
                                Ну так у вас вызов msProducts неуниверсальный. Или вы в parents по другому указываете?
                                kudesia
                                18 мая 2023, 18:17
                                0
                                Так.

                                Может так понятнее будет.

                                КАТАЛОГ
                                
                                [[!msProducts?
                                               &parents=`150`
                                               &limit=`0`
                                               &sortby=`{ "menuindex":"ASC" }`
                                               &tpl=`programs.row`
                                            ]]
                                
                                [[!msProducts?
                                               &parents=`151`
                                               &limit=`0`
                                               &sortby=`{ "menuindex":"ASC" }`
                                               &tpl=`programs.row`
                                            ]]
                                
                                [[!msProducts?
                                               &parents=`152`
                                               &limit=`0`
                                               &sortby=`{ "menuindex":"ASC" }`
                                               &tpl=`programs.row`
                                            ]]
                                
                                [[!msProducts?
                                               &parents=`155`
                                               &limit=`0`
                                               &sortby=`{ "menuindex":"ASC" }`
                                               &tpl=`programs.row`
                                            ]]
                                
                                [[!msProducts?
                                               &parents=`140`
                                               &limit=`0`
                                               &sortby=`{ "menuindex":"ASC" }`
                                               &tpl=`programs.row`
                                            ]]
                                
                                [[!msProducts?
                                               &parents=`180`
                                               &limit=`0`
                                               &sortby=`{ "menuindex":"ASC" }`
                                               &tpl=`programs.row`
                                            ]]
                                
                                ....
                                &tpl=`programs.row` у всех одинаковый, потому что универсальный.
                                Dan
                                Dan
                                18 мая 2023, 18:59
                                0
                                Во, другой разговор, с этого и надо было начинать вопрос.
                                Вы можете использовать additionalPlaceholders, про который написано тут.
                                Но нужно обновить minishop2 как минимум до 4.2. Не знаю, как будет в синтаксисе PHx, но на феном вызов будет такой:
                                {'!msProducts' | snippet : [
                                        'parents' => 180,
                                        'limit' => 0,
                                        'sortby' => '{"menuindex":"ASC"}',
                                        'tpl' => 'programs.row',
                                        'additionalPlaceholders' => [
                                            'pr' => 180
                                        ]
                                ]}
                                И в чанке programs.row вместо
                                {$parent | resource: 'pagetitle'}
                                укажите
                                {$additionalPlaceholders.pr | resource: 'pagetitle'}
                                kudesia
                                18 мая 2023, 19:38
                                0
                                Эх…

                                так выводит родителя этих всех категорий…
                                Dan
                                Dan
                                18 мая 2023, 20:42
                                0
                                Чет вы неправильно делаете
                                kudesia
                                18 мая 2023, 21:16
                                0
                                Да тут сложно неправильно сделать.
                                kudesia
                                19 мая 2023, 10:17
                                0
                                Так Вы попробуйте сами.

                                Создайте в минишоп две категории.
                                В одной создайте товар, а другую отметьте в нем галочкой.

                                И вот выведите pagetitle этой другой категории.

                                modx.pro/help/23970#comment-139267
                                Dan
                                Dan
                                19 мая 2023, 16:44
                                0
                                Уже делал такое без проблем и не раз на многих проектах. Я же говорю, вы что-то делаете неправильно.
                                kudesia
                                21 мая 2023, 11:03
                                0
                                Этого не может быть. Поскольку все, что Вы рекомендовали я сделала один-в-один, а результата нет.
                                Значит, Вы не поняли мой вопрос.
                                Мне нужно вывести pagetitle той категории, которая указана в msproducts.
                                Если такая категория является основной — проблем нет. А вот если она дополнительная — то не выводится.
                                В любом случае, спасибо за попытку помочь.
                        Павел Романов
                        19 мая 2023, 12:27
                        +1
                        Если Вам нужно вывести второстепенные категории товара, сделайте сниппет myCategories:
                        <?php
                        $id = $modx->getOption('id', $scriptProperties, $modx->resource->get('id'));
                        $table_cont = $modx->getOption('table_prefix').'site_content';
                        $table_cat = $modx->getOption('table_prefix').'ms2_product_categories';
                        $sql = "SELECT * FROM {$table_cat} WHERE `product_id` = {$id}";
                        $q = $modx->prepare($sql);
                        $q->execute();
                        $resources = $q->fetchAll(PDO::FETCH_ASSOC);
                        foreach ($resources as $category){
                            $cid = $category['category_id'];
                        	if($result = $modx->query("SELECT * FROM {$table_cont} WHERE id = {$cid}")){
                        		$row = $result->fetch(PDO::FETCH_ASSOC);
                        		$out .= $modx->getChunk($tpl, $row);
                        	}
                        }
                        return $out;

                        В чанке msProducts (programs.row) вызывайте его так:
                        [[myCategories? &id=`[[+id]]`&tpl=`subcat_tpl`]]
                        Или на Fenom
                        {'myCategories' | snippet: ['id' => $id, 'tpl' => 'subcat_tpl']}
                        В карточке товара &id можно не указывать.

                        В чанке subcat_tpl доступны любые поля категории: [[+pagetitle]], [[+content]] и т. д.
                          kudesia
                          21 мая 2023, 11:00
                          0
                          Спасибо, но мне нужно вывести pagetitle той категории, которая указана в msproducts.
                          Если такая категория является основной — проблем нет. А вот если она дополнительная — то не выводится.

                          Ваш сниппет выводит все дополнительные категории.

                          Может Вы знаете, как вывести именно ту, которая указана?
                            Павел Романов
                            21 мая 2023, 11:10
                            0
                            Имеется та, что указана в вызове в &parents?
                            То есть тут нужно в чанке programs.row вывести pagetitle категории с ID = 180?

                            [[!msProducts?
                                &parents=`180`
                                &limit=`0`
                                &sortby=`{ "menuindex":"ASC" }`
                                &tpl=`programs.row`
                            ]]
                              kudesia
                              21 мая 2023, 12:07
                              0
                              То есть тут нужно в чанке programs.row вывести pagetitle категории с ID = 180?
                              Да, но таких категорий на странице несколько и programs.row у всех в tpl.
                              Он одинаков для всех категорий.
                              modx.pro/help/23970#comment-139274
                                Павел Романов
                                21 мая 2023, 12:22
                                +1
                                Сделайте копию сниппета msProducts и перед этой строкой:
                                $output[] = $pdoFetch->getChunk($tpl, $row);
                                добавьте:
                                $row['parents'] = $scriptProperties['parents'];

                                Поменяйте вызовы msProducts на новый сниппет и теперь сможете в чанках использовать плейсхолдер [[+parents]], который будет выводить то, что указано в параметре &parents в вызове.
                                Для вывода в чанках именно pagetitle делайте так:

                                [[#[[+parents]].pagetitle]]
                                
                                //или на Fenom
                                {$parents | resource : 'pagetitle'}
                                kudesia
                                21 мая 2023, 12:59
                                +1
                                Спасибо!
                                То, что нужно!
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            36