Разработка web-сайта о кафе, барах и ресторанах города Челябинска

Понятие веб-страницы и гиперссылки, их функции и назначение для поиска информации в сети Интернет. Языки, используемые для подготовки гипертекстовых документов. Разработка проекта информационного сайта о кафе, барах и ресторанах города Челябинска.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 06.06.2012
Размер файла 4,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

· full - Особенности конкретного заведения

· count_zal - Количество залов

· order_table - Заказ столика

· advanced_services - Дополнительные услуги

· count_places - Общее количество мест

· parking - Парковка

· phones - Телефоны

· timetable - Время работы

· programm - Развлечения и программа

Полный код модели представлен в Приложении Б.

2.2.2 Модель категорий - Tag

Модель Tag предоставляет доступ к информации о категориях, хранимой в базе данных MySQL. Модель позволяет сделать следующие выборки данных:

· getListOrderByCount - список категорий, с количеством заведений в каждой категории,

· getListByFirm - список категорий конкретного заведения.

Каждая запись модели Tag содержит следующие поля:

· name - Название категории

· slug - Условное обозначение

Полный код модели представлен в Приложении В.

2.2.3 Прочие модели

Так же были созданы следующие модели:

Banner - Модель баннеров

Cat - Модель основных категорий заведений

Counter - Модель счетчиков

Firms_comment - Модель комментариев к заведениям

Firms_photo - Модель фотогалереи

Firms_rate - Модель рейтингов

menu - Модель меню сайта

option - Модель параметров сайта

raion - Модель районов города

resize_image - Модель создания уменьшеных изображений для фотогалереи

user - Модель пользователей (менеджеров сайта)

2.3 Контроллеры

2.3.1 Контроллер Firms

Контроллер Firms отвечает за обработку запроса пользователя по конкретному заведению. Для этого используется метод класса display. В этом методе вызываются функции моделей Firm, Tag, Firms_comment, Firms_rate и Firms_photo, для получения информации о фирме, списка категорий, относящихся к фирме, списка комментариев и фотографий и рейтинга заведения. Затем эта информация передается в отображение firms/display.html

2.3.2 Контроллер Tags

Контроллер Tags отвечает за обработку запроса пользователя по конкретной категории и запроса главной странице.

Для обработки запроса главной страницы используется метод класса index. В этом методе вызываются функции моделей Firm и Tag, для получения информации о списке популярных и недавно добавленных заведений. Затем эта информация передается в отображение tags/index.html.

Для обработки запроса пользователя по конкретной категории используется метод класса display. В этом методе вызываются функции моделей Firm и Tag, для получения информации о списке заведений, относящихся к данной категории и собственно о категории. Затем эта информация передается в отображение tags/display.html.

2.4 Отображения

Все отображения наследуются от общего шаблона layouts_html.html. В этом отображении содержиться общие для всех страниц сайта элементы - верхняя часть сайта (название сайта, статистическая информация и форма поиска), карта от сервиса Яндекс.Карт, нижняя часть сайта. Полный код шаблона приведен в Приложении Г.

ЗАКЛЮЧЕНИЕ

В ходе выполнения дипломного проекта был создан полнофункциональный web-сайт, полностью готовый к применению.

Запуск данного сайта позволит пользователям:

- быстро находить необходимое заведение;

- просматривать информацию о них;

- оставлять свои комментарии о заведениях;

- оценивать данное заведение;

- увидеть местоположение заведения на карте.

Данный сайт ориентирован на жителей и гостей города Челябинска. Благодаря этому сайту пользователи смогут получить достоверную информацию об интересующих их заведениях, оцененных и прокомментированных другими пользователями.

При размещении его в глобальной сети география распространения возрастает до масштабов всего мира.

Литература

1. Зандстра М. PHP. Объекты, шаблоны и методики программирования. - Вильямс: 2010, 560 c.

2. Котеров Д. PHP 5. - BHV-СПб: 2008, 1104 с.

3. Мейер Э. CSS - каскадные таблицы стилей. Подробное руководство, 3-е издание. - Символ-Плюс: 2008, 576 с.

4. Флэнаган Д. JavaScript. Подробное руководство, 5-е издание. - Символ-Плюс: 2009, 992 с.

5. Грабер М. SQL. - Лори: 2007, 644 с.

6. Дюбуа П. MySQL. Сборник рецептов. - Символ-Плюс: 2004, 1056 с.

7. Заводны Д., Шварц Б., Зайцев П., Ткаченко В., Ленц А. MySQL. Оптимизация производительности, 2-е издание. - Символ-Плюс: 2010, 816 с.

Приложение A

class FirmDescriptor extends CMSK_Descriptor

{

public $className = 'Firm';

public $common_fields = array(

'slug'=>array('name'=>'Url','type'=>'text','slug'=>'name_ru','rules'=>'trim|required','display_in_index'=>'text',),

'address'=>array('name'=>'Адрес','type'=>'text','rules'=>'trim|required',),

'point'=>array('name'=>'Координаты','type'=>'point'),

'avg_price'=>array('name'=>'Средняя цена на человека','type'=>'text','rules'=>'trim',),

'raion_id'=>array('name'=>'Район','type'=>'select','model'=>'Raion','value_field'=>'id','name_field'=>'name',),

'showed'=>array('name'=>'Показывать','type'=>'checkbox','default_value'=>true,'display_in_index'=>'showed_toogler',),

'tags'=>array('name'=>'Категории','type'=>'multiselect','model'=>'Tag','value_field'=>'id','name_field'=>'name','table'=>'firms_tags','inner_field'=>'firm_id','outer_field'=>'tag_id'),

);

public $multi_language_fields = array(

'name'=>array('name'=>'Название','type'=>'text','rules'=>'trim|required','display_in_index'=>'text',),

'short'=>array('name'=>'Кратко','type'=>'textarea','rules'=>'trim',),

'full'=>array('name'=>'Подробно','type'=>'textarea','rules'=>'trim',),

'count_zal'=>array('name'=>'Количество залов','type'=>'text','rules'=>'trim',),

'order_table'=>array('name'=>'Заказ столика','type'=>'text','rules'=>'trim',),

'advanced_services'=>array('name'=>'Дополнительные услуги','type'=>'text','rules'=>'trim',),

'count_places'=>array('name'=>'Общее количество мест','type'=>'text','rules'=>'trim',),

'parking'=>array('name'=>'Парковка','type'=>'text','rules'=>'trim',),

'phones'=>array('name'=>'Телефоны','type'=>'text','rules'=>'trim',),

'timetable'=>array('name'=>'Время работы','type'=>'text','rules'=>'trim',),

'title'=>array('name'=>'Title','type'=>'text',),

'keywords'=>array('name'=>'Keywords','type'=>'text',),

'description'=>array('name'=>'Description','type'=>'text',),

);

public $orderby = 't1.orderby,t1.id';

public $multi_lang_field = 'firm_id';

}

Приложение Б

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Firm extends CMSK_Model {

public $count_per_page = 10;

public $count_per_page_favorites = 6;

public $count_per_page_last = 12;

/**

* Информация о фирме

*

* @param object $firm фирма

*

* @return array

*/

function getFieldsByFirm($firm, $tags)

{

$firm_fields = array();

foreach ($this->descriptor->common_fields as $name=>$field) {

if(isset($field['for_out']) && $field['for_out'] && $firm->{$name}) {

$firm_fields[] = array(

'name' => $field['name'],

'value' => $firm->{$name},

);

}

}

foreach ($this->descriptor->multi_language_fields as $name=>$field) {

if(isset($field['for_out']) && $field['for_out'] && $firm->{$name}) {

$firm_fields[] = array(

'name' => $field['name'],

'value' => $firm->{$name},

);

}

}

foreach ($tags as $tag) {

if($tag->for_out) {

$firm_fields[] = array(

'name' => $tag->name,

'is_have' => true,

);

}

}

return $firm_fields;

}

/**

* Информация для статистики

*

* @return integer

*/

function getStats()

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

$q->escape(false)->column('count(distinct t1.id) as c')->escape(true);

$q->where('t1.showed', true);

$items = $q->get()->result();

if (count($items)>0) {

return $items[0]->c;

} else {

return 0;

}

}

/**

* Статьи по списку адресов

*

* @param array $urls список адресов

*

* @return array

*/

function getByUrls($urls)

{

$items = array();

foreach($urls as $url)

{

$items[] = $this->getByField('url',$url);

}

return $items;

}

/**

* выборка записи по полю и значению

*

* @param integer $field поля таблице для выборки

* @param string $value значение для выборки

* @param boolean $separate_lang признак будут ли разделены языки? иначе будет выбран текущий

*

* @return object

*/

public function getOneByField($field, $value=true)

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

$q->escape(false)->column('x(point) as point_x, y(point) as point_y, t1.*')->escape(true);

$q->escape(false)->column('round(avg(t4.rate)) as rate,count(distinct t4.id) as count_rate')->escape(true);

$q->join('firms_rates', "t1.id=t4.firm_id", array());

$q->escape(false)->column('t5.img as cat_img,t6.name as cat_name')->escape(true);

$q->join('cats', "t5.id=t1.cat_id", array());

$q->join('cats_content', 't5.id=t6.cat_id', array());

$q->join('langs', "t6.lang_id=t7.id", array());

$q->where('t1.'.$field, $value);

if (!$this->obj->is_admin && $this->load->database_original()->field_exists('showed', $this->descriptor->getTable())) {

$q->where('t1.showed', true);

}

$q->groupBy('t1.id');

$q->limit(1);

$items = $q->get()->result();

if (count($items)>0) {

$item = $items[0];

return $item;

} else {

return false;

}

}

/**

* выборка записи по полю и значению для админки

*

* @param integer $field поля таблице для выборки

* @param string $value значение для выборки

* @param boolean $separate_lang признак будут ли разделены языки? иначе будет выбран текущий

*

* @return object

*/

public function getByField($field, $value=true, $separate_lang=false)

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

if (!$separate_lang && $this->descriptor->multi_lang_field) {

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

}

$q->escape(false)->column('x(point) as point_x, y(point) as point_y, t1.*')->escape(true);

$q->where('t1.'.$field, $value);

if (!$this->obj->is_admin && $this->load->database_original()->field_exists('showed', $this->descriptor->getTable())) {

$q->where('t1.showed', true);

}

$q->groupBy('t1.id');

$q->limit(1);

$items = $q->get()->result();

if (count($items)>0) {

$item = $items[0];

// TODO: убрать бы id...

if ($separate_lang && $field=='id' && $this->descriptor->multi_lang_field) {

$q = $this->db->select()->from($this->descriptor->getTable().'_content', array());

$q->escape(false)->column("t2.short as lang_short_name, t1.*")->escape(true);

$q->join('langs', "t1.lang_id=t2.id", array());

$q->where('t1.'.$this->descriptor->multi_lang_field, $value);

$langs_values = $q->get()->result();

if (count($langs_values)>0) {

foreach ($langs_values as $values) {

foreach ($values as $key=>$val) {

if (isset($item->{$key})) {

if (is_array($item->{$key})) {

$item->{$key}[$values->lang_short_name] = $val;

}

} else {

$item->{$key} = array($values->lang_short_name => $val);

}

}

}

}

}

if ($separate_lang && $field=='id') {

foreach($this->descriptor->common_fields as $name=>$field) {

switch($field['type'])

{

case 'multiselect':

$q = $this->db->select()->from($field['table'], array());

$q->escape(false)->column('t1.*')->escape(true);

$q->where('t1.'.$field['inner_field'], $value);

$item->{$name} = $q->get()->result();

break;

}

}

}

return $item;

} else {

return false;

}

}

/**

* условие для поиска

*

* @param string $tag_slug slug тэга

*

* @return array

*/

public function _sub_search($q, $search)

{

$q->where()

->like('t2.name', $search['q'])

->where('or')

->like('t2.short', $search['q'])

->where('or')

->like('t2.full', $search['q'])

->where('or')

->like('t2.advanced_services', $search['q'])

->where('or')

->like('t2.phones', $search['q'])

->where('or')

->like('t2.programm', $search['q'])

->where('or')

->like('t2.title', $search['q'])

->where('or')

->like('t2.keywords', $search['q'])

->where('or')

->like('t2.description', $search['q'])

->where('or')

->like('t1.address', $search['q'])

->end();

return $q;

}

/**

* поиск фирм

*

* @param array $search условия поиска

*

* @return array

*/

public function search($search, $page=0)

{

if(!$search['q'])

return array(array(),0,0);

$q = $this->db->select()->from($this->descriptor->getTable(), array());

if ($this->descriptor->multi_lang_field) {

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

}

$q->join('firms_tags', "t1.id=t4.firm_id", array());

$q->join('tags', "t5.id=t4.tag_id", array());

$q->escape(false)->column('x(point) as point_x, y(point) as point_y, t1.*')->escape(true);

$q->escape(false)->column('round(avg(t6.rate)) as rate,count(distinct t6.id) as count_rate')->escape(true);

$q->join('firms_rates', "t1.id=t6.firm_id", array());

$q->escape(false)->column('t7.img as cat_img,t8.name as cat_name')->escape(true);

$q->join('cats', "t7.id=t1.cat_id", array());

$q->join('cats_content', 't7.id=t8.cat_id', array());

$q->join('langs', "t8.lang_id=t9.id", array());

$q->where('t1.showed', true);

$q->where('t5.showed', true);

$this->_sub_search($q, $search);

$q->escape(false)->orderBy('t1.id')->escape(true);

$q->groupBy('t1.id');

$q->limit($this->count_per_page, $this->count_per_page*$page);

$items = $q->get()->result();

// общее число записей

$q = $this->db->select()->from($this->descriptor->getTable(), array());

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->join('firms_tags', "t1.id=t4.firm_id", array());

$q->join('tags', "t5.id=t4.tag_id", array());

$q->escape(false)->column('count(distinct t1.id) as c')->escape(true);

$q->where('t1.showed', true);

$q->where('t5.showed', true);

$this->_sub_search($q, $search);

$count_items = $q->get()->result();

$count = $count_items[0]->c;

$count_page = ceil($count/$this->count_per_page);

return array($items, $count, $count_page);

}

/**

* список фирм по тэгу

*

* @param string $tag_slug slug тэга

*

* @return array

*/

public function getListByTag($tag_slug, $page=0)

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

if ($this->descriptor->multi_lang_field) {

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

}

$q->join('firms_tags', "t1.id=t4.firm_id", array());

$q->join('tags', "t5.id=t4.tag_id", array());

$q->escape(false)->column('x(point) as point_x, y(point) as point_y, t1.*')->escape(true);

$q->escape(false)->column('round(avg(t6.rate)) as rate,count(distinct t6.id) as count_rate')->escape(true);

$q->join('firms_rates', "t1.id=t6.firm_id", array());

$q->escape(false)->column('t7.img as cat_img,t8.name as cat_name')->escape(true);

$q->join('cats', "t7.id=t1.cat_id", array());

$q->join('cats_content', 't7.id=t8.cat_id', array());

$q->join('langs', "t8.lang_id=t9.id", array());

$q->where('t1.showed', true);

$q->where('t5.showed', true);

$q->where('t5.slug', $tag_slug);

$q->escape(false)->orderBy('t1.id')->escape(true);

$q->groupBy('t1.id');

$q->limit($this->count_per_page, $this->count_per_page*$page);

$items = $q->get()->result();

// общее число записей

$q = $this->db->select()->from($this->descriptor->getTable(), array());

$q->join('firms_tags', "t1.id=t2.firm_id", array());

$q->join('tags', "t3.id=t2.tag_id", array());

$q->escape(false)->column('count(distinct t1.id) as c')->escape(true);

$q->where('t1.showed', true);

$q->where('t3.showed', true);

$q->where('t3.slug', $tag_slug);

$count_items = $q->get()->result();

$count = $count_items[0]->c;

$count_page = ceil($count/$this->count_per_page);

return array($items, $count, $count_page);

}

/**

* список популярных фирм

*

* @return array

*/

public function getListFavorites($is_main=true, $page=0)

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

if ($this->descriptor->multi_lang_field) {

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

}

$q->escape(false)->column('x(point) as point_x, y(point) as point_y, t1.*')->escape(true);

$q->escape(false)->column('round(avg(t4.rate)) as rate,count(distinct t4.id) as count_rate')->escape(true);

$q->join('firms_rates', "t1.id=t4.firm_id", array());

$q->escape(false)->column('t5.img as cat_img,t6.name as cat_name')->escape(true);

$q->join('cats', "t5.id=t1.cat_id", array());

$q->join('cats_content', 't5.id=t6.cat_id', array());

$q->join('langs', "t6.lang_id=t7.id", array());

$q->where('t1.showed', true);

$q->escape(false)->orderBy('rate desc')->escape(true);

$q->groupBy('t1.id');

if($is_main)

{

$q->limit($this->count_per_page_favorites);

$count = 0;

$count_page = 0;

}

else

{

$q->limit($this->count_per_page, $this->count_per_page*$page);

}

$items = $q->get()->result();

if(!$is_main) {

// общее число записей

$q = $this->db->select()->from($this->descriptor->getTable(), array());

$q->escape(false)->column('count(distinct t1.id) as c')->escape(true);

$q->where('t1.showed', true);

$count_items = $q->get()->result();

$count = $count_items[0]->c;

$count_page = ceil($count/$this->count_per_page);

}

return array($items, $count, $count_page);

}

/**

* список новых фирм

*

* @return array

*/

public function getListLatest($is_main=true, $page=0)

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

if ($this->descriptor->multi_lang_field) {

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

}

$q->escape(false)->column('x(point) as point_x, y(point) as point_y, t1.*')->escape(true);

$q->escape(false)->column('round(avg(t4.rate)) as rate,count(distinct t4.id) as count_rate')->escape(true);

$q->join('firms_rates', "t1.id=t4.firm_id", array());

$q->escape(false)->column('t5.img as cat_img,t6.name as cat_name')->escape(true);

$q->join('cats', "t5.id=t1.cat_id", array());

$q->join('cats_content', 't5.id=t6.cat_id', array());

$q->join('langs', "t6.lang_id=t7.id", array());

$q->where('t1.showed', true);

$q->escape(false)->orderBy('t1.create desc')->escape(true);

$q->groupBy('t1.id');

if($is_main)

{

$q->limit($this->count_per_page_last);

$count = 0;

$count_page = 0;

}

else

{

$q->limit($this->count_per_page, $this->count_per_page*$page);

}

$items = $q->get()->result();

if(!$is_main) {

// общее число записей

$q = $this->db->select()->from($this->descriptor->getTable(), array());

$q->escape(false)->column('count(distinct t1.id) as c')->escape(true);

$q->where('t1.showed', true);

$count_items = $q->get()->result();

$count = $count_items[0]->c;

$count_page = ceil($count/$this->count_per_page);

}

return array($items, $count, $count_page);

}

}

class FirmDescriptor extends CMSK_Descriptor

{

public $className = 'Firm';

public $common_fields = array(

'slug'=>array('name'=>'Условное обозначение','type'=>'text','slug'=>'name_ru','rules'=>'trim|required','display_in_index'=>'text',),

'address'=>array('name'=>'Адрес','type'=>'text','rules'=>'trim|required','for_out'=>true,),

'point'=>array('name'=>'Координаты','type'=>'point'),

'avg_price'=>array('name'=>'Средняя цена на человека','type'=>'text','rules'=>'trim','for_out'=>true,),

'date_open'=>array('name'=>'Дата открытия','type'=>'date','rules'=>'trim','for_out'=>true,),

'raion_id'=>array('name'=>'Район','type'=>'select','model'=>'Raion','value_field'=>'id','name_field'=>'name',),

'cat_id'=>array('name'=>'Основная категория','type'=>'select','model'=>'Cat','value_field'=>'id','name_field'=>'name',)

'showed'=>array('name'=>'Показывать','type'=>'checkbox','default_value'=>true,'display_in_index'=>'showed_toogler',),

'tags'=>array('name'=>'Категории','type'=>'multiselect','model'=>'Tag','value_field'=>'id','name_field'=>'name','table'=>'firms_tags','inner_field'=>'firm_id','outer_field'=>'tag_id'),

);

public $multi_language_fields = array(

'name'=>array('name'=>'Название','type'=>'text','rules'=>'trim|required','display_in_index'=>'text',),

'short'=>array('name'=>'Кратко','type'=>'textarea','rules'=>'trim',),

'full'=>array('name'=>'Особенности','type'=>'textarea','rules'=>'trim','for_out'=>true,),

'count_zal'=>array('name'=>'Количество залов','type'=>'text','rules'=>'trim','for_out'=>true,),

'order_table'=>array('name'=>'Заказ столика','type'=>'text','rules'=>'trim','for_out'=>true,),

'advanced_services'=>array('name'=>'Дополнительные услуги','type'=>'text','rules'=>'trim','for_out'=>true,),

'count_places'=>array('name'=>'Общее количество мест','type'=>'text','rules'=>'trim','for_out'=>true,),

'parking'=>array('name'=>'Парковка','type'=>'text','rules'=>'trim','for_out'=>true,),

'phones'=>array('name'=>'Телефоны','type'=>'text','rules'=>'trim','for_out'=>true,),

'timetable'=>array('name'=>'Время работы','type'=>'text','rules'=>'trim','for_out'=>true,),

'programm'=>array('name'=>'Развлечения и программа','type'=>'text','rules'=>'trim','for_out'=>true,),

'title'=>array('name'=>'Title','type'=>'text',),

'keywords'=>array('name'=>'Keywords','type'=>'text',),

'description'=>array('name'=>'Description','type'=>'text',),

);

public $orderby = 't1.orderby,t1.id';

public $multi_lang_field = 'firm_id';

}

/* End of file firm.php */

/* Location: ./application/models/firm.php */

Приложение В

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Tag extends CMSK_Model {

public $count_per_page_for_cloud = 20;

/**

* список тэгов отсортированных по количеству фирм

*

* @return array

*/

public function getListOrderByCount()

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

if ($this->descriptor->multi_lang_field) {

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

}

$q->join('firms_tags', "t1.id=t4.tag_id", array());

$q->join('firms', "t5.id=t4.firm_id", array());

$q->escape(false)->column('count(distinct t5.id) as count_tags,t1.*')->escape(true);

$q->where('t1.showed', true);

$q->where('t5.showed', true);

$q->escape(false)->orderBy('t2.name,t1.id')->escape(true);

$q->groupBy('t1.id');

$q->limit($this->count_per_page_for_cloud);

$items = $q->get()->result();

return $items;

}

/**

* список тэгов фирмы

*

* @param object $firm фирма

*

* @return array

*/

public function getListByFirm($firm)

{

$q = $this->db->select()->from($this->descriptor->getTable(), array());

if ($this->descriptor->multi_lang_field) {

$q->join($this->descriptor->getTable().'_content', 't1.id=t2.'.$this->descriptor->multi_lang_field, array());

$q->join('langs', "t2.lang_id=t3.id", array());

$q->where('t3.short', $this->Lang->default_lang);

$q->whereIsNotNull('t3.short');

$q->escape(false)->column('t3.*, t2.*')->escape(true);

}

$q->escape(false)->column('t1.*')->escape(true);

$q->join('firms_tags', "t1.id=t4.tag_id", array());

$q->join('firms', "t5.id=t4.firm_id", array());

$q->where('t5.id', $firm->id);

$q->where('t1.showed', true);

$q->where('t5.showed', true);

$q->escape(false)->orderBy('t1.id')->escape(true);

$q->groupBy('t1.id');

$items = $q->get()->result();

return $items;

}

}

class TagDescriptor extends CMSK_Descriptor

{

public $className = 'Tag';

public $common_fields = array(

'slug'=>array('name'=>'Url','type'=>'text','slug'=>'name_ru','rules'=>'trim|required','display_in_index'=>'text',),

'showed'=>array('name'=>'Показывать','type'=>'checkbox','default_value'=>true,'display_in_index'=>'showed_toogler',),

'for_out'=>array('name'=>'Для показа в фирме','type'=>'checkbox','default_value'=>true,'display_in_index'=>'showed_toogler',),

);

public $multi_language_fields = array(

'name'=>array('name'=>'Название','type'=>'text','rules'=>'trim|required','display_in_index'=>'text',),

'title'=>array('name'=>'Title','type'=>'text',),

'keywords'=>array('name'=>'Keywords','type'=>'text',),

'description'=>array('name'=>'Description','type'=>'text',),

);

public $orderby = 't1.orderby,t1.id';

public $multi_lang_field = 'tag_id';

public $parent_field = 'tag_id';

}

/* End of file tag.php */

/* Location: ./application/models/tag.php */

Приложении Г

{{ "Content-Type: text/html; charset=utf-8"|header }}

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

<meta name="description" content="{% block description %}{{ seo.description }}{% endblock %}" />

<meta name="keywords" content="{% block keywords %}{{ seo.keywords }}{% endblock %}" />

<title>{% block title %}{{ seo.title }}{% endblock %}</title>

{% block javascript %}

<script type="text/javascript" src="/js/jquery.js"></script>

<script type="text/javascript" src="/js/jquery.scrollTo-min.js"></script>

<script type="text/javascript" src="/js/swfobject.js"></script>

<script type="text/javascript" src="/js/thickbox.js"></script>

<script src="http://api-maps.yandex.ru/1.1/index.xml?key={{ yandex_api }}" type="text/javascript"></script>

<script src='/js/star/jquery.rating.js' type="text/javascript" language="javascript"></script>

<script type="text/javascript" src="/js/script.js"></script>

<script>

function pre_init()

{

map.setCenter(new YMaps.GeoPoint({{ user_center_x }}, {{ user_center_y }}), {{ user_zoom }});

};

</script>

{% endblock %}

{% block css %}

<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon" />

<link rel="stylesheet" type="text/css" href="/css/reset.css" media="all" />

<link rel="stylesheet" type="text/css" href="/css/style.css" media="all" />

<link rel="stylesheet" type="text/css" href="/css/print.css" media="print" />

<link rel="stylesheet" type="text/css" href="/css/thickbox.css" />

<link href='/js/star/jquery.rating.css' type="text/css" rel="stylesheet"/>

{% endblock %}

</head>

<body>

<div class="header">

<h1><a href="/">{% trans %}Кафе,&nbsp;рестораны Челябинска{% endtrans %}</a></h1>

<div class="stats">

<h4>{% trans %}На&nbsp;нашем&nbsp;сайте{% endtrans %}</h4>

<p class="objs"><strong>{{ stats.objs }}</strong>&nbsp;{% trans %}заведений{% endtrans %}</p>

<p class="stars"> <strong>{{ stats.stars }}</strong>&nbsp;{% trans %}голосов{% endtrans %}</p>

<p class="comments"> <strong>{{ stats.comments }}</strong>&nbsp;{% trans %}комментария{% endtrans %}</p>

<p class="photos"> <strong>{{ stats.photos }}</strong>&nbsp;{% trans %}фотографии{% endtrans %}</p>

</div>

<div class="top_search">

<ul class="top_menu">

</ul>

<form class="search" method="get" action="/search">

<input type="hidden" value="" name="t"/>

<input type="text" value="{{ content.search.q }}" name="q" class="text"/>

<input type="submit" class="submit" value=""/>

</form>

<a href="#" class="no_link advanced_search">{% trans %}Сложный&nbsp;поиск{% endtrans %} &rarr;</a>

<a href="#" class="no_link cloud_tags">{% trans %}Облако&nbsp;тэгов{% endtrans %}</a>

<ol class="cloud_tags">

{% for item in cloud_tags %}

<li class="cloud_{{ item.count_tags }}"><a href="/tag/{{ item.slug }}">{{ item.name }}</a></li>

{% endfor %}

</ol>

</div>

</div>

<div class="map">

{% block map %}

<div id="YMaps" style="height:400px"></div>

{% endblock %}

</div>

<div class="content">

{% block content %}

{% endblock %}

</div>

<div class="clearfix"></div>

<div class="footer">

</div>

</body>

</html>

Размещено на Allbest.ru


Подобные документы

  • Понятие веб-страницы, ее структура, содержание и назначение. Требования к оформлению страниц и обязательных элементов, особенности навигационной структуры. Разработка проекта веб-сайта для телеканала, публикация данного узла в Интернете и его поддержка.

    курсовая работа [2,4 M], добавлен 16.11.2012

  • История появления, структура и возможности сети Интернет, ее роль в бизнесе. Основные функции и принципы использования web-сайта, его правовое регулирование. Источники угрозы для сетевых компьютеров. Построение web-страницы для ОАО "Алейскзернопродукт".

    дипломная работа [1,6 M], добавлен 11.11.2010

  • Определение понятия веб-сайта. Рассмотрение и анализ этапов построения информационного ресурса. Изучение и характеристика особенностей процесса расположения сайта в сети интернет. Ознакомление с порядком регистрации доменного имени и аренды хостинга.

    дипломная работа [4,7 M], добавлен 08.06.2019

  • Понятие web-сайта и их типы. Программы для создания web-сайта. Описание структуры проекта. Алгоритм создания сайта. Описание конструктора Jimdo. Языки программирования серверного выполнения. Создание полнофункционального веб-сайта для ОАО "КУЛЗ".

    курсовая работа [3,5 M], добавлен 05.06.2015

  • Иерархическая структура работ. Выбор контента для сайта для сети кафе общественного питания. Линейная матрица ответственности. Обязанности между участниками проекта. Затраты на оплату труда. Проведение PERT-анализа. Структурная декомпозиция работ.

    курсовая работа [1,0 M], добавлен 06.05.2014

  • Разработка сайта в приложении FrontPage. Программные средства и технологии, используемые при разработке сайта. Основная структура сайта и размещение исходных файлов. Создание графических страниц, элементов и рисунков. Размещение сайта в сети Internet.

    курсовая работа [1,6 M], добавлен 13.06.2013

  • Языки написания сайта, принципы и обоснование их отбора. Программы создания web-страниц, их функциональные особенности и возможности. Технология и основные этапы разработки интернет-сайта, правила его составления, оформления, заполнения, программный код.

    курсовая работа [3,1 M], добавлен 20.05.2015

  • Технологии и методы создания программного продукта в соответствии с деятельностью кафе "Бережок". Анализ технического задания и возможные способы реализации поставленной задачи. Выбор инструментальных программных средств. Структура продукта Web-сайта.

    курсовая работа [755,9 K], добавлен 28.12.2014

  • Технические характеристики компьютерных систем. Анализ интернет-сайта филиала предприятия и выявление основных проблем. Обновление структуры и подгонка сайта под современные стандарты с помощью программы WebSite X5. Создание дизайна веб-страницы.

    отчет по практике [410,2 K], добавлен 14.01.2015

  • Анализ существующих сайтов данной сферы деятельности, сравнительный анализ существующих технологий их создания. Инструментарий для разработки сайта-визитки кафе "Family", программное обеспечение. Принцип работы, внутренняя структура и компоненты.

    курсовая работа [3,8 M], добавлен 21.06.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.