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

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

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

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

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

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

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

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

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

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

$this->catalogmodel->getAllBooks();
$this->catalogmodel->getBookDetails($bookid);


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

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

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

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

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

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

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

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

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

<?php
$this->load->view('header');
?>
<h1>Каталог книг</h1>
<ul>
<?php
if (isset($errDescription)) {
echo "<h1>".$errDescription."</h1>";
}
else {
foreach ($books as $book) {
echo "<li>";
echo "<p>".anchor('catalog/bookdetails/'.$book['id'], $book['title'])."</p>";
echo "<p>Автор: ".$book['author']."</p>";
echo "<p>Жанр: ".$book['genre']."</p>";
echo "<p>Страниц: ".$book['pages']."</p>";
echo "</li>";
}
}
?>
</ul>
<?php
$this->load->view('footer');
?>

Разберем, что мы здесь написали. Прежде всего, обратите внимание, что в строках 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<?php
    $this->load->view('header');
?>
<?php
if (isset($errDescription)) {
    echo "<h1>".$errDescription."</h1>";
}
else {
    echo "<p><strong>Название:</strong> ".$bookdetails['title']."</p>";
    echo "<p><strong>Автор:</strong> ".$bookdetails['author']."</p>";
    echo "<p><strong>Жанр:</strong> ".$bookdetails['genre']."</p>";
    echo "<p><strong>Страниц:</strong> ".$bookdetails['pages']."</p>";
    echo "<p><strong>Аннотация:</strong> ".$bookdetails['annotation']."</p>";
}
?>
<?php
    echo "<p>".anchor("", "На главную")."</p>";
    $this->load->view('footer');
?>

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

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

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

Удачи!

  • Fiat-88

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

    • UML диаграммы с помощью StarUML. А рисунки и логотипы в Photoshop.

  • Fiat-88

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

    • UML диаграммы с помощью StarUML. А рисунки и логотипы в Photoshop.

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

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

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

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

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

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

  • info_man

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

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

  • info_man

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

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

  • info_man

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

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

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

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

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

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

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

    • mixalich7b

      Вы видимо мало знакомы с архитектурой модель-вид-контроллер или изучали её на коленке. Во всех технических университетах, если проходят MVC, то используют именно такие термины как у автора. И вообще, изучать её надо не на пхп, а на труъ языках, я в своё время изучал её на плюсах. В пхп она убого реализована. 
      В общем, когда я читал эту серию статей, то видел вполне знакомые термины, и вспоминал как нам это рассказывали на парах программирования.

  • info_man

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

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

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

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

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

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

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

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

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

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

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

      • >> Успехов!

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

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

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

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

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

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

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

      • >> Успехов!

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

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

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

  • 2 info_men

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 2 info_men

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Choo

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

  • Choo

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

  • 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:homelocalhostbookcatalog

      • webman

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

        Владимир. Так я и ставил. Но если распаковать выложенный вами архив, то получаем адрес сайта — «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, — стал с первого раза, без единого выбрыка, а тут … Просто даже интересно, где возникает проблема

  • 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, — стал с первого раза, без единого выбрыка, а тут … Просто даже интересно, где возникает проблема

  • 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:homelocalhostbookcatalogsystemapplicationconfigdatabase.php, — все нормально забегало Благодарю

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

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

      • D@RK_DIE$EL

        А не проще, если ты на локальном апаче, просто создать сайт c:WINDOWSsystem32driversetchosts и прописать к нему путь в ..Apache2.2confextrahttpd-vhosts.conf и все будет работать и не надо конфиги менять. Но правда это под WIndows я тау пробовал, на других ОС не знаю

        • А когда вы прописываете путь к сайту в httpd-vhosts.conf это разве не изменение конфигов?

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

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

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

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

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

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

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

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

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

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

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

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

  • 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 и изменение стандартного размещения папок». Хотя не один раз видел такие инструкции 🙂

      • D@RK_DIE$EL

        А не проще, если ты на локальном апаче, просто создать сайт c:\WINDOWS\system32\drivers\etc\hosts и прописать к нему путь в ..\Apache2.2\conf\extra\httpd-vhosts.conf и все будет работать и не надо конфиги менять. Но правда это под WIndows я тау пробовал, на других ОС не знаю

        • А когда вы прописываете путь к сайту в httpd-vhosts.conf это разве не изменение конфигов?

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Если интересуетесь паттернами у меня есть книга Php Architects Guide To Php Design Patterns (на англ.), могу прислать.

      • Да, не откажусь.
        Заранее спасибо.

        • Ваша почта отказывается принимать 11МБ файл. Поэтому залил книгу на обменник http://fileshare.in.ua/2155101
          Если будут проблемы с загрузкой, пишите.

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

    • Если интересуетесь паттернами у меня есть книга Php Architects Guide To Php Design Patterns (на англ.), могу прислать.

      • Да, не откажусь.
        Заранее спасибо.

        • Ваша почта отказывается принимать 11МБ файл. Поэтому залил книгу на обменник http://fileshare.in.ua/2155101
          Если будут проблемы с загрузкой, пишите.

  • Денис

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

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

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

    • echo «».anchor('catalog/bookdetails/'.$book['id'], $book['title']).»»;

      Это 13-тая строка в в»юшке main.php

      То есть, $bookid получаеться при переходе по соответствующей ссылке (она имееться в адресе), и, таким образом, эта ссылка уже запускает метод bookdetails с аргументом $bookid

  • Денис

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

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

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

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

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

  • fireXXX

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

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

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

  • fireXXX

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

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

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

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

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

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

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

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

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

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

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

    • Спасибо за советы! Правда при «наворачивании» функционала код становиться объемным, и рассказывать о том как он работает, сложно 😉

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

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

    • Спасибо за советы! Правда при «наворачивании» функционала код становиться объемным, и рассказывать о том как он работает, сложно 😉

  • Алекс

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

  • Алекс

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

  • Илья

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

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

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

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

  • Илья

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

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

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

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

  • Илья

    с кодировкой я сначала боролся так:
    $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/Ц

    • Зря вы сразу не написали какую ошибку вывел CI. Это не проблемы с базой, это «фичи» CI.
      Подробное обсуждение здесь, в нем есть ссылка на готовое решение.

  • Илья

    с кодировкой я сначала боролся так:
    $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/Ц

    • Зря вы сразу не написали какую ошибку вывел CI. Это не проблемы с базой, это «фичи» CI.
      Подробное обсуждение здесь, в нем есть ссылка на готовое решение.

  • D@RK_DIE$EL

    А у меня проблема в том, что книги занесенные в базу на русском языке выводят непонятными символами. Это тоже к фичам относятся?

    • Нет, тут нужно проверять кодировки БД и страницы.

  • D@RK_DIE$EL

    А у меня проблема в том, что книги занесенные в базу на русском языке выводят непонятными символами. Это тоже к фичам относятся?

    • Нет, тут нужно проверять кодировки БД и страницы.

  • Alex

    Замечательный сайт,и всё толково и внятно разъяснено,а если кому-то контент не нравиться-пущай пишет такой,какой хочет..Читали мы тоже Кузнецова «Практику создания Web-сайтов»…Да уж,там пока все скрипты не проштудируешь,CMS не запустишь(хотя книга хорошая)..Что же касается написанного» нормальным программистом для людей»-был у меня прецендент,когда я тупо копировал код из книги нормального программиста и упорно получал error,причем препод в институте ок.часа не мог понять в чём дело…Так что,УРА Владимиру-программисту с человеческим лицом!!

  • Alex

    Замечательный сайт,и всё толково и внятно разъяснено,а если кому-то контент не нравиться-пущай пишет такой,какой хочет..Читали мы тоже Кузнецова «Практику создания Web-сайтов»…Да уж,там пока все скрипты не проштудируешь,CMS не запустишь(хотя книга хорошая)..Что же касается написанного» нормальным программистом для людей»-был у меня прецендент,когда я тупо копировал код из книги нормального программиста и упорно получал error,причем препод в институте ок.часа не мог понять в чём дело…Так что,УРА Владимиру-программисту с человеческим лицом!!

  • Vufer

    Спасибо. Лезу в дебри CI, не совсем понимая зачем, но лезу… становится понятнее. Понятно, что на нативном PHP все это решается проще и быстрее, но… надо, надо осваивать, а у вас язык действительно человеческий 🙂

    • Сделать такой простой сайт. как в примере, действительно проще на нейтивном РНР, но если требуються уже посложнее вещи, то тут уж намного проще использовать фреймворк

  • Vufer

    Спасибо. Лезу в дебри CI, не совсем понимая зачем, но лезу… становится понятнее. Понятно, что на нативном PHP все это решается проще и быстрее, но… надо, надо осваивать, а у вас язык действительно человеческий 🙂

  • uaser

    Владимир, в документации показано как подгружать шаблон в контроллере:
    <?php

    class Page extends Controller {

    function index()
    {
    $data['page_title'] = 'Your title';
    $this->load->view('header');
    $this->load->view('menu');
    $this->load->view('content', $data);
    $this->load->view('footer');
    }

    }
    ?>
    Но ведь такой способ не рационален, в каждом методе подгружать и хеадер и футер.
    В вашем примере хеадер с футером подгружаются непосредственно в самих файлах шаблона и такой способ мне тоже кажется не рациональным, так как в каждом шаблончике класс вызывается два раза.
    Лучше было наверно сделать один основной файл шаблона и в нем подгружать контент, но можно ли так сделать в CI и как?
    Или посоветуйте более на ваш взгляд рациональный способ.

  • Я не совсем понял какой класс вызывается два раза. Но, в любом случае, существует расширение CI для работы с шаблонами Most Simple Template Library for CodeIgniter

  • uaser

    Cпасибо за ссылку, попробую в действии.

  • Slava

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

    result() as $row)
    echo $row->index;?>

    Сохранить данные

    ссылка вызывает метод safe в контролере, который в свою очередь загружает модель safedata, и я хотел бы узнать что прописывать в модели чтобы текст в обновлялся в базе данных(бд MySQL).

  • Leo

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

    <textarea cols=70 rows=20 name=»area1">
    <?php foreach($query->result() as $row)
    echo $row->index;?>
    </textarea>

    Сохранить данные

    ссылка вызывает метод safe, который в свою очередь загружает модель safedata. Вот я и хочу узнать что нужно прописать в модели чтобы обновить текст в бд(бд MySQL).

  • Если вы хотите обновить запись, то формируйте массив с новыми значениями и передавайте его методу update.
    Этот код и нужно разместить в модели.

  • Leo

    это то понятно, я никак не могу понять как этому массиву передать значение переменной, которому присвоен текст, в моем случае эта переменная $index:

    <textarea cols=70 rows=20 name=»index»>
    <?php foreach($query->result() as $row)
    $index = $row->index;
    echo $index;?>
    </textarea>

  • Это значение придет из формы, т.е. будет доступно через
    $this->input->post('textarea_name')

  • Leo

    Да, разобрался, еще раз спасибо)))

  • Black

    Мне в статье очень понравилось , то что Владимир использовал для иллюстрации диаграмму последовательностей из uml. Я и не думал что так удобно можно изобразить работу веб приложения ( в данном ключе )

  • Hakk43mag

    подскажите что это

    Warning
    : require_once(1/system/codeigniter/CodeIgniter.php) [
    function.require-once
    ]: failed to open stream: No such file or directory in
    S:homelocalhostwww1public_htmlindex.php
    on line
    132

    Fatal error
    : require_once() [
    function.require
    ]: Failed opening required '1/system/codeigniter/CodeIgniter.php' (include_path='.;/usr/local/php5/PEAR') in
    S:homelocalhostwww1public_htmlindex.php
    on line
    132

    • Проверяйте размещение файлов фреймворка. Похоже вы перенесли index.php в папку public_html, но не исправили в путь к папке с системными файлами.

      Попробуйте заменить в index.php значение

      $system_folder = «../system»;

  • xent

    учебники по web-программированию можно найти на ycheniki.ru

  • Progvlad

    т.е. ychebniki.ru

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

    • Честно говоря, с CI я не работаю уже года полтора. Авторы практически перестали поддерживать и развивать.

      В общем, на сегодняшний день Yii выглядит гораздо интереснее 🙂 У меня, кстати, есть несколько статей о Yii.

      • ВОзможно, но я только начинаю осваивать работу с фреймворками, и так как уже взялся за СІ, то хотелось бы разобраться до конца. А потом можно и на другие)

  • vasak

    kak izbavitca ot ” kavicek naprimer http://test4.ru/code/pages” pages eto kontroller dayot 403 error ili
    http://test4.ru/code“(http://test4.ru/code kornevaya papka)