[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MVC, архитерктура системы.
Rapp_colince
Пишу систему в рамках MVC.
Алгоритм системы:
Принимается запрос, передается контроллеру.
Указывается, что вывод идет в буфер ob_start()
Контроллер его парсит, и, в зависимости от элементов, создает массив с названием модулей и методов. Затем подключает соответствующие модули (это классы), вызывает их методы, передавая им нужные параметры, которые пришли в строке URL. Модули делают свою работу. Если нужно что-то вывести, то они выводят средствами smarty в буфер.
Контроллер закончил свою работу.
Буфер сохраняется в переменную ob_end_clean();

Далее, index.php передает переменную с контентом в smarty и выводит его.

Проблемы:
1. Нельзя сделать шаблон модулей. Например, есть у меня модуль Сотрудники и модуль отделы. При просмотре отдела (модуль отделы) нужно посмотреть всех сотрудников этого отдела (а это уже модуль сотрудники). В контроллере я правильно формирую массим с модулями и методами, но чувствую, что не хватает так называемого контроллера модулей на уровне дизайна. Т.е., мне нужно между отделом и списком сотрудников поставить две горизонтальные полосы, или любой другой HTML. В каком месте это делать?
2. Проблема с тем, что печать может идти только в одно место. Т.е., в начале она идет в буфер, из него - в переменную, а из нее в одно место (между header и footer). Мне нужен виджет, который будет расположен в header. Есть модуль и метод, которые его напечатают. Как в шаблоне указать, чтобы он печатался именно туда. Как отойти от схемы сумбурной печати в буфер а из него строго в одно место?
Спасибо! Ниже привожу коды основных файлов.
Апач настроен так, что любой запрос обращается к index.php

index.php
<?php
header('Content-Type: text/html; charset=utf-8');
require_once $_SERVER['DOCUMENT_ROOT'].'/conf.php';
require_once(DOCUMENT_ROOT.'/dispatcher.php');

ob_start();
$dispatcher = new Dispatcher();
$dispatcher -> moduleConstructer();
$dispatcher -> moduleWork();

$mainContent = ob_get_contents();
ob_end_clean();

$smarty->assign('mainContent', $mainContent);
if($dispatcher->from == 'ajax'){
$smarty->display($smarty->template_dir.'ajaxResult.tpl');
}else{
$smarty->assign('menu', $_admMenu);
$smarty->display($smarty->template_dir.'index.tpl');
}
?>
dispatcher.php
<?php
class
Dispatcher {
public $address = '';
public $from = 'site';
public $modules = array();

// Работаем URL
public function __construct() {
$address = $_SERVER['REQUEST_URI'];

if(preg_match('/^\/ajax(\/.*)$/i',$address, $addressNew)){
$this->from = 'ajax';
$address = $addressNew[1];
}

if(in_array($address, array('index.php', 'index.htm', 'index.html', 'index.shtml'))) $address = '/';
$this->address = $address;
}

// Конструируем массив модулей и действий
public function moduleConstructer(){
$modules = $this->modules;

if($this->address == '/'){
$modules['main'] = array();
}


// Слова
if($this->address == '/words'){ // Список
if($this->from == 'site'){
$modules['words']['_addForm'] = array();
}
$modules['words']['_list'] = array();
}
if($this->address == '/words/add'){ // Добавление связки
$modules['words']['_add'] = array();
}
if(preg_match('/^\/trns\/edit\/(\d+)$/', $this->address, $wordTrnsId)){ // Редактирование перевода
$modules['words']['_trnsEdit'] = array('wordTrnsId' => $wordTrnsId[1]);
}
if(preg_match('/^\/words\/delete\/(\d+)$/', $this->address, $ligamentId)){ // Удаление связки
$modules['words']['_delete'] = array('ligamentId' => $ligamentId[1]);
}
if($this->address == '/words/wordTrnsTagSet'){ // Присваиваем связке тег
$modules['words']['wordTrnsTagSet'] = array();
}
$this->modules = $modules;
}

// Обрабатываем каждый модуль
public function moduleWork(){
$modules = $this->modules;
if(isset($modules) && is_array($modules)){
require_once(DOCUMENT_ROOT.'/modules/securityManager/module.php');
$securityManager = new SecurityManager();

foreach($modules as $moduleName => $action){
if($moduleName != '/'){

if(is_array($action)){
foreach($action as $actionName => $parameters){
$securityManager->moduleCheckPermission($moduleName, @$actionName);
$this->moduleRun($moduleName, $actionName, $parameters);
}
}
}
else echo 'File with the module is missing.<br>';
}
}
else echo 'Name of the module is empty.<br>';
}

// Непосредственно, запускаем модуль и действие
private function moduleRun($moduleName, $actionName, $parameters){
$modulePath = DOCUMENT_ROOT.'/modules/'.$moduleName.'/module.php';
if(file_exists($modulePath)){
require_once($modulePath);
$$moduleName = new $moduleName();
$$moduleName -> $actionName($parameters);
}else{
echo 'File with module (<b>'.$moduleName.'</b>) and action (<b>'.$actionName.'</b>) do\'nt exists.<br>';
}
}
}

?>
index.tpl
{* Smarty *}
<html>
<
body>
<
div id="msg"{if !empty($err) && $err=='true'} style="color: #FF0000;"{/if}>{$msg}</div>
<
div id="ajaxMsg" align="center">Див для сообщений из Аякса</div>
<
div id="test"></div>
<
table class="main" cellpadding="0" cellspacing="0">
<
tr>
<
td class="menu" valign="top">
</
td>
<
td id="mainContent" valign="top">{$mainContent}</td>
</
tr>
</
table>
</
body>
</
html>




Спустя 1 день, 5 часов, 17 минут, 43 секунды (31.10.2010 - 22:12) Guest написал(а):
Изначально не правильно спроектировано.
Модуль - это автономная единица в системе, которая отвечает за определённый набор функциональности без своей области данных.
То что Вы называете модулем, явно говорит что это объект.
UML и проектирование могут внести ясность в ваш проект.
Разбейте ваш проект по прецедентам использования, возможно они и подскажут Вам какие контроллеры создавать. В YII используется одна функция = один контроллер, со своим шаблоном или шаблонами. Все контроллеры (шаблоны) включаются на единый каркас - шаблон системы.
Регистрация модулей или компонентов производится в роутере (маршрутизаторе).

Спустя 1 минута, 28 секунд (31.10.2010 - 22:13) Guest написал(а):
Как отойти от схемы сумбурной печати в буфер а из него строго в одно место?
-- В smarty есть большой набор фильтров и функций.

Спустя 12 часов, 54 минуты (1.11.2010 - 11:07) Rapp_colince написал(а):
Цитата (Guest @ 31.10.2010 - 23:12)
Изначально не правильно спроектировано.

Не понял, что вы описываете, но, видимо, это нормально.
Что можно почитать, про архитектуру web приложений? Наверняка же все эти задачи давно решены и идеальная архитектура уже придумана и описана.
Только на русском, и, желательно не "Искусство программирования" в 7-ми томах smile.gif

Спустя 1 час, 29 минут, 8 секунд (1.11.2010 - 12:36) Maas написал(а):
 В smarty есть большой набор фильтров и функций.


Насколько корректно в модели MVC часть функционала перекладывать на шаблонизатор (Smaarty). Дело в том, что сам по себе смарти предлагает неплохой функционал

Спустя 4 часа, 18 минут, 37 секунд (1.11.2010 - 16:55) Guest написал(а):
Цитата (Rapp_colince @ 1.11.2010 - 08:07)
Цитата (Guest @ 31.10.2010 - 23:12)
Изначально не правильно спроектировано.

Не понял, что вы описываете, но, видимо, это нормально.
Что можно почитать, про архитектуру web приложений? Наверняка же все эти задачи давно решены и идеальная архитектура уже придумана и описана.
Только на русском, и, желательно не "Искусство программирования" в 7-ми томах smile.gif

Спустя 55 секунд (1.11.2010 - 16:56) Guest написал(а):
Цитата (Maas @ 1.11.2010 - 09:36)
 В smarty есть большой набор фильтров и функций.


Насколько корректно в модели MVC часть функционала перекладывать на шаблонизатор (Smaarty). Дело в том, что сам по себе смарти предлагает неплохой функционал

Буква V и означает view за что и отвечает smarty.

Спустя 4 дня, 3 часа, 2 секунды (5.11.2010 - 19:56) Sanchopansa написал(а):
Для ознакомления с моделью MVC я бы посоветовал почитать про ZendFramework или про создание компонентов для CMS джумла. Там ты сможешь почерпнуть достаточно инфы про MVC.
Удачи smile.gif

Спустя 4 дня, 23 часа, 17 минут, 1 секунда (10.11.2010 - 19:13) Maas написал(а):
Цитата
Буква V и означает view за что и отвечает smarty.


Это понятно. Так-же понятно, что в MVC не надо смешивать эти три буквы, а перекладывая часть функционала в Smarty мы это делаем

Спустя 1 час, 1 минута, 14 секунд (10.11.2010 - 20:14) Guest написал(а):
Фтопку смарти.


_____________
Быстрый ответ:

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