В этом уроке создадим контроллер мероприятия. По сути он будет аналогичным контроллеру новости. Разница будет в том, что в контроллере мероприятия будут две даты (дата начала и дата окончания) и дополнительно будут указываться дни недели по которым идет мероприятие.
Для начала создадим таблицу для мероприятий cm_events
DROP TABLE IF EXISTS `cm_events`;
CREATE TABLE `cm_events` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) DEFAULT NULL,
`from` DATE DEFAULT NULL,
`to` DATE DEFAULT NULL,
`anons` text,
`content` text,
`days` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
Дни недели мы будем хранить в текстовом поле days в виде строки с разделителями. Строка будет состоят из семи символов (0 — нет события в этот день, 1 — есть). Пример: событие идет: по понедельникам, пятницам и воскресеньям. Строка в поле days будет выглядеть так: 1;0;0;0;1;0;1.
Создадим файл вида для списка мероприятий admin/events
<h2>Список мероприятий</h2>
<?=anchor(base_url().'admin/events/add','Добавить мероприятие');?>
<table border="0" width="400" cellspacing="4">
<tr><td>Начало</td><td>Окончание</td><td>Заголовок</td><td>Дни недели</td><td>Удалить</td></tr>
<?php foreach($list as $one):?>
<tr><td><?=$one['from'];?></td><td><?=$one['to'];?></td><td><?=anchor(base_url().'admin/events/edit/'.$one['id'],$one['title']);?></td><td nowrap="nowrap"><?=$one['days'];?></td><td><?=anchor(base_url().'admin/events/del/'.$one['id'],'X');?></td></tr>
<?endforeach;?>
</table>
Как видно из файла вида, дни у нас выводятся в переменной $one['days']. В таблице они хранятся в виде строки из нулей и единиц, но нам такой внешний вид не подходит. Соответственно необходимо сделать функцию, которая преобразовывала строку из таблицы в строку состоящую из русских сокращений дней недели. Например: 1;0;0;0;1;1;0 в строку ПН ПТ СБ.
Создадим файл вида для добавления и редактирования мероприятия admin/event. Я не буду приводить полный текст файла вида (результаты урока можно будет скачать в конце поста). Приведу лишь часть касающуюся дней недели
<tr>
<td>Дни недели</td><td>
<input name="days[0]" type="checkbox" <?=($type == 'edit') ? ($one['days'][0] == '1')? 'checked': '': 'checked'?> value="Mon"> ПН
<input name="days[1]" type="checkbox" <?=($type == 'edit') ? ($one['days'][1] == '1')? 'checked': '': 'checked'?> value="Tue"> ВТ
<input name="days[2]" type="checkbox" <?=($type == 'edit') ? ($one['days'][2] == '1')? 'checked': '': 'checked'?> value="Wed"> СР
<input name="days[3]" type="checkbox" <?=($type == 'edit') ? ($one['days'][3] == '1')? 'checked': '': 'checked'?> value="Thu"> ЧТ
<input name="days[4]" type="checkbox" <?=($type == 'edit') ? ($one['days'][4] == '1')? 'checked': '': 'checked'?> value="Fri"> ПТ
<input name="days[5]" type="checkbox" <?=($type == 'edit') ? ($one['days'][5] == '1')? 'checked': '': 'checked'?> value="Sat"> СБ
<input name="days[6]" type="checkbox" <?=($type == 'edit') ? ($one['days'][6] == '1')? 'checked': '': 'checked'?> value="Sun"> ВС
</td>
</tr>
Эта часть выводит чекбоксы с днями недели. Пользователь отмечает дни по которым идет мероприятие и отмеченные дни передаются в переменной days в виде массива состоящего из названий дней на английском. Например пользователь отметил понедельник и вторник. В переменной days будет массив [Mon,Tue]. Соответственно перед вставкой в базу нам надо преобразовать этот массив в строку вида (1;1;0;0;0;0;0).
Нам придется немного переделать модель CRUD.
Добавить преобразование дат для начала (from) и окончания (to)
Добавить преобразования поля days.
Содержание файла CRUD:
<?php
/**
* @author allexe
* @copyright 2010
* 26.8.2010
* Описание файла: Общая модель для работы с БД
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Crud extends Model
{
var $table = ''; //Имя таблицы
var $idkey = 'id'; //Ключ ID
var $add_rules = array(); //Правила валидации для добавления
var $edit_rules = array(); //Правила валидации для редактирования
//Конструктор
function Crud()
{
parent::Model();
}
/**
* Функция для добавления
*/
function add()
{
$this->form_validation->set_rules($this->add_rules);
if ($this->form_validation->run()) {
$data = array();
foreach ($this->add_rules as $one) {
$f = $one['field'];
if ((($f == 'date') or ($f == 'from')) or ($f == 'to')) {
$date = $this->input->post($f);
$data[$f] = $this->date_to_mysql($date);
} elseif ($f == 'days') {
$days = $this->input->post($f);
$data[$f] = $this->implode_days($days);
} else {
$data[$f] = $this->input->post($f);
}
}
$this->db->insert($this->table, $data);
return $this->db->insert_id(); //Возвращает номер товар
} else {
return false;
}
}
/**
* Функция для редактирования
*/
function edit($id)
{
$this->form_validation->set_rules($this->edit_rules);
if ($this->form_validation->run()) {
$data = array();
foreach ($this->edit_rules as $one) {
$f = $one['field'];
if ((($f == 'date') or ($f == 'from')) or ($f == 'to')) {
$date = $this->input->post($f);
$data[$f] = $this->date_to_mysql($date);
} elseif ($f == 'days') {
$days = $this->input->post($f);
$data[$f] = $this->implode_days($days);
} else {
$data[$f] = $this->input->post($f);
}
}
$this->db->where($this->idkey, $id);
$this->db->update($this->table, $data);
return $data; //Возвращает вставленные данные
} else {
return false;
}
}
/**
* Функция удаления
*/
function del($id)
{
$this->db->where($this->idkey, $id);
$this->db->delete($this->table);
}
/**
* Получение данных
*/
function get($id)
{
$this->db->where($this->idkey, $id);
$query = $this->db->get($this->table);
$rez = $query->row_array();
foreach ($rez as $key => $value) {
if ((($key == 'date') or ($key == 'from')) or ($key == 'to')) {
$rez[$key] = $this->mysql_to_date($value);
}
if ($key == 'days') {
$rez[$key] = $this->explode_days($value);
}
}
return $rez;
}
/**
* Получение списка
*/
function getlist($start_from = false, $limit = false)
{
if (($start_from) & ($limit)) {
$this->db->limit($limit, $start_from);
} elseif ($limit) {
$this->db->limit($limit);
}
$query = $this->db->get($this->table);
$rez = $query->result_array();
for ($i=0;$i<count($rez);$i++) {
$one = $rez[$i];
foreach ($one as $key => $value) {
if ((($key == 'date') or ($key == 'from')) or ($key == 'to')) {
$rez[$i][$key] = $this->mysql_to_date($value);
} elseif ($key == 'days') {
$rez[$i][$key] = $this->week_days($value);
}
}
}
return $rez;
}
/**
* Преобразует дату в формат MySql
*/
function date_to_mysql($str)
{
$day = substr($str, 0, strpos($str, '.'));
$str = substr($str, strpos($str, '.') + 1);
$month = substr($str, 0, strpos($str, '.'));
$year = substr($str, strrpos($str, '.') + 1);
$mysql_date = $year . '-' . $month . '-' . $day;
return $mysql_date;
}
/**
* Преобразует дату формате MySql в формат 01.10.2010
*/
function mysql_to_date($str)
{
$year = substr($str, 0, strpos($str, '-'));
$str = substr($str, strpos($str, '-') + 1);
$month = substr($str, 0, strpos($str, '-'));
$day = substr($str, strrpos($str, '-') + 1);
$date = $day . '.' . $month . '.' . $year;
return $date;
}
/**
* Преобразовывает строку в массив
*/
function explode_days($str) {
$rez = explode(';',$str);
return $rez;
}
/**
* Преобразовывает полученные из формы отмеченные дни
* недели в строку с нулями и единицами
*/
function implode_days($arr) {
$rez = explode(';','0;0;0;0;0;0;0');
foreach ($arr as $key=>$value) {
switch ($value) {
case 'Mon' : $rez[0] = '1'; break;
case 'Tue' : $rez[1] = '1'; break;
case 'Wed' : $rez[2] = '1'; break;
case 'Thu' : $rez[3] = '1'; break;
case 'Fri' : $rez[4] = '1'; break;
case 'Sat' : $rez[5] = '1'; break;
case 'Sun' : $rez[6] = '1'; break;
}
}
$rez = implode(';',$rez);
return $rez;
}
/**
* Преобразовывает поле days в строку с днями недели
* для показа в списке мероприятий
*/
function week_days($str) {
$rez = '';
$arr = explode(';',$str);
foreach ($arr as $key=>$value) {
if ($value == '1') {
switch ($key) {
case '0' : $rez .= 'ПН '; break;
case '1' : $rez .= 'ВТ '; break;
case '2' : $rez .= 'СР '; break;
case '3' : $rez .= 'ЧТ '; break;
case '4' : $rez .= 'ПТ '; break;
case '5' : $rez .= 'СБ '; break;
case '6' : $rez .= 'ВС '; break;
}
}
}
return $rez;
}
}
?>
Создадим модель для мероприятий где опишем правила валидации для добавления и редактирования
<?php
/**
* @author allexe
* @copyright 2010
* 26.8.2010
* Описание файла: Модель для работы с таблицей мероприятий
*/
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class mdl_events extends CRUD {
var $table = 'events'; //Имя таблицы
var $idkey = 'id';
var $add_rules = array(array('field' => 'title', 'label' => 'Заголовок мероприятия',
'rules' => 'required|max_length[255]'), array('field' => 'from', 'label' =>
'Начало', 'rules' => 'required'), array('field' => 'to', 'label' =>
'Окончание', 'rules' => 'required'), array('field' => 'anons', 'label' =>
'Анонс мероприятия', 'rules' => 'required'), array('field' => 'content', 'label' =>
'Текст мероприятия', 'rules' => 'required'), array('field' => 'days', 'label' =>
'Дни', 'rules' => 'required'));
var $edit_rules = array(array('field' => 'title', 'label' => 'Заголовок мероприятия',
'rules' => 'required|max_length[255]'), array('field' => 'from', 'label' =>
'Начало', 'rules' => 'required'), array('field' => 'to', 'label' =>
'Окончание', 'rules' => 'required'), array('field' => 'anons', 'label' =>
'Анонс мероприятия', 'rules' => 'required'), array('field' => 'content', 'label' =>
'Текст мероприятия', 'rules' => 'required'), array('field' => 'days', 'label' =>
'Дни', 'rules' => 'required'));
}
?>
Теперь создадим сам контроллер.