Статьи

Kohana: Swift PHP Framework

Kohana — это фреймворк PHP 5, использующий архитектурный паттерн Model View Controller (MVC). Есть несколько причин, по которым вы должны выбрать Kohana, но основными из них являются безопасность, невесомость и простота. В этом уроке я расскажу о его основных функциях и с помощью простой демонстрации покажу вам, сколько времени Kohana может потенциально сэкономить вам.

Kohana — это PHP5-фреймворк, использующий архитектурный паттерн Model View Controller. MVC сохраняет логику приложения
отдельно от презентации. Это позволяет нам создавать более чистый код и экономить время на поиск ошибок.
В незнакомой с этим закономерности:

  • Модель представляет данные, с которыми работает приложение. Обычно база данных.
  • Представление содержит код представления, такой как HTML, CSS и JavaScript.
  • Контроллер интерпретирует входные данные от пользователя и отправляет модели и / или представлению.

Изначально Kohana была форком CodeIgniter (CI), который является продуктом с открытым исходным кодом от EllisLab. Есть много общего между CI и Kohana, но весь код либо новый, либо полностью переписан. Как вы можете прочитать на официальном веб-сайте Kohana , основными функциями являются:

  • Очень безопасный
  • Очень легкий
  • Короткая кривая обучения
  • Использует шаблон MVC
  • 100% совместимость с UTF-8
  • Слабосвязанная архитектура
  • Очень легко расширить

Давайте начнем. Посетите официальный веб-сайт Kohana http://kohanaphp.com и нажмите на зеленое поле в правом углу, чтобы загрузить последнюю версию. Все библиотеки Kohana, помощники и представления включены в пакет загрузки по умолчанию, но вы можете выбрать дополнительные модули, инструменты поставщика и языки, если хотите. Для целей данного руководства может быть достаточно пакета по умолчанию. Нажмите «Скачать Kohana!» начать загрузку.

Как только вы закончили загрузку:

  1. расстегнуть молнию
  2. Переименуйте папку «Kohana_vx.xx» в «kohana» и загрузите ее в корневой каталог документов вашего веб-сервера.
  3. Отредактируйте файл глобальной конфигурации application / config / config.php следующим образом
  4. 1
    $config[‘site_domain’] = ‘localhost/kohana’;
  5. Если вы используете unix-подобную систему, подкаталоги установки могут потерять свои разрешения во время распаковки zip. Чмод их всех на 755, запустив find. -тип d -exec chmod 755 {} \; из корня вашей установки Kohana.
  6. Убедитесь, что каталоги application / logs и application / cache доступны для записи. Чмод до 666.
  7. Теперь наведите ваш браузер на http: // localhost / kohana /. Платформа автоматически вызывает скрипт install.php и проверяет ваши требования к серверу.

Kohana будет работать практически в любой среде с минимальной конфигурацией. Существует несколько минимальных требований к серверу:

  • Сервер с поддержкой Unicode
  • Версия PHP> = 5.2.3
  • HTTP-сервер. Я предлагаю вам использовать XAMPP . XAMPP — это простой инструмент для установки MySQL, PHP и Perl.
  • База данных (MsSQL, MySQL, MySQLi, PostgreSQL, PDOSqlite)

Есть также некоторые необходимые расширения.

  • PCRE
  • Iconv
  • Mcrypt
  • SPL

Если ваша установка успешно завершена, вы будете перенаправлены на эту тестовую страницу:

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

Если все тесты пройдены, перейдите в каталог Kohana и удалите или переименуйте скрипт install.php. Обновите, и вы увидите страницу приветствия, как это:

Кохана готова идти. Никаких других настроек не требуется. Эта структура удивительна. Не так ли? Давайте рассмотрим некоторый код. Подписывайтесь на меня.

Учебные пособия по каноническому программированию начинаются с примера «Hello world». Вместо этого я думаю, что простое приложение может дать вам четкое представление о том, как работает фреймворк. Итак, мы создадим менеджер коллекции CD — просто для забавной демонстрации. Прежде чем мы начнем кодировать, требуется краткое введение в файловую систему Kohana.

Наше приложение будет размещено в папке приложения . В этой папке есть несколько подпапок, но нам нужно следующее для нашего проекта:

  • Папка config содержит все файлы конфигурации, закодированные как простые статические массивы.
  • папка контроллеров содержит наш класс контроллеров
  • Папка моделей содержит наш класс моделей
  • В папке views хранятся наши пользовательские файлы, написанные на HTML (или на любом языке разметки или скрипте, необходимом для отображения пользователю данных и элементов управления интерфейсом).

Остальные подпапки не требуются для этого урока, поэтому я приглашаю вас узнать больше на веб-сайте Kohana.

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

Папка ресурсов не является предопределенной папкой Kohana. Я создал его для медиа-файлов, таких как CSS, JS и изображения. Я покажу вам, как включить эти файлы в проект.

Папка modules — это место для многократного использования коллекций связанных файлов, которые вместе добавляют определенную функциональность приложению. Модуль аутентификации, предоставленный командой Kohana, является примером модуля.

Это очень краткое введение в файловую систему Kohana, но этого достаточно для целей данного руководства. Я не хочу утомлять вас больше теорией.

Я выбрал MySQL в качестве моей СУБД, но помните, что Kohana также поддерживает MsSQL, MySQLi, PostgreSQL, PDOSqlite. Создайте базу данных с именем «cd_collection» или выберите имя, которое вы предпочитаете, и запустите следующий SQL через phpMyAdmin или любой другой инструмент для администрирования MySQL.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
CREATE TABLE `albums` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) collate utf8_bin NOT NULL,
  `author` varchar(50) collate utf8_bin NOT NULL,
  `genre_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `genre_id` (`genre_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=19 ;
 
INSERT INTO `albums` (`id`, `name`, `author`, `genre_id`) VALUES
(2, ‘Lines, Vines And Trying Times’, ‘Jonas Brothers’, 16),
(3, ‘The END’, ‘The Black Eyed Peas’, 16),
(4, ‘Relapse’, ‘Eminem’, 18),
(5, ‘Monuments And Melodies’, ‘Incubus’, 1),
(6, ‘Thriller’, ‘Michael Jackson’, 16),
(7, ‘Back in Black’, ‘AC/DC’, 4),
(8, ‘The Dark Side of the Moon’, ‘Pink Floyd’, 4),
(9, ‘Bat out of Hell’, ‘Meat Loaf’, 4),
(10, ‘Backstreet Boys’, ‘Millennium’, 16),
(11, ‘Rumours’, ‘Fleetwood Mac’, 4),
(12, ‘Come on Over’, ‘Shania Twain’, 16),
(13, ‘Led Zeppelin IV’, ‘Led Zeppelin’, 4),
(14, ‘Jagged Little Pill’, ‘Alanis Morissette’, 4),
(15, ‘Sgt. Pepper»s Lonely Hearts Club Band’, ‘The Beatles’, 16),
(16, ‘Falling into You’, ‘C√©line Dion’, 16),
(17, ‘Music Box’, ‘Mariah Carey’, 16),
(18, ‘Born in the USA’, ‘Bruce Springsteen’, 4);
 
CREATE TABLE `genres` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) collate utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=22 ;
 
INSERT INTO `genres` (`id`, `name`) VALUES
(1, ‘Alternative Rock’),
(2, ‘Blues’),
(3, ‘Classical’),
(4, ‘Rock’),
(5, ‘Country’),
(6, ‘Dance’),
(7, ‘Folk’),
(8, ‘Metal’),
(9, ‘Hawaiian’),
(10, ‘Imports’),
(11, ‘Indie Music’),
(12, ‘Jazz’),
(13, ‘Latin’),
(14, ‘New Age’),
(15, ‘Opera’),
(16, ‘Pop’),
(17, ‘Soul’),
(18, ‘Rap’),
(20, ‘Soundtracks’),
(21, ‘World Music’);
 
ALTER TABLE `albums`
  ADD CONSTRAINT `genre_inter_relational_constraint` FOREIGN KEY (`genre_id`) REFERENCES `genres` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Как видите, SQL создает две таблицы, альбомы и жанры и заполняет их некоторыми данными. Последний оператор SQL добавляет ограничение для внешнего ключа «genre_id».

Структура базы данных очень проста и не требует особых пояснений.

Теперь вы должны сообщить Kohana, где находится ваша база данных и как получить к ней доступ. Отредактируйте глобальную конфигурационную файловую систему / config / database.php следующим образом

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
$config[‘default’] = array
(
    ‘benchmark’ => TRUE,
    ‘persistent’ => FALSE,
    ‘connection’ => array
    (
        ‘type’ => ‘mysql’,
        ‘user’ => ‘root’,
        ‘pass’ => ‘root’,
        ‘host’ => ‘localhost’,
        ‘port’ => FALSE,
        ‘socket’ => FALSE,
        ‘database’ => ‘cd_collection’
    ),
    ‘character_set’ => ‘utf8’,
    ‘table_prefix’ => »,
    ‘object’ => TRUE,
    ‘cache’ => FALSE,
    ‘escape’ => TRUE
);

Этот код говорит Kohana подключиться к базе данных MySQL с именем «cd_collection» на локальном хосте с именем пользователя «root» и паролем «root». Вы должны изменить эти параметры в соответствии с конфигурацией сервера базы данных.

Давайте теперь создадим наш первый контроллер. Помните эти соглашения.

  • имя файла контроллера должно быть в нижнем регистре, например, album.php
  • класс контроллера должен соответствовать имени файла и заглавным буквам, и должен быть добавлен с _Controller, например, Album_Controller
  • должен иметь класс Controller как (великий) родитель

Также помните, как Kohana структурирует свои URL и как вы можете вызывать метод контроллера; например, http: //hostname/kohana_directory/index.php/controller/function.

Давайте посмотрим на этот простой контроллер.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php defined(‘SYSPATH’) OR die(‘No direct access allowed.’);
 
class Album_Controller extends Controller
{
    public function __construct()
    {
        parent::__construct();
    }
     
    public function index()
    {
        echo «My first controller»;
    }
}

PHP5 ООП является обязательным условием. Так что, если вы не очень хорошо разбираетесь, вы можете узнать больше здесь .

Функция конструктора, называемая __construct, инициализирует класс и вызывает родительский конструктор.
Функция index является функцией по умолчанию, поэтому она будет вызываться, если мы вызываем контроллер без
указание любой функции (например, http: //localhost/index.php/kohana/album. После имени контроллера
функции нет, будет вызываться индексная функция по умолчанию.)

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

Итак, давайте изменим класс следующим образом.

Создайте файл с именем album.php в приложении / controllers / и вставьте следующее.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php defined(‘SYSPATH’) OR die(‘No direct access allowed.’);
     
class Album_Controller extends Controller
{
     private $album_model;
     private $genre_model;
      
     private $list_view;
     private $create_view;
     private $update_view;
  
    public function __construct()
    {
        parent::__construct();
        $this->album_model = new Album_Model;
        $this->genre_model = new Genre_Model;
        $this->list_view = new View(‘list’);
        $this->update_view = new View(‘update’);
        $this->create_view = new View(‘create’);
    }
  
    public function index()
    {
        $this->show_albums_list();
    }
         
    private function show_albums_list()
    {
        $albums_list = $this->album_model->get_list();
        $this->list_view->set(‘albums_list’,$albums_list);
        $this->list_view->render(TRUE);
    }
     
    public function show_create_editor()
    {
        $this->create_view->set(‘genres_list’,$this->get_genres_list());
        $this->create_view->render(TRUE);
    }
  
    public function show_update_editor($id)
    {
        $album_data = $this->album_model->read($id);
        $this->update_view->set(‘album_id’,$album_data[0]->id);
        $this->update_view->set(‘name’,$album_data[0]->name);
        $this->update_view->set(‘author’,$album_data[0]->author);
        $this->update_view->set(‘genre_id’,$album_data[0]->genre_id);
        $this->update_view->set(‘genres_list’,$this->get_genres_list());
        $this->update_view->render(TRUE);
    }
  
    public function create()
    {
        $album_data=array(
        ‘name’ => $this->input->post(‘name’),
        ‘author’ => $this->input->post(‘author’),
        ‘genre_id’ => $this->input->post(‘genre_id’)
        );
        $this->album_model->create($album_data);
        url::redirect(‘album’);
    }
  
    public function update()
    {
        $album_data = array(
            ‘name’ => $this->input->post(‘name’),
            ‘author’ => $this->input->post(‘author’),
            ‘genre_id’ => $this->input->post(‘genre_id’)
        );
        $this->album_model->update($this->input->post(‘album_id’),$album_data);
        url::redirect(‘album’);
    }
   
    public function delete($id)
    {
        $this->album_model->delete($id);
        url::redirect(‘album’);
    }
  
    private function get_genres_list()
    {
        $db_genres_list = $this->genre_model->get_list();
        $genres_list = array();
         
        if(sizeof($db_genres_list) >= 1)
        {
            foreach($db_genres_list as $item)
            {
                $genres_list[$item->id] = $item->name;
            }
        }
        return $genres_list;
    }
}

Позвольте мне объяснить, что делает этот код.

Пять переменных членов объявлены в верхней части класса:

1
2
3
4
5
6
private $album_model;
private $genre_model;
          
private $list_view;
private $create_view;
 private $update_view;

Эти члены являются частными, потому что я хочу ограничить видимость только для этого класса.

В методе конструкции объекты модели и представления создаются с использованием пяти элементов:

1
2
3
4
5
$this->album_model = new Album_Model;
$this->genre_model = new Genre_Model;
$this->list_view = new View(‘list’);
$this->update_view = new View(‘update’);
$this->create_view = new View(‘create’);

Чтобы создать объект модели, используйте этот синтаксис:

1
$obj_name = new Name_Model;

Чтобы создать объект представления, используйте этот синтаксис:

1
$obj_name = new View(‘view_filename_without_extension’);

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

Метод index вызывает метод show_albums_list, в котором перечислены все альбомы, хранящиеся в базе данных.

1
2
3
$albums_list = $this->album_model->get_list();
$this->list_view->set(‘albums_list’,$albums_list);
$this->list_view->render(TRUE);

В этом методе вы можете увидеть, как модель и объект представления используются для доступа к относительным методам. «get_list» — это метод модели (мы увидим его позже), который возвращает все альбомы, хранящиеся в базе данных. Результат сохраняется в массиве «$ album_list». Чтобы передать массив результатов из контроллера в представление, для объекта представления вызывается метод «set». Этот метод требует два параметра: новая пустая переменная (album_list) для хранения данных существующей переменной ($ album_list). Теперь новая переменная «album_list» содержит массив $ album_list (позже мы увидим, как отображать содержимое в представлении). Метод render с параметром TRUE необходим для вывода данных в браузер.

Метод show_create_editor показывает пользовательский интерфейс для вставки нового альбома.

1
2
$this->create_view->set(‘genres_list’,$this->get_genres_list());
$this->create_view->render(TRUE);

Список жанров передается на просмотр.

Метод show_update_editor показывает пользовательский интерфейс для обновления существующего альбома.

1
2
3
4
5
6
7
$album_data = $this->album_model->read($id);
$this->update_view->set(‘album_id’,$album_data[0]->id);
$this->update_view->set(‘name’,$album_data[0]->name);
$this->update_view->set(‘author’,$album_data[0]->author);
$this->update_view->set(‘genre_id’,$album_data[0]->genre_id);
$this->update_view->set(‘genres_list’,$this->get_genres_list());
$this->update_view->render(TRUE);

«read» — это модельный метод (мы увидим его позже), который возвращает данные ($ album_data) альбома с идентификатором, равным $ id. Затем каждый отдельный элемент возвращенного альбома данных передается в представление.

Метод create получает данные для нового альбома из представления, и данные сохраняются в базе данных.

1
2
3
4
5
6
7
$album_data=array(
‘name’ => $this->input->post(‘name’),
‘author’ => $this->input->post(‘author’),
‘genre_id’ => $this->input->post(‘genre_id’)
);
$this->album_model->create($album_data);
url::redirect(‘album’);

$ album_data — это массив, который содержит данные POST из представления. Чтобы сохранить альбом, массив передается методу создания модели. Последняя строка — это вызов вспомогательного метода. Помощники — это просто функции, которые помогают вам в развитии. Вспомогательные классы автоматически загружаются фреймворком. Помощники объявляются как статические методы класса, поэтому нет необходимости создавать экземпляр класса. В этом случае вызывается метод «redirect» вспомогательного «url», который говорит Kohana перенаправить браузер на контроллер альбома. Это позволяет избежать новой вставки (например, нажав F5).

«Помощники — это просто функции, которые помогают вам в развитии».

Методы update и delete работают так же, как и метод create, описанный выше.

Последний метод get_genres_list получает список жанров из модели ($ db_genres_list) и создает новый массив ($ genres_list) для поля выбора в представлениях.

01
02
03
04
05
06
07
08
09
10
11
$db_genres_list = $this->genre_model->get_list();
$genres_list = array();
 
if(sizeof($db_genres_list) >= 1)
{
    foreach($db_genres_list as $item)
    {
        $genres_list[$item->id] = $item->name;
    }
}
return $genres_list;

Давайте теперь создадим модели для нашего веб-приложения. Помните эти соглашения.

  • имя модели должно быть в нижнем регистре, например, album.php
  • класс модели должен соответствовать имени файла и быть написан заглавными буквами, и должен быть добавлен с _Model, например, Album_Model
  • должен иметь класс Model в качестве (большого) родителя

Вот код модели альбома. Создайте файл с именем album.php в приложении / models / и вставьте в него приведенный ниже код.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php defined(‘SYSPATH’) OR die(‘No direct access allowed.’);
 
class Album_Model extends Model
{
    private $album_table;
    private $genre_table;
  
    public function __construct()
        {
            parent::__construct();
        $this->album_table = ‘albums’;
        $this->genre_table = ‘genres’;
    }
   
    public function read($id)
    {
        $this->db->where(‘id’, $id);
        $query = $this->db->get($this->album_table);
        return $query->result_array();
    }
     
    public function delete($id)
    {
        $this->db->delete($this->album_table, array(‘id’ => $id));
    }
   
    public function update($id,$data)
    {
        $this->db->update($this->album_table, $data, array(‘id’ => $id));
    }
     
    public function create($data)
    {
        $this->db->insert($this->album_table, $data);
    }
     
    public function get_list()
    {
        $this->db->select(‘albums.id as id,albums.name as name,albums.author as author, genres.name as genre’);
        $this->db->from($this->album_table);
        $this->db->join($this->genre_table,’genres.id’,’albums.genre_id’);
        $query = $this->db->get();
        return $query->result_array();
    }
}

Все методы в моделях используют синтаксис построителя запросов. Этот инструмент Kohana ускоряет время разработки баз данных и упрощает создание запросов.

Две переменные-члены объявлены в верхней части класса:

1
2
private $album_table;
private $genre_table;

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

Первая строка в методе конструктора загружает библиотеку базы данных Kohana в $ this-> db. Во второй и третьей строках два члена класса инициализируются.

1
2
3
parent::__construct();
$this->album_table = ‘albums’;
$this->genre_table = ‘genres’;

Запрос в методе чтения извлекает записи альбома с определенным идентификатором («$ id»).

1
2
3
$this->db->where(‘id’, $id);
$query = $this->db->get($this->album_table);
return $query->result_array();

Запрос в методе удаления удаляет строку таблицы альбомов с определенным идентификатором («$ id»).

1
$this->db->delete($this->album_table, array(‘id’ => $id));

Запрос в методе update обновляет строку таблицы альбомов с определенным идентификатором («$ id») новыми значениями из массива «$ data».

1
$this->db->update($this->album_table, $data, array(‘id’ => $id));

Массив «$ data» должен содержать имена записей в качестве ключей массива и значения в качестве значений массива. Массив «$ data» должен иметь следующую форму:

1
2
3
4
5
$data = array(
    ‘name’ => ‘album_name’,
    ‘author’ => ‘author_name’,
    ‘genre_id’ => ‘genre_id’
    );

Запрос в методе create вставляет новую запись со значениями массива $ data.

1
$this->db->insert($this->album_table, $data);

Массив «$ data» должен иметь следующую форму:

1
2
3
4
5
6
$data = array(
    ‘id’ => ‘album_id’,
    ‘name’ => ‘album_name’,
    ‘author’ => ‘author_name’,
    ‘genre_id’ => ‘genre_id’
);

Запрос в методе get_list извлекает все строки альбомов.

1
2
3
4
5
$this->db->select(‘albums.id as id,albums.name as name,albums.author as author, genres.name as genre’);
$this->db->from($this->album_table);
$this->db->join($this->genre_table,’genres.id’,’albums.genre_id’);
$query = $this->db->get();
return $query->result_array();

Теперь жанровая модель. Создайте файл под названием genre.php в application / models / и вставьте код под ним:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php defined(‘SYSPATH’) OR die(‘No direct access allowed.’);
 
class Genre_Model extends Model
{
    private $genre_table;
 
    function __construct()
    {
        parent::__construct();
        $this->genre_table = ‘genres’;
    }
 
    function get_list()
    {
        $query = $this->db->get($this->genre_table);
        return $query->result_array();
    }
}

Эта модель очень проста, поэтому я больше не буду тратить время на ее комментирование. Модели и контроллер готовы к работе. Давайте теперь работать над представлениями.

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

Создайте файл с именем list.php в application / views / и вставьте следующий код в:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html>
<head>
<?php
    echo html::stylesheet(array
        (
         ‘assets/css/style’
        ),
        array
        (
         ‘screen’
        ), FALSE);
?>
        <title>CD COLLECTION</title>
        </head>
        <body>
        <?php
                echo html::image(‘assets/images/add.png’);
                echo html::anchor(‘album/show_create_editor’, ‘Add new album’);
        ?>
        <table class=»list» cellspacing=»0″>
        <tr>
            <td colspan=»5″ class=»list_title»>CD Collection</td>
        </tr>
        <tr>
            <td class=»headers»>Album name</td>
            <td class=»headers»>Author</td>
            <td colspan=’3′ class=»headers»>Genre</td>
         
        </tr>
        <?php
            foreach($albums_list as $item)
            {
                echo «<tr>»;
                echo «<td class=’item’>».$item->name.»</td>»;
                echo «<td class=’item’>».$item->author.»</td>»;
                echo «<td class=’item’>».$item->genre.»</td>»;
                echo «<td class=’item’>».html::anchor(‘album/delete/’.$item->id,html::image(‘assets/images/delete.png’)).»</td>»;
                echo «<td class=’item’>».html::anchor(‘album/show_update_editor/’.$item->id,html::image(‘assets/images/edit.png’)).»</td>»;
                echo «</tr>»;
            }
        ?>
        </table>
        </body>
        </html>

Это представление показывает HTML-страницу, содержащую список всех альбомов. Этот список был создан с помощью цикла foreach, который печатает информацию в HTML-таблице. Для каждой строки альбома есть два изображения: «красный крест» и «бумажник». Они связывают соответственно метод удаления контроллера и метод обновления. Оба передают идентификатор альбома контроллеру альбома, используя запрос get. Над списком есть кнопка для создания новых альбомов. В этом коде мы также используем вспомогательный HTML, предоставляемый Kohana, который ускоряет операции по написанию HTML-страниц.

Давайте теперь создадим файл с именем create.php в приложении / views / .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html>
<head>
<?php
    echo html::stylesheet(array
    (
        ‘assets/css/style’
    ),
    array
    (
        ‘screen’
    ), FALSE);
?>
<title>CD COLLECTION</title>
</head>
<body>
<?php echo form::open(‘album/create’);
<table class=’editor’>
<tr>
    <td colspan=’2′ class=’editor_title’>Create new album</td>
</tr>
<?php
    echo «<tr>»;
    echo «<td>».form::label(‘name’, ‘Name: ‘).»</td>»;
    echo «<td>».form::input(‘name’, »).»</td>»;
    echo «</tr>»;
     
    echo «<tr>»;
    echo «<td>».form::label(‘author’, ‘Author: ‘).»</td>»;
    echo «<td>».form::input(‘author’, »).»</td>»;
    echo «<tr/>»;
     
    echo «<tr>»;
    echo «<td>».form::label(‘genre’, ‘Genre: ‘).»</td>»;
    echo «<td>».form::dropdown(‘genre_id’,$genres_list).»</td>»;
    echo «<tr/>»;
     
    echo «<tr>»;
    echo «<td colspan=’2′ align=’left’>».form::submit(‘submit’, ‘Create album’).»</td>»;
    echo «</tr>»;
?>
</table>
<?php echo form::close();
</body>
</html>

Последнее, но не менее важное — это вид обновления. Давайте создадим файл с именем update.php в приложении / views / .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html>
<head>
<?php
    echo html::stylesheet(array
    (
        ‘assets/css/style’
    ),
    array
    (
        ‘screen’
    ), FALSE);
?>
<title>CD COLLECTION</title>
</head>
<body>
<?php echo form::open(‘album/update’);
<table class=’editor’>
<tr>
    <td colspan=’2′ class=’editor_title’>Update album</td>
</tr>
<?php
    echo «<tr>»;
    echo «<td>».form::label(‘name’, ‘Name: ‘).»</td>»;
    echo «<td>».form::input(‘name’, $name).»</td>»;
    echo «</tr>»;
     
    echo «<tr>»;
    echo «<td>».form::label(‘author’, ‘Author: ‘).»</td>»;
    echo «<td>».form::input(‘author’, $author).»</td>»;
    echo «<tr/>»;
     
    echo «<tr>»;
    echo «<td>».form::label(‘genre’, ‘Genre: ‘).»</td>»;
    echo «<td>».form::dropdown(‘genre_id’,$genres_list, $genre_id).»</td>»;
    echo «<tr/>»;
     
    echo «<tr>»;
    echo «<td colspan=’2′ align=’left’>».form::submit(‘submit’, ‘Update album’).»</td>»;
    echo «</tr>»;
     
?>
</table>
<?php
    echo form::hidden(‘album_id’,$album_id);
    echo form::close();
?>
</body>
</html>

Первый — это простой редактор, который позволяет пользователю вставлять информацию о новом альбоме.
Поля, такие как автор и имя, будут вставлены с использованием ввода HTML и жанра с использованием
поле со списком. Как только пользователь нажимает кнопку «Создать», вся информация передается,
как запрос POST, к методу создания / обновления в контроллере альбома. Когда контроллер получает эти сообщения
переменные, он вызывает модель, которая вставляет новый альбом в базу данных. Формы, в обоих представлениях, используют помощник формы Kohana.

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

В папке css создайте новый файл с именем style.css и вставьте его:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
a {
    font-family: Verdana, Geneva, Arial, Helvetica, sans-serif ;
    font-weight: normal;
    font-size: 12px;
    color: #00F;
    vertical-align:text-top;
}
 
img {
    border: 0;
}
 
label {
    font-family: Verdana, Geneva, Arial, Helvetica, sans-serif ;
    font-weight: normal;
    font-size: 12px;
}
 
input {
    border: 1px solid #000;
}
 
select {
    width:185px;
}
 
table.editor
{
    text-align: center;
    font-family: Verdana, Geneva, Arial, Helvetica, sans-serif ;
    font-weight: normal;
    font-size: 11px;
    color: #fff;
    width: 280px;
    background-color: #666;
    border: 0px;
    border-collapse: collapse;
    border-spacing: 0px;
}
 
table.editor td.editor_title
{
    background-color: #666;
    color: #fff;
    padding: 4px;
    text-align: left;
    font-weight: bold;
    font-size: 16px;
}
 
table.editor td
{
    padding: 4px;
}
 
table.list
{
    text-align: center;
    font-family: Verdana, Geneva, Arial, Helvetica, sans-serif ;
    font-weight: normal;
    font-size: 11px;
    color: #fff;
    width: 280px;
    background-color: #666;
    border: 0px;
    border-collapse: collapse;
    border-spacing: 0px;
}
 
table.list td.item
{
    background-color: #CCC;
    color: #000;
    padding: 4px;
    text-align: left;
    border: 1px #fff solid;
}
 
table.list td.list_title,table.list td.headers
{
    background-color: #666;
    color: #fff;
    padding: 4px;
    text-align: left;
    border-bottom: 2px #fff solid;
    font-weight: bold;
}
 
table.list td.list_title
{
    font-size: 16px;
}
 
table.list td.headers
{
    font-size: 12px;
}

Теперь скопируйте следующие изображения в папку изображений :

Это все. Укажите в браузере http: //localhost/kohana/index.php/album, и вы должны увидеть что-то похожее на это:

Если вы попытаетесь создать новый альбом или отредактировать существующий, вы должны увидеть что-то похожее на это:

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

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