Принадлежность двум категориям (msProducts)

Доброго времени суток!

Есть следующие категории:
Категория 1 (1)
Категория 2 (2)
Категория 3 (3)
— Подкатегория 3.1 (4)
— Подкатегория 3.2 (5)

Для товаров в Подкатегория 3.1 я поставил галочку в дереве, что они еще принадлежат и Категории 1.

Задача в следующем: нужно вывести все товары из Категория 3, которые, также, принадлежат Категория 1 (товары из Категория 1 выводить не нужно).

Делаю следующим образом:

[[!msProducts? &tpl=`tpl.row` &parents=`3`]]
Этот вызов выведет все товары из Категория 3, даже те, которые не принадлежат еще и Категория 1.
Пробовал выставить так:
[[!msProducts? &tpl=`tpl.row` &parents=`3` &where=`{"parent:=":"1"}`]]
— выводятся только товары из Категория 1.
[[!msProducts? &tpl=`tpl.row` &parents=`3` &where=`{"parent:IN(1)"}`]]
— снова выводятся все товары из Категория 3.

Единственное, что сейчас приходит в голову это писать свой сниппет, которому передавать результат этого вызова:
[[!msProducts? &tpl=`tpl.row` &parents=`1`]]
В своем сниппете получать id всех подкатегорий Категория 3, и если parent элемента равен одному из id полученных подкатегорий, то выводить этот товар.

Может можно как-то отфильтровать для моего случая без своего сниппета, а только используя msProducts либо другим способом?
Ilya Z.
04 апреля 2015, 13:47
modx.pro
2
2 708
0

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

Сергей Фещуков
05 апреля 2015, 05:48
0
Смотрите базу данных и как в нём хранятся родители и принадлежность категориям у товаров. parent — стандартный столбец прямого единственного родителя в modx и имеет тип integer (если мне память не изменяет), то есть одно целое число. А вы пишите parent=3 и тут же parent=1. Добавьте showLog=`1` при вызове сниппета и посмотрите какой запрос в итоге получается. А вот дополнительные категории не знаю точно где хранятся, в этом не разбирался, но возможно в таблице modx_ms2_products.
    Ilya Z.
    05 апреля 2015, 12:35
    0
    это я посмотрел. основные категории берутся из таблицы modx_site_content столбца parent. дополнительные категории берутся из таблицы modx_ms2_product_categories, следовательно, если делать:
    [[!msProducts? &tpl=`tpl.row` &parents=`1`]]
    то добавится:
    OR:msProduct.id:IN(53,57,58,59,60,61)
    это id товаров, которые присутствуют в modx_ms2_product_categories.

    не совсем понятно, как используя только msProducts можно выбрать товары из Категория 3, а потом эту выборку отфильтровать так, чтобы остались товары, которые еще принадлежат и Категория 1.
      Владимир
      05 апреля 2015, 15:22
      0
      А вот «костыль» modx.com/extras/package/taxonomies, который позволяет связать любой ресурс с несколькими категориями создаваемые этим костылем. Как вариант.
        Ilya Z.
        05 апреля 2015, 15:57
        0
        все уже связано. вы видимо не вникли в суть моего вопроса.
        Сергей Фещуков
        05 апреля 2015, 17:03
        0
        Если эта таблица не подключается по умолчанию, то используйте параметр join вроде называется при вызове сниппета для подключения таблицы с дополнительными категориям, затем в where указываете правильное условие. Сейчас не за компьютером, не могу посмотреть как там точно.
          Ilya Z.
          05 апреля 2015, 17:31
          0
          не могу сообразить, как правильно использовать leftJoin и select в msProducts. написал следующее:
          [[!msProducts? &tpl=`tpl.main.page.content.goods.row` 
                         &parents=`3`
                         &leftJoin=`{
          		"modx_ms2_product_categories":"*"
          		}`
                         &select=`{"modx_ms2_product_categories":"modx_ms2_product_categories.product_id as cpid, modx_ms2_product_categories.category_id as ccid"}`
                         &limit=`50` 
                         &showLog=`1`]]
          и получаю такую ошибку:
          Could not process query, error #1054: Unknown column 'modx_ms2_product_categories.product_id' in 'field list'
            Руслан Кундиус
            05 апреля 2015, 17:58
            +2
            Как-то так:
            [[!msProducts?
                &tpl=`tpl.main.page.content.goods.row` 
                &parents=`3`
                &innerJoin=`{
                    "msCategoryMember": {
                        "class": "msCategoryMember",
                        "on": "msCategoryMember.product_id = msProduct.id AND msCategoryMember.category_id = 1"
                    }
                }`
                &limit=`50` 
                &showLog=`1`
            ]]
              Ilya Z.
              05 апреля 2015, 20:21
              0
              спасибо большое :)

              а почему таблицу modx_ms2_product_categories называть в msProducts, как msCategoryMember?

              подскажите, пожалуйста, где можно почитать про данные тонкости, чтобы потом самому составлять подобные выборки?
                Василий Наумкин
                05 апреля 2015, 20:34
                +3
                Так прописано в модели дополнения, это хорошо видно в схеме, по которой она генерируется.

                Почитать можно здесь. А про работу с джоинами pdoTools — здесь.
                  Ilya Z.
                  05 апреля 2015, 20:42
                  0
                  Спасибо, Василий :)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      10