Сен 23 2008
Вывод случайного баннера на CakePHP
В одном из проектов нашей студии, нам понадобилось выводить случайные изображения (типа баннеров) в различных местах нескольких шаблонов. Все шаблоны относились к разным контроллерам, в каждом шаблоне к баннеру могли применяться различные css-классы для правильного размещения. Естественно, хотелось придумать универсальное решение.
Логично, чтобы все баннеры хранились в одной таблице — тогда для них проще разработать админку, да и удобнее когда они все управляются из одного места.
Какие поля должны быть в этой таблице?
Ну, id — уникальный номер баннера, это уж точно. Дальше, name — чтобы баннер как-то называть. Может быть просто комментарием, а можно использовать в качестве alt-текста в теге картинки. Поле image — с именем картинки баннера, url — с адресом ссылки, на которую баннер ссылается. И еще place - тут будет обозначаться место размещения этого баннера (в каком именно месте и на каком шаблоне выводить) и visits — для учета количества показов.
В итоге таблица получилась такая:
1 2 3 4 5 6 7 8 9 | CREATE TABLE IF NOT EXISTS `banners` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `url` varchar(255) NOT NULL DEFAULT '0', `image` varchar(255) NOT NULL, `place` varchar(8) NOT NULL, `visits` int(10) UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; |
Для того чтобы все баннеры показывались с равной вероятностью будем просто сортировать их по полю visits, брать первый баннер, показывать его и увеличивать у него кол-во визитов на единицу. Конечно, в более сложной системе надо учитывать клики, какому пользователю этот баннер принадлежит и сколько дней его показывать. Но в этой заметке я напишу только про способ вывода случайного баннера, а не про логику его работы. Может потом, отдельной заметкой.
Создаем модель для баннеров:
1 2 3 4 5 | <?php class Banner extends AppModel { var $name = 'Banner'; } ?> |
Создаем BannersController и в нем функцию, которая находит случайный баннер для определенного места шаблона. Место в шаблоне передается в параметре.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php class BannersController extends AppController { var $name = 'Banners'; function get_banner($place = null){ if($place){ $banner = $this->Banner->findAll('place="'.$place.'"', null, 'views ASC', 1, 1, -1); if ($banner){ $this->Banner->id = $banner[0]['Banner']['id']; $this->Banner->saveField('views',$banner[0]['Banner']['views']+1); } } return $banner; } } ?> |
Обратите внимание, что эта функция возвращает значение. Для нее не нужен отдельный шаблон, она будет использоваться совместно со специальным элементом.
Создаем этот элемент в файле /app/views/elements/banner.ctp:
1 2 3 4 5 6 7 8 | <?php if (isset($place)) { $banner = $this->requestAction('banners/get_banner/'.$place); if ($banner){ echo $html->link($html->image('ban/'.$banner[0]['Banner']['image'], array('alt'=>$banner[0]['Banner']['name'], 'class'=>'image', 'align'=>'left')), $banner[0]['Banner']['url'], null, null, 1); } } ?> |
Вот и все. Как использовать всю эту баннерокрутилку?
В том месте шаблона, где нужно вывести баннер пишем:
1 | <?php echo $this->element('banner', array('place'=>1)); ?> |
Здесь, значением параметра place как раз и выбирается какой набор баннеров показывать.
Опять очень торопился пока писал, если что-то непонятно — спрашивайте в комментариях.