Контроллер мероприятия

В этом уроке создадим контроллер мероприятия. По сути он будет аналогичным контроллеру новости. Разница будет в том, что в контроллере мероприятия будут две даты (дата начала и дата окончания) и дополнительно будут указываться дни недели по которым идет мероприятие.

Для начала создадим таблицу для мероприятий 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'));
}
?>

Теперь создадим сам контроллер.
Теги:
Контроллер, мероприятия
Добавлено: 13 Апреля 2018 07:29:59 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...