Помогите оптимизировать сниппет

Здравствуйте!
Помогите, пожалуйста, улучшить потуги моего разума так, чтобы это стало выглядеть и работать лучше. Сейчас львиную долю времени загрузки страницы занимает выполнение этого сниппета. Я буду благодарен за любые комментарии по коду и критику. Я легко обойдусь без рабочего кода, просто попинайте меня в нужную сторону.

Суть работы сниппета
Есть структура магазина — общие категории > деление по коллекциям > товары. У каждого товара есть несколько полей ТВ. Нужно сделать так, чтобы при открытии общей категории у каждой коллекции были выведены ее параметры, взятые у товара с минимальной ценой. Да, конечно, можно было бы приделать эти параметры к каждой коллекции и не парится, но хочу максимально упростить заполнение магазина, чтобы даже грандиозная блондинка если что, то справилась бы.

<?php
//выбираю ресурсы, у которых шаблон не товар
$query = $modx->newQuery('modResource');
$query->where(array(
   'parent' => $id,
   'template:!=' => 3,
));
//плейсхолдер для pdoPage
$modx->setPlaceholder($totalVar, $modx->getCount('modResource', $query));
$query->limit($limit, $offset);
//перебираю каждый ресурс, беру их pagetitle, id, template, иконку и URL
$pages = $modx->getCollection('modResource',$query);
foreach ($pages as $page){
    $coll_id = $page->get('id');
    $coll_uri = $page->get('uri');
    $coll_template = $page->get('template');
    $coll_ico = $page->getTVValue('ico');
    $coll_pagetitle = $page->get('pagetitle');
    //если шаблон = коллекция товаров, то берем нужные ТВ и складываем в плейсхолдеры
    if ($coll_template == 6){
        $q = $modx->newQuery('msProductData', array('id:>' => 0));
        $q->select('msProductData.price as price,Product.pagetitle,TV.tmplvarid,TV.value');
        $q->leftJoin('msProduct', 'Product', 'Product.id = msProductData.id');
        $q->leftJoin('modTemplateVarResource', 'TV', 'msProductData.id=TV.contentid');
        $q->sortby('msProductData.price','ASC');
	//нужных ТВ 4 штуки, а я вытаскиваю их базы и поэтому такой чудесный лимит и дальнейшая //выборка по индексам в массиве
        $q->limit(4,0);
        $q->where(array('Product.parent' => $coll_id,'TV.tmplvarid:IN' =>  array(6,10,3) ));
        $q->prepare();
        $q->stmt->execute();
        $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
        $tpl = 'category-tpl';
        $price = $res[0]['price'];
        $manufacturer_name = $res[0]['value'];
        $format = $res[1]['value'];
        $country = $res[2]['value'];
        $placeholders = $modx->setPlaceholders(
            array('min_price' => $price,
                'pagetitle' => $coll_pagetitle,
                'ico' => $coll_ico,
                'manufacturer_name' => $manufacturer_name,
                'country' => $country,
                'format' => $format,
                'uri' => $coll_uri,
                
        )
        );
    } else {
	//если шаблон не коллекция, значит просто общая категория, а к ней нам нужны только иконка, URL и название
       $tpl = 'category-tpl';
       $placeholders = $modx->setPlaceholders(
            array('min_price' => $price,
                'pagetitle' => $coll_pagetitle,
                'ico' => $coll_ico,
                'uri' => $coll_uri 
                )
            );
    }
    $output .= $modx->getChunk($tpl);
}
return $output;
Дмитрий
11 июня 2016, 10:11
modx.pro
1 892
0
Поблагодарить автора Отправить деньги

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

Василий Наумкин
11 июня 2016, 17:30
1
+5
$modx->getCollection заменить на $modx->getIterator, а еще лучше выбирать через $q->stmt->fetchAll — массив, а не объект. ТВшку выбрать не через метод, а присоединением к таблице.

setPlaceholders не надо, массив данных можно передавать вторым параметров сразу в $modx->getChunk($tpl, $placeholders).
Не знаю, что там в чанке, но его можно парсить через pdoTools — будет быстрее.

А вообще, вот старая заметка по написанию сниппета с pdoTools, попробуй применить.
    Дмитрий
    11 июня 2016, 17:38
    0
    Большое спасибо! Сейчас займусь!
      Дмитрий
      12 июня 2016, 14:24
      0
      Спасибо большое еще раз! Сделал исправления, теперь все летает!
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3