Document

Блог на php для самых маленьких

Привет, я php backend разработчик и по совместительству преподаю php в основном для детей и не только. Последний проект над которым я работал, был сайт votpusk.ru. Я не считаю себя гуру, тем не менее знаний у меня достаточно что бы направить на путь истинный начинающих php программистов.

Для кого эта публикация?

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

Цель публикации

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

Начнем-с

Для начала нужно будет создать несколько папок и файлов как показано на скрине: (blog.com это корневая папка проекта у вас может быть другое название, остальное как на скрине).

Файловая структура

Теперь когда файлы и папки созданы, давайте откроем файл index.php в браузере. Пропишем название нашего сайта и через слэш имя нужного файла у меня это будет выглядеть так: http://blog.com/index.php Запустив файл мы увидим белый экран так как в файле пока нет кода. Файл index.php запускается по умолчанию если мы не указываем название другого файла. Поэтому мы можем исправить нашу ссылку на http://blog.com и увидим точно такой же результат.

Читайте также:  Open exe

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

Теперь нужно прикинуть какие страницы будут на нашем сайте. Изначально планируем «Главную», «Контакты», и собственно страницу со статьями. Так же нужно продумать возможность вывода статей по категориям.

Теперь откроем файл index.php в редакторе. Зная что мы попадаем на этот файл всегда как нам узнать когда нужно подключать файл с кодом главной страницы, а когда например страницы с контактами?

В php есть механизм позволяющий передавать значения из адресной строки в переменную $_GET которая является массивом (array). Теперь добавляя к http://blog.com/ строку типа ?c=contact&a=index мы получим в массиве $_GET два значения, которые запишем в переменные. Обратите внимание, что значения разделены знаком &. Почитать о $_GET

Теперь то что мы получили в переменной $controller будем считать именем подключаемого файла нужной страницы, но с условием что будем добавлять к имени строку ‘Controller’. Подключаемые файлы будем хранить в папке /controllers.

Создадим файл contactController.php для страницы «Контакты» в папке /controllers. Так же можем создать файлы и для главной (mainController.php), и для страницы со статьями (articlesController.php). Переменную $action пока не трогаем, она нам понадобиться позже.

Теперь хочу пояснить для чего нам значение в переменной $action. У нас есть пока что только одна страница для вывода всех статей. Но если вдруг нам понадобиться еще страница для вывода каждой статьи по отдельности, по нашей логике мы создадим два файла, что само собой не хорошо. Т.е. 100 файлов для 100 страниц и непонятно какой файл за что отвечает и для поиска нужного файла мы крутим колесико вечность. Как вариант мы можем все файлы которые относятся к статьям поместить в папку articles/ это бы помогло нам быстрее находить файлы с нужным кодом, но количество файлов это никак не уменьшит.

Решением данной ситуации я вижу поместив в наш файл articlesController.php две или более функции и вызывать их в зависимости от значения переменной $action. При этом предлагаю немного модифицировать имя функции добавив к нему параметр $_GET[‘c’]. По итогу файл articlesController.php будет выглядеть вот так:

Теперь давайте напишем код, который анализирует значения переменной $controller и подключает нужный нам файл(контроллер). А так же анализируя переменную $action вызывает нужную функцию. Договоримся что если $_GET[‘c’] содержит пустое значение в $controller по умолчанию у нас будет main, ну а $action — index. По итогу файл index.php будет выглядеть вот так: ( empty file_exists include_once function_exists )

 /*Если в $_GET['c'] не пустое значение запишем в переменную $action */ if (! empty($_GET['a'])) < $action = $_GET['a']; >//Сформируем путь к нашему контролеру $controllerPath = "controllers/Controller.php"; //Сформируем название вызываемой функции $functionName = $controller . '_' . $action; //Если такой контролер существует подключим его инклудом if (file_exists($controllerPath)) < include_once $controllerPath; //Если такая функция существует вызовем её if (function_exists($functionName)) < $data = $functionName(); >>

Теперь перейдя по адресу http://blog.com/?c=contact&a=index мы подключим файл contactController.php и выполним функцию сontact_index().

Отлично хотел бы сказать я, но это еще не все. Обычно html разметку и php код следует размещать в разных файлах. Код отдельно, а разметку отдельно. А это значит что для каждой такой функции нам нужен будет отдельный файл вида. Который мы поместим в папку views/ далее в папку по имени контролера, например views/contact/, а файл назовем по имени $action. Создадим файлы вида и папки для контролеров contactController и mainController.

Теперь заполним кодом сами контролеры и файлы видов:

/controllers/contactController.php и views/contact/index.php

Добро пожаловать!

Добро пожаловать!

Теперь обратите внимание на файл layout.php что в папке views/. Он нужен для того что бы вынести в него общий для сайта код. Например, шапку сайта, меню, логотип и т.д. и внутри общего шаблона подключить конкретные файлы видов. Скопируйте код файла layout.php

         

Супер Блог

Шапка

СтрелкаГлавная

СтрелкаПопулярные

СтрелкаЖивотные

СтрелкаРастения

СтрелкаКонтакты

/$action.php"; ?>

Теперь напишем функцию, которая будет подключать общий файл вида, а в нем и конкретный. Для этого в папке /lib создайте файл viewLib.php и поместите в него следующий код:

 //Подключаем наш общий вид include_once 'views/layout.php'; >

и добавим в файл index.php подключение этого файла и вызов функции

 if (! empty($_GET['a'])) < $action = $_GET['a']; >$controllerPath = "controllers/Controller.php"; $functionName = $controller . '_' . $action; if (file_exists($controllerPath)) < include_once $controllerPath; if (function_exists($functionName)) < $data = $functionName(); //Вызываем функцию render($controller, $action, $data); >> 

Теперь если скопировать все картинки из моей папки img в вашу и перейти по адресу http://blog.com/?c=contact&a=index мы подключим файл contactController, вызовем функцию contact_index(), дальше произойдет вызов функции render() в которой подключиться общий шаблон с разметкой, а в общем шаблоне конкретный файл вида. То же самое произойдет если поменять ссылку на http://blog.com/?c=main&a=index только файлы теперь будут другие и соответственно мы увидим другую страницу.

Десерт

Приступим к созданию страниц для вывода статей. Для на чала создадим файл db.txt в корне проекта. Формат файла должен быть следующим

id-1|категория|текст статьи -*- id-2|категория|текст статьи

1|животные| 

Собакай

Текст статьи про собаку

-*- 2|животные|

Суслик

Текст статьи про суслика

-*- 3|животные|

Олень

Текст статьи про оленя

-*- 4|растения|

Кульбаба

Текст статьи про кульбабу

-*- 5|растения|

Айстра

Текст статьи про айстру

-*- 6|растения|

Бавовник

Текст статьи про бавовник

Контроллер articlesController заполним следующим кодом

 $result = []; foreach ($items as $item) < //Разделяем данные одной статьи id категорию и текст $article = explode('|', $item); //Отбор по категориям if ($category === 'популярные' || $article['1'] === $category) < //Формируем конечный масив со статьями $result[] = [ 'id' =>$article['0'], 'category' => $article['1'], 'text' => $article['2'] ]; > > //Передаем данные в шаблон return ['articles' => $result, 'category' => $category]; > function articles_view() < $id = $_GET['id']; $text = file_get_contents('db.txt'); $items = explode('-*-', $text); $result = NULL; foreach ($items as $item) < $article = explode('|', $item); if ($id == $article['0']) < $result = [ 'id' =>$article['0'], 'category' => $article['1'], 'text' => $article['2'] ]; > > return ['article' => $result]; > 

Файлы вида views/articles/index.php и views/articles/view.php

Итого

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

Источник

Пример MVC в php. Четвертая статья. Проектируем блог

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

Проектируем базу данных

Пример MVC в php. Четвертая статья. Проектируем блог

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

А также создать бд можете, воспользовавшись sql-патчем:

CREATE TABLE `category` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50), `is_active` TINYINT(1), PRIMARY KEY (`id`) ); CREATE TABLE `article` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `id_category` INT(10), `title` VARCHAR(255), `small_text` TEXT, `text` TEXT, `date_create` DATE, `is_active` TINYINT(1), PRIMARY KEY (`id`) ); CREATE TABLE `comments` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `user_name` VARCHAR(50), `text` TEXT, `date_create` DATETIME, `is_active` TINYINT(1), PRIMARY KEY (`id`) ); ALTER TABLE `article` ADD CONSTRAINT `article_fk1` FOREIGN KEY (`id_category`) REFERENCES category(`id`);

Проектируем структуру блога

  • Создадим модели для таблиц
  • Создадим контроллеры и экшены
  • Создадим шаблон и вьюхи(отображения)

Разработка функционала

Теперь приступим к самой интересной части – разработке функционала, начнем с главной страницы – контроллер index, экшен index, тут мы ни чего делать не будем, а просто выведем текст, то есть просто будем подключать нужную вьюху:

Давайте создадим контроллер, который будет отвечать за вывод всех статей для определенный категории — Controller_Category. Мы будем передавать в него ID категории и делать по нему запрос:

// экшен function index() < $idCategory = (isset($_GET['id'])) ? (int)$_GET['id'] : false; if($idCategory)< $select = array( 'where' =>"is_active = 1 AND id_category = $idCategory", // условие 'order' => 'date_create DESC' // сортируем ); $model = new Model_Article($select); // создаем объект модели $articles = $model->getAllRows(); // получаем все строки >else < $articles = false; >$this->template->vars('articles', $articles); $this->template->view('index'); >

Во вьюхе для этого контроллера и экшена сделаем вывод заголовков, короткого описания и ссылки на полный текст статьи.
И наконец, в последнем контроллере(Controller_Article) реализуем получение конкретной статьи по ее ID:

function index() < $idArticle = (isset($_GET['id'])) ? (int)$_GET['id'] : false; if($idArticle)< $select = array( 'where' =>"id = $idArticle" // условие ); $model = new Model_Article($select); // создаем объект модели $article = $model->getOneRow(); // получаем статью >else < $article = false; >$this->template->vars('article', $article); $this->template->view('index'); >

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

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

Источник

Оцените статью