Конфликт при вызове msProduct внутри pdoResource

В общем, хочу вывести список категорий и у каждой категории рандомный товар из неё (любой вложенности).

Делаю так:
1. В шаблоне вызываю pdoResource:
[[!pdoResources?
	&depth=`0`
	&tpl=`tpl.categories.preview`
	&tplWrapper=`tpl.categories.preview.wrapper`
	&where=`{"class_key:=": "msCategory"}`
	&sortby=`menuindex`
	&sortdir=`ASC`
]]
2. Чанк tpl.categories.preview.wrapper:
<section class="products-list">
[[+output]]
</section>
3. Чанк tpl.categories.preview. В нём вызываю msProduct, чтобы вытащить рандомный товар. Но сейчас в нём нет никаких плейсхолдеров, чтобы показать происходящую ошибку:
<div class="product-preview">
	Это превью категории
<b>[[!msProducts?
	&parents=`[[+id]]`
	&tpl=`tpl.msProducts.row.preview.without.container`
	&includeContent=`1`
	&includeThumbs=`x220`
	&sortby=`RAND()`
	&limit=`1`
]]</b>
</div>
4. Чанк tpl.msProducts.row.preview.without.container:
Это превью рандомного товара
По логике должно быть вот так:
<section class="products-list">
	<div class="product-preview">
		Это превью категории
<b>Это превью рандомного товара</b>
	</div>
	<div class="product-preview">
		Это превью категории
<b>Это превью рандомного товара</b>
	</div>
	<div class="product-preview">
		Это превью категории
<b>Это превью рандомного товара</b>
	</div>
	<div class="product-preview">
		Это превью категории
<b>Это превью рандомного товара</b>
	</div>
</section>
Но получается вот так:
<section class="products-list">
	<div class="product-preview">
		Это превью категории
<b>Это превью рандомного товара</b>
	</div>

Это превью рандомного товара
Это превью рандомного товара
Это превью рандомного товара
Это превью рандомного товара
Это превью рандомного товара
Это превью рандомного товара
Это превью рандомного товара
Это превью рандомного товара
Это превью рандомного товара
</section>
Ума не приложу, почему так. Возможно из-за использования pdoTools в качестве класса для выборки и сниппеты где-то как-то между собой конфликтуют…
Алексей Карташов
25 августа 2013, 13:41
modx.pro
1
3 569
0

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

Василий Наумкин
25 августа 2013, 17:43
0
Зачем, для кого я сделал параметр &showLog=`1`, если им никто не пользуется?!

Ну и если в pdoTools возникает ошибка при запросе — он пишет её в системный журнал.
    Алексей Карташов
    25 августа 2013, 17:50
    0
    Не-не-не! Я пользуюсь, ток в этот раз у меня из-за вёрстки лог уехал, я его сразу не увидел… Ну протупил в общем.

    Вот лог, который выдаёт pdoResource:
    0.0090439: xPDO query object created
    0.0002632: leftJoined msProductData as Data
    0.0002358: leftJoined msVendor as Vendor
    0.0012491: leftJoined msProductFile as x220
    0.0000131: Grouped by msProduct.id
    0.0000689: Added selection of msProduct: SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`content`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`
    0.0000310: Added selection of Data: `Data`.`article`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`
    0.0000250: Added selection of Vendor: `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties`
    0.0000191: Added selection of x220: `x220`.`url` as `x220`
    0.0002918: Added where condition: class_key=msProduct, published=1, hidemenu=0, deleted=0, parent:IN(65,66,67,68,69,70,71,72,73,121,122,123)
    0.0000160: Sorted by RAND(), ASC.
    0.0000081: Limited to 1, offset 0.
    0.0005081: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`content`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`, `Data`.`article`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`, `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties`, `x220`.`url` as `x220` FROM `modx_site_content` AS `msProduct` LEFT JOIN `modx_ms2_products` `Data` ON `msProduct`.`id`=`Data`.`id` LEFT JOIN `modx_ms2_vendors` `Vendor` ON `Data`.`vendor`=`Vendor`.`id` LEFT JOIN `modx_bunny_lovems2_product_files` `x220` ON `x220`.`product_id` = `msProduct`.`id` AND `x220`.`parent` != 0 AND `x220`.`path` LIKE '%/x220/' WHERE  ( `msProduct`.`class_key` = 'msProduct' AND `msProduct`.`published` = 1 AND `msProduct`.`hidemenu` = 0 AND `msProduct`.`deleted` = 0 AND `msProduct`.`parent` IN (65,66,67,68,69,70,71,72,73,121,122,123) )  GROUP BY msProduct.id ORDER BY RAND() ASC LIMIT 1 "
    0.0013440: SQL executed
    0.0000958: Total rows: 3
    0.0000262: Rows fetched
    0.0000079: Returning raw data
    0.0028591: Returning processed chunks
    0.0059109: Returning processed chunks
    0.0220170: Total time
    15 728 640: Memory usage
    А вот лог, который отдаёт msProduct:
    0.0090680: xPDO query object created
    0.0002520: leftJoined msProductData as Data
    0.0002151: leftJoined msVendor as Vendor
    0.0012698: leftJoined msProductFile as x220
    0.0000222: Grouped by msProduct.id
    0.0000679: Added selection of msProduct: SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`content`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`
    0.0000300: Added selection of Data: `Data`.`article`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`
    0.0000250: Added selection of Vendor: `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties`
    0.0000188: Added selection of x220: `x220`.`url` as `x220`
    0.0002890: Added where condition: class_key=msProduct, published=1, hidemenu=0, deleted=0, parent:IN(65,66,67,68,69,70,71,72,73,121,122,123)
    0.0000150: Sorted by RAND(), ASC.
    0.0000081: Limited to 1, offset 0.
    0.0004871: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`content`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`, `Data`.`article`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`, `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties`, `x220`.`url` as `x220` FROM `modx_bunny_lovesite_content` AS `msProduct` LEFT JOIN `modx_ms2_products` `Data` ON `msProduct`.`id`=`Data`.`id` LEFT JOIN `modx_ms2_vendors` `Vendor` ON `Data`.`vendor`=`Vendor`.`id` LEFT JOIN `modx_ms2_product_files` `x220` ON `x220`.`product_id` = `msProduct`.`id` AND `x220`.`parent` != 0 AND `x220`.`path` LIKE '%/x220/' WHERE  ( `msProduct`.`class_key` = 'msProduct' AND `msProduct`.`published` = 1 AND `msProduct`.`hidemenu` = 0 AND `msProduct`.`deleted` = 0 AND `msProduct`.`parent` IN (65,66,67,68,69,70,71,72,73,121,122,123) )  GROUP BY msProduct.id ORDER BY RAND() ASC LIMIT 1 "
    0.0022249: SQL executed
    0.0009580: Total rows: 3
    0.0000651: Rows fetched
    0.0000088: Returning raw data
    0.0029361: Returning processed chunks
    0.0179609: Total time
    15 728 640: Memory usage

    Т.е. в итоге pdoResource формирует запрос, который должен формировать msProduct!
    Логи я включал по отдельности, так что это на самом деле так.
      Алексей Карташов
      25 августа 2013, 17:55
      0
      В принципе, именно это и видно в конечном html.
        Василий Наумкин
        25 августа 2013, 18:29
        0
        Решение такое — замени в pdoResources в начале файла строку с getService на:
        require_once MODX_CORE_PATH . 'components/pdotools/model/pdotools/pdofetch.class.php';
        $pdoFetch = new pdoFetch($modx, $scriptProperties);

        Нужно будет так все pdoTools сниппеты потом переделать, во избежание.
        Василий Наумкин
        25 августа 2013, 18:00
        0
        Ясно.
        Вызов сниппета pdoTools в чанке другого сниппета pdoTools меняет pdoTools::config, поэтому всё ломается.

        Пока не знаю, как лечить, позже подумаю.
        Алексей Карташов
        25 августа 2013, 17:51
        0
        А в системном журнале на эту тему пусто
        Володя
        25 августа 2013, 18:30
        0
        ну это как взять pdoResource, а в шаблоне вызвать еще один pdoResource — тоже все ломается. Василий же говорил что pdoResource и msProducts — братья…
        у меня такая же проблема была, пока выход — использовать вместо pdoResource что то другое…
          Василий Наумкин
          25 августа 2013, 19:04
          0
          Ща будет новая версия, пофиксил.

          Это из-за использования $modx->getService(), который отдаёт один и тот же экземпляр класса сниппетам, типа синглтон.
          Василий Наумкин
          25 августа 2013, 19:09
          0
          Можно обновляться.

          pdoResources пофикшен, остальные — в порядке необходимости.
          Abu
          Abu
          20 февраля 2017, 21:32
          0
          Возникла такая же ошибка при вызове msProducts вложенном в mFilter2 с вызовом msProducts. Вылечилась изменением вызова pdofetch в сниппете.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            11