PHP framework CodeIgniter: создаем небольшой web сайт

Владимир | | CodeIgniter, PHP.

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

Т.к. изучать фрэймворки (да и программирование вообще) лучше всего на примерах, создадим небольшой web сайт.

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

Вся эта информация должна храниться в базе данных, которая называется bookcatalog. Создать ее можно с помощью SQL запроса:

CREATE DATABASE `bookcatalog` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

В этой базе создадим таблицу books:

CREATE TABLE `bookcatalog`.`books` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 100 ) NOT NULL ,
`author` VARCHAR( 100 ) NOT NULL ,
`pages` INT NOT NULL ,
`genre` VARCHAR( 60 ) NOT NULL ,
`annotation` TEXT NOT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci

Наша таблица содержит шесть полей:
id – порядковый номер записи в таблице (первичный ключ);
title – название книги;
author – имя автора;
pages – количество страниц;
genre – жанр книги;
annotation – аннотация.

Для отображения этих данных нам понадобится две страницы. На главной будет показан общий список книг (без аннотаций). На второй странице поместим подробное описание выбранной книги.

Теперь разберем, как это все реализовать с помощью CodeIgniter.

Все скрипты нашего приложения должны быть размещены в папке system/application/.
Контроллеры в папке system/application/controllers, модели – в system/application/models, а представления – в system/application/controllers/views.

Прежде всего, нам нужно создать контроллер. Для этого в папке system/application/controllers создаем файл catalog.php и записываем в нем следующий код:

<?php
class Catalog extends Controller {
    function Catalog() {
        parent::Controller();
    }
}
?>

Как видите, мы просто объявили новый класс, который наследует Controller. Имя класса должно совпадать с названием файла и начинаться с заглавной буквы.

Примечание. Вы, наверное, заметили, что в папке system/application/controllers уже находится файл wellcome.php. Этот контроллер создает стандартное приветственное сообщение.

Теперь нам нужно сделать наш контроллер используемым по умолчанию. Для этого в файле system/application/config/routes.php изменяем значение переменной $route['default_controller']:

$route['default_controller'] = "catalog";

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

Все ссылки для навигации внутри сайта должны иметь следующую структуру:

http://www.sitename.domain/index.php/controller/method/value1/value2/value3/...

Первым, как обычно, идет адрес сайта. Сразу за ним файл index.php, который находится в корне нашего сайта и обрабатывает все вызовы.

Третий параметр (controller) – это имя файла контроллера.
Четвертый (method) – имя метода контроллера, который мы хотим вызвать.
Пятый, шестой и т.д. (value1, value2, value3) – параметры, которые будут переданы методу. Эти параметры необязательные.

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

function index() {
}
function bookdetails($bookid) {
}

Метод index() будет вызван, если название метода в адресе не указано. Например, http://www.mysite.com/index.php/catalog будет автоматически преобразовано в http://www.mysite.com/index.php/catalog/index/.

Этот метод будет создавать главную страницу нашего каталога.

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

Таким образом, ссылка http://www.mysite.com/index.php/catalog/bookdetails/4 приведет нас на страницу с подробным описанием книги, для которой в БД значение поля id равно 4. При этом, значение переменной $bookid будет равно 4. Т.е. мы сразу получаем доступ к значениям, переданным в запросе, без обработки массивов $_GET и $_POST.

Примечание. Это не единственный способ передачи данных. Например, значения, отправленные странице с помощью формы, будут передаваться в массиве $_POST. Кроме того, мы в любом случае должны проверить полученные данные перед использованием.

С навигацией и структурой сайта мы разобрались. В следующий раз я расскажу о работе с базой данных.

До встречи!

Интересные материалы

Любите общаться в интернете? У нас вы можете бесплатно скачать квип — один из лучших мессенджеров.

  • горящие туры

    всегда удивлялся на программистов.наверно надо иметь ума палату.две.

    • Ума палату нужно иметь в любом деле, если вы хотите делать его хорошо.
      P.S. А ссылки из таких комментариев я удаляю…

  • горящие туры

    всегда удивлялся на программистов.наверно надо иметь ума палату.две.

    • Ума палату нужно иметь в любом деле, если вы хотите делать его хорошо.
      P.S. А ссылки из таких комментариев я удаляю…

  • Pingback: PHP framework CodeIgniter: работа с базой данных()

  • Спасибо! пока не разобрался полностью, но добавил в закладки!

  • Спасибо! пока не разобрался полностью, но добавил в закладки!

  • infoman

    Здравствуйте Я правильно понял? Вы создаете новую базу и в ней таблицу данных приложения (пользователя), через консоль «phpMyAdmin_MySQL» Вы пробовали написать плагин, типа этого: http://codex.wordpress.org/Creating_Tables_with_Plugins
    меня интересует подобная задача на платформе «MaxSite CMS» На сколько это возможно и есть ли смысл? Вы не обосновали преимущества работы с двумя базами, а недостатки очевидны. Благорарю за ответ.

  • infoman

    Здравствуйте Я правильно понял? Вы создаете новую базу и в ней таблицу данных приложения (пользователя), через консоль «phpMyAdmin_MySQL» Вы пробовали написать плагин, типа этого: http://codex.wordpress.org/Creating_Tables_with_Plugins
    меня интересует подобная задача на платформе «MaxSite CMS» На сколько это возможно и есть ли смысл? Вы не обосновали преимущества работы с двумя базами, а недостатки очевидны. Благорарю за ответ.

  • infoman

    Скачал пример приложения Прочел файл setup.txt Все стало ясно вы строили специализированное приложение на «CI» и под него же делали базу 🙂 Извините Я несколько озадачен своими проблемами и не сразу вник Меня интересует более фунциональное приложение, не только каталог (чего-тот там), с фуккциями импорта (CSV), предварительного резервирования, каталога статей, фотогалереи и мультимедийных вставок, … Потому и хочу основаться на «MaxSite CMS», следовательно залез в «первоисточник» этого фреймворка
    Может дадите подскажете ссылочку на пример реализации (можно на «ящик»)? Благодарю за ответ

    • Лучше всего вам подойдет книжка Thomas Myer «Professional CodeIgniter», правда она на английском, но читается легко. По сути вся книга — пример создания online магазина. Если нужно, могу выслать.
      Думаю, это будет лучше чем анализировать чужие приложения, которые писались под другие задачи.
      А MaxSite CMS практически идеально подходит для реализации любых не стандартных функций, т.к. не ограничивает вам возможности использования фреймворка.

      • infoman

        Лучше всего вам подойдет книжка Thomas Myer «Professional CodeIgniter», правда она на английском, но читается легко.
        Благодарю, скачал отсюда: http://depositfiles.com/ru/files/8517289

        • BierBauch

          А паролем от архива не поделитесь? Заранее мерсите… 🙂

        • У меня нет пароля, но книгу я вам могу отправить почтой 🙂

        • dima

          parol: ebibla.ru

  • infoman

    Скачал пример приложения Прочел файл setup.txt Все стало ясно вы строили специализированное приложение на «CI» и под него же делали базу 🙂 Извините Я несколько озадачен своими проблемами и не сразу вник Меня интересует более фунциональное приложение, не только каталог (чего-тот там), с фуккциями импорта (CSV), предварительного резервирования, каталога статей, фотогалереи и мультимедийных вставок, … Потому и хочу основаться на «MaxSite CMS», следовательно залез в «первоисточник» этого фреймворка
    Может дадите подскажете ссылочку на пример реализации (можно на «ящик»)? Благодарю за ответ

    • Лучше всего вам подойдет книжка Thomas Myer «Professional CodeIgniter», правда она на английском, но читается легко. По сути вся книга — пример создания online магазина. Если нужно, могу выслать.
      Думаю, это будет лучше чем анализировать чужие приложения, которые писались под другие задачи.
      А MaxSite CMS практически идеально подходит для реализации любых не стандартных функций, т.к. не ограничивает вам возможности использования фреймворка.

      • infoman

        Лучше всего вам подойдет книжка Thomas Myer «Professional CodeIgniter», правда она на английском, но читается легко.
        Благодарю, скачал отсюда: http://depositfiles.com/ru/files/8517289

        • BierBauch

          А паролем от архива не поделитесь? Заранее мерсите… 🙂

        • У меня нет пароля, но книгу я вам могу отправить почтой 🙂

        • dima

          parol: ebibla.ru

  • Воланд

    Теперь нам нужно сделать наш контроллер используемым по умолчанию. Для этого в файле system/application/config/routes.php изменяем значение переменной $route['default_controller']

    Когда меняю значение переменной, выдает ошибку 404, страница не найдена. Если прописан wellcome, т овсе в поряжке, отображается страница приветствия CI.

    Сразу за ним файл index.php, который находится в корне нашего сайта и обрабатывает все вызовы.

    Опять же, где именно, я имею в виду пути.

    Где описываются методы:
    function index() {
    }
    function bookdetails($bookid) {
    }

    ?

    • 1) Страница 404 если вы указали название не существующего контроллера.
      2) Корень сайта — папка на которую указывает переменная DOCUMENT_ROOT вашего сервера.
      3) Эти методы относятся к классу Catalog.

    • ошибка 404 действительно появляется после того, как дефолтным контроллером поставить catalog. но, чтобы она исчезла, в контроллер надо вставить методы index и bookdetails. должно стать так:

      Автор это не объяснил, поэтому этот вопрос и возник.

  • Воланд

    Теперь нам нужно сделать наш контроллер используемым по умолчанию. Для этого в файле system/application/config/routes.php изменяем значение переменной $route['default_controller']

    Когда меняю значение переменной, выдает ошибку 404, страница не найдена. Если прописан wellcome, т овсе в поряжке, отображается страница приветствия CI.

    Сразу за ним файл index.php, который находится в корне нашего сайта и обрабатывает все вызовы.

    Опять же, где именно, я имею в виду пути.

    Где описываются методы:
    function index() {
    }
    function bookdetails($bookid) {
    }

    ?

    • 1) Страница 404 если вы указали название не существующего контроллера.
      2) Корень сайта — папка на которую указывает переменная DOCUMENT_ROOT вашего сервера.
      3) Эти методы относятся к классу Catalog.

  • ИВан

    скажите а как css файлы и изображения загружать .В какой директорий их хранить?

    • Там, где вам удобнее. Главное, чтобы из этой директории можно было файлы загружать. Я обычно в папке в которой находится index.php делаю папку css.

  • ИВан

    скажите а как css файлы и изображения загружать .В какой директорий их хранить?

    • Там, где вам удобнее. Главное, чтобы из этой директории можно было файлы загружать. Я обычно в папке в которой находится index.php делаю папку css.

  • Diz

    Есть такой урл:
    http://localhost/main/pics/toyota/corolla , где
    main — имя контроллера
    pics — имя метода в нем
    toyota,corolla — параметры
    Отмечу что нет упоминания об index.php, т.к. на него перенапр. запросы с помощью .htaccess
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
    </IfModule>
    В routes.php прописан контроллер по-умолч. $route['default_controller'] = «main»;
    Вопрос: как убрать в урле «main», чтобы было
    http://localhost/pics/toyota/corolla
    Ведь по идее контроллер по-умолч. задан.

  • У вас всего один контроллер?
    Я спрашиваю, потому что вам нужно обеспечить, чтобы фреймворк мог однозначно определить какой контроллер и метод ему вызывать.

    В вашем случае нужно создать правило для роутера.

    Что-то вроде
    $route['car/(:any)/(:any)'] = «main/pics/$1/$2»;

  • Diz

    Ага, спасибо за ссылку и пример, разобрался!

  • Равиль

    а как надо назвать класс контроллера, чтобы страницы вызывалась по адресу http://www.mysite.com или http://www.mysite.com/index.php

    • Имя класса может быть любым, его нужно указать в конфиге.
      application/config/routes.php
      $route['default_controller'] = «classname»;

  • Vgkurlyan

    Насколько понимаю, название класса Controller устарело? С новой версией CI выдаёт ошибки… Не посоветуете подобных уроков только новых? Очень хорошо всё расписано, жаль, что время может идти.

    • Замените Controller на CI_Controller. А вообще лучшая документация здесь.

      • Vgkurlyan

        Заменил — ругается на строку
        parent::Controller();

        Взможно проще будет изучить старую версию CI, а потом перейти на новую

        • Нужно везде заменить Controller на CI_Controller. Изучать лучше новую.

        • Vgkurlyan

           Нет, заработало после того, как заменил на:
          parent::get_instance();

        • Sheff

          А везде заменить, это где?

        • Во всех файлах приложения с расширением php.

  • Фахриддин

    Спасибо! Вы мне очень помогли! Уважением Фахриддин!