PHP framework CodeIgniter: контроллер и представления

27 января, 2008

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

В первой части мы установили и настроили фрэймворк (CodeIgniter).
Во второй – определились с требованиями к нашему приложению, создали БД, написали каркас контроллера и разобрались с передачей параметров в ссылках.
В третьей части описана модель нашего приложения, т.е. мы создали класс, выполняющий все операции с данными.

Подключаем модель к контроллеру

Для этого в конструкторе контроллера (system/application/controllers/catalog.php) добавляем строку

  1. $this->load->model('catalogmodel');

Обратите внимание, что имя файла модели указывается без расширения (.php). Это правило относится и ко всем остальным компонентам фрэймворка (библиотекам, представлениям).

У вас мог возникнуть вопрос: «Почему подключение выполняется именно в конструкторе?». Тут все просто. Подключить модель можно в любом из методов. Но тогда она будет доступна только внутри этого метода, а т.к. оба метода нашего контроллера используют одну и ту же модель, то лучше подключить ее в конструкторе (не дублируется код).

Теперь мы можем вызывать методы модели. Например,

  1. $this->catalogmodel->getAllBooks();
  2. $this->catalogmodel->getBookDetails($bookid);


Как видите, CodeIgniter создал объект catalogmodel, с помощью которого мы и работаем с моделью. Кстати, обратите внимание, мы не используем функции include() и require(). Все необходимые вызовы выполняются объектом load.

Переходим к методам контроллера. В первой части мы уже объявили эти методы.
Первый метод называется index() и служит для создания главной страницы каталога.

  1. function index() {
  2.     $pageData['title'] = "Каталог книг – главная";
  3.     $pageData['books'] = $this->catalogmodel->getAllBooks();
  4.     if ($pageData['books'] == false) {
  5.         $pageData['errDescription'] = "Книги не найдены";
  6.     }
  7.     $this->load->view("main", $pageData);
  8. }

Здесь мы сталкиваемся еще с одной возможностью CodeIgniter, а именно передачей данных из контроллера в представление.

Все, что нам нужно сделать, это создать массив с данными, которые нужны для формирования страницы, и передать его во втором параметре метода view() (строка 7). Учтите, что массив должен быть ассоциативным, т.к. в представлении ключи используются для доступа к данным.

О представлениях мы поговорим чуть ниже, а сейчас разберемся какие данные нужно передавать. Прежде всего, это данные из БД, т.е. информация о книгах. Поэтому в строке 3 мы читаем эти данные из базы (с помощью модели) и сохраняем их в $pageData['books']. Если метод getAllBooks() вернул false, мы создаем элемент массива $pageData['errDescription'] с описанием ошибки.

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

После того, как массив сформирован, мы загружаем представление (строка 7).

Представление (согласно архитектуре MVC) формирует страницу, которая будет отправлена браузеру. Как мы уже говорили, все представления должны находиться в папке system/application/views. Т.к. мы загружаем представление с именем main, то файл представления должен называться main.php.

  1. <?php
  2. $this->load->view('header');
  3. ?>
  4. <h1>Каталог книг</h1>
  5. <ul>
  6. <?php
  7. if (isset($errDescription)) {
  8. echo "<h1>".$errDescription."</h1>";
  9. }
  10. else {
  11. foreach ($books as $book) {
  12. echo "<li>";
  13. echo "<p>".anchor('catalog/bookdetails/'.$book['id'], $book['title'])."</p>";
  14. echo "<p>Автор: ".$book['author']."</p>";
  15. echo "<p>Жанр: ".$book['genre']."</p>";
  16. echo "<p>Страниц: ".$book['pages']."</p>";
  17. echo "</li>";
  18. }
  19. }
  20. ?>
  21. </ul>
  22. <?php
  23. $this->load->view('footer');
  24. ?>

Разберем, что мы здесь написали. Прежде всего, обратите внимание, что в строках 2 и 23 мы загружаем два других представления ('header' и 'footer'), т.е. заголовок и завершение страницы. Это, конечно, не обязательно, но эти фрагменты будут повторяться во всех страницах, поэтому удобно вынести их в отдельные файлы.Теперь посмотрите на строки 7-9. Здесь мы проверяем, установлена ли переменная $errDescription. Эту переменную автоматически создает фрэймворк, если в массиве $pageData был создан элемент с ключом errDescription (как вы помните, этот элемент создается, если книги в БД отсутствуют).

В основном цикле (строки 11 – 18) мы формируем обычный список с данными из массива. Вот здесь есть один интересный момент. Это использование функции anchor(). В принципе, она создает обычную ссылку, но при этом используются настройки из конфигурационного файла (system/application/config/config.php). А если конкретнее, используется переменная $config['base_url'], значение которой должно указывать на адрес сайта (например, http://www.my_site.domen/).

В первом параметре функции мы указываем вторую часть адреса, в данном случае это адрес страницы, которую мы хотим загрузить (в формате: имя_контроллера/имя_метода/параметры). Во втором – текст ссылки.

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

Использование anchor() позволяет упростить перенос сайта на другой домен. Если вы делаете все правильно, т.е. нигде, кроме файла config.php не прописываете ссылки на домен, то при переносе сайта вам потребуется только изменить значение $config['base_url'] в этом файле.

Перед использованием функции anchor() нужно подключить вспомогательную библиотеку, в которой она находится. Для этого, открываем файл system/application/config/autoload.php, ищем в нем массив вспомогательных библиотек, и добавляем в него библиотеку url.

  1. $autoload['helper'] = array('url');

Чтобы получить представление о конечном результате, посмотрите на файлы header.php и footer.php.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
  3. <head>
  4. <title><?php echo $title; ?></title>
  5. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  6. <link rel="stylesheet" type="text/css" href="<?php echo base_url(); ?>/css/styles.css" />
  7. </head>
  8. <body>
  1. </body>
  2. </html>

Как видите, в них находятся обычный заголовок и завершение страницы. Стоит обратить внимание на два момента в заголовке.

Во-первых, для создания заголовка мы используем переменную $title, которую устанавливаем в контроллере.

Во-вторых, при подключении таблицы стилей мы используем функцию base_url(). Как вы, наверное, догадались, она возвращает значение $config['base_url'] из config.php.
Примечание. Здесь предполагается, что файл styles.css размещен в папке css/, которая находится в DOCUMENT_ROOT, т.е. там же где и index.php.

Теперь взгляните на диаграмму. На ней показал порядок формирования главной страницы сайта.

Создание главной страницы каталога (миниатюра)

Запрос браузера передается контроллеру (catalog.php), который получает данные с помощью модели (catalogmodel.php) и загружает представление (main.php). Представление формирует страницу, которая отсылается назад браузеру.

В этом и заключается смысл архитектуры MVC. Модель выполняет работу с данными (чтение, запись в БД и т.п.), представление – формирует страницу, а контроллер – обрабатывает запросы и обеспечивает взаимодействие компонентов.

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

Мы подробно разобрали создание главной страницы каталога. Код создания страницы с подробным описанием книги практически идентичен. Поэтому я его приведу без описания.

В контроллере:

  1. function bookdetails($bookid) {
  2.     $pageData['bookdetails'] = $this->catalogmodel->getBookDetails($bookid);
  3.     if ($pageData['bookdetails'] == false) {
  4.         $pageData['errDescription'] = "Выбранная книга не найдена";
  5.     }
  6.     $pageData['title'] = $pageData['bookdetails']['title'];
  7.     $this->load->view("bookdetails", $pageData);
  8. }

Представление (файл bookdetails.php).

  1. <?php
  2.     $this->load->view('header');
  3. ?>
  4. <?php
  5. if (isset($errDescription)) {
  6.     echo "<h1>".$errDescription."</h1>";
  7. }
  8. else {
  9.     echo "<p><strong>Название:</strong> ".$bookdetails['title']."</p>";
  10.     echo "<p><strong>Автор:</strong> ".$bookdetails['author']."</p>";
  11.     echo "<p><strong>Жанр:</strong> ".$bookdetails['genre']."</p>";
  12.     echo "<p><strong>Страниц:</strong> ".$bookdetails['pages']."</p>";
  13.     echo "<p><strong>Аннотация:</strong> ".$bookdetails['annotation']."</p>";
  14. }
  15. ?>
  16. <?php
  17.     echo "<p>".anchor("", "На главную")."</p>";
  18.     $this->load->view('footer');
  19. ?>

Как видите, разница заключается только в том, что метод контроллера принимает в качестве параметра id книги и вызывает соответствующий метод модели. А в представлении отсутствует цикл, т.к. мы выводим информацию только об одной книге.

Если хотите посмотреть, как работает этот каталог, скачайте архив с исходным кодом. В нем находится дистрибутив CodeIgniter и исходники каталога. Кроме того, в нем вы найдете файл db_backup.sql, который можно импортировать с помощью phpMyAdmin и не заполнять базу данных самостоятельно.

Примечание. В архиве находятся две папки: system – дистрибутив CI и public_html – в ней находится index.php (основной контроллер), т.е. отсюда выполняется вход в каталог. Более подробное описание находится в файле setup.txt, который вы найдете в архиве.

Удачи!

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в CodeIgniter, PHP Комментарии (49) »

]]>

Комментарии (49)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

]]>
  1. Fiat-88

    А чем вы рисуете схемы и диаграммы?

  2. «Модели — это PHP классы, создаваемые для работы…, методы, контроллер, …). Этот фреймворк придумали электронщики (сам, от родясь такой). Завтра какой-то прогрессивно развитый ветеринар в свободное от основной работы время сварганит какую-то ему нужную оболочку и напихает его привычными ему терминами: симптом, синдром, «методы определения антибактериальных препаратов в биологических субстратах…», …
    К чему эта словесная эквилибристика! Ребята! Программисты в этом разделе информатики есть? Расскажите нормальным языком! Модель – это подпрограмма, создаваемая для решения … ее составляющими являются функции…
    Господи! Вернитесь к «исходникам» вашей специализации!
    Я, в общем-то, энциклопедического развития человек, но когда корову называют молочным агрегатом, собаку – охранным, самообучающимся устройством, … Ненароком спотыкаешься. Аналого-ассоциативные связи в мозгах предъявляют для восприятия совершенно иные «модели» Ну давайте вернемся к языку информатики! И нам и вам, ВСЕМ – сразу станет легче. Я уж точно определюсь, что в следующем абзаце меня не подстерегают силиконовые подложки, «истоки», микропроцессоры, программируемые контроллеры, драйверы, а интерфейс будет точно соответствовать обговариваемой области знаний

  3. Ну, нельзя в сердцах обозвать меня полным чайником. «РНР 5 практика создания web-сайтов», М. Кузнецова, прочел как журнал «Наука жизнь», с полным разбором скриптов. Прошел «WordPress» на одном дыхании. Сделал несколько проектов. Все нормально, но он еле ползает – «тяжелый» до невозможности. Нужно что-то пошустрее. «Max CMS» – еще только в зародыше. Построил на нам в денвере блог. Слишком упрощенно. Расширений функционала ждать только через пару лет, если энтузиасты выложат плагины. Самому бы покопаться, но … тут же полный … нет нормального хелпа, написанного программистом для людей. То, что изложено в http://code-igniter.ru/ – отрывки из обрывков, – нет целостности и логики изложения на таком «диалекте», как написано мною в прошлом посту – кошмарный ужас. Книгу, что вы мне рекомендовали: “Professional CodeIgniter” by Thomas Myer (на английском) читать и читать… Уже просто начал делать посильный перевод, если хватит терпения потом выложу в электронном виде, чтобы другие не мучались. Больше делать видать просто некому …

  4. Я не против понятной терминологии, но хотелось бы увидеть конкретные примеры. Если вы видели статью с понятным "полному чайнику" объяснением MVC, пришлите, пожалуйста ссылочку, мне будет интересно почитать.

  5. info_man

    А разве “Модель» (которая, почему-то является еще и «классом»???) не является, по своей сути, давно известной программистам разного уровня (еще с “MS Basic») – подпрограммой (subprogramm), с прописанным в ней набором функций? Мало того, открывая каталог ”Model” мы там обнаруживаем (PHP) файл, являющимся на самом деле комплектом форм внутреннего запроса к базе, опять же с функциями: function getAllBooks() – считать перечисленные поля базы и function getBookDetails($bookId) – взять единственное поле с оговоренным «id»

    «Методы» – наверное, и есть, ничто иное, как сами функции? Иными словами говоря: блоки команд, призванные выполнить определенную функцию. Тем более, что эта функция так и прописана в вашем скрипте: function index()(!!!). Верно?

  6. info_man

    Что такое «Контроллер» – это полноценная РНР-программа управления приложением, состоящая из функций. В вашем примере: function Catalog(), function index(), function bookdetails($bookid). Просто так и скажите: у нас есть два объекта приложения (две странички), так вот ими мы и управляем.

    С «Представлением» вообще полный АТАС! Да назовите ЭТО «Блок вывода» в котором собраны все нужные для формирования Страницы блоки: header.php, footer.php, main.php, bookdetails.php (всем известные по «динамическим веб-проектам) Сколько страниц проектируем, столько файликов сюда и запихнем (header.php, footer.php – для всех общие «шапка» и «подвал»)

    Так зачем рожать новые термины? Ведь ни «Модели», ни «Метода», ни «Контроллера» с «Представлением», а тем более, «Конструктора», как объектов кода вообще не существует, если не считать имен каталогов. Это такие абстрактные условности, которыми можно манипулировать, создавая видимость «науки», запутывая и запугивая нестойких энтузиастов. Есть РНР-программы, и функции. Еще есть «системные функции» самого «CodeIgnifer» в библиотеках, которые на радость нашу кто-то прописал, чтобы облегчить нам существование и свести работу к «блочной сборке». В этом-то и есть основное преимущество фремворка.

    Когда я читаю текст типа: «…Подключить модель можно в любом из методов. Но тогда она будет доступна только внутри этого метода, а т.к. оба метода нашего контроллера используют одну и ту же модель, то лучше подключить ее в конструкторе (не дублируется код)….», – мне хочется воскликнуть словами известного юмориста: «Мужик! Ты, сам-то понял, что сказал!» )

    Ну, ладно, ОНИ придумали. Наши, наотмашь, бездумно «растолмачили», … Это конечно их право внедрять (насильственно), но ведь люди останутся при своем мнении о целесообразности применения этого многословия. Вопрос в другом. Разжевывая что-то человеку, я обычно приглядываюсь к «аудитории», и, как правило, стараюсь пользоваться общепринятой терминологией. Я в этом сам заинтересован. Меня больше людей понимать будут.

    За работу же спасибо. Большинство ведь даже не пытается что-то кому-то объяснить. А если и ткнут дважды в «клаву», то подавай им за это звонкую монету …

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

  7. 2info_men
    Вот так вот и получается, что вместо «Подай ключ 9 на 10» говорят «Дай вон ту железную х..ёвину».

    Вы спрашиваете «Зачем рожать новые термины?» а кто сказал вам, что они новые? Может просто на вашем уровне, программирование умещается в три термина: программа, функция, блок вывода? Так если решили углубиться потрудитесь подтянуть терминологию, возможно в процессе вы поймёте, что классы называют по разному как раз для того что бы каждый раз не объяснять на пальцах «какую именно из х..ёвин нужно подать». Да и много чего другого.

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

    • Информативность вашего поста равна НУЛЮ. Научитесь сами излагать свои мысли, если они иногда вас посещают, миную бульварный сленг и приобретите сами опыт ведения конструктивной дискуссии. Успехов!

      • >> Успехов!

        Спасибо! И вам того же!

        • Мой ответ: "Информативность вашего поста равна НУЛЮ. Научитесь сами излагать свои мысли, если они иногда вас посещают, миную бульварный сленг и приобретите сами опыт ведения конструктивной дискуссии. Успехов!" Был оставлен для "mariO".

          "Владимиру" Моя благодарность и ответ в слеюдующем комменте.

  8. 2 info_men

    Большое спасибо за такое подробное объяснение вашей позиции, но боюсь, что я с вами в принципе не согласен.

    Термины, которые вам не нравятся "класс", "метод" и т.д. относятся к объектно-ориентированному программированию (ООП) и придуманы именно для того, чтобы показать его особенности. ООП не является заменой процедурного подхода, оно скорее представляет надстройку над ним. И поведение метода отличается от поведения функции, поэтому эти термины нельзя путать. Кстати, термины "инкапсуляция" и "полиморфизм" тоже имеют смысловую нагрузку и придуманы не для того, чтобы путать людей.

    >> подпрограмма с прописанным в ней набором функций

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

    Теперь о "модели", которая почему-то является и "классом".
    CodeIgniter построен с соблюдением определенной архитектуры, которая называется MVC (Модель – Вид – Контроллер). Каждый из этих компонентов имеет свое назначение и заранее определенное поведение. Например, модель предназначена для получения данных (не важно откуда из файла, памяти или БД). А реализована модель с помощью PHP класса.

    Почему фраза "является комплектом форм внутреннего запроса к базе" понятнее моего объяснения для меня тоже загадка. О каких формах речь? У большинства web разработчиков слово "форма" ассоциируется с html. Что такое внутренний запрос и чем он отличается от внешнего?

    Заменять "контроллер с двумя методами" на "две странички" тоже нельзя. Ведь термин "контроллер" описывает поведение приложения, этот компонент "точкой входа" или "узлом приложения", а не обычной страничкой.
    Вообще подробное описание MVC модели занимает несколько страниц, и чтобы не повторять его каждый раз и придумали термины. Контроллер, конечно, можно считать "абстрактной условностью", его поведение определено вполне конкретно. Он должен обработать все запросы, с помощью модели получить данные и передать эти данные в представление.
    Это и отличает приложение, построенное с использование MVC от "двух страничек". С точки зрения пользователя разницы нет, страниц в обоих случаях действительно две, но для программиста разница есть, хотя бы в организации связей между этими страницами.

    Теперь о "подключении модели". Да, я действительно понял, что сказал :) Более того, в той фразе я просто повторил информацию из официальной документации. Конструктор вызывается всегда при создании объекта, поэтому если подключить модель в нём, то она будет доступна всегда. Если подключать её в одном из методов, то она будет доступна только для этого метода и не будет доступна для других.

    В заключение хочу сказать, что я не придумал не одного нового слова. Все термины, которыми я пользуюсь являются общепринятыми (их значение вы легко сможете найти в той же википедии) и не являются взаимозаменяемыми.
    Ещё раз повторю, если заменить "метод" "функцией", то изменится смысл фразы и даже более того, ваша программа будет работать по-другому.

    Мне, конечно, хотелось бы чтобы мои статьи было легко читать. И я знаю, что есть разработчики, которые игнорируют ООП, паттерны проектирования (тотже MVC) и вообще всё, что они не понимают. Но если вы хотите разобраться в принципах работы современных систем, то все эти вещи придется изучить и терминологию. Другого пути, к сожалению, нет.

    P.S. Вообще-то я просил ссылки не на свой сайт, а на статьи с других ресурсов, которые вы считаете понятными, чтобы почитать и сравнить со своими.

    • Благодарю Вас за терпение. Думаю, наш диалог только расширит базу знания по данному разделу. Эта тема проблематична ведь не только для моего личного восприятия. «CodeIgniter» в Сети уже не первый год, но особого распространения пока так и не получил, и, как мне представляется, особо забираться в его дебри мало кто захочет. Я бы тоже суда не совался и нормально обходился бы уже «раскатанными» возможностями «WordPress», – переключаешь плагины и получаешь: интернет-магазин, аукцион, каталог,… если бы не его общеизвестные непреодолимые недостатки.

      Вы правы, что будущее за Объектно-Ориентированным Программированием, но составляющие его «Объекты», видимо, должны быть значительно «Крупнее» :) ). Перешли же люди от кирпичной кладки к монолитобетонному, крупноблочному строительству? Пользователю ведь абсолютно все равно, что там, внутри этой «коробочки», главное, что она позволяет получить «на выходе». Думаю, до этого нас доведет «MaxCMS», со временем.

      Да, я не профессиональный программист, но вынужден решать свои насущные задачи, – самостоятельно разбираясь в сути. И то, что я, не профессионал в данном разделе информатики, пытаюсь увязать новые понятия с общеизвестными, надеюсь не повод для пинков со стороны всякого рода … «умников», возомнивших из себя великими спецами. Если «яйцеголовый» действительно считает себя «проФФесором», то пусть расскажет, и покажет «на пальцах» (на собственном ресурсе) пытающемуся понять. Стыдно не «НЕ ЗНАТЬ», гораздо хуже не пытаться узнать. Поэтому я спокоен, не стыжусь, что мне что-то не ясно. Это позиция вполне нормального человека, проходящего путь от незнания к знанию.

      … «Ссылок» по этой теме я выложить пока не могу, – из-за их элементарного отсутствия. Просматривал линки из Вашего «Компаса», уровень изложения, не считая Макса, еще более оторванный от «народа».

      Я ни коим образом не пытаюсь высказать Вам какое-либо «Фе…». Еще раз спасибо. И наши комментарии гораздо лучше, чем вообще их отсутствие, или того, что стоит первым :) Иначе получается как после лекции в некоторых аудиториях. Профессор: «Вопросы есть?». Полная тишина. Профессор: «Так. Понятно. Никому ничего не ясно. Начнем сначала …»

      • Полностью с Вами согласен, лучше задать вопрос, и нельзя стесняться незнания. Я не встречал хороших разработчиков, которые бы заявляли, что знают всё о программировании. Скорее всего это просто не возможно :)
        Я сам очень много узнал нового благодаря комментариям.

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

        Кстати, а чем плох первый комментарий? Я сам перепробовал много программ для рисования UML диаграмм. По-моему, очень актуальная тема :)

        И, кстати, CodeIgniter не так уж и слабо распространен.

        • Первый коммент безусловно полезен, но мне он показался совсем далеким от темы этого поста. Наверное всем бы интересно было прочесть эту инфу более подробно в отдельном разделе: "Инструменты веб-мастера", или что-то вроде этого, на ваше усмотрение.
          Указанная Вами ссылка почему-то "поламалась" ?) Наверное ее нужно изменить на эту:

        • Странно, у меня ссылка нормально открывается. Там опрос "Какой framework вы используете и почему?".

          А для того, чтобы писать об UML инструментах у меня информации маловато.

  9. Choo

    infoman, ну вы даете. Все осуждаемые вами термины (модель, контроллер, отображение и т.д.) – вполне устоявшиеся и прижившиеся наименования в современной среде разработки и трудно придумать что-то более емкое, подходящее и понятное всем, кто с этим работает. Если вам это действительно интересно, то вы пойдете и почитаете, что такое MVC и какие термины присущи этой архитектуре. Примеры, вроде собака=охранное устройство неуместны, это преувеличение.

  10. webman

    Ваше описание в “setup.txt” не соответствует реально прописанным в скриптах линкам (запускаем в субдиректории, на Денвер). Так в инструкции указано: «…5) запишите в $config['base_url'] (файл system/application/config/config.php) адрес папки public_html на вашем сервере; …» На самом деле нужно указывать путь к месту расположения не папки, а файла «index.php»: http://bookcatalog.localhost/public_html/ Только в этом случае скрипт запускается, но при нажатии на ссылку выбора книги, получаем ошибку: «… сервер пытается найти файл Z:/home/localhost/bookcatalog/index.php/catalog/bookdetails/1, которого не существует.» ?

    • Предполагается, что public_html – это папка в которую вы распаковали дистрибутив CodeIgniter. Просто очень часто хостеры так называют папку на которую указывает DOCUMENT_ROOT.
      Поэтому index.php как раз и должен находится в этой папке.

      Ссылки должны быть вида
      http://localhost/bookcatalog/index.php/catalog/bookdetails/1

      Т.е. в параметре $config['base_url'] нужно указать
      $config['base_url'] = "http://localhost/bookcatalog"

      При этом фреймворк будет находится в
      Z:\home\localhost\bookcatalog\

      • webman

        При этом фреймворк будет находится в
        Z:\home\localhost\bookcatalog\

        Владимир. Так я и ставил. Но если распаковать выложенный вами архив, то получаем адрес сайта – "http://bookcatalog.localhost/", а вместо страницы:
        Index of /

        Name Last modified Size Description
        public_html/ 16-Jan-2008 21:12 -
        system/ 18-Apr-2009 18:37
        Можно упаковать именно вашу нормально работающую структуру каталогов и выложить для закачки?
        У меня никогда небыло проблем с эмуляцией сайтов в Денвер на разных платформах: простой HTML, WordPress, MaxSite, – стал с первого раза, без единого выбрыка, а тут … Просто даже интересно, где возникает проблема

  11. webman

    Прочел вашу статью "PHP framework CodeIgniter. Установка и настройка." и кажется понял в чем дело… Так дело не пойдет я же не могу отдать весь "localhost" под CodeIgniter и ваш маленький пример сайта У меня на локалке штук 6 проектов в разной степени готовности
    А можно так развернуть ваш пример, как это организовано в "MaxSiteCMS", с отдельно встроенным в "…/bookcatalog/" дистрибутивом CodeIgniter, нормально развернутой структурой каталогов, … в полной готовности загрузки на сервер в public_htm? Благодарю за ответ

    • Дело в том, что я выложил как раз работающий вариант :)
      Просто у меня создан отдельный виртуальный хост под это приложение.

      И, конечно, можно разместить приложение в отдельной папке. Для этого:
      1) распаковываете архив в папку bookcatalog (на вашем сервере)
      2) переносите все содержимое папки public_html в эту папку
      Т.е. получится
      bookcatalog/
          index.php
          system/
          css/

      3) удаляете папку public_html
      4) в файле index.php изменяете
      $system_folder = "../system";
      на
      $system_folder = "system";
      5) в файле system/application/config.php указываете адрес
      $config['base_url'] = "http://localhost/bookcatalog"
      6) настраиваете подключение к БД.

      • webman

        Замечательно Осталось перенести эту инструкцию в "setup.txt" Да бы небыло у всех остальных заморочек и недоразумений :) Спасибо

      • webman

        … меняем параметры подключения к базе в Z:\home\localhost\bookcatalog\system\application\config\database.php, – все нормально забегало Благодарю

        • >> Осталось перенести эту инструкцию в "setup.txt"

          Не уверен, скорее нужно написать отдельный пост на тему "Настройка CodeIgniter и изменение стандартного размещения папок". Хотя не один раз видел такие инструкции :)

    • Перенести проект из папки в папку – это пара строчек в конфиге, кроме собственно переноса.

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

      • Согласен, не для домохозяек. Но если человек делает что-то впервые, то простые и очевидные вещи могут показаться сложными или непонятными. У меня так часто бывает ;)
        К тому же при переносе папок в CI возможно придется править 3 файла: config.php, index.php и .htaccess.

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

        • Всё же должен быть какой-то нижний предел, ниже которого в объяснениях опускаться нет смысла.

          Например человек использующий пример из этого поста как минимум должен иметь корректно установленный CI. А раз он его установил – должен был пройти ту самую серию операций, которая задаёт и папку в частности.

          Так имеет ли смысл для такого человека писать FAQ для переноса папки??

          PS: Я и себя не считаю большим знатоком CI и пока ещё много не знаю :)

        • Нижний предел есть всегда. Например, я не писал о том, что такое PHP и зачем нужен web-сервер :)

          И если кто-то просто установил CI, то он может и не догадаться, что часть изменений нужно вносить в index.php.

          Хотя, вы, наверное, правы. Если делать все только по инструкции и не экспериментировать самому, то научиться чему-то будет сложно.

        • Но давать домашние задания в блоге – это перебор :)

  12. Прочитал все статьи по CodeIgniter.
    Всё опробовал. Огромное спасибо!
    PS. Ещё вчера не понимал смысла выражения "паттерны проектирования", – теперь понял, что делал много лишней работы )))

  13. Денис

    Владимир
    Здравствуйте!
    Спасибо за полезные статьи, очень толковые руководства.

    Вот вопрос по этой – никак не могу словить, где в контроллере передается ID книги

    function bookdetails($bookid) – в какой момент мы получаем $bookid?

  14. bookid передается в запросе.
    Т.е. посетитель переходит по ссылке
    sitename.com/index.php/catalog/bookdetails/25
    CI анализирует запрос и:
    1) создает экземпляр класса catalog;
    2) вызывает его метод bookdetails и в качестве параметра передает 25.

  15. fireXXX

    ммм, Инфоман, спасибо, что пояснил насчет моделей=классов.

    Я тоже долго вникал, что же это такое, пока для себя не определил, что это по сути одни и те же вещи под разным соусом.

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

  16. Кстати можно ещё маленько наворотить примерчик, использовав во вьюшке обработку темплейта через parser()

  17. ещё в header.php
    я первой строкой вставил

  18. header('Content-Type: text/html; charset=utf8');

  19. ну и САМОЕ главное – (для меня по крайней мере)
    ну ОЧЕНЬ бы хотелось добавить кнопки "добавить" "редактировать" и "Удалить"
    причем, чтоб "добавить" и "редактировать" открывались как в Circle Task (там вроде на JQuery появляется окошечко)

    тогда примеру цены бы не было !!!

  20. Алекс

    Владимир, спасибо за проделанную роботу.
    Я в пхп где-то среднего уровня. Писал только сайты визитки. захотел изучит CI, ваша статья помогла немного разобраться, но пока все еще в "тумане". Но одно я понял на практике точно – фреймворки куда сокращают время и делают код проще в много раз:)

  21. Илья

    Владимир, добрый день!
    Очень понравился ресурс, даже начал что-то понимать в CI!

    Вопрос: Почему-то не возможно передать в виде параметра, русскоязычную ссылку. Эта проблема должна иметь решения, на чистом PHP, у меня все работало, а когда начал переделывать сайт с использованием CI, пришлось посылать параметры с сипользованием латиских букв и цифр, а удобней было бы н арусском.

    • Проблемы с кодировками сами по себе с CI не связаны. Т.е. вам нужно правильно указать кодировки подключения к базе
      $db['default']['char_set'] = "utf8";
      $db['default']['dbcollat'] = "utf8_general_ci";
      и проверить кодировку представлений (должна совпадать с кодировкой базы).

    • Я не обратил сразу внимание. "невозможно передать" – это значит, что вообще ссылка не отправляется, или она как-то неправильно сохраняется?

  22. Илья

    с кодировкой я сначала боролся так:
    $this->db->query("set character_set_connection=utf8");
    $this->db->query("set character_set_client=cp1251");
    $this->db->query("set character_set_results=utf8");

    потом, почитав другие ваши посты с рекомендациями, передела как Вы указали только что, но проблема не пропала данные отображаются корректно,а при попытке послать ссылку по русски, выводит сообщение:

    An Error Was Encountered
    The URI you submitted has disallowed characters.

    а я все лишь в БД поменял надпись с "U", на "Ц".
    при этом ссылка была:
    http://test.ru/index.php/grpz/menu/U
    стала:
    http://test.ru/index.php/grpz/menu/Ц

]]>

Оставить комментарий

* - обязательные для заполнения поля

]]>