На предыдущем шаге освоили создание контроллера и вьюера. Теперь пришло время заняться собственно блогом. На этом шаге заведем базы двнных, вобьем туда фиктивные данные и попробуем вывести как в всамоделешном блоге.
1.
Создаем БД (у меня - имя БД - "с3"). В ней таблицу с записями records:
CREATE TABLE records ( id int(11) NOT NULL auto_increment, title varchar(255) NOT NULL, body text NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM ; INSERT INTO records VALUES (1, 'record1', 'Lorem ipsum dolor ... adipiscing elit'); INSERT INTO records VALUES (2, 'record2', 'Sed ut perspiciat ... sit voluptatem'); |
2.
Прописываем в конфигурационом файле /system/application/config/database.php атрибуты БД:
$db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "c3"; |
3.
Поскольку начали работать с БД, необходимо подключить соответствующую библиотеку В файле ле /system/application/config/autoload.php находим строку:
и исправляем ее:
4.
Редактируем контроллер /system/application/controller/blog.php дополняя его выводом данных из таблицы records
function index()
{
$data['query']=$this-> db-> get('records'); // выборка всех записей из табл.
$this-> load-> view('blog_view',$data); // отправка данных во вьюер
} |
5.
Редактируем вьюер
<html>
<body>
<?
foreach ($query-> result() as $row)
{
echo "<h1> ".$row-> title."</h1> ";
echo $row-> body;
}
?>
</body>
</html> |
вызываем http://ci/ проверяем результат. Должны быть выведены все записи. Теперь можно перейти к комментариям
6.
Создаем таблицу комментариев и заранее записываем туда несколько записей.
CREATE TABLE comments ( id int(11) NOT NULL auto_increment, record_id int(11) NOT NULL, author varchar(64) NOT NULL, body text NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ; INSERT INTO comments VALUES (1, 1, 'Ayavryk', 'Wow!'); INSERT INTO comments VALUES (2, 1, 'Ivan Tyngylchav', 'No pasaran!'); INSERT INTO comments VALUES (3, 2, 'Semion Khyngulaev', 'Ooooooo! Cool!'); INSERT INTO comments VALUES (4, 2, 'Oolzhiin Olya', 'It''s realy nice!'); |
7.
a) Создаем функцию контроллера для комментариев /system/application/controller/blog.php. В соответствии с принятой в Codeigniter адресацией, по умолчанию она будет вызываться по адресу http://c3/index.php/blog/comments/номер_записи_блога. Адрес получается не ахти. Позже займемся приведением его в божеский вид.
function comments()
{
$id=$this-> uri-> segment(3); // получаем номер записи блога из URL
//(то что после третьего слэша)
// подробнее о классе URI можно посмотреть в мануале
$this-> db-> where('id',$id); // определяем условие выборки текущей записи
// подробнее о реализации интерфейса к БД можно почитать в мануале
$query1=$this-> db-> get('records'); // получам основную запись
$data1 = $query1-> result();
$this-> db-> where('record_id',$id); // определяем условие выборки комментариев
$query2=$this-> db-> get('comments'); // получам комментарии из БД
$data2 = $query2-> result();
$this-> load-> view('comment_view', array('data1' => $data1, 'data2' => $data2));
// в отличие от предыдущего контроллера здесь во вьюер передается массив данных.
} |
Внимание! Здесь и далее не рассматриваются вопросы безопасности. В частности, неизвестно, что может какой-нибудь паразит затолкать вместо номера записи блога и как это отработается в SQL. Cтрока определяющая номер записи должна быть защищена от злоумышленников, т.е. id необходимо принудительно приведести к целому виду. Но это отдельная тема которой в этом примере не заморачиваемся. Подробнее об этом можно почитать здесь
b) Создаем представление для комментариев /system/application/views/comment_view.php
<html>
<body>
<?
foreach ($data1 as $row1)
{
echo "<h1> ".$row1-> title."</h1> ";
echo "<p> ".$row1-> body."</p> <hr/> ";
}
foreach ($data2 as $row2)
{
echo "<h4> ".$row2-> author."</h4> ";
echo "<p> ".$row2-> body."</p> <hr/> ";
}
?>
</body>
</html> |
c) Вызываем http://ci/index.php/blog/comments/1 и проверяем результат.
8.
Разбираемся с результатами, выстраивая систему адресов блога. По умолчанию, система адресов в Codeigniter строится по принципу:
http://ИМЯ_САЙТА/index.php/ИМЯ_КОНТРОЛЛЕРА/ИМЯ ФУНКЦИИ(МЕТОДА) КОНТРОЛЛЕРА/ПАРАМЕРЫ/
Определенно такой адрес неэстетичен и по целому ряду причин нежелателен (подробнее см. здесь) Собственную обработку адресов можно реализовать при помощи mod_rewrite - cпециального модуля Apache
a) добавляем в корневую директорию .htaccess, который позволит избавиться от необходимости указания в адресе index.php
- Options +FollowSymLinks
- Options -Indexes
- DirectoryIndex index.php
- RewriteEngine on
- RewriteCond $1 !^(index\.php|images|robots\.txt|public)
- RewriteCond %{REQUEST_URI} !\.(css│js│jpg│gif)$
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^(.*)$ /index.php/$1 [L,QSA]
В этой конструкции исключается из обработки Codeigniter'ом все что указано в строке 5. - картинки, стили и т.д. Все остальное перенаправляется на обработчик index.php, который исключается из адреса при помощи строки 9.
b) находим в файле /system/application/config/config.php
строку:
$config['index_page'] = "index.php";
убираем из нее index.php
$config['index_page'] = "";
находим строку
$config['base_url'] = "";
и записываем туда абсолютный адрес сайта
$config['base_url'] = "http://ci/";
вызываем результат п.7 (комментарии к сообщению) уже по новому адресу: http://ci/blog/comments/1
посмотреть исходные сообщения можно по адресу http://ci/
Надо сказать, что это лучше чем было, но все-таки далеко от желаемого. В идеале имена должны быть произвольными. Особенно важно это при переводе старых сайтов на новый движок. Теоретически Codeigniter позволяет это делать (см. мануал) . Но даже если не удастся с этим разобраться, можно всегда по-хамски (потому что в обход Codeigniter) переопределить все через .htaccess
c) связываем полученные страницы ссылками. Для этого воспользуемся вспомогательной функцией URL helper, которая отвечает за обработку адресов. Для этого регистрируем их в файле автоподгрузки /system/application/config/autoload.php.
Находим строку:
$autoload['helper'] = array();
и исправляем ее:
$autoload['helper'] = array('url');
Регистрируем хелпер в контроллере
function Blog()
{
parent::Controller();
$this-> load-> helper('url');
}
|
d) добавляем во вьюер /system/application/views/comment_view.php строку с адресом главной страницы.
<html>
<body>
<?
foreach ($data1 as $row1)
{
echo "<h1> ".$row1-> title."</h1> ";
echo "<p> ".$row1-> body."</p> ";
}
foreach ($data2 as $row2)
{
echo "<h3> ".$row2-> author."</h3> ";
echo "<p> ".$row2-> body."</p> ";
}
echo anchor('','Back'); // возврат на главную страницу
?>
</body>
</html> |
аналогично исправляем вьюер блога, добавляя туда ссылки на отдельны записи блога /system/application/views/blog_view.php:
<html>
<body>
<?
foreach ($query-> result() as $row)
{
echo "<h1> ".$row-> title."</h1> ";
echo "<p> ".$row-> body."</p> ";
echo anchor('blog/comments/'.$row-> id,'comments');
}
?>
</body> |
И наблюдаем результат. Полуфабрикат блога без добавления записей готов
9.
Технический перерыв. Сохраняем все в папке Step2