Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Стили H1 || htaccess запретить доступ >>>

MVC — фундамент интернет магазина

05.02.2012
MVC - фундамент интернет магазина

Здравствуй уважаемый читатель блога LifeExample, я давно собирался выделить время на изучение данного шаблона проектирования, поскольку он очень популярен, и вот, наконец, появилось свободное время.

В общих чертах суть работы шаблона понятна из расшифровки аббревиатуры: Model-View-Controller (Модель – Представление – Контроллер). Представление – отвечает, за пользовательский интерфейс, контролер – связывает представление и модель. Модель в свою очередь представляет собой всю логику работы скриптов.

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

Эта статья не только расскажет тебе читатель о паттерне MVC, но и будет фундаментом, для нашего интернет магазина, который я пообещал разработать с нуля в статье пишем интернет магазин на PHP.

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

Листинг урока №1 ( Скачали: 24417 чел. ) 

Также скажу, что система не претендует на звание идеальной, ибо разработана лишь для понимания паттерна Model-View-Controller. В данной реализации не используются синглтоны, и перехваты ошибок. Хотя один синглетон все-таки можно найти в реализации модуля для меню. Но об этом я напишу, как-нибудь в другой раз.

Основа интернет магазина с использованием MVC

Потихоньку начнем писать наш интернет магазин, попутно изучая паттерн MVC.

Важной особенностью этого шаблона является то что, все страницы будут генерироваться только после того как пройдут через файл index.php, к которому будут перенаправлены все запросы пользователя. Чтобы добиться такого эффекта нужно в корневом файле .htaccess написать код:

1
2
3
4
5
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
AddDefaultCharset UTF-8

Теперь я предлагаю вам для удобства восприятия материала скачать:

Готовый набор скриптов ( Скачали: 24417 чел. ) 

По которым я буду описывать логику работы системы MVC и нашего интернет-магазина в целом. Это поможет сконцентрировать статью только на общей концепции работы MVC системы, и не будет необходимости загромождать статью лишними вставками php кода. Сами файлы содержат подробные комментарии относительно логики работы того или иного php скрипта. Но если у вас возникнут вопросы, сообщите об этом в комментариях, и мы рассмотрим их вместе.

Разархивируйте скачанные файлы в корневую директорию вашего тестового сайта.

MVC система структура файлов

Найдите среди них файл LifeExampleShop.sql, это дамп базы данных необходимой для демонстрации урока по созданию интернет магазина. Импортируйте базу данных из LifeExampleShop.sql, для дальнейшей работы.

Пример импорта БД

Если все сделанно верно то запустив свой сайт вы увидите примерно следующее:

Интерфейс интернет магазина с MVC

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

1
2
Логин: Admin
Пароль: 1

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

И так, теперь, когда вы скачали и распаковали архив, а также импортировали БД, мы можем двигаться дальше и приступить непосредственно к самой сути патерна MVC.

Давайте я расскажу о структуре каталогов системы, и их содержимом. В корне сайта мы имеем 4-ре файла.

  1. .htacces – перенаправляет все запросы на index.php
  2. config.php – подключает автоматическую загрузку новых классов, и содержит в себе настройки для работы с БД.
  3. index.php – инициализирует запуск MVC системы.
  4. LifeExampleShop.sql – дамп базы интернет магазина.

Также в корне сайта у нас есть 4-ре каталога:

  1. application – по большому счету содержимое данной папки и есть патерн MVC. В ней находятся три подпапки с контролерами, моделями, и представлениями.
  2. images – без этой папки не обойдется ни один сайт, т.к. картинки нужны везде. В данном случае в ней находятся изображения продуктов каталога, а также логотип магазина.
  3. lib – в этой папке находятся библиотеки необходимые для работы сайта. Важными файлами в разрезе нашей темы являются: Application.php и BaseController.php. Именно эти файлы в купе с папкой application делают все, что нужно для исправной работы патерна MVC.
  4. template – как понятно из названия, эта папка с шаблоном для сайта, ее файлы содержат верстку графического интерфейса нашего интернет магазина.

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

Именно поэтому в данной статье я напишу о том, как же все это крутится и вертится. Благо есть для этого простая и готовая MVC система, которую вы скачали в начале статьи.

Ход работы MVC системы (алгоритм)

Как я уже и говорил, точкой входа будет файл index.php, это означает то, что с помощью файла index.php будут инициализироваться все необходимые компоненты. А именно компонент паттерна: Application.php, который определяет маршрут до нужного контролера и библитека настроек сайта и взаимодействия с БД: config.php.

Допустим, мы находимся на главной странице сайта, и хотим перейти на страницу каталога, для этого мы жмем на соответствующую ссылку в меню. Что же происходит в момент нажатия на ссылку? Ссылка имеет вид:

1
http://[ИмяСайта]/catalog

Первым делом данная ссылка преобразуется файлом .htaccess в вид

1
http://[ИмяСайта]/index.php?route=catalog

Далее в index.php, происходит инициализация MVC системы. И управление передается в файл Application.php, который в свою очередь по GET переменной $_GET[‘route’] определяет, какой контролер должен быть вызван. В данном случае это будет контролер с именем catalog.

Определив, какой контролер был вызван, система начинает свою работу:

  1. Запускает контролер для странницы каталога.
  2. Обрабатывает полученные данные. В этом случае данных не передается, запрашивается только вывод каталога.
  3. Обращается к модели каталога, которая и формирует html код для показа в публичной части.
  4. Сформированный html код передается в соответствующий вид (представление) контролера. И благополучно выводится в шаблоне интернет магазина.
Схема работы MVC

Запомните важный момент: для любой новой страницы сайта должен существовать одноименный контролер (Сontroler), а также одноименный вид (View). Заметьте модель (Model) создавать для каждой страницы не обязательно, т.к. можно использовать другие модели либо не использовать их вовсе, так сделано с главной страницей нашего учебного интернет магазина.

Плюсы MVC

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

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

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

Правила использования MVC в нашем проекте.

Если вы взгляните на код функции __autoload(), отвечающей за загрузку вызываемых классов:

1
2
3
4
5
function __autoload ($class_name) //автоматическая загрузка классов
 {
    $path=str_replace("_", "/", $class_name);//разбивает имя класса получая из него путь
    include_once($path .".php");//подключает php файл по полученному пути   
 }

То вы обязательно заметите закономерность между названиями классов и структурой папок системы. Функция преобразует имя вызываемого класса в адрес, по которому расположен данный класс, заменяя символ _ подчеркивания на привычный / слеш.

Поясню: все названия классов должны содержать путь, по которому они расположены, где вместо символа / слеш, должен стоять символ _ подчеркивание. Например создание экземпляра инициализирующего класса Application будет иметь вид:

1
$router=new Lib_Application;

Это значит, что файл Application.php должен находиться в папке Lib. А класс контролера Application_Controllers_Catalog, будет расположен в application\controllers\сatalog.php, и тогда система MVC при анализе ссылки:

1
http://[ИмяСайта]/index.php?route=catalog

запросто определит, что нужный контролер именуется как "Catalog " и находится по адресу application\controllers\ , а следовательно сам класс называется Application_Controllers_Catalog. Такая логика позволит безошибочно определить необходимый контролер для обработки страницы.

С первого раза это все может показаться сложным, но стоит попробовать создать несколько страниц самостоятельно, и все становится на свои места. Практика – лучшее средство для усвоения.

В этой статье я рассказал об алгоритме разработанной мной MVC системы под интернет магазин, конечно, хотелось бы поведать еще многое и о взаимодействии модулей магазина, таких как каталог, и система авторизации, но это выходит за рамки данной статьи о паттерне программирования Model-View-Controller.

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

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

Поскольку в следующем уроке о создании интернет магазина мы не будем возвращаться к логике работы паттерна Model-View-Controller (Модель–Представление–Контроллер), а просто будем создавать исправный интернет магазин.

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

Скачать архив урока №1 ( Скачали: 24417 чел. ) 

Следующий урок >>>

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • VeryGood

    Отличная статья, спасибо за проделанный труд! Жду 2 и 3 части!

  • Kirill

    Добрый день! Что-то у меня выводится пустая страница. Включил логи, тоже всё пусто. В чем мможет быть дело?
    OS:Linux 2.6 Apache:1.3.37 Perl:5.8.8 PHP4: 4.4.4 ( mod )
    MySQL:5.0.26

  • Mark

    Kirill: У вас выводится абсолютно пустая страница, без ошибок?
    Попробуйте в index.php закомментировать строчку

    1
     error_reporting(E_ALL);

    Эту строку можно удалить совсем, ибо она дублируется в config.php

    Также закомментируйте в config.php

    1
     Error_Reporting(E_ALL & ~E_NOTICE);
  • NoSmog

    Хорошая статья, но было бы интересней добавить более подробный рисунок или схему работы mvc. Например, какой файл к какому обращается, чтобы иметь цельное представление. Спасибо.

  • Павел

    Если скрипт переместить во вложенный каталог, все ссылки перестают работать.
    _http://[ИмяСайта]/[Папка]/catalog
    Как решить эту проблему?

  • Mark

    Павел, если я правильно Вас понял то у вас не работают ссылки меню. В следующей части урока я создам константу с содержащую путь до сайта, и проблема будет решена. На данный момент только вручную.
    Т.к. пути к ссылкам жестко прописаны в /lib/Menu.php в массиве:
    $MenuItem = array(«Главная»=>»/», «Каталог»=>»/catalog», «Вход»=>»/enter»);
    Вам нужно их изменить: Папка/catalog

  • Павел

    дада) спасибо, разобрался.
    Ждем следующего урока!

  • Дiмка

    Привет!
    Огромное спасибо за проделанный тобой труд, за разъяснения и подробный комментарий в коде, но не понятным остается один момент, а именно в index.php переход от модели к виду.

    Например, если я правильно понимаю, для каталога в

    1
    $member=$router->Run();

    возвращается результат работы контроллера (и модели) в виде $сatalogItems (выборка из БД товаров),а в

    1
    2
    $view=$router->getView();
     include ($view);

    в виде уже
    foreach($Items as $item) те «форичьется» какой то массив $Items.
    Так вот остается не совсем ясным как в $Items попадает $member и какая роль

    1
    2
    3
    4
      foreach ($member as $key => $value)
        {
            $$key= $value;
        }

    Надеюсь не очень запутанно изложил и вопрос сформулировал понятно. Спасибо.

    • Mark

      $сatalogItems — это результат работы метода getList() из модели каталога.
      $Items — это переменная в которую записывается $сatalogItems. Запись происходит в контролере catalog.php
      строчкой:

      1
      $Items = $model->getList();

      Там же в контролере присутствует и такая строка :

      1
      $this->Items=$Items;

      которая как раз и означает что в member будет передан масив Items с данными по каталогу

      Конструкция:

      1
      2
      3
      4
        foreach ( $member as $key => $value)
          {
              $$key= $value;
          }

      преобразовывает записи из $member в переменные, таким образом мы получаем обычный доступ к некогда переданному в контролере массиву через переменную $Items, которая в свою очередь выводится в представлении.

      Если остались вопросы пиши, объясню.

  • Дiмка

    Благодарю за быстрый ответ!
    Продолжу выяснять непонятки…
    Ваши пояснению подтверждают правильность моих рассуждений, что радует. Но все же остается неясным принцип конструкции foreach, которая «перебирает» массив $member, «складывая» на каждой итерации ключ элемента массива в $key (Items и init), а значение в переменную $value($сatalogItems и 0) , но что делает выражение $$key= $value,
    подскажите, дайте с ссылочку на мануал, как мы после этого получает доступ к массиву $Items, который выводим в view

    • Mark

      Дима, посмотри на этот код:

      1
      2
      3
      $x="y";
      $$x=1;
      echo $y;

      В результате выводится единица.
      Думаю теперь вопрос про $$key= $value, отпадет. Если нет, то почитай про оператор $$

  • Дiмка

    Все!!! разобрался с этим.
    По поводу $member[‘init’]=0
    Я правильно понимаю что это необходимо чтоб циклу
    было что обрабатывать в случае какой либо ошибки и отсутствия member[Items]?

  • Константин

    Сделал все вроде как сказали, залил файлы на хостинг! Имя базы у меня свое и пользователь тоже свой! и пароль тоже! Все это я поменял в конфиге.пхп ! так же залил файл sql в базу! Вроде все правильно НО при заходе на хостинг выходит такая ошибка:

    Warning: include_once(Lib/Application.php) [function.include-once]: failed to open stream: in /home/users1/r/rifer/domains/rifer.jino.ru/config.php on line 6

    Warning: include_once() [function.include]: Failed opening ‘Lib/Application.php’ for inclusion (include_path=’.:/usr/local/zend/share/pear’) in /home/users1/r/rifer/domains/rifer.jino.ru/config.php on line 6

    Fatal error: Class ‘Lib_Application’ not found in /home/users1/r/rifer/domains/rifer.jino.ru/index.php on line 10

    А на локальном серваке работает все!

    • Mark

      Константин, попробуйте воспользоваться следующей версией config.php доступной в уроке №2 . Возможно она вам поможет.

  • Константин

    загрузил конфиг аш с третьего урока (пробывал и из второго), пишет такое:

    К сожалению такой страницы не существует. [PATH_SITElib/application.php ]

  • Константин

    но ама директория есть

  • Константин

    Ошибка постоянно на
    function __autoload ($class_name) //автоматическая загрузка кслассов
    {
    $path=str_replace(«_», «/», $class_name);//разбивает имя класска получая из него путь
    include_once($path .».php»);//подключает php файл по полученному пути
    }

    залил весь урок полностью в папку! прописал подключение базы…. все ровно ругается… такое ощущение что хостинг не распознает функцию str_replace

    • xxxbas

      Уроки написаны под маздай(windows) т.е.
      Из названия классов(Lib_Apliction) формируются пути к файлам типа Lib/Аpliction, а на хосте используются северные ОС типа линукс которые в подавляющем большинстве !!!регистрозависимы!!!(Lib/Аpliction и lib/apliction разные каталоги)

  • Константин

    Короче нашел простой пример функции str_replace

    залил на хост просто проверить работает ли она сама! НЕТ!!! Видать не все хостинги поддерживают её по каким то причинам!! Подскажите как решить проблему? может есть аналог этой функции?

  • Константин

    В общем решил проблему! По началу ошибка кажется ясна:

    Warning: include_once(Lib/Application.php)

    Я долго не замечал здесь одну вещь! А это то что
    Lib/Application.php написанны с заглавной буквы!
    а папка lib у меня была с маленькой! Просто поменял на на заглавную и все сразу нашлось!! Видать для классов маленькая буква и заглавная это разные символы!! У меня ругнулся ещё на некоторые классы, я их также подкорректировал и в итоге все запустилось!

    • Mark

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

  • Константин

    А как его изменять то? я ведь весь код брал с вашего урока!

  • Mark

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

  • Евгений

    На хостингах импортировать бд не такуш просто они выдают сами имена и автоматом не создаются

  • Денис

    Здравствуйте, подскажите пожалуйста. у меня почему-то «.htaccess» не преобразует «http://[ИмяСайта]/catalog» в вид «http://[ИмяСайта]/index.php?route=catalog». При вбивании руками адрес «http://[ИмяСайта]/index.php?route=catalog» переходит к каталогу.

  • Денис

    все исправил. надо было в httpd.conf подключить модуль (убрать #) «LoadModule rewrite_module modules/mod_rewrite.so» и поставить AllowOverride в All. один вопрос остался.
    При переходе с главной в каталок в адресной строке будет стоять «http://[ИмяСайта]/catalog» или «http://[ИмяСайта]/index.php?route=catalog»

  • Mark

    Денис при переходе в каталог в адресной строке должно отображаться:
    _http://[ИмяСайта]/catalog

  • Денис

    спасибо. значит все работает корректно.

  • Тема

    Здравствуйте, спасибо Вам за проделанный труд, очень доступно все расписано. Но интересует один вопрос а именно, если написано два разных контроллера на две разных части сайта, как их запустить на одной странице?
    Может не совсем понятно выразился, без MVC это делается просто includ’ом, а тут как, я понял, надо правильно контроллер вызвать, но в какой часте?

    • Mark

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

  • Тема

    Спасибо за быстрый ответ, а если мне нужно подгрузить на одну страницу view другой?

    • Mark

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

      • контролер — 1
      • представление — 1
      • модель — сколько угодно

      Контролер оперирует полученными данными из представления, и передает их той или иной модели, в зависимости от условий.

  • Дiмка

    Марк!
    От себя хочу поблагодарить тебя за оперативные и внятные разъяснения по возникающим у твоих читателей вопросам!

    PS Небольшое замечание по интерфейсу твоего сайта http://lifeexample.ru. К данной теме накопилось достаточно комментариев и возможно ли разбиение их на страницы с навигационными переходами, чтоб не перегружать одну страницу информацией.
    Спасибо!

  • Mark

    Дима, спасибо. Сегодня на работе время позволяет отвечать оперативно 🙂

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

  • Дiмка

    ОК! будем ждать!)
    И еще! Все же как то не корректно отображается дата.. сдвиг с Москвой — 3 часа

  • Mark

    Ага, точно, я этого не замечал 🙂

  • Наталь

    Здравствуйте. У меня показывает только это.
    Главная
    Каталог
    Вход
    Главная страница

    Добро пожаловать на презентационный сайт урока №1 по созданию интернет магазина «SHOP LifeExample».

    Все права защищены © 2012 г.
    Автор урока: Авдеев Марк.
    e-mail: mark-avdeev@mail.ru

    Я загрузила при помощи денвера, может нужна и kohana?

    • Mark

      Наталья — kohana не нужна, это отдельный фрэймворк. Для работы данного примера нужен только установленный денвер, с настройками по умолчанию.

  • Mark

    Пожалуйста опишите подробно, как вы загрузили с помощью денвера?

  • Наталь

    БД ввела так: вошла в _http://localhost/Tools/phpmyadmin/
    Import->Choose File.
    А папку с файлами загрузила в
    C:\WebServers\home\localhost\www\Listing1_ваш_сайт

  • Mark

    Наталь, Вам нужно в папке C:\WebServers\home\ создать новую папку с названием ИМЯ_САЙТА.RU, например такую: LifeExampleShop.ru.
    В ней создать еще одну папку и дать ей название www.
    И вот в нее уже распаковывать содержимое архива, т.е. открыв
    C:\WebServers\home\LifeExampleShop.ru\www\
    вы должны наблюдать такую картину:
    http://lifeexample.ru/image/mvc-fundament-internet-magazina/mvc-sitema-structura-failov.jpg

    После этого, вам нужно перезапустить денвер. И в адресной строке вашего браузера ввести ИМЯ_САЙТА.RU , в нашем случае LifeExampleShop.ru.

    • Валерий

      Добрый день, Mark!
      На локальном компе установлен Apache 2.2
      Создаю каталог на компе d:\www\moguta\
      В этом каталоге еще 2 каталога: logs и www
      Закидываю вот этот распакованный архив moguta.cms.v0.1.zip
      в d:\www\moguta\www\. Запускаю в браузере: moguta/index.php
      Все ок работает. Проблема в следующем. Создаю новый каталог
      d:\www\moguta\www\mycart и перемещаю распакованный архив moguta.cms.v0.1.zip в эту папку. Запускаю в браузере:
      moguta/mycart/index.php
      Окно пустое, ошибок в браузере нет. Окно девственно чисто.

      Error.log
      [Thu Oct 25 14:41:00 2012] [error] [client 127.0.0.1] PHP Warning: require_once(D:/www/moguta/www/mg-core/function.php) [function.require-once]: failed to open stream: No such file or directory in D:\\www\\moguta\\www\\mycart\\config.php on line 13

      [Thu Oct 25 14:41:00 2012] [error] [client 127.0.0.1] PHP Fatal error: require_once() [function.require]: Failed opening required ‘D:/www/moguta/www/mg-core/function.php’ (include_path=’.;C:\\php5\\pear’) in D:\\www\\moguta\\www\\mycart\\config.php on line 13

      Как это побороть?
      Просто мой сайт работает. Основной файл там index.html Что бы не сваливать все в кучу, решил для интернет магазина создать отдельную папку mycart и все закинуть туда.

    • Дело в том что этот архив содержит не один скрипт, а работающую систему.
      Данная CMS представляет собой автономный сайт, использование его таким образом как вы описали не предусмотрено. Если вам это на самом деле нужно, то надо переписывать много функций, и начать с автолоадера в config.php. А вобще не понимаю, зачем вам внутри собственного сайта, отдельный интернет магазин.

  • Наталь

    Получилось спасибо

  • skymer

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

    В поисках нормального решения убил 2 дня. Везде мануалы и теория.

    • Mark

      skymer, буду рад если мои материалы окажутся вам полезными.

  • Ярослав

    Большое спасибо за цикл статей по созданию своего фреймворка с нуля. Именно то, что искал и информации по данному вопросу не так много в нете.
    Но, все же, позволю себе сделать небольшое уточнение, или можно сказать улучшение, которое, думаю, будет полезным. А именно — адаптация скрипта под Linux. Всего-то чего не хватает для кроссплатформенности — это вспомнить о том, что в unix-подобных системах различаются большие и маленькие буквы. Вобщем, надо немного переписать такие функции:

    //config.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     function __autoload ($class_name) //автоматическая загрузка кслассов

     {

        $path=str_replace("_", "/", $class_name);//разбивает имя класска получая из него путь

            $path_arr = explode('/', $path);
     // разбиваем путь в массив
            $filename = array_pop($path_arr);
     // вытаскиваем имя файла
            $path = implode('/', array_map( lcfirst, $path_arr) ).'/'.$filename;
      // переводим весь остальной путь в нижний регистр и присоединяем к пути имя файла ( с Большой буквы )
        include_once($path .".php");//подключает php файл по полученному пути   

     }

    // lib/Application.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
        public function Run()// запуск процесса обработки данных

        {

           session_start(); //открываем сессию

           $controller=$this->getController();//получаем контролер

           $cl=explode('.', $controller);

           $cl=$cl[0]; //отбрасываем расширение, получаем только путь до контролера

           $name_contr=str_replace("/", "_", $cl);//заменяем в пути слеши на подчеркивания, таким образом получая название класса

           $name_contr_arr = array_map( ucfirst, explode('_', $name_contr) );
      // разбиваем путь в массив, переводим в верхний регистр первые буквы слов и записываем в массив
           $name_contr = implode('_', $name_contr_arr);
     // строим имя класса
           $contr=new $name_contr;//создаем экземпляр класса контролера

           $contr->index();//запускаем контролер на выполнение (index() должна быть у любого контролера)

           $member=$contr->member;//получаем переменные контролера

           return $member;

       

        }

    и все файлы моделей и контроллеров переименовывать с большой буквы (как бэ косим под Zend стиль).
    Все, скрипт работает теперь и на Убунте — ура, ура! 🙂
    Надеюсь кому-то это пригодится, а я пошел курить остальные статьи цикла.

    • Ай да красавец! Выражаю вам огромную благодарность. Данную проблему выявил давно, но все забывал расписать как это исправить.

      У меня на блоге пока не проводятся конкурсы на лучший комментарий, но если бы он был вы бы заняли 1-е место 😉

    • Sergey
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      /**
      * Автозагрузка классов      
      */      
          function __autoload($classname)
          {
              global $INCLUDE_PATCH;
             
              foreach ($INCLUDE_PATCH as $include_path)
              {
                  $class = ROOT .'/'. $include_path .'/'. strtolower($classname) .'.php';
                 
                  if(file_exists($class))
                  {
                      include_once $class;
                      break;
                  }
              }
          }

      Помоему так проще и НАМНОГО понятнее …

  • wisest

    Спасибо. Это реально классный урок, давно хотел разобраться в MVC, но на такой доходчивый материал не рассчитывал.

  • ZBuilder

    У меня при просмотре кода сайта какие то отступы. Проблема появляеться после

    1
    $member = $router->Run();//Начинаем поиск нужного контролера

    Что ето может бить?

    • Не понял смысла вашего вопроса. При просмотре какого кода? Т.е. что вы имеете в виду под кодом сайта, и как вы его просматриваете. Какие какие-то отступы? С чего вы взяли что проблема именно после строки
      $member = $router->Run();

      Сайт сам работает?

    • Юрий

      Эта проблема из-за тега

      1
      ?>

      Уберите его во всех файлах, и тогда пустые строчки будут компилиться не как html.

  • ZBuilder

    Сайт работает. После замены некоторого кода что в посте Ярослава. (Различие больших и маленьких букв)

    1
    2
    3
    echo "mess1";
    $member = $router->Run();
    echo "mess2";

    Исходник страницы в Chrome

  • ZBuilder

    Ссылку на рисунок урезало…

    _http://s016.radikal.ru/i337/1205/5b/30c8ba6f26ed.jpg
    _http://s016.radikal.ru/i337/1205/5b/30c8ba6f26ed.jpg

  • ZBuilder

    Может бить что проблема в __autoload

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function __autoload ($class_name)
     {
    $path=str_replace("_", "/", $class_name);
    $path_arr = explode('/', $path);
    $filename = array_pop($path_arr);
    $path = implode('/', array_map( lcfirst, $path_arr) ).'/'.$filename;
    echo 'autoload 1  ';
    include_once($path .".php");//где то тут проблема...
    echo 'autoload 2  ';
       
     }

    _http://s004.radikal.ru/i206/1205/13/af5cb4d6e8ef.jpg

    И вот так виглядит без проверок

    _http://s019.radikal.ru/i640/1205/0d/fca25a631af8.jpg

  • Вы имеете в виду отступы до строки

    1
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    ?
    Если да, то они могут появляться из-за существования пробельных символов, и символов перевода строки в подключаемых php файлах.
    На самом деле — эта проблема не очень существенна в данном уроке, но конечно лучше исключить все символы после закрывающего тега ?> во всех имеющихся php файлах.
    Также, следую рекомендациям команды Zend можно просто удалить данный тэг в подключаемых файлах.

    • в следующих уроках, таких отступов возникать не должно.

  • ZBuilder

    Исправил спасибо.

  • Привет всем, во первых сразу спасибо Марку за статью и проделанную работу …
    вопрос адресован не конкретно Марку а всем тем пользователям линукс && счастливчикам которым удалось поставить ЛайфЕкзамплШоп на свои локальные LAMPы… не могли бы вы скинуть плиз свои скрипты, тк я испытываю проблемы с установкой, первые баги лезут уже в процессе unzip *.zip :), потом мне не совсем ясно в какой директории должны лежать скрипты в Listing1 или их надо переместить из етой директории в другую … в общем было бы здорово если б кто нибудь выложил на download архив со скриптами для линукс, заранее Балгодарю. Ю

  • Niko-Sun

    Это просто потрясающий пример того как работать с объектами, как организовывать MVC !!! Очень доходчивые комменты. В общем огромное спасибо за помощь в освоении новых техник !!!!

  • Алексей

    Импортирую базу
    После чего появляется ошибка

    Ошибка
    SQL-запрос:


    — Database: `LifeExampleShop`

    CREATE DATABASE `LifeExampleShop` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;

    Ответ MySQL:

    #1044 — Access denied for user ‘4e6ypek’@’%’ to database ‘lifeexampleshop’

    Какова может быть причина

    Заранее благодарю за отвер

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

  • Алексей

    Спасибо, Mark.
    Пока, описание импорта базы, обнаружил только на этой странице.
    Буду искать причину.
    Благодарю за статью.

  • Дiмка

    Заново разбираю «работу» движка, наткнулся на маленькую неточность в 1 уроке, которая следует и далее в MOGUTA.CMS…
    В Виде модуля авторизации две строки 8 и 9

    if(!$unVisibleForm):
    echo $msg;

    В данном случае пользователь увидит сообщение $msg только в случае неудачного ввода логина-пароля.

    Если данные строки поменять местами, то в случае удачной авторизации пользователь видит симпатичное приветствие «Вы верно ввели данные!», как и задумывалось автором )))

  • Алексей_Д

    Здравствуйте Mark, у меня такая же проблема, которая была у Kirill-а, а именно запускаю сайт: в ответ пусто.
    БД импортировал, содержимое архива Lesson1.zip перенёс в каталог
    /var/www/shop, прописал параметры подключения к базе в файле config.php
    Далее ввожу в браузере /localhost/shop/index.php но там пусто. Попробовал закоментировать те строки о которых вы говорили в ответе Kirill-у. Но результат тот же. Не подскажите сходу в чем ошибка?

    ОС linux ubuntu 12.04 apahe2 php5 mysql

  • Cходу не подскажу (
    Я думаю проблема кроется в настройках сервера.

  • 1
    2
    3
    Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at X:\home\lesson3.ru\www\config.php:1) in X:\home\lesson3.ru\www\lib\application.php on line 51

    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at X:\home\lesson3.ru\www\config.php:1) in X:\home\lesson3.ru\www\lib\application.php on line 51

    такая вот фигня вылазит постоянно

    • Ошибки говорят о том, что до старта сессии гдето происходит вывод. Попробуйте удалить закрывающие php теги ?> в файлах index.php , sql_setting.php и config.php

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

  • поставил свежий денвер, заработало все нормально, спасибо

  • Ivan

    Здравствуйте! прошу прощения за глупый вопрос но у меня не загружается на топ сервере этот магазин. подключение к базе сделал, выдает ошибку 403. если убираю все содержимое этого фала .htaccess начинает работать но не полностью.Подскажите что сделать

    • Опишите подробнее, что убираете и откуда.

  • Серёжа

    Статься супер, спасибо!

  • Vadim

    Здравствуйт!!!Учу MVC по вашему примеру, в принципе все понятно, урок просто супер, хотел спросить у вас в классе меню в массиве храняться значения ссылок ‘/enter’ и т д, когда я запускал сайт не работал разобравшись в классе Application понял что туда приходит значение ссылки из настроек .htaccess поменял в массиве на вот это «?=route» все заработало и так же в форме action=»?route=enter» правильно ли сделал или я чего то не понял???

    • Такой подход к решению проблемы не совсем верный, т.к. теперь вам нужно будет все ссылки переделать в гет параметр, а это во-первых влияет на сео, а во-вторых не удобно.

      Теоретически не нужно было ничего менять, все работает. Каким вы пользуетесь локальным сервером?

  • Игорь

    А мне статья очень нравиться все довольно просто описано. Ксати, на этом принципе построены такие популярные фрэймворки ка Zend Framework. Но это статья намного проще в понимании. Спасибо автору!

  • Mirasoft

    Доброго времени суток всем.
    Почитал статью, посмотрел исходники, запустил все это дело.
    Есть много замечаний по этому поводу.

    Zend Framework, построен то на mvc, но немного не так.

    Сам являюсь автором одного фреймворка и мог бы предложить много чего нового для даного проекта.

    Если интиресно то стучитесь.

  • Катя

    А как импортировать базу данных подскажите пожалуйста. И какой программой вы пользуетесь?

    • В начале статьи приведен скриншёт с тем как это делается. На каком этапе у вас возникли трудности? Чтобы импортировать БД вам нужно вызвать утилиту phpMyAdmin, она устанавливается вместе в денвером.

  • Михаил

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

    • Значит что-то сделали не правильно, либо не подходяще настроен web-сервер.

  • vadim

    Здравствуйте Марк, хочу спросить у вас, вот если мы находимся в корне сайта открыта главная страница(index.php), если в адресной строке изменить немного и дописать допутим application ,то увидим весь каталог application так же не должно быть с точки зрения безопасности как это исправить нужно что то менять в классе Application.php который формирует контроллер???

    • Чтобы запретить просмотр директорий, нужно в .htaccess прописать правило:

      1
      Options All -Indexes

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

  • vadim

    Я вставил в .htaccess Options All -Indexes, но доступ к директории все равно можно получить через адрессеую строку, я думаю у меня может не работае .htaccess? потому что если в нем отключаю допустим волшебные ковычки спец символы все равно экранируются, а если в скрипте отключать то не экранируются может быть такое что .htacces не работает???хотя у меня стоит в нем RewriteRule ^(.*)$ index.php?page=$1 [L,QSA] это дирректива работает

    • А вот такого правила у вас случаем в файле нет?
      AllowOverride None

  • vadim

    Нет в .htaccess нет такой инструкции .htaccess полностью из вашего примера, я в httpd.conf изменил AllowOverride None на All все равно не работает,а через httpd.conf можно запретить доступ к каталогам??? какая директива не подскажите?

    • Через httpd.conf можно. Также как и через .htaccess

  • Allen

    Уважаемый автор, что обозначает кусок кода в index.php:

    $member[‘init’]=0;
    foreach ($member as $key => $value)
    {
    $$key = $value;
    }

    • Делает ключи массива переменными.

  • vadim

    Нет такого нет правила в httpd.conf устанавливал на это правило All все равно не работает все перепробовал уже не работает почему то

  • Андрей

    MVC не паттерн.

  • Julia

    Смотрю на картинку, которая на сайте и пытаюсь понять, что с чем взаимодействует + анализирую код. Вот что у меня получается. Контролер взаимодействует с моделью, так как в контролере мы создаем объект модели и получаем данные. Модель взаимодействует с контролером, потому что она эти данные передает в контролер. Потом контролер взаимодействует с View потому что туда передаются данные, которые контролер получил из модели. Правильно хоть я понимаю? А то чувствую, что я плаваю в материале немного.

    • Да, составляющие MVC именно так и взаимодействуют.

  • valera

    Было бы хорошо добавить поле для фильтра наименование name(для таблицы product). Когда много товаров, комбиками и ценой не всегда удобно фильтровать. А вот фильтрануть по полю Name, сузило бы параметры поиска.

  • Максим

    Здравствуйте! У меня такая проблема

    1
    2
    3
    4
    5
     Warning: include_once(Application/Models/Catalog.php) [function.include-once]: failed to open stream: No such file or directory in /home/a10428/public_html/config.php on line 6

    Warning: include_once() [function.include]: Failed opening 'Application/Models/Catalog.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/a10428/public_html/config.php on line 6

    Fatal error: Class 'Application_Models_Catalog' not found in /home/a10428/public_html/application/controllers/catalog.php on line 7

    Читал в комментариях не у меня одного такая проблема, но так и не понял как ее решить. Меняю название на заглавные
    буквы начинает в ошибки прописывать маленькие. Можете подсказать что делать?

    • Попробуйте скачать из следующего урока архив, если не ошибаюсь то там этот момент поправлен. Все дело в том что у вас UNIX система, а она не видет разницы между именами файлов в верхнем регистре и нижнем. В widows системах, такой проблемы не возникает, так как два файла с одинаковыми именами в разных регистрах могут существовать.

  • alexman

    Здравствуйте Mark у меня проблема!
    Я не могу загрузить страницу вашего сайта(урока). Видимо .htaccess не настроен у меня на локальной машине.
    Ошибка

    1
    2
    3
    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    у меня установлен Apache/2.2.8 (Win32) PHP/5.2.6

    • Я думаю дело не в .htaccess а в неправильной конфигурации сервера в принципе. У вас только мой урок не запускается?
      Остальные сайты работают?

  • alexman

    когда я удаляю htaccess то вас урок работает но правда не так как как положено потому что не пере адресации на index. поэтому я подумал что дело в htaccess

  • Oleg

    $member=$contr->member;У меня не работает,пищет
    Undefined property: Application_Controllers_Catalog::$member!
    разве мы можем обратиться к private переменной?Объясните пожалуйста!

  • Александр

    Здравствуйте. Решил проверить на практике этот урок, а заодно поработать с MVC, и вроде бы все хорошо: создал в локалхосте->www->webstore все что надо и внутри файлов переписал систему ссылок и маршрутизации но натолкнулся на проблему уровня новичка: не хотят подгружаться картинки…. был бы рад если бы показали где и как прописать им пути…
    картинки хранятся в localhost/www/webstore/images/img/

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

  • ihor

    Как сделать MVC авторизацию с AJAX?

    • Нужно изучить технологию AJAX и паттерн MVC, это поможет найти ответ на ваш вопрос.

  • Катя

    Привет.спасибо за ваши уроки очень помогает в самостоятельном обучение! Но у меня возник такой вопрос почему возникает ошибка когда я начинаю изменять ваш код? С чем это может быть связано?

  • Андрей

    ПРивет. а у меня ругается на то, что вызывается неизвестная функция
    Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\moguta\mg-core\lib\updata.php on line 129

  • Андрей

    Здравствуйте. когда в админку захожу пишет это :
    Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\moguta\mg-core\lib\updata.php on line 129

    сервак — xampp

  • Здравствуйте, когда пытаюсь запустить сайт, подключив БД получается так же, как писала Наталья, т.е.

    Главная
    Каталог
    Вход
    Главная страница

    Добро пожаловать на презентационный сайт урока №1 по созданию интернет магазина “SHOP LifeExample”.

    Все права защищены © 2012 г.
    Автор урока: Авдеев Марк.
    e-mail: mark-avdeev@mail.ru

    пробовал решить проблему, как вы описывали выше, ничего не помогает, подскажите пожалуйста что делать. Сервак Denwer, так же пробовал xampp

  • Марк

    почему на хостинге Джино не могу добавить вашу базу данных? выскакивает ошибка:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Ошибка
    SQL-запрос:

    --
    -- Database: `LifeExampleShop`
    --
    CREATE DATABASE  `LifeExampleShop` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;


    Ответ MySQL:

    #1044 - Access denied for user 'm1a9r9k9'@'%' to database 'lifeexampleshop'
    • Видимо на хостинге уже имеется база с определенным названием, которое нельзя поменять. Удалите из дампа команды, которые пытаются создать новую БД.

  • Михаил

    Здравствуйте.
    Не могу скачать скрипты по Вашим ссылкам.. скачивается файл с расширением архива в котором написано —
    Notice: Undefined index: HTTP_REFERER in /home/lifeexampl/lifeexample.ru/docs/download_count.php on line 2
    Пожалуйста не открывайте этот фаил напрямую, у него другие функции.

    • Не знаю как у вас так получается) Все скачивают без проблем. Попробуйте другим браузером, мало ли.

  • мария

    спасибо за урок!

  • Таисия

    спасибо за статью!

  • Skifskif

    Скачал lesson1.zip — не разархивируется. Ошибка 20 — Не каталог.

    • Попробуйте еще раз, архив рабочий.

    • Alex

      Так пишет на Mac если юзать стандратный разархиватов, если поставить друглй из appstore, то разархивируется

  • Andry

    Здравствуйте, Загрузил файлы архива в папку сайта на denwer, сделал импорт базы данных, но при открытии сайта открывается только:

    Главная
    Каталог
    Вход
    Главная страница

    Добро пожаловать на презентационный сайт урока №1 по созданию интернет магазина «SHOP LifeExample».

    Все права защищены © 2012 г.
    Автор урока: Авдеев Марк.
    e-mail: mark-avdeev@mail.ru

    Тут не произошло подключение с базой и не прикрепились стили?

    • zMax

      настройки подключения к БД отредактировали?

  • V1sQy

    Действительно содержательная статья, безумно рад, что наткнулся на наконец таки стоящий мануал.

    Не понимая вообще Веб-программирования, начал потихоньку вникать.

    Спасибо огромное.

  • Виктор

    Спасибо за материал!!!
    Маленький минус — автор не уточнил место (адрес) для создания папки магазина — вот комментарий автора от 2012 года — РЕШЕНИЕ:
    нужно в папке C:\WebServers\home\ создать новую папку с названием ИМЯ_САЙТА.RU, например такую: LifeExampleShop.ru.
    В ней создать еще одну папку и дать ей название www.
    И вот в нее уже распаковывать содержимое архива, т.е. открыв
    C:\WebServers\home\LifeExampleShop.ru\www\
    вы должны наблюдать такую картину:
    http://lifeexample.ru/image/mvc-fundament-internet-magazina/mvc-sitema-structura-failov.jpg

    После этого, вам нужно перезапустить денвер. И в адресной строке вашего браузера ввести ИМЯ_САЙТА.RU , в нашем случае LifeExampleShop.ru.

  • Vadim

    Здравствуйте Марк хотел спросить у вас,очень важную роль играет файл .htaccess, он работает на apache,а будет он работать под Nginx,допустим я возьму и напишу кому нибудь на основе вашего примера что нибудь,будет это работать под Nginx???

    • Не могу сказать точно, но скорее всего не будет. Но если вы будете использовать связку apache+nginx, подобно тому как это делается на хостинге nic.ru? то будет работать.

  • Александр

    Замечательная статья, ни как у многих умелкиных, которые только умеют копировать отдельные куски у других и выдавать на своих народ ру за свои знания))) Мой респект. …. У меня все идеально работает. Единственное что в браузере надо всегда переключать кодировку на utf-8 , хотя по идее браузер сам определяет и ставит нужную, но кроме windows-1251 ничего не ставит и в итоге если самому не поменять, в результате иероглифы. Пробовал в самом движке все значения на windows-1251 поменять и в БД в том числе. Итог почему то иероглифы все равно. Может быть какие то функции ООП только с UTF-8 работают или в чем может быть проблема? С Уважением, Александр.

  • xaocbozzz

    Выкладываю свое видение по поводу этого урока. Каждая строка прокомментирована, надеюсь поможет кому-то в освоении этого урока и последующих, да и вообще в MVC.
    http://files.mail.ru/C37759C8B05946EA8924FF4918DB8BB5
    http://yadi.sk/d/tdkaetHr5YTCs
    http://letitbit.net/download/37202.3df68740d77fc76db686c3bc5357/Дополнение_к_учебному_материалу_по_CMS-Moguta.doc.html

    • Sergey

      Молодец, отличная работа!!!!!

    • Александр

      Строка 31 Lib/Application.php,»$member=$contr->member;» ты пишешь «Вызываем свойство member у класса Application_Controllers_Catalog. Но этот метод не заявлен в классе. Так как он расширяет (extends) другой класс Lib_BaseController – то пытаемся найти свойство там. Оно там есть, но оно защищенное» во первых не метод, а свойство, а во вторых важно заметить, не нашли доступное свойство — работает __get(). Марку стоило бы переименовать «$member=$contr->member;» чтоб не зыпутывать читателей. Тут важно запросить недоступное свойство. Попробуйте у себя переименовать как угодно «$member=$contr->memberfsfd;» всё равно скрипты работают!

  • Panda

    Здравствуйте. Пытаюсь сварить свой первый сайт в жизни. Прошу прощения за, наверное, самый глупый в истории мира вопрос, может даже немного не по теме, но всё же… «Как должны располагаться файлы на сервере, чтобы мне можно было наблюдать наглядный пример работы РНР-кодов в браузере?» Имеется почти готовый вид, сваренный на хтмл-ксс, но как можно объединить с рнр в одно целое? Например, располагать в одной папке или слить определённый код о существовании рнр на сервере в голову хтмл? Помогите дураку. Вижу, что Вы итак всё подробно объясняете, но вот именно этого пока понять не могу. Благодарю за Вашу работу

  • Panda

    Попытаюсь точнее изложить свой вопрос. «Как правильно расположить папки с рнр и элементы ксс/хтмл так, чтобы скрипт корректно и абсолютно работал для «почти» готового макета хтмл/ксс? По сути дела, пока требуется только скрипты для маленькой и большой корзины. Прошу прощения, вот ещё один вопрос внутри этого предыдущего вопроса. «Как я могу правильно сделать так, чтобы маленькая корзина ссылалась на большую при нажатии на ссылку из маленькой корзины? Я могу настроить эту функцию?»» Простите за беспокойство.

    • В корень сайта все положите. Если что-то не будет работать, поправьте пути к файлам, в тех местах где к ним идет обращение.

  • Panda

    Warning: mysql_connect() [function.mysql-connect]: Access denied for user ‘root’@’localhost’ (using password: NO) in public_html/config.php on line 13
    Невозможно установить соединение c базой данныхAccess denied for user ‘root’@’localhost’ (using password: NO)

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

  • тима

    здраствуйте у меня вышло вот это,что делать
    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

    More information about this error may be available in the server error log.

  • Аят

    Здравствуйте. Не могу разобраться, на денвере все работает как надо, а на сервере пишет это:
    К сожалению такой страницы не существует. [/home/u596286357/public_htmllib/application.php ]

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

    • Исходя из пути в ошибке /home/u596286357/public_htmllib/application.php видно что не хватает слеша между public_html и lib. Т.е. некорректно формируется путь.

  • Майкл

    Спасибо за статью.
    Лично у меня mod_rewrite отказывался работать пока я не добавил в .htaccess после
    RewriteEngine on
    строку: RewriteBase /
    это к сведению тех, кто мучается проблемой типа «К сожалению такой страницы не существует.»

  • Майкл

    .. хотя вот подумал, что наверное все-таки написанное мною выше это в случае Internal Server Error как это было у меня, а «Страницы не существует» — это что-то с именами..

  • Станислав

    Добрый день! Просмотрел код дампа базы данных, и увидел следующие строки:

    1
    CREATE DATABASE `LifeExampleShop` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
    1
    ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

    На сколько я понимаю этими строками вы устанавливаете стандартную кодировку для базы данных и созданной таблицы в формате «cp1251», но сами записи вы храните в кодировке «UTF-8», не возникнет ли в дальнейшем каких-либо неприятностей в связи с различием кодировок?

  • Станислав

    Добрый день! Просмотрел код дампа базы данных и увидел несоответствие в связи с кодировками, так как Вы указываете стандартной для всей базы данных и для новой таблицы кодировку «cp1251», а сами записи храните в «UTF-8». Рекомендую привести все кодировки к формату UTF-8, так как она соответствует стандартам W3C, и поддерживается большим количеством платформ.

    • Полностью присоединяюсь к вашей рекомендации. Все нужно хранить в оlной кодировке — UTF-8.

  • Станислав

    Извините за практически дублирование сообщения, просто у меня почему-то сообщение не отображалось сразу после отправки, так и должно быть или это какой-то баг?

    • Это не баг. Все сообщения проходят модерацию, перед добавлением.

  • Алексей

    Добрый день!
    Пробую добавить еще одну страничку, на которую можно перейти по ссылке с главной. Создаю контроллер и вид этой страницы, но ни чего не получается — выводятся только шапка и подвал. Что я делаю не так?
    Контроллер:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
       
        class Application_Controllers_Privet  extends Lib_BaseController
        {
            function index()
                {  
             
                }
        }
    ?>

    И вид:

    1
    <h1>Привет мир!</h1>
  • Egor

    Ошибка обращения к базе Access denied for user ‘axlash’@’localhost’ to database ‘LifeExampleShop’

  • Кирилл

    Пожалуйста, помогите. Пытаюсь импортировать базу данных, но выскакивает сообщение

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Ошибка
    SQL-запрос:

    --
    -- Database: `LifeExampleShop`
    --
    CREATE DATABASE  `LifeExampleShop` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;


    Ответ MySQL: Документация

    #1044 - Access denied for user 'u8071_baseuser'@'%' to database 'LifeExampleShop'

    При этом фаил из второго урока импортировался без проблем в базу данных. Что я делаю не так? В пятом уроке Вы обьясняете в коментах как импортировать нормально, но и так у меня ничего не получается=(( Пожалуйста, помогите…

  • Leha

    Там где указаны пути от текущей директории файлы не подгружаются, если не стоит точка в начале.Из-за этого все не работает.Например

    1
    <a href="./product?id=<?php echo $item["id"]?>">

    работает только с точкой и так везде.Как исправить это в php.ini? Стоит Apache 2.2 на винде.

  • Екатерина

    Не удается импортировать базу
    Выдает #1044 ошибку.

  • Юрий

    Здравствуйте, Марк! Благодарю за прекрасные уроки и возможность на простых примерах понять сложные вещи. Хотелось бы задать такой вопрос: есть сайт, созданный по традиционной схеме (не MVC). Мне нужно «прикрутить» к нему интернет-магазин (например на CMS «Moguta»). Возможно ли это сделать, не нарушая функциональности существующего сайта? Т.е. чтобы интернет-магазин находился в отдельной папке. Или файл .htaccess в корне не позволит этого сделать?

    • Если речь идет о Moguta.CMS то это возможно. Создайте папку в своем проекте, распакуйте туда файлы движка. Обратиться к интернет-магазину можно будет по адресу ваш_домен/созданая_папка/

  • Алексей

    Добрый день, Марк! Спасибо за эти уроки — очень много интересного открыл для себя!
    Есть маленький вопросик: в случае, когда мне надо подключить javascript я указываю адрес скриптов в шапке, в этом случае они «включаются» для всех страниц на сайте. А есть ли возможность как то разделить, т.е. чтобы на одной странице скрипт был подключен а на другой нет?

    • Да, конечно, можно это сделать. в html коде сделайте проверку url текущей страницы, и если он будет совпадать с нужной то делайте подключение, в противном случае не делайте. url страницы можно узнать в массиве $_SERVER

  • Булат

    Добрый день, Марк! Только начал изучать ваши статьи по созданию интернет магазина, и сразу же проблема:
    «Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at admin@example.com to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.»
    Т.к. хочется понять все основательно, дальше не иду.. Прочитал все комменты, то что написано не помогло( добавить в .htaccess строку RewriteBase /). Что может быть?

  • Булат

    «learn.ru/www/.htaccess: Invalid command ‘RewriteEngine’, perhaps misspelled or defined by a module not included in the server configuration»
    в логах…

  • Булат

    Снимаю вопрос. Решено. Нужно было установить модуль rewrite_module для Apache.

  • serg

    Ссылки битые. Архивы удалены

    • Поправил ссылки, можно качать

  • SlFomin

    ссылки битые, файлов для примера больше нет 🙁

    • Проблема вызвана переездом на новый сервер. Теперь все в порядке, можно скачивать.

  • Добрый день!
    все сделанно верно, запустив свой сайт увидел в первой строке следующее:

    Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\xampp\htdocs\config.php on line 13

    дальше логотип, приветствие, Все права защищены…

    и всё?!

    что делать?

  • Сергей

    А как сделать , чтобы на главной странице располагался каталог товаров ?

  • Интересно… Читал подобные статьи других авторов, но информация у них представлялась как то размыто, не все было понятно. В этой же на оборот все складывается в единую картину. Смотрю дальше…

  • Александр

    Запутанная получается штука… Для меня самое сложное было разобраться с $contr->member. Уяснил следующее: Любые свойства, что мы задействовали в контроллере как $this->xxxxx будут нам доступны в отображении (view) как переменные $xxxxx. Например в catalog.php мы установили $this->Items=…, и затем в отображении мы используем переменную $Items.

  • lufter

    Сам подходил к процессу создания движков, для миниблогов и просто сайтов визиток, просмотрел бегло все разделы, для меня это новый подход, очень интересный, спасибо за материал к размышлению. Решил залить первый урок сразу на хостинг и по ходу поэтапно создавать магазин(точнее витрину, для работы с партнерками). Была проблема с отображением пустой страницы, вижу не только у меня. Проблема заключалась в регистре букв, я перевел все имена файлов в нижний регистр, а так же во всех файлах имена классов в нижний регистр. Так же у меня это все дело в папке на дополнительном домене, поправьте пути к файлам.

  • lufter

    И еще у кого проблемы с импортом базы, кто импортит сразу на хост: не мучайтесь с импортом, создайте базу и таблицу в ручную.

  • Дмитрий

    Доброе время суток! Огромная благодарность за такие статьи
    Вчитывался в этот урок, досконально перебрал каждую строчку кода, перечитал все комментарии к этому уроку в поисках ответа, но так и не понял для себя. Подскажите, пожалуйста:
    вот получили $Items = $model->getList();
    $Items в дальнейшем используется в представлении в foreach($Items as $item), его получение понятно.
    Непонятно для чего выполнять конструкцию
    foreach ( $member as $key => $value)
    {
    $$key= $value;
    }
    для преобразования записи из $member в переменные, чтобы получить обычный доступ к некогда переданному в контролере массиву через переменную $Items, если в дальнейшем ни к $member, ни к $key, ни к $value нигде не идёт обращение, а для вывода используется только $Items

    • Это нужно чтобы в дальнейшем иметь возможность работать с переменными в представлении. Приведенный код аналог функции extract

      1
      2
      3
      4
      5
      6
      7
      $size = "large";
      $var_array = array("color" => "blue",
                         "size"  => "medium",
                         "shape" => "sphere");
      extract($var_array, EXTR_PREFIX_SAME, "wddx");

      echo "$color, $size, $shape, $wddx_size\n";
  • Роман

    Отличный урок с примерами! Теперь я наконец таки понял как работает MVC. Для меня, как для программиста — это очень важно. Спасибо огромное за проделанную работу. Буду ждать с нетерпением новых уроков!

  • Виктор

    познавательно и главное понятно объяснено); по крайней мере в этом уроке

  • Борис

    Да все очень хорошо и понятно изложено. Только одно что хотел заметить, как то не раскрыто как загрузить базу данных и создать пользователя под базу, ну это наверное уже отдельная тема.

  • Андрей

    Не понимаю скачал распаковал,открыл получилось что то не то стили поплыли где то что неподключилось,но с этим разобрался ,только не могу понять почему ссылки не работают,
    прост имеют вид
    http://localhost/
    http://localhost/catalog
    http://localhost/enter
    не подскажите в чем может быть проблема

  • Виталий

    Здравствуйте! По этому пути: C:\WebServers\home\LifeExampleShop.ru\www\ у меня все как-надо открывается. Но картинки в папке images не выводятся! Что делать?

  • Виталий

    В этой строчке ошибка:
    Что за: image ? Возможно: img должно быть

  • Виталий

    Mark можете объяснить назначение данной строчки: $cl=explode(‘.’, $controller); которая расположена в файле catalog.php в папке controllers

  • Егор

    Добрый день.
    Огромное спасибо за статью. но пока столкнулся с проблемой. При открытии сайта отображается пустая страница с логотипом, «getMenu(); ?>» такой вот записью вместо меню и «Главная страница», «Добро пожаловать на презентационный сайт урока №1 по созданию интернет магазина «SHOP LifeExample». Ну про «все права защищены» тоже написано после черты.
    Подскажите, как исправить.

  • Сергей

    Здравствуйте Mark, подскажите в чем косяк, я пытаюсь использовать вместо стандартного способа работы с базой данных новый метод PDO, но при этом при выполнении запроса в модели catalog появляется ошибка, что переменная $db_connect не определена. Не понимаю в чем разница обычного подключения b PDO?

  • Dmitry

    не хочет открывать файл с архивом на комп. пишет: ! C:\Users\ааа\Downloads\lesson1 (1).zip: Cannot create C:\Users\ааа\Downloads\lesson1 (1)\Listing1\.htaccess
    Системе не удается найти указанный путь.

    C:\Users\ааа\Downloads\lesson1 (1)\Listing1\template\style.css
    Системе не удается найти указанный путь.
    и.т.д.
    в чём дело? битый архив?

  • Denis

    Не совсем понял как импортировать файл LifeExampleShop.sql, для этого нужна какая-то программа? Если да то какая?

    • phpmyadmin подойдет , он есть на любом хостинге.

  • seowebstroy.ru

    Спасибо за статью. Классно написано.

  • i-m-nik

    Обязательно буду читать такие статьи спасибо то что искал.

  • Bizrhan

    4 Года прошла с выхода статьи, и до сих пор актуальна, Карл)

    • Качество — на века! =)

    • Oleg

      Здравствуйте! Подскажите …как запускается phpMyAdmin

  • Anna

    Ошибка
    SQL-запрос:


    — Database: `LifeExampleShop`

    CREATE DATABASE `LifeExampleShop` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;

    Ответ MySQL: Документация

    #1044 — Access denied for user ‘u0178428_default’@’localhost’ to database ‘LifeExampleShop’

  • Как открывать файлы, через какую программу?

  • Егор

    Спасибо за полезные статьи!
    Целый хороший учебник!

    Сейчас в php еще не очень, поэтому прошу прощения за глупые вопросы по поводу php.

    Я в исхониках видел динамическое создание классов (через new), но ни видел их удаление (delete). Где лучше их удалять? Или можно не удалять, сами уничтожаться при завершении скрипта в котором создаются?

    И сессии. В /lib/Application.php есть session_start, но не нашел нигде session_destroy.

  • Oleg

    Здравствуйте! Подскажите ..в чем ошибка? При вводе в броузере localhost/lifeexampleshop.ru выдает
    Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in D:\USR\www\LifeExampleShop.ru\config.php on line 13

  • oleg

    Здравствуйте! Подскажите..При открытие магазина в броузере показывает

    Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in D:\USR\www\LifeExampleShop.ru\config.php on line 13

    getMenu(); ?>

  • Виталий

    У меня такая же проблема как у Егора 09.05.2015. Меню не выводится. Зато getMenu(); ?> появлятся и хэдер с футером.

    • user

      // в template\header.php заменить строчку //
      // getMenu(); ?> //
      // на //
      // getMenu(); ?> //

  • Лександр

    Статьи хорошие, но блин где нормальное оглавление по ним!?

  • Андрей

    Вылезает следующая ошибка:

    1
    Fatal error: Uncaught Error: Call to undefined function mysql_connect() in C:\Server\data\htdocs\testshop\config.php:13 Stack trace: #0 C:\Server\data\htdocs\testshop\index.php(8): require_once() #1 {main} thrown in C:\Server\data\htdocs\testshop\config.php on line 13

    Вычитал, что это из-за версии, т.к mysql сменили на mysqli

  • Артем

    Спасибо

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

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика