Делаем страницу с подбором случайного товара MODx [EVO]

Итак, есть задача. Сделать «как в лучших домах» страницу, на которой пользователь видит случайный товар, а также надпись типа «Посмотрите на это чудо» и ссылку «Хочу другой». Нажимает на ссылку, получает другой рандомный товар, надпись меняется на следующую в очереди, наприммер «Не хотите первый — вот вам второй». Поехали.

В руках у нас MODx Evolution, Shopkeeper и клавиатура.

Для начала создадим сниппет, который будет все это делать, а затем займемся красотой.

Сниппет [[randomProduct]]:

<?php
$arrMessage = array (
"1" => "Для начала вот этот отличный товар.",
"2" => "Не подходит? Оцените вот этот.",
"3" => "И тот не проканал? Вот Прекрасный Товар, не правда ли?",
"4" => "Вы издеваетесь?",
"5" => "Ну я прямо даже не знаю... А вот такой?"
);

$arrParentIDs = array (
"1" => "932",
"2" => "18",
"3" => "645",
"4" => "365",
"5" => "98",
"6" => "485",
"7" => "107"
);

$_GET['mess']=(int)$_GET['mess'];
if ( !isset($_GET['mess']) || $_GET['mess'] > '5' || $_GET['mess'] < '1' ) $_GET['mess'] = '1';
if ( $_GET['mess'] >= '1' && $_GET['mess'] <= '5' ) $messageOUT = "<p><b>".$arrMessage[$_GET['mess']]."</b></p>";

$randomCategoryID = $arrParentIDs[array_rand($arrParentIDs)]; //берем случайную категорию
$arrChildProductIDs = $modx->getChildIds ($randomCategoryID); //выгребаем массив с товарами из случайной категории
$randomID = $arrChildProductIDs[array_rand($arrChildProductIDs)]; //берем случайный товар из случайной категории

$out = $modx->runSnippet('Ditto', array(
	'tpl' => 'shopShowRandomBucket' //в качестве шаблона - чанк
	'documents' => $randomID //показывать только те товары, которые нашлись рандомом
	'showPublishedOnly' => '0 //показывать только опубликованные
));

$_GET['mess']++;
$linkNext = $modx->documentIdentifier.'?mess='.$_GET['mess'];
$textLinkNext = "<p><a class=\"shk-but next\" href=\"$linkNext\">Покажите другой!</a></p>";

return '<table width="100%" style="padding-left:-20px;"><tr><td>'.$out.'</td></tr><tr><td style="padding-top:70px;" align="center">'.$messageOUT.'<br />'.$textLinkNext.'</td></tr></table>';
?>

Собственно, ничего сверхъестественного, как выяснилось. Что у нас тут происходит. Сначала делаем два массива — первый ($arrMessage) с фразами, которые будут выводиться по очереди, второй ($arrParentIDs) — с категориями, из которых будем выводить рандомные товары.

Далее преобразуем тип GET-запроса в Integer (заодно убиваем лишние символы, которые кулхацкеры могут туда навтыкать). В следующей строке проверяем mess на существование, на значения от 1 до 5. Если нас все устраивает — двигаемся дальше, если «что-то пошло не так» — переходим к первому шагу (сообщению).

Дальше, если значение mess из GET в пределах от 1 до 5 — имеем это в виду и готовимся писать текст (переменную заполняем).

Когда разобрались с проверками — начинаем работать 🙂 Для начала определимся со случайностями — берем рандомную категорию, а в ней берем рандомный товар. Собственно, на это можно закончить — дальше рутина — определяемся с выводом (забираем из Ditto рандомный товар), увеличиваем mess на 1 и выводим.

Чанк {{shopShowRandomBucket}}

Собственно, тут особо писать нечего — у всех сверстано по-своему. Сначала я хотел взять чанк от категории товаров, но выяснилось, что надо сверстать по-другому, поэтому я скопировал чанк категории и немного его изменил под себя.

Для тех, кто в танке приведу примерный код чанка (разумеется, стили я опущу — они тут не нужны):

<div class="product">
  <a href="[+url+]"><img src="[+image+]" width="512" height="512"/></a>
  <p><a href="[+url+]">[+pagetitle+]</a></p>
  <form action="[~[*id*]~]" method="post">
    <input type="hidden" name="shk-id" value="[+id+]" />
    <input type="hidden" name="shk-name" value="[+pagetitle+]" />
    <input type="hidden" name="shk-count" value="1" size="2" maxlength="3" />
    <div class="shk-price">
      [+price:shk_widget=`radio:price:wraptag:first_selected`+]
      <button type="submit" class="buy"></button>
    </div>
  </form>
</div>

Шаблон ideal

Название, конечно, можно было и получше придумать… Но нам же им не на выставках светить 🙂 Делаем шаблон (существующие мне не подходили). Я скопировал шаблон категории (ибо в нем меньше пришлось менять всего) и, опять же, немного его изменил — там подкрасил, здесь замазал…

Материал с заголовком «Случайный товар»

Теперь делаем материал, чтобы можно было вывести красоту на отдельной странице с текстом вызова сниппета: [!randomProduct!], то есть, сниппет вызываем в поле, куда обычно текст статьи пишем. Шаблон материала надо выставить ideal (тот, который только что создали). Материал надо опубликовать 🙂

В принципе, это все… Если возникли вопросы — срашивайте 🙂 Удачи!

0

Добавить комментарий