Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ WEB Разработка ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

FreeBSD and Nix

Общая

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Codeigniter: Введение


    Это урок предназначен для того, чтобы познакомить вас с CodeIgniter и основными принципами архитектуры MVC. Он покажет вам основы применения CodeIgniter при конструировании приложения, шаг за шагом.

    В этом уроке вы создадите основное приложение новостей. Вы начнете с написания кода, который будет загружать статичные страницы. Затем, вы создадите раздел новостей, который будет считывать записи новостей из базы данных. Наконец, вы добавите форму, чтобы добавлять новости в базу данных.

 

Этот урок предполагает, что вы загрузили CodeIgniter и установили фреймворк в вашем окружении разработки.

Для начала давайте установим контроллер для отображения статичных страниц.

Разберем адрес запроса http://site/news/latest/10

Тут /news/ - сам контроллер, /latest/ - метод контроллера, а смысл метода заключается в выводе по 10 элементов новостей например.
Т.е адрес запроса имеет такое представление http://site/[controller-class]/[controller-method]/[arguments]

Создайте файл в application/controllers/pages.php со следующим кодом.

<?php
class Pages extends CI_Controller {

    public function view($page = 'home')
    {

    }
}

Вы создали класс с названием Pages, с методом отображения, который приниамет один аргумент $page. Класс страниц расширяет класс CI_Controller. Это означает, что новый класс страниц получит доступ к методам и переменным, определенным в классе CI_Controller (system/core/Controller.php).

Как любой другой класс PHP, вы ссылаетесь на него из вашего контроллера через $this. Ссылка на $this позволяет вам загружать библиотеки, отображения и обычные команды фреймворка.

Мы создадим два отображения (шаблоны страниц), которые будут представлять шапку и подвал нашей страницы.
Создайте шапку в application/views/templates/header.php и добавьте следующий код.

<html>
<head>
    <title><?php echo $title ?> - CodeIgniter 2 Tutorial</title>
</head>
<body>
    <h1>CodeIgniter 2 Tutorial</h1>

Шапка содержит основной код HTML, который вы будете выводить перед загрузкой основного отображения, вместе с заголовком. Она также выводит переменную $title, которая будет позже определена в контроллере. Теперь создадим подвал в application/views/templates/footer.php, который включает следующий код:

<strong>&copy; 2011</strong>
</body>
</html>

Добавление логики в контроллер
Ранее вы устанавливали контроллер с методом view(). Метод принимает один параметр, который указывает на имя страницы, которую нужно загрузить. Шаблоны статических страниц будут находиться в директории application/views/pages/.
В этой директории создайте два файла home.php и about.php. В этих файлах напишите любой текст, все что пожелаете, и сохраните их. Если вы не хотите быть оригинальным, попробуйте "Hello World!".
Чтобы загрузить эти страницы, вы должны проверить существование запрашиваемых страниц:

Измените в файле application/controllers/pages.php

public function view($page = 'home') 

    if ( ! file_exists('application/views/pages/'.$page.'.php')) 
    { 
        // Упс, у нас нет такой страницы! 
        show_404(); 
    }
    $data['title'] = ucfirst($page); // Сделать первую букву заглавной

    $this->load->view('templates/header', $data); 
    $this->load->view('pages/'.$page, $data); 
    $this->load->view('templates/footer', $data); 

Теперь, если страница существует, она будет загружена, включая шапку и подвал, и будет показана пользователю. Если страница не существует, будет показана ошибка "404 Page not found".

Первая строка в этом метода проверяет существование страницы. Родная функция PHP file_exists() используется для проверки существования файла. Функция show_404() встроена в CodeIgniter, она позволяет отображать страницы ошибок по умолчанию.

В шаблоне шапки переменная $title была использована для настройки заголовка страницы. Значение заголовка определяется в этом методе, но вместо присвоения значения переменной, оно присваивается элементу title массива $data.

Наконец мы загружаем отображения, чтобы они отобразились. Второй параметр метода view() используется для передачи значений в отображение. Каждое значение в массиве $data ассоциируется переменной с именем, соответствующим ключу. Поэтому значение $data['title'] в контроллере эквивалентно значению $title в отображении.

Роутинг
Теперь контроллер функционирует! Направьте ваш браузер в [your-site-url]index.php/pages/view (У меня например это http://site/index.php/pages/view) чтобы увидеть вашу страницу.

 Когда вы посещаете index.php/pages/view/about, вы увидите страницу about, включающую шапку и подвал.

Используя собственные правила роутинга, вы можете переадресовать любой URI к любому контроллеру и методу, изменяя нормальное поведение: 
http://site/[controller-class]/[controller-method]/[arguments]

Давайте сделаем это. Откройте файл роутинга, находящийся в application/config/routes.php и добавьте две следующие строки. Удалите весь другой код, который устанавливает любые элементы в массиве $route.

Меняем:
//$route['default_controller'] = "welcome";
//$route['404_override'] = '';

На:
$route['default_controller'] = 'pages/view';
$route['(:any)'] = 'pages/view/$1';

CodeIgniter считывает его правила роутинга сверху вниз, и перенаправляет запрос по первому совпавшему правилу. Каждое правило это регулярное выражение (слева), перенаправляющее запрос в указанный контроллер и метод (справа).

 Когда приходит запрос, CodeIgniter ищет первое совпадение, и вызывает соответствующий контроллер и метод, возможно с аргументами.

Здесь второе правило в массиве $routes, соответствующее любому запросу, используя строку шаблона (:any), и передающее параметр в метод view() класса Pages:

Если вызвать например страницу 'about', то код будет равнозначен:

class Pages extends CI_Controller {

    public function view($page = 'about')

Теперь посетите index.php/about. (На моем примере в браузере: http://site/index.php/about).

 

Теперь время для введения в динамическое содержание и начало использования базы данных.

Установка вашей модели
Вместо того, чтобы писать операции с базами данных прямо в контроллер, запросы могут быть помещены в модели, поэтому они легко могут быть позднее повторно использованы. 

Модели это место, где вы получаете, вставляете и обновляете информацию в вашей базе данных и других хранилищах данных. Они представляют ваши данные.

Откройте директорию application/models и создайте новый файл news_model.php, затем добавьте в него следующий код. Убедитесь, что вы сконфигурировали вашу базу данных(application/config/database.php)


<?php 
class News_model extends CI_Model {
     public function __construct() 
    { 
        $this->load->database(); 
    } 

Он создает новую модель, расширяющую CI_Model и загружающую библиотеку базы данных. Это делает доступным класс базы данных через объект $this->db.

Перед тем, как делать запросы в базу данных, должна быть создана ее схема. Соединитесь с вашей базой данных, и выполните команду SQL ниже. Кроме того, добавьте несколько записей.

CREATE TABLE news ( 
    id int(11) NOT NULL AUTO_INCREMENT, 
    title varchar(128) NOT NULL, 
    slug varchar(128) NOT NULL, 
    text text NOT NULL, 
    PRIMARY KEY (id), 
    KEY slug (slug) 
); 

Таблицы созданы, после я добавил пару записей в таблицу.

Теперь, когда база данных и модель настроены, вам нужен будет метод для получения всех постов из нашей базы данных. Чтобы сделать это, будет использован слой абстракции базы данных, включенный в CodeIgniter — Active Record. 

Это сделает возможным записать ваши «запросы» однажды и сделать их работающими во всех поддерживаемых системах баз данных. Добавьте следующий код внутрь класса в вашей модели.

public function get_news($slug = FALSE) 

    if ($slug === FALSE) 
    { 
        $query = $this->db->get('news'); 
        return $query->result_array(); 
    } 
    
    $query = $this->db->get_where('news', array('slug' => $slug)); 
    return $query->row_array(); 

С этим кодом вы можете выполнить два различных запроса. Вы можете получить все новые записи, или получить один элемент по его ЧПУ. Вы можете заметить, что переменная $slug не очищается перед выполнением запроса; Active Record сделает это для вас.

Отображение новостей
Теперь, когда запросы записаны, модель должна быть привязана к отображениям, которые используются для показа новостей пользователю. Это можно сделать в контроллере Pages, который мы сделали ранее, но для наглядности будет определен новый контроллер News. Создайте его в application/controllers/news.php.

<?php
class News extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('news_model');
    }

    public function index()
    {
        $data['news'] = $this->news_model->get_news();
    }

    public function view($slug)
    {
        $data['news'] = $this->news_model->get_news($slug);
    }
}

Глядя на этот код, вы можете увидить некоторое соответствие с файлами, которые мы создали ранее. Во-первых, метод __construct();, он вызывает конструктор его родительского класса (CI_Controller) и загружает модель, поэтому она может быть использована во всех методах этого контроллера.

Далее, есть два метода, для просмотра всех новостей и одного конкретного элемента. Вы можете увидеть переменную $slug, которая передается методу модели во втором методе. Модель использует эту переменную для идентификации новости, которую следует вернуть.

Теперь данные получаеются в контроллере через нашу модель, но ничего не отображается. Следующая вещь, которую мы сделаем, это передача этих данных в отображения.

Изменяем функцию index

    //public function index()
    //{
    //    $data['news'] = $this->news_model->get_news();
    //}
    public function index()
    {
        $data['news'] = $this->news_model->get_news();
        $data['title'] = 'News archive';

        $this->load->view('templates/header', $data);
        $this->load->view('news/index', $data);
        $this->load->view('templates/footer');
    }

Код выше выбирает все записи новостей из модели и ассоциирует их в переменную. Значение для заголовка также ассоциируется с элементом $data['title'] и все его данные передаются в отображения. Теперь вы должны создать отображение, для вывода элементов новостей.

 Создайте файл application/views/news/index.php и поместите в него следующее.

Страница обзора новостей завершена, но страница для отображения индивидуальных новостей все еще отсутствует. Модель, созданная ранее, сделана таким образом, чтобы использовать ее и для этой функциональности. 

Вернитесь к контроллеру News и добавьте следующие строки в файл.

    //public function view($slug)
    //{
    //    $data['news'] = $this->news_model->get_news($slug);
    //}    
    public function view($slug)
    {
        $data['news_item'] = $this->news_model->get_news($slug);

        if (empty($data['news_item']))
        {
            show_404();
        }

        $data['title'] = $data['news_item']['title'];

        $this->load->view('templates/header', $data);
        $this->load->view('news/view', $data);
        $this->load->view('templates/footer');
    }

Вместо вызова get_news() без параметра, передается переменная $slug, поэтому функция вернет указанный элемент. Единственная вещь, которую останется сделать, это создать соответствующее отображение в application/views/news/view.php. Поместите следующий код в этот файл.

<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];

Роутинг

Так как шаблон с правилом роутинга был создан ранее, сейчас вам нужно добавить дополнительный роут к контроллеру, который вы только что сделали. 

Редактируйте ваш файл с роутами (application/config/routes.php), чтобы он выглядел, как показано ниже. Это позволит убедиться в том, что запросы к контроллеру новостей поступают напрямую в контроллер Pages. Первая строка URI с ЧПУ в метод view() контроллера News.

$route['news/(:any)'] = 'news/view/$1'; 
$route['news'] = 'news'; 
$route['(:any)'] = 'pages/view/$1'; 
$route['default_controller'] = 'pages/view'; 

Направьте ваш браузер в корень сайта, а затем в index.php/news и смотрите ваши страницы новостей.

В итоге находясь в корне "новостей"(http://site/index.php/news), и щелкая по ссылке новости(http://site/index.php/news/s1), мы передаем в контроллер "news" переменную "s1" по которой отрабатывает public function view($slug), переменная s1 превращается в $slug, и т.к. мы прописали "роутинг" $route['news/(:any)'] = 'news/view/$1'; все отрабатывает, и выводит нам определенную новость с помощью странички "application/views/news/view.php"

 

Урок — создание новых элементов

Теперь вы знаете, как вы можете считывать данные из базы данных, используя CodeIgniter, но вы еще не записали никакой информации в базу данных. 

В этом разделе вы расширите ваш контроллер новостей и модель, созданную ранее, чтобы включить эту функциональность.

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

Мы сделаем красивый URL из заголовка непосредственно в модели. Создайте новое отображение в application/views/news/create.php.

<h2>Создание нового элемента</h2>

<?php echo validation_errors(); ?>

<?php echo form_open('news/create') ?>

    <label for="title">Title</label>
    <input type="input" name="title" /><br />

    <label for="text">Text</label>
    <textarea name="text"></textarea><br />

    <input type="submit" name="submit" value="Create news item" />

</form>

Здесь только две вещи, которые могут выглядеть незнакомо для вас: функции form_open() и validation_errors().

Первая функция предоставлена помощником форм, и генерирует элемент формы с дополнительной функциональностью, вроде добавления скрытого поля для предотвращения CSFR-атак. 

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

Вернитесь к вашему контроллеру новостей(application/controllers/news.php). Здесь вы собираетесь сделать две вещи, убедиться в том, что форма передана, а также в том, что переданные данные прошли правила валидации. Вы будете использовать библиотеку валидации форм, чтобы сделать это.

public function create()
    {
        $this->load->helper('form');
        $this->load->library('form_validation');

        $data['title'] = 'Create a news item';

        $this->form_validation->set_rules('title', 'title', 'required');
        $this->form_validation->set_rules('text', 'text', 'required');

        if ($this->form_validation->run() === FALSE)
        {
            $this->load->view('templates/header', $data);
            $this->load->view('news/create');
            $this->load->view('templates/footer');

        }
        else
        {
            $this->news_model->set_news();
            $this->load->view('news/success');
        }
    }

Приведенный выше код добавляет много функциональности. 
Первые несколько строк загружают помощник форм и библиотеку валидации форм. 
После этого устанавливаются правила для валидации форм. 

Метод set_rules() принимает три аргумента: имя поля, имя, которое будет использовано в сообщениях об ошибках, и правило. В этом случае поля заголовка и текста являются обязательными.

Продолжая, вы увидите условие, которое проверяет, успешно ли пройдена валидация формы. Если нет, форма отображается снова, если она была передана и выполнены все правила, вызывается модель. 

После этого, загружается файл отображения, чтобы показать сообщение об успехе. Создайте отображение в application/view/news/success.php и запишите в него сообщение об успехе.

<?php
    echo "OK!";
?>

Модель
Единственное, что остается, это написать метод, который записывает данные в базу данных. 

Вы будете использовать класс Active Record, чтобы вставить информацию и использовать библиотеку ввода, чтобы получить данные. 

Откройте модель(models/news_model.php), созданную ранее и добавьте в нее следующее:

    public function set_news()
    {
        $this->load->helper('url');

        $slug = url_title($this->input->post('title'), 'dash', TRUE);

        $data = array(
            'title' => $this->input->post('title'),
            'slug' => $slug,
            'text' => $this->input->post('text')
        );

        return $this->db->insert('news', $data);
    }

Этот новый метод заботится о вставке записи новости в базу данных. 

Третья строка содержит новую функцию url_title(). Эта функция предоставлена помощником URL, она обрезает переданную строку, заменяя все пробелы дефисами, и приводит все символы к нижнему регистру. Это создает хорошую строку, превосходную для создания URI.

Давайте вернемся к подготовке записи перед тем, как она будет позже вставлена, в массиве $data. 

Каждый элемент соответствует столбцу в таблице базы данных, созданной ранее. Тут вы можете обратить внимание на новый метод, называемый post() из библиотеки ввода. Этот метод позволяет убедиться в том, что данные очищены, защищая вас от атак. Библиотека ввода загружается по умолчанию. Наконец, вы вставляете ваш массив $data в базу данных.

Роутинг
Перед тем как вы начнете добавлять новости в ваше приложение с CodeIgniter, вы добавите дополнительное правило в файл config/routes.php. Убедитесь в том, что файл содержит следующее. Это позволит убедиться в том, что CodeIgniter будет искать метод create() прежде чем запись новостей.

Теперь направьте ваш браузер на локальную среду разработки, где вы установили CodeIgniter, и добавьте index.php/news/create к URL. Поздравляем, вы только-что создали ваше первое приложение на CodeIgniter. Добавьте несколько новостей, и проверьте различные страницы, которые вы только-что сделали.


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект