.. / Codeigniter Blog. Step2: Приступаем к блогу. Ввод/вывод записей и комментариев

  1. codeigniter-blog

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

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 находим строку:

$autoload['libraries'] = array();

и исправляем ее:

$autoload['libraries'] = array('database');

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

  1. Options +FollowSymLinks
  2. Options -Indexes
  3. DirectoryIndex index.php
  4. RewriteEngine on
  5. RewriteCond $1 !^(index\.php|images|robots\.txt|public)
  6. RewriteCond %{REQUEST_URI} !\.(css¦js¦jpg¦gif)$
  7. RewriteCond %{REQUEST_FILENAME} !-f
  8. RewriteCond %{REQUEST_FILENAME} !-d
  9. 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

  1. 2007-09-03
  2. codeigniter-blog
Go Index Test