делаю один движок и немного путаюсь в структуре да и в названиях

tf

крылья рулят
делаю один движок и немного путаюсь в структуре да и в названиях

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

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

модули - это программый код заключенный в классы, который умеет обрабатывать информацию, в своем распоряжении он имеет
объект базы данных привязанный к одной таблице данных, которому он может приказать сохранить информацию (массив данных), прочить информацию (информация может хранится в разном виде, поэтому он может ее преобразовывать как на входе так и на выходе)
объект обработчика форм - может обработать данные формы (валидность и тп), может вернуть js код обновления представления формы, может вернуть xhtml элемента формы


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

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

закладывая всю одинаковую логику в обстранные классы контрллеров, модулей, и объектов базы данных мы получим
PHP:
# php файл конфигурируемый главный контролер, подготавливает данные для представления
$controler = new cmfAjaxControler();
cmfControler('controler_edit');  

$controler_edit = new controler_edit();
$controler_edit->setId(1);

$controler->addControler($controler_edit);
$controler->run();

$this->assing('controler_edit', $controler_edit->getView());

list($form, $data) = $controler_edit->current()->main;
$this->assing('form', $form);
$this->assing('data', $data);
PHP:
# представление
<?=$controler_edit->htmlStartForm() ?>
<?=$form->getHtml('phone') ?>
<?=$form->getHtml('email') ?>
<?=$form->getHtml('icq') ?>
<?=$controler_edit->htmlEndForm() ?>
PHP:
# контроллеры, модули, объект базы данных
class controler_edit extends abstract_controler_edit {

	protected function init() {
		parent::init();
		$this->addObject('main',	new modul_edit());

		// url
		$this->setSubmitUrl(cmfPages::getMain());
	}

}

class modul_edit extends abstract_modul_edit {

	protected function init() {
		parent::init();

		$db = new db_edit();
		$this->setDb($db);

		// формы
		$form = $this->getForm();
		$form->addObject('phone',	new cmfFormText(array('max'=>255, '!empty'=>1)));
		$form->addObject('email',	new cmfFormText(array('max'=>255, '!empty'=>1)));
		$form->addObject('icq',	new cmfFormText(array('max'=>255, '!empty'=>1)));
	}

}

class db_edit extends abstract_db_edit {

	protected function getTable() {
		return db_main;
	}

}
вопрос насколько эта логика удобна, крива, можно сделать ее более удобной
 

AmdY

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

AmdY

Пью пиво
Команда форума
тогда я бы не связывал контроллеры между собой, сделав их равноправными и реализовал бы функцию Controller->_forward() которая создаёт и запускает новый контроллер, а передачу данных между контролами сделал на основе Registry
допустим страница со статьями в админке
admin-article/
//выбираем пункты меню и ложим их в реестр Registry::set('menu', Menu::getList('admin'));
$menuController = new AdminMenuController();
$menuController->getMenu();

$articleController = new AdminArticleController();
$articleController->list();

в методе AdminArticleController::list вызовем метод, чтобы обогатить нашу менюшку пунктами с категориями статей
$this->_forward('admin-article/rich-menu/');
и соответственно происходит
$controller = new AdminArticleController();
$controller->richMine(); // выбираем категории и обогащием менюшку
получаем удобную навигацию по категориям статей
пользователи
статьи
----о компании
----про хомячков
настройки
 

tf

крылья рулят
ну да прикольно с менюшкой, но про равноправие контролеров ничего не понял.
 
Сверху