[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите в реализации логики представления
Myrow
Здравствуйте. Помогите в реализации логики вывода представления (контента) (я новичок в программировании, стараюсь, но нужен совет).
Допустим, существует несколько скриптов, разложенных (физически) по папкам – articles/article.php и blogs/blog.php, которые отвечают за получение статьи и поста блога из базы. На данный момент в этих же файлах инициализируется Смарти и передается код в тпл-файлы. Теперь мне нужно разрозненные php-файлы выводить в одном шаблоне (то есть собрать сайт воедино), то есть вынести визуализацию из этих файлов в один файл шаблона. К файлам article.php и blog.php ниже через require подключается файл template.php. И вот тут встает вопрос – как выводить код из article.php в template.php? Завернуть код в функцию и вызывать ее в шаблоне не получится, так как по ходу выполнения кода могут отправляться http-заголовки, а в теле шаблона уже будет другой html-код, и возникнет ошибка headers already sent. Единственное что смог пока придумать – инициализировать и давать уникальное значение специальной переменной $variable в скриптах articles.php и blogs.php, вывод в смарти вырезать из этих файлов в файл view.php, в этом файле на основе значения $variable выводить соответствующее подключение тпл-файла смарти, а к файлу template.php инклюдить уже view.php, Но такой костыль мне не нравится. Как можно сделать лучше?
Игорь_Vasinsky
пересмотрите архитектуру вашего приложения.
познакомьтесь с паттерном MVC

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Myrow
Цитата (Игорь_Vasinsky @ 22.02.2013 - 20:46)
пересмотрите архитектуру вашего приложения.
познакомьтесь с паттерном MVC

Цитата
пересмотрите архитектуру вашего приложения.

Уже поздно!) Надо закругляться с этим проектом.
Если следовать вашему совету - при модели MVC мне все равно не очень понятно, как передавать "результат" работы кода в "середину" html-каркаса так, чтобы код выполнялся до вывода в шаблон, и не возникало проблем наподобие той, которая возникла у меня.
Игорь_Vasinsky
Цитата
как передавать "результат" работы кода в "середину" html-каркаса так, чтобы код выполнялся до вывода в шаблон


$tpl = '<div>{MARK}</div>';

$data = 100%33;

echo strtr($tpl, array('{MARK}'=>$data));



Запись из моего журнала, давнишняя, - только для понимания - про что я говорю

Решил я малость потрепаться про широко-популярный паттерн MVC (MODEL-VIEW-CONTROLLER), который практикуют и здесь, да и много кто ещё))

Кого озадачил - поясню: этот паттерн(он же шаблон проектирования) используется для создания сайтов, удобство его в том что используя его вы будете разделять логику(работу PHP) от вывода(шаблона).

Хочу рассказать о своём способе его использования, а неорденарен он тем, что в нём я использую и лёгкий намёк на Smarty (это уж в WIKI гляньте...).

Сначала о структуре такого сайта.
Цитата
Корень
       |_____Папка: admin
       |                                |_____файл: config.php
       |                                |_____файл: variables.php
       |
       |_____Папка: moduls
       |                                |_______Папка: administarte
       |                                |                                     |___________модули панели администрирования
       |                                |_______файл: home.php
       |                                |_______ ..............................
       |                                |_______ файл: contacts.php
       |_____Папка: controllers
       |                                   |____________Папка: administrate
       |                                   |                                    |___________контроллеры и подконтроллеры панели администрорования
       |                                   |____________контроллеры и подконтроллеры модулей, например: c.home.php (первая "с." - говорит мне что это контроллер)
       |_____Папка: templates
       |                                   |_______Папка: default
       |                                                                      |______Папка: tpl (шаблоны tpl по названию модулей)
       |                                                                      |______Папка: js (js- применяемые в этом шаблоне)
       |                                                                      |______Папка: images (картинки применяемые в этом шаблоне) 
       |_____Папка: images (тут хранится графика для админки)
       |_____Папка: js (js - для админки)
       |_____Папка: uploads (для загружаемых файлов)
       |_____Папка: libs (функции)
       |_____Папка: logs(логи - ошибки, статистика)
       |_____файл: index.php
       |_____файл: .htaccess
       |_____файл: robots.txt
       |_____файл: favicon.ico

Так... тепер поясняю:

Как вы обратили внимание - папки images и js - есть и в корне и в templates/default, я придерживаюсь такой иерархии, так как в тех папках, что находяться в корне - я храню графику и скрипты, необходимые для адинки, а те что в папке templates - default - это всё файлы шаблона "default" - удобно это тем, что - оч просто создать новый шаблон (создать папку "new_templte" в папке templates) - и данные нового шаблона - хранить в его папке. А для админки не зачем каждый раз переписывать шаблон, он есть и его хватает.

Далее файл: variables.php - тут я определяю большую часть переменных, GET, POST, SESSION и т.д
файл: config.php - настройки подключения к БД, константы Debug (bool) - отладка/продакшн, mod_rewrite(ЧПУ/SEO)
в папке libs - здесь я храню все функции, одна функция - один файл по названию функции (f.getLinks.php)

Итак, как построен алгоритм работы такого сайта:

в корне лежит index.php - вот он один и тянет весь сайт (т.е. все ссылки проходят через него), а организовано это так:
- конструкция switch/case - обеспечивает подключение модулей
-сами модули инклудят (именно в таком порядке!)
- функции, необходимые для работы модуля
- контроллер модуля (или подконтроллер)
- шаблон шапки
- шаблон тела
-шаблон футера

Вывод этих 3-х шаблонов заносится в буфер, назначается переменная для данных в буфере и буфер очищается.

В шаблонах содержаться метки вида {*TITLE*}, {*TOP_MENU*}, {*BANNER*}

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

Функция str_replace - тем для меня удобна - что в качестве аргументов может принимать массивы - массив меток <> массив данных из БД, тем самым - мне хватает - подготовить массивы и один раз "прореплесить" - после этого уже вывод переменной с изменёнными данними из буфера (окончательный вывод статики всей страницы)

В дальнейшем, при сождании нового шаблона - просто вставляю такие метки в нужные мне места - и всё. уаля.....
(например - я в админки создал новое меню - всё в БД, в том числе там же хранится и метка этого меню {*MY_MENU*}, и если я куда нить поставлю эту метку - то он замениться на это созданное меню).

Админка моей CMS содержит массу настроек (и будет содержать ещё больше, так там например можно даже редактировать php и др. файлы, закрывая разделы для доступа - на время работы, и оснащено это дло редактором с подсветкой синтаксиса), чтоб меньше лазить в панель управления хостингом.
Написать модули для такой структуры - раз плюнуть (всё по полочкам, всё по нотам), добавили модуль - добавили подраздел в админку - для управления.

Вот в принципе и всё. Так же хочу добавит, что можно в контроллере - тоже устроить switch-case подконтролерам - тогда точно всё по полочкам!

Удачь!

P.S файлы .htaccess и robots.txt - помогают мне ограничить доступ к одельным файлам и директориям не только от куль-хаккеров, но и от не нужной индексации.


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.