Итак, есть задача. Сделать «как в лучших домах» страницу, на которой пользователь видит случайный товар, а также надпись типа «Посмотрите на это чудо» и ссылку «Хочу другой». Нажимает на ссылку, получает другой рандомный товар, надпись меняется на следующую в очереди, наприммер «Не хотите первый — вот вам второй». Поехали.
В руках у нас 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 (тот, который только что создали). Материал надо опубликовать 🙂
В принципе, это все… Если возникли вопросы — срашивайте 🙂 Удачи!