Шаги к MVC или как правильно (или неправильно) сделать проект

Alexandre

PHPПенсионер
Как тебе идея, когда представление выполняет ф-ции схемы (основы) и несет инфу о всех включаемых моделях (агрегация)? Как тебе идейка о наследовании представлений?
идея хорошая, остается осмыслить на трезвую голову
 

_RVK_

Новичок
Как тебе идея, когда представление выполняет ф-ции схемы (основы) и несет инфу о всех включаемых моделях (агрегация)? Как тебе идейка о наследовании представлений?
идея хорошая, остается осмыслить на трезвую голову
Угу, а я вот, хоть и трезвый, тоже не понял. Можно чуть подробнее, особенно в плане реализации?
 

Макс

Старожил PHPClub
Модель почти всегда выполняет именно операции с БД, то мне нужно будет при вызове каждого метода передавать в параметрах по крайней мере __LINE__. Это неудобно.
можно делать запросы к БД не напрямую (mysql_query) а через специальный метод класса. Этот метод и будет проверять ошибки и делать error_log, а номер строки можно определить через debug_backtrace()
 

_RVK_

Новичок
Макс
Спасибо, упустил из виду эту функцию.

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

Screjet

Новичок
В шаблоне обычно описана схема отображения, на примере ПХП :)
(file1.html)
PHP:
<table>
	<tr>
		<td><?=$this->include1->HTML?></td>
		<td><?=$this->include2->HTML?></td>
	</tr>
</table>
<div align=center><?=$this->include3->HTML?></div>
Но есть отдельный файл где хранится информация, что для этого отображения есть три включения: include1, include2, include3.
Загрузчик вместе с загрузкой шаблона читает этот файл, и определяет, что должны быть созданы соотвествующие включения (другие загрузчики) и какая модель отвечает за это отображение. Именно эта модель выполняет всю полезную работу.
(Далее рекурсивно все это загружается)
Все создаваемые модели обрабатывают инфу, и все имеют интерфейс на модель на уровень выше.
Это была агрегация.

Далее: наследование.
Для каждого шаблона (загрузчика) можно описать родителя, в котором единажды должен быть вызов отображения чайлда, типа
PHP:
<div id="main_area"><?=$this->child->HTML?></div>
и загрузчик указывает для своей модели родителя.

Когда все загружено и отработано можно делать вывод, например include "file1.html" если без родителя,
Иначе запрос на вывод передается родителю.
 

_RVK_

Новичок
Это всего лишь блоки в шаблоне. Старо как мир. Если нужно чтоб каждый блок обрабатывал отдельный скрипт. В главном скрипте просто include все скрипты.
 

Screjet

Новичок
Да, идея примерно такая же. Только одно "но": вывод должен быть конролируемым (согласно MVC).
 

_RVK_

Новичок
Screjet
Дык, контролируй, кто тебе не дает. На то он и Контроллер, для каждого блока, свой. Включается инклюдом. Каждый Контроллер обрабатывает свой блок. Иль я чего не понял?
 

Screjet

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

Если бы в ПХП было типа $CUSTOM_GLOBALS = include_namespace('file.php');
тогда бы и ООП не очень был бы нужен.
 

_RVK_

Новичок
Screjet
Да нет, я не против ООП. Я не пойму в чем смысл указаывать Контроллер в шаблоне. Напиши Контроллер-контейнер, который будет сам подкружать нужные Контроллеры для определенных блоков, и контролировать их работу... Можешь даже в БД потом указывать, какой блок каким скриптом обрабатывается...
 

Screjet

Новичок
Я не пойму в чем смысл указаывать Контроллер в шаблоне.
Не в шаблоне, а в неком контейнере (как ты ниже описал). Смысл в том, что каждому контейнеру соответствует URL сайта (via reWrite).
 

Макс

Старожил PHPClub
Diesel
Я не пойму в чем смысл указаывать Контроллер в шаблоне.
Кстати, сейчас читаю Мартина Фаулера "PEAA", он пишет что часто Предстваление и Контроллер очень тесно связаны. Как пишет автор, отделение контроллера от представления не играет такой важной роли как отделение представления от модели.
Хотя и считает что в веб-приложениях отделение контроллера от представления может оказаться полезным.
 

_RVK_

Новичок
соответствует URL сайта
В смысле? Ты хотел сказать путь к скрипту?
Например чем твое решение, отличается от моего?
Шаблон:
main.tpl.html
PHP:
<table> 
    <tr> 
        <td>{NEWS:tpl=news.tpl.html}td> 
        <td>{CONTENT:tpl=content.tpl.html}</td> 
    </tr> 
</table>
news.tpl.html
PHP:
<table> 
    <tr> 
        <td>{DATA}td> 
        <td>{TITLE}</td> 
    </tr> 
</table>
content.tpl.html
PHP:
{CONTENT}
Как видишь, в основной шаблон включаются 2 других.
Теперь 3 файла которые их обрабатывают.
main.php
PHP:
<?php
  $t = new phptpl('index.tpl.html','templates/');
  $t->build();
  include 'news.inc.php';
  include 'content.inc.php';
  $t->parse();
  print $t->result();
?>
news.inc..php
PHP:
<?php
  //Модель для новостей
  $news = new news();
  $res = $news->getNews();

  $t->clear('root->NEWS');
  while ($data = $res->feth())  {
       $t->settag('root->NEWS->DATE',$data['date']);
       $t->settag('root->NEWS->TITLE',$data['title']);
       $t->parse('root->NEWS');
  }
?>
content.inc..php
PHP:
<?php
  //Модель для контента
  $content = new content();
  $text = $content->getContent();

   $t->settag('root->CONTENT->CONTENT',$text);
   $t->parse('root->CONTENT');
?>
Это упрощенный вариант с обычными инклюдами, но можно и класс написать, которому указывать каким скриптом какой блок парсить и какие параметры передавать.
 

_RVK_

Новичок
Макс
Где почитать можно?

А вообще это да. Я вот CMS пишу по старинке, в одном скрипте контроллер и представление. Просто лень юзать шаблонизатор для простых таблиц. Да и Смарти тому пример. Часть логики в шаблоне....

-~{}~ 19.11.04 13:26:

эти 2 комментария только для первых 2-х строк кода или для всего файла
Для первых строк конечно. :)
 

Макс

Старожил PHPClub
Diesel
я книгу заказывал
http://www.books.ru/shop/books/156126

В сети есть англоязычный pdf-вариант
 

_RVK_

Новичок
Кстати, по сути 3 шаблона можно заменить одним:
PHP:
<table> 
    <tr> 
        <td>
{NEWS:begin}
<table> 
    <tr> 
        <td>{DATA}td> 
        <td>{TITLE}</td> 
    </tr> 
</table>
{NEWS:end}
        </td> 
        <td>
{CONTENT:begin}
{CONTENT}
{CONTENT:end}
</td> 
    </tr> 
</table>
 

Screjet

Новичок
Как в твоем варианте агрегировать/наследовать шаблоны?

Ненужно заменять одним вариантом, это не дает никаких преимуществ.
 
Сверху