Работа с prepareSnippet
Доброго времени суток!
Пытаюсь на своем сайте сделать все правильно, а именно вызывать pdoPage сразу с шаблоном, и обрабатывать данные заранее, через prepareSnippet. Но самостоятельно, у меня ничего не выходит — не хватает опыта. Подскажите, что делаю неправильно.
Сейчас на сайте работает (но очень медленно, из за кол-ва ненужных запросов, если я правильно все понял) вот так:
Вызов pdoPage
Сам tpl.msProduct.row, в котором вызывается порядка 5 сниппетов
И код сниппета getBtn (на его примере рассмотрю)
Пытаюсь самостоятельно привести все к нормальному виду вот так, т.е. вызов pdoPage
И код одного из сниппетов в prepareSnippet (testSnippet)
Но у меня ничего не выходит. Шаблон выводится, но ни один из сниппетов не работает.
Знаю, что скорее всего пишу какую-то ересь, но очень сложно это дается. Укажите, пожалуйста, на ошибки.
Пытаюсь на своем сайте сделать все правильно, а именно вызывать pdoPage сразу с шаблоном, и обрабатывать данные заранее, через prepareSnippet. Но самостоятельно, у меня ничего не выходит — не хватает опыта. Подскажите, что делаю неправильно.
Сейчас на сайте работает (но очень медленно, из за кол-ва ненужных запросов, если я правильно все понял) вот так:
Вызов pdoPage
[[!pdoPage:default=`<div class=\"fool\"><p>К сожалению, товары с указанными параметрами отсутствуют. За помощью в подборе, Вы можете обратиться по телефону <span>+7(xxx) xxx-xx-xx</span>.</p></div>`?sortby=`Data.price`
&element=`msProducts`
&parents=`2`
&showLog=`1`
&tpl=`tpl.msProducts.row`
&limit=`72`
]]Сам tpl.msProduct.row, в котором вызывается порядка 5 сниппетов
<div class="container_cat-item">
<div class="cat-item">
<div class="catalogue-in">
<div class="catalogue-item catalogue-item_hover">
<a href="[[~[[+id]]]]" target="_blank" class="cat-item"><img class="lazy" data-original="[[!imgGet? &pId=`[[+id]]` &key=`0`]]" height="130"></a>
<span class="cat-sku">[[+wl]]x[[+rad]] [[+co]]х[[+pcd]] [[+dl]] ET[[+vl]]</span>
<div class="floater">
<h3 class="cat-item">
<a href="[[~[[+id]]]]" target="_blank" class="cat-item">[[+pagetitle]]</a>
</h3>
</div>
<div class="price">
<span class="price_val">[[+price]]</span>
<span class="price_cur">руб.</span>
</div>
<div class="cat_down">
<form method="post" class="ms2_form">
[[!getBtn? &id=`[[+id]]`]]
<input type="hidden" name="id" value="[[+id]]">
<input type="hidden" name="count" value="4">
<input type="hidden" name="options" value="[]">
</form>
[[!getTip? &id=`[[+id]]`]]
</div>
</div>
<div class="catalogue-item catalogue-item_descr">
<a href="" class="cat-logo">[[!getMade? &id=`[[+id]]` ]]</a>
<table class="cat_params">
<tbody>
<tr>
<td>Тип диска</td>
<td class="params_val">[[!getType? &id=[[+id]] ]]</td>
</tr>
<tr>
<td>Ширина литья</td>
<td class="params_val">[[+wl]] дм</td>
</tr>
<tr>
<td>Диаметр</td>
<td class="params_val">[[+rad]] дм</td>
</tr>
<tr>
<td>Разболтовка (PCD)</td>
<td class="params_val">[[+co]]х[[+pcd]]</td>
</tr>
<tr>
<td>Диаметр ступицы</td>
<td class="params_val">[[+dl]] мм</td>
</tr>
<tr>
<td>Вылет литья (ЕТ)</td>
<td class="params_val">[[+vl]] мм</td>
</tr>
</tbody>
</table>
<div class="cat_descript">
[[!getMadeText? &id=`[[+id]]` ]]
</div>
</div>
</div>
</div>
</div>И код сниппета getBtn (на его примере рассмотрю)
<?php
$id = $scriptProperties['id'];
$key = $scriptProperties['key'];
if ($product = $modx->getObject('msProduct', $id)) {
$res = $product->get('bal');
//echo $res;
if ($res < 4 && !empty($res)) {
echo "<button class=\"btn2 btn_grey\" type=\"submit\" id=\"nocart\" name=\"ms2_action\" >Не комплект</button>";
if ($key == 1) {
echo "
</div>
<div class=\"wait\">
<p><b>Готовы подождать?</b></p>
<p>Оставьте минимум контактной информации <a class=\"inline cboxElement\" href=\"#inline_content2\">здесь</a>, и наши менеджеры свяжутся с вами, как только товар поступит в наличие.</p>
</div>";
}
} else if (empty($res)) {
echo "<button class=\"btn2 btn_grey\" type=\"submit\" id=\"nocart\" name=\"ms2_action\" >Нет в наличии</button>";
if ($key == 1) {
echo "
</div>
<div class=\"wait\">
<p><b>Готовы подождать?</b></p>
<p>Оставьте минимум контактной информации <a class=\"inline cboxElement\" href=\"#inline_content2\">здесь</a>, и наши менеджеры свяжутся с вами, как только товар поступит в наличие.</p>
</div>";
}
} else {
if ($key == 1) {
echo "<button class=\"btn2 btn_orange\" type=\"submit\" name=\"ms2_action\" value=\"cart/add\">В корзину</button></div>";
} else {
echo "<button class=\"btn2 btn_orange\" type=\"submit\" name=\"ms2_action\" value=\"cart/add\">В корзину</button>";
}
}
}Пытаюсь самостоятельно привести все к нормальному виду вот так, т.е. вызов pdoPage
[[!pdoPage:default=`<div class=\"fool\"><p>К сожалению, товары с указанными параметрами отсутствуют. За помощью в подборе, Вы можете обратиться по телефону <span>+7(xxx) xxx-xx-xx</span>.</p></div>`?
&sortby=`Data.price`
&element=`msProducts`
&parents=`2`
&showLog=`1`
&limit=`72`
&prepareSnippet=`testSnippet`
&tpl=`@INLINE
<div class='container_cat-item'>
<div class='cat-item'>
<div class='catalogue-in'>
<div class='catalogue-item catalogue-item_hover'>
<a href='[[~[[+id]]]]' target='_blank' class='cat-item'><img class='lazy' data-original='[[!imgGet? &pId=`[[+id]]` &key=`0`]]' height='130'></a>
<span class='cat-sku'>[[+wl]]x[[+rad]] [[+co]]х[[+pcd]] [[+dl]] ET[[+vl]]</span>
<div class='floater'>
<h3 class='cat-item'>
<a href='[[~[[+id]]]]' target='_blank' class='cat-item'>[[+pagetitle]]</a>
</h3>
</div>
<div class='price'>
<span class='price_val'>[[+price]]</span>
<span class='price_cur'>руб.</span>
</div>
<div class='cat_down'>
<form method='post' class='ms2_form'>
[[+getBtn]]
<input type='hidden' name='id' value='[[+id]]'>
<input type='hidden' name='count' value='4'>
<input type='hidden' name='options' value='[]'>
</form>
[[+getTip]]
</div>
</div>
<div class='catalogue-item catalogue-item_descr'>
<a href='' class='cat-logo'>[[+getMade]]</a>
<table class='cat_params'>
<tbody>
<tr>
<td>Тип диска</td>
<td class='params_val'>[[+getType]]</td>
</tr>
<tr>
<td>Ширина литья</td>
<td class='params_val'>[[+wl]] дм</td>
</tr>
<tr>
<td>Диаметр</td>
<td class='params_val'>[[+rad]] дм</td>
</tr>
<tr>
<td>Разболтовка (PCD)</td>
<td class='params_val'>[[+co]]х[[+pcd]]</td>
</tr>
<tr>
<td>Диаметр ступицы</td>
<td class='params_val'>[[+dl]] мм</td>
</tr>
<tr>
<td>Вылет литья (ЕТ)</td>
<td class='params_val'>[[+vl]] мм</td>
</tr>
</tbody>
</table>
<div class='cat_descript'>
[[+getMadeText]]
</div>
</div>
</div>
</div>
</div>
`
]]И код одного из сниппетов в prepareSnippet (testSnippet)
<?php
$modx->setPlaceholder('getBtn', $row['getBtn']);
$id = $scriptProperties['id'];
$key = $scriptProperties['key'];
if ($product = $modx->getObject('msProduct', $id)) {
$res = $product->get('bal');
if ($res < 4 && !empty($res)) {
$row[`getBtn`] .= "<button class=\"btn2 btn_grey\" type=\"submit\" id=\"nocart\" name=\"ms2_action\" >Не комплект</button>";
if ($key == 1) {
$row[`getBtn`] .= "
</div>
<div class=\"wait\">
<p><b>Готовы подождать?</b></p>
<p>Оставьте минимум контактной информации <a class=\"inline cboxElement\" href=\"#inline_content2\">здесь</a>, и наши менеджеры свяжутся с вами, как только товар поступит в наличие.</p>
</div>";
}
} else if (empty($res)) {
$row[`getBtn`] .= "<button class=\"btn2 btn_grey\" type=\"submit\" id=\"nocart\" name=\"ms2_action\" >Нет в наличии</button>";
if ($key == 1) {
$row[`getBtn`] .= "
</div>
<div class=\"wait\">
<p><b>Готовы подождать?</b></p>
<p>Оставьте минимум контактной информации <a class=\"inline cboxElement\" href=\"#inline_content2\">здесь</a>, и наши менеджеры свяжутся с вами, как только товар поступит в наличие.</p>
</div>";
}
} else {
if ($key == 1) {
$row[`getBtn`] .= "<button class=\"btn2 btn_orange\" type=\"submit\" name=\"ms2_action\" value=\"cart/add\">В корзину</button></div>";
} else {
$row[`getBtn`] .= "<button class=\"btn2 btn_orange\" type=\"submit\" name=\"ms2_action\" value=\"cart/add\">В корзину</button>";
}
}
}
return serialize($row);Но у меня ничего не выходит. Шаблон выводится, но ни один из сниппетов не работает.
Знаю, что скорее всего пишу какую-то ересь, но очень сложно это дается. Укажите, пожалуйста, на ошибки.
Комментарии: 23
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
на
То есть, вместо вызова сниппета будет плейсхолдер, куда потом вставится результат.
Затем в сниппете, указанном в prepareSnippet пишешь эту свою логику определения не получая ресурс — он уже получен и находится в переменной $row!
В итоге мы не получаем ресурс из БД повторно, не делаем некаких запросов, а только добавляем новое поле в массив данных, проверяя другие поля этого массива — что в итоге будет вставлено в чанк.
Никаких getObject и setPlaceholder не нужно — именно от них мы и избавляемся для большей скорости.
То есть, всё уже выбрано, ты просто подготавливаешь массив данных для оформления в чанке. Отсюда и название параметра — «подготовочный сниппет».
Сниппет mySnippet:
Дальше уже усложняй и добавляй свою логику, чанки и код из сниппетов.
Все как Вы и писали, только дополнено:
Но дальше, (перед return serialize($row);) пытаюсь вставить код следующего сниппета, так же убрав запросы и подставив $row в нужное место
Как результат — пустая страница, ошибка. Как в prepare включить все сниппеты разом?
Рабочий код
Нерабочий код
Чем отличается рабочий код от нерабочего? Что нужно исправить?
Ну в любом случае огромное Вам спасибо за то, что откликнулись и помогли!
В принципе, да, это может совсем чуть-чуть сократить время загрузки, потому что парсер MODX не будет пытаться разобрать инлайновый чанк и плейсхолдеры в нём.
Но в целом, думаю, тебе нужно оптимизировать вызовы других сниппетов на странице. Можно воспользоваться для этого моим дополнением debugParser.
Еще одна мелочь, наверное опять туплю. Никак не могу обозначить $row для этой логики
Используй его и картинки уже будут в $row. Вообще, посмотри, что сейчас там есть:
Опыта не хватает, с первого раза понять то, что вы пишете, или мозгов.
я так понимаю, это совсем не то, что Вы имели ввиду?
Внутри $row должна быть ссылка на картинку товара:
А prepare делаю еще один, где размещаю вот это
Не совсем понимаю и как ссылку разместить. Внутри скобок [[~[[+id]]]]?
Прощу прощения, если раздражаю, просто уже ум за разум заходит
Объясняю так, чтобы ты понял:
Дошло?
Нужно просто попросить msProducts вместе с твоими товарами выбрать им картинки — он это умеет. А дальше делай с ними что хочешь в prepareSnippet.
Вместо
пиши
Я не знаю, как еще объяснить. bezumkin.ru/modx/minishop2/snippets/917/
Вот этого только не понял.
Все делаю так, как Вы сказали, но картинок нет.
Помоему у меня картинки заливаются в gallery
За информацию — спасибо!