Помогите оптимизировать сниппет
Здравствуйте!
Помогите, пожалуйста, улучшить потуги моего разума так, чтобы это стало выглядеть и работать лучше. Сейчас львиную долю времени загрузки страницы занимает выполнение этого сниппета. Я буду благодарен за любые комментарии по коду и критику. Я легко обойдусь без рабочего кода, просто попинайте меня в нужную сторону.
Суть работы сниппета
Есть структура магазина — общие категории > деление по коллекциям > товары. У каждого товара есть несколько полей ТВ. Нужно сделать так, чтобы при открытии общей категории у каждой коллекции были выведены ее параметры, взятые у товара с минимальной ценой. Да, конечно, можно было бы приделать эти параметры к каждой коллекции и не парится, но хочу максимально упростить заполнение магазина, чтобы даже грандиозная блондинка если что, то справилась бы.
Помогите, пожалуйста, улучшить потуги моего разума так, чтобы это стало выглядеть и работать лучше. Сейчас львиную долю времени загрузки страницы занимает выполнение этого сниппета. Я буду благодарен за любые комментарии по коду и критику. Я легко обойдусь без рабочего кода, просто попинайте меня в нужную сторону.
Суть работы сниппета
Есть структура магазина — общие категории > деление по коллекциям > товары. У каждого товара есть несколько полей ТВ. Нужно сделать так, чтобы при открытии общей категории у каждой коллекции были выведены ее параметры, взятые у товара с минимальной ценой. Да, конечно, можно было бы приделать эти параметры к каждой коллекции и не парится, но хочу максимально упростить заполнение магазина, чтобы даже грандиозная блондинка если что, то справилась бы.
<?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;
Поблагодарить автора
Отправить деньги
Комментарии: 3
$modx->getCollection заменить на $modx->getIterator, а еще лучше выбирать через $q->stmt->fetchAll — массив, а не объект. ТВшку выбрать не через метод, а присоединением к таблице.
setPlaceholders не надо, массив данных можно передавать вторым параметров сразу в $modx->getChunk($tpl, $placeholders).
Не знаю, что там в чанке, но его можно парсить через pdoTools — будет быстрее.
А вообще, вот старая заметка по написанию сниппета с pdoTools, попробуй применить.
setPlaceholders не надо, массив данных можно передавать вторым параметров сразу в $modx->getChunk($tpl, $placeholders).
Не знаю, что там в чанке, но его можно парсить через pdoTools — будет быстрее.
А вообще, вот старая заметка по написанию сниппета с pdoTools, попробуй применить.
Большое спасибо! Сейчас займусь!
Спасибо большое еще раз! Сделал исправления, теперь все летает!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.