Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: MVC - вопрос по формированию html

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: для профи
dqdq
Отправлено: 25 Марта, 2013 - 16:39:58
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Создал (не знаю как назвать) в общем приложение на php на mvc

Создал свою карту маршрутизации

т.е. аналог .htaccess mod_rewrite

дошел до того места где контроллер создает модель или не создает, создает отображение и генерирует страницу

PHP:
скопировать код в буфер обмена
  1.     class Controller_Catalog extends Controller {
  2.    
  3.         public function __construct() {
  4.                 $this->model = new Model_Catalog();
  5.                 $this->view = new View();
  6.         }
  7.        
  8.         public function action_index(array $parameters) {
  9.                 $data = $this->model->get_data();              
  10.                 $this->view->generate(array('catalog_view.php'), 'template_view.php', $parameters);
  11.         }
  12.     }


Вот тут все понятно, это как бы логично:

что есть шаблон html который находится в файле template_view.php и в нем прописана вставка в определенном месте файла catalog_view.php

PHP:
скопировать код в буфер обмена
  1.     <!DOCTYPE html>
  2.     <html lang="ru">
  3.     <head>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=windows-utf-8">
  5.         <title>Главная</title>
  6.     </head>
  7.     <body>
  8.         <?PHP
  9.             foreach ($content_view as $view) {
  10.                
  11.                     include $view;//catalog_view.php
  12.                
  13.             }
  14.         ?>
  15.     </body>
  16.     </html>


Но вот допустим у меня шаблон состоит из множества отдельных модулий каждый из которых я хочу поместить в отдельный файл (допустим левоем меню, верхнее меню и контент)

Тогда при таком подходе у меня ничего выходить не будет

PHP:
скопировать код в буфер обмена
  1.     $this->view->generate(array('catalog_view.php', 'top_menu.php','left_menu.php'), 'template_view.php', $parameters);


Шаблон подключиться но все файлы подрубятся друг за другом в том порядке в котором указаны в массиве

Как сделать чтобы допустим есть шаблон вида

PHP:
скопировать код в буфер обмена
  1.     <!DOCTYPE html>
  2.     <html>
  3.         <head>
  4.             <title></title>
  5.             <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6.             <link rel="stylesheet" type="text/css" href="css/main.css">
  7.         </head>
  8.         <body>
  9.             <div class="header_panel"></div>
  10.             <div class="main">
  11.                 <div class="header">
  12.                     <div class="top_menu">
  13.    
  14.                 <?PHP
  15.                    
  16.                         include $content_view[1];//top_menu.php
  17.                    
  18.                 ?>
  19.        
  20.                     </div>
  21.                 </div>
  22.                 <div class="content">
  23.                    
  24.                         <div class="content_main">
  25.                             <div class="content_left">
  26.    
  27.                 <?PHP
  28.                    
  29.                         include $content_view[2];//left_menu.php
  30.                    
  31.                 ?>
  32.                                
  33.                             </div>
  34.                             <div class="content_right">
  35.                                
  36.                                 <div class="content_block">
  37.    
  38.                 <?PHP
  39.                    
  40.                         include $content_view[0];//catalog_view.php
  41.                    
  42.                 ?>
  43.                                 </div>
  44.                                
  45.                             </div>
  46.                             <div class="clear"></div>
  47.                         </div>
  48.                    
  49.                 </div>
  50.                 <div class="footer">
  51.                    
  52.                 </div>
  53.             </div>
  54.         </body>
  55.     </html>


Чтобы я мог указывать допустим в верхнее меню подрубить определенный файл, в контент другой, а в лувое меню еще чтото?

Какие шаблоны программирования используются?

Что посоветуете в данном случае?

В общем кто что понял из вопроса то и пишите (примеры ссылки и т.д.), я из вариантов выберу то что подходит так как обьяснить понятней не получается
 
 Top
DelphinPRO
Отправлено: 25 Марта, 2013 - 16:49:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




я так делал

главный шаблон

CODE (htmlphp):
скопировать код в буфер обмена
  1. <body>
  2.  
  3. <header>
  4.   <?= $this->printModules('top') ?>
  5. </header>
  6.  
  7. <article>
  8.   <?= $this->printContent() ?>
  9. </article>
  10.  
  11. <aside>
  12.   <?= $this->printModules('side') ?>
  13. </aside>
  14.  
  15. </body>


printModules() и printContent() - это методы класса view внутри которых делается подключение соответствующих файлов, исходя из переданных параметров.

printModules() - выводит все модули, установленные для данной позиции
printModule() - выводит конкретный модуль по его названию

какие модули выводить вкакой позиции - задается в админке


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 25 Марта, 2013 - 16:57:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Какие шаблоны программирования используются?

ты ж уже решил что MVC
Цитата:
я так делал

жумла фарева Улыбка


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DelphinPRO
Отправлено: 25 Марта, 2013 - 17:01:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




caballero пишет:
жумла фарева
да, идея оттуда )


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
ondefeat
Отправлено: 31 Марта, 2013 - 15:07:06
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




я вот даже специально зарегистрировался ради этой темы)
сейчас абсолютно те же вопросы.

попробую несколько развернуть мысль. рискну предположить, что автор, как и я, опирался на статью на Хабре.)

но, в общем-то, не в этом суть.

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

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

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

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

В общем, буду рад, если объясните чуть детальней дураку, что именно должны делать эти методы и как (или какие-то иные подходы), или развернете мысль на тему "чувак, ты не так понимаешь MVC".
 
 Top
vanicon
Отправлено: 31 Марта, 2013 - 15:18:51
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Например в yii есть виджеты, которые могут работать с моделью...


-----
Так было, так есть и так будет
 
 Top
DelphinPRO
Отправлено: 31 Марта, 2013 - 15:42:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




ondefeat пишет:
в этом случае представление должно работать с данными из БД

Ну а почему представление не может обратиться к модели за данными?
В моем случае так и делается. Зачем заморачиваться на парадигме? Мы отделили бизнес-логику от представления данных? да. Шаблоны отдельно, методы получения данных для них отдельно.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 31 Марта, 2013 - 16:59:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Ну а почему представление не может обратиться к модели за данными?

вообще то это наиболее логичный путь


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
digi
Отправлено: 31 Марта, 2013 - 18:35:52
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




есть такая еще такая штука, называется HMVC (Hierarhical MVC), это когда один котроллер, может вызывать другой контроллер, этот процесс называется "forward", также есть методика вызова контроллера из шаблона, в симфони выглядит так:

CODE (htmlphp):
скопировать код в буфер обмена
  1. {# app/Resources/views/base.html.twig #}
  2.  
  3. {# ... #}
  4. <div id="sidebar">
  5.     {{ render(controller('MyMenuBundle:Menu:main')) }}
  6. </div>


более подробно описано тут: http://symfony[dot]com/doc/master/bo[dot][dot][dot]ding-controllers

а конкретно для меню есть отличная библиотечка KnpMenu ;) а также бандл для неё: https://github[dot]com/KnpLabs/KnpMe[dot][dot][dot]ces/doc/index[dot]md

если шаблоны делаются на пхп, а не шаблонизаторе, тогда да действительно воникает соблазн понатолкать туда какой-то код, в том числе и связанный с прямым доступом к моделям... но это плохая практика ;) наиболее красивый и управляемый код, когда шаблон отрисовывает только уготованные для него данные, а не генерирует их сам для себя...
 
 Top
DeepVarvar Супермодератор
Отправлено: 31 Марта, 2013 - 18:50:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




caballero пишет:
вообще то это наиболее логичный путь
digi пишет:
наиболее красивый и управляемый код, когда шаблон отрисовывает только уготованные для него данные
Один сказал одно, другой другое Закатив глазки
digi пишет:
не генерирует их сам для себя
Он и не генерирует, он вызывает.
Давай называть все своими именами:
Шаблон - это то, что сливает контроллер после своей работы - забитый данными шаблон.
Лайоут - это шаблон уровнем абстракции на ступень выше - в нем происходят вызовы контроллеров (виджетов, плагинов и пр.), каждый из которых сливает в ответ забитый данными шаблон.
 
 Top
digi
Отправлено: 31 Марта, 2013 - 19:10:12
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




зачем так всё усложнять? Улыбка) методика "лейаутов" - это просто способ организации шаблонов, подробно описано тут: http://symfony[dot]com/doc/master/bo[dot][dot][dot]evel-inheritance
 
 Top
caballero
Отправлено: 31 Марта, 2013 - 19:11:05
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Шаблон - это то, что сливает контроллер после своей работы - забитый данными шаблон.

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 31 Марта, 2013 - 19:37:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




caballero пишет:
шаблон - это то что запускается контроллером. Рендеринг шаблона, в том числе подтягивание данных - не забота контроллера.
кроме того -не нужно смешивать понятия - бизнес-логика (которая в модели) и логика отрисовки страницы.
В чем я не прав? Где я сказал что контроллер рендерит шаблон? А "подтягивание" готовый данных происходит в лайоуте.
digi пишет:
зачем так всё усложнять?
По мне, так по ссылке большая сложность, чем пояснял я.
 
 Top
digi
Отправлено: 31 Марта, 2013 - 19:38:54
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)





DeepVarvar пишет:
По мне, так по ссылке большая сложность, чем пояснял я.

в 3-х строчках запутался? Улыбка) на самом деле всё просто там, просто надо понакомиться разок и всё Улыбка

(Отредактировано автором: 31 Марта, 2013 - 19:39:11)

 
 Top
DeepVarvar Супермодератор
Отправлено: 31 Марта, 2013 - 19:47:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




digi пишет:
на самом деле всё просто там
Учить еще один синтаксис - твига..
Я тебя так же с улыбкой могу отправить к докам по зенду Закатив глазки
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB