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 View Comments

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

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


    < a href="safe">Сохранить данные< /a>
    ссылка вызывает метод safe, который в свою очередь загружает модель safedata. Вот я и хочу узнать что нужно прописать в модели чтобы обновить текст в бд(бд MySQL).
  • Если вы хотите обновить запись, то формируйте массив с новыми значениями и передавайте его методу update.
    Этот код и нужно разместить в модели.
  • Leo
    это то понятно, я никак не могу понять как этому массиву передать значение переменной, которому присвоен текст, в моем случае эта переменная $index:

    <textarea cols="70" name="index" rows="20"><br><?php foreach($query->result() as $row) <br>$index = $row->index; <br>echo $index;?> <br></textarea>
  • Это значение придет из формы, т.е. будет доступно через
    $this->input->post('textarea_name')
  • Leo
    Да, разобрался, еще раз спасибо)))
  • uaser
    Владимир, в документации показано как подгружать шаблон в контроллере:

    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пасибо за ссылку, попробую в действии.
  • Vufer
    Спасибо. Лезу в дебри CI, не совсем понимая зачем, но лезу... становится понятнее. Понятно, что на нативном PHP все это решается проще и быстрее, но... надо, надо осваивать, а у вас язык действительно человеческий :)
  • Alex
    Замечательный сайт,и всё толково и внятно разъяснено,а если кому-то контент не нравиться-пущай пишет такой,какой хочет..Читали мы тоже Кузнецова "Практику создания Web-сайтов"...Да уж,там пока все скрипты не проштудируешь,CMS не запустишь(хотя книга хорошая)..Что же касается написанного" нормальным программистом для людей"-был у меня прецендент,когда я тупо копировал код из книги нормального программиста и упорно получал error,причем препод в институте ок.часа не мог понять в чём дело...Так что,УРА Владимиру-программисту с человеческим лицом!!
  • D@RK_DIE$EL
    А у меня проблема в том, что книги занесенные в базу на русском языке выводят непонятными символами. Это тоже к фичам относятся?
  • Нет, тут нужно проверять кодировки БД и страницы.
  • Илья
    с кодировкой я сначала боролся так:
    $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.
    Подробное обсуждение здесь, в нем есть ссылка на готовое решение.
  • Илья
    Владимир, добрый день!
    Очень понравился ресурс, даже начал что-то понимать в CI!

    Вопрос: Почему-то не возможно передать в виде параметра, русскоязычную ссылку. Эта проблема должна иметь решения, на чистом PHP, у меня все работало, а когда начал переделывать сайт с использованием CI, пришлось посылать параметры с сипользованием латиских букв и цифр, а удобней было бы н арусском.
  • Я не обратил сразу внимание. "невозможно передать" - это значит, что вообще ссылка не отправляется, или она как-то неправильно сохраняется?
  • Проблемы с кодировками сами по себе с CI не связаны. Т.е. вам нужно правильно указать кодировки подключения к базе
    $db['default']['char_set'] = "utf8";
    $db['default']['dbcollat'] = "utf8_general_ci";
    и проверить кодировку представлений (должна совпадать с кодировкой базы).
  • Алекс
    Владимир, спасибо за проделанную роботу.
    Я в пхп где-то среднего уровня. Писал только сайты визитки. захотел изучит CI, ваша статья помогла немного разобраться, но пока все еще в "тумане". Но одно я понял на практике точно - фреймворки куда сокращают время и делают код проще в много раз:)
  • ну и САМОЕ главное - (для меня по крайней мере)
    ну ОЧЕНЬ бы хотелось добавить кнопки "добавить" "редактировать" и "Удалить"
    причем, чтоб "добавить" и "редактировать" открывались как в Circle Task (там вроде на JQuery появляется окошечко)

    тогда примеру цены бы не было !!!
  • Спасибо за советы! Правда при "наворачивании" функционала код становиться объемным, и рассказывать о том как он работает, сложно ;)
  • header('Content-Type: text/html; charset=utf8');
  • ещё в header.php
    я первой строкой вставил
  • Кстати можно ещё маленько наворотить примерчик, использовав во вьюшке обработку темплейта через parser()
  • fireXXX
    ммм, Инфоман, спасибо, что пояснил насчет моделей=классов.

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

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

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

    function bookdetails($bookid) - в какой момент мы получаем $bookid?
  • Прочитал все статьи по CodeIgniter.
    Всё опробовал. Огромное спасибо!
    PS. Ещё вчера не понимал смысла выражения "паттерны проектирования", - теперь понял, что делал много лишней работы )))
  • Если интересуетесь паттернами у меня есть книга Php Architects Guide To Php Design Patterns (на англ.), могу прислать.
  • Да, не откажусь.
    Заранее спасибо.
  • Ваша почта отказывается принимать 11МБ файл. Поэтому залил книгу на обменник http://fileshare.in.ua/2155101
    Если будут проблемы с загрузкой, пишите.
  • webman
    Прочел вашу статью "PHP framework CodeIgniter. Установка и настройка." и кажется понял в чем дело... Так дело не пойдет я же не могу отдать весь "localhost" под CodeIgniter и ваш маленький пример сайта У меня на локалке штук 6 проектов в разной степени готовности
    А можно так развернуть ваш пример, как это организовано в "MaxSiteCMS", с отдельно встроенным в ".../bookcatalog/" дистрибутивом CodeIgniter, нормально развернутой структурой каталогов, ... в полной готовности загрузки на сервер в public_htm? Благодарю за ответ
  • Перенести проект из папки в папку - это пара строчек в конфиге, кроме собственно переноса.

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

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

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

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

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

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

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

    И, конечно, можно разместить приложение в отдельной папке. Для этого:
    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) настраиваете подключение к БД.
  • D@RK_DIE$EL
    А не проще, если ты на локальном апаче, просто создать сайт c:\WINDOWS\system32\drivers\etc\hosts и прописать к нему путь в ..\Apache2.2\conf\extra\httpd-vhosts.conf и все будет работать и не надо конфиги менять. Но правда это под WIndows я тау пробовал, на других ОС не знаю
  • А когда вы прописываете путь к сайту в httpd-vhosts.conf это разве не изменение конфигов?
  • webman
    ... меняем параметры подключения к базе в Z:\home\localhost\bookcatalog\system\application\config\database.php, - все нормально забегало Благодарю
  • >> Осталось перенести эту инструкцию в "setup.txt"

    Не уверен, скорее нужно написать отдельный пост на тему "Настройка CodeIgniter и изменение стандартного размещения папок". Хотя не один раз видел такие инструкции :)
  • webman
    Замечательно Осталось перенести эту инструкцию в "setup.txt" Да бы небыло у всех остальных заморочек и недоразумений :) Спасибо
  • 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, - стал с первого раза, без единого выбрыка, а тут ... Просто даже интересно, где возникает проблема
  • Choo
    infoman, ну вы даете. Все осуждаемые вами термины (модель, контроллер, отображение и т.д.) - вполне устоявшиеся и прижившиеся наименования в современной среде разработки и трудно придумать что-то более емкое, подходящее и понятное всем, кто с этим работает. Если вам это действительно интересно, то вы пойдете и почитаете, что такое MVC и какие термины присущи этой архитектуре. Примеры, вроде собака=охранное устройство неуместны, это преувеличение.
  • 2 info_men

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    А для того, чтобы писать об UML инструментах у меня информации маловато.
blog comments powered by Disqus ]]>