Разработка 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 %}Кафе, рестораны Челябинска{% endtrans %}</a></h1>
<div class="stats">
<h4>{% trans %}На нашем сайте{% endtrans %}</h4>
<p class="objs"><strong>{{ stats.objs }}</strong> {% trans %}заведений{% endtrans %}</p>
<p class="stars"> <strong>{{ stats.stars }}</strong> {% trans %}голосов{% endtrans %}</p>
<p class="comments"> <strong>{{ stats.comments }}</strong> {% trans %}комментария{% endtrans %}</p>
<p class="photos"> <strong>{{ stats.photos }}</strong> {% 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 %}Сложный поиск{% endtrans %} →</a>
<a href="#" class="no_link cloud_tags">{% trans %}Облако тэгов{% 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Определение понятия веб-сайта. Рассмотрение и анализ этапов построения информационного ресурса. Изучение и характеристика особенностей процесса расположения сайта в сети интернет. Ознакомление с порядком регистрации доменного имени и аренды хостинга.
дипломная работа [4,7 M], добавлен 08.06.2019История появления, структура и возможности сети Интернет, ее роль в бизнесе. Основные функции и принципы использования web-сайта, его правовое регулирование. Источники угрозы для сетевых компьютеров. Построение web-страницы для ОАО "Алейскзернопродукт".
дипломная работа [1,6 M], добавлен 11.11.2010Понятие 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