Сен 23 2008

Вывод случайного баннера на CakePHP

Раздел: Веб-разработкаМета @ 23:28

В одном из проектов нашей студии, нам понадобилось выводить случайные изображения (типа баннеров) в различных местах нескольких шаблонов. Все шаблоны относились к разным контроллерам, в каждом шаблоне к баннеру могли применяться различные 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 как раз и выбирается какой набор баннеров показывать.

Опять очень торопился пока писал, если что-то непонятно — спрашивайте в комментариях.

Теги: , ,

Напиши комментарий!