diff --git a/src/Controller/Action.php b/src/Controller/Action.php index 4ddeb58..2d8f6ad 100644 --- a/src/Controller/Action.php +++ b/src/Controller/Action.php @@ -47,10 +47,14 @@ class Controller_Action public $_shortcut; public $modulePrefix = ''; public $iconPath = ''; - public $path; - public function __construct () { - $this->path = new Widgets_PathMenu(); + // Для Widgets + public $view = null; + public $childNodes = array(); + public $ctrlValues = array(); + public $childViews = array(); + + function __construct() { } public function setUp() { @@ -149,7 +153,7 @@ class Controller_Action * 2. Использовать наследование чтобы добавить к старому обработчику новое поведение * @param $request Обьект запроса */ - public function execute1(HttpRequest $request) + public function preprocess(HttpRequest $request) { $action = self::ACTION_PREFIX . ucfirst($request->getAction()); if (!method_exists($this, $action)) { @@ -165,7 +169,7 @@ class Controller_Action public function execute(HttpRequest $request) { - $result = $this->execute1($request); + $result = $this->preprocess($request); if (!empty($result)) { $this->view = $result; } @@ -283,12 +287,6 @@ class Controller_Action return $result->export(); } - // Для Widgets - public $view = null; - public $childNodes = array(); - public $ctrlValues = array(); - public $childViews = array(); - public function setView($name) { $this->view = $this->getView($name); @@ -371,44 +369,4 @@ class Controller_Action { $this->_getActionPath()->getPath($this, ($action) ? $action : $request->getAction()); } - - function addFilePathToPath($filePath, $type) - { - $pathToItem = $this->directoryPath($filePath, $type, 'default'); - $this->path->addMenuItems($pathToItem['path']); - } - - function directoryPath($path, $type, $action) - { - $path = empty($path) ? '/' : $path; - - $base = new Path($path); - $parts = $base->getParts(); - - $_path = '/' . implode('/', $parts); - - $rs = new Model_Resources($this->db); - $section_path = $rs->getSectionByPath($_path, $type); - - $pathMenu = new Widgets_PathMenu(); - $pathMenu->addTitle('title'); - $modules = ['image' => 'images','page' => 'pages','document' => 'documents','media' => 'videos']; - - while ($section_path->id_parent) { - $_path = '/' . implode('/', $parts); - $pathMenu->addMenuItem( - forceUrl($this->nUrl('', array('module'=>$modules[$type],'action' => $action, 'mode' => 'ajax', 'path' => $_path))), - $section_path->title - ); - $section_path = $rs->getSectionById($section_path->id_parent); - array_pop($parts); - } - - $pathMenu->addMenuItem( - forceUrl($this->nUrl('', array('module'=>$modules[$type],'action' => $action, 'mode' => 'ajax', 'path' => '/'))), - $this->moduleTitle - ); - return $pathMenu->getItemsReverse(); - } - } diff --git a/src/Controller/Front.php b/src/Controller/Front.php index 38b1a40..d317e2a 100644 --- a/src/Controller/Front.php +++ b/src/Controller/Front.php @@ -70,10 +70,10 @@ class Controller_Front extends Controller_Action $module->db = $this->db; // Не для всех приложений нужно вести лог действий // Ведение лога - $logger = $this->loadClass(FRAMEWORK_PATH . '/filter/actionlogger.php', $module, 'Filter_'); + $logger = $this->loadClass(__DIR__ . '/../Filter/ActionLogger.php', $module, 'Filter_'); $logger->before = $this->loadSettings(Shortcut::getUrl('logger', $name)); // Управление доступом - $module->access = $this->loadClass(FRAMEWORK_PATH . '/filter/actionaccess.php', $logger, 'Filter_'); + $module->access = $this->loadClass(__DIR__ . '/../Filter/ActionAccess.php', $logger, 'Filter_'); $module->access->access = $this->loadSettings(Shortcut::getUrl('access', $name)); $module->setUp(); diff --git a/src/Controller/Model.php b/src/Controller/Model.php deleted file mode 100644 index 4c1cbf9..0000000 --- a/src/Controller/Model.php +++ /dev/null @@ -1,520 +0,0 @@ -table->setHeader - */ - public $tableSchema = null; - public /*.array.*/$formSchema = array(); - - public $menu; - public $table; - - protected /*.string.*/$useModel; - protected /*.string.*/$itemModel; - - public function __construct() - { - parent::__construct(); - $this->menu = new Widgets_PageMenu(); - $this->table = new Widgets_ReactListTable(); - } - - /** - */ - function setUp() { - parent::setUp(); - $this->table->addMenuItem($this->aUrl('delete'), 'удалить', false, 'all', 'btn-danger', 'remove'); - } - - function saveParameters(HttpRequest $args, $list) { - foreach ($list as $item) { - $args->session()->set(array($this, $item), $args->get($item)); - } - } - - protected function getJSONList(/*.Model_Mapper.*/ $model, HttpRequest $request) { - $result = array(); - $this->saveParameters($request, array('size','page','desc', 'key')); - - $result['list'] = $model->findAll($request, $request->get('ref')); - $result['size'] = $model->getCount($request, $request->get('ref')); - return json_encode($result); - } - - protected function getCSV(Model_Mapper $model, HttpRequest $request, $title) { - $ref = $request->get('ref'); - - $list = $model->findAll($request, $request->get('ref')); - - header('Content-Type: text/csv; charset=utf-8'); - header('Content-Disposition: attachment; filename='.$title.'.csv'); - - echo "\xEF\xBB\xBF"; //UTF-8 BOM. - - $output = fopen('php://output', 'w'); - if (is_resource($output)) { - foreach ($list as $row) { - fputcsv($output, (array)$row,';'); - } - } - } - - /** - * Удаление строк из таблицы - */ - public function actionDelete(HttpRequest $request) - { - $model = $this->getModel($this->useModel); - // Почему table_item ??? - $list = ($request->get('table_item')) ? $request->get('table_item'): $request->get('id'); - $model->deleteList($list); - -// return $this->getJSONList($model, $request); - return json_encode(array('result' => 'ok')); - } - - /** - * Ответ на запрос по поиску - */ - public function actionSearch(HttpRequest $request) - { - $model = $this->getModel($this->useModel); - $model->addFilter($model->requestToSQL($request, $this->formSchema)); - - return $this->getJSONList($model, $request); - } - - /** - * Список элементов - */ - public function actionList(HttpRequest $request) - { - $model = $this->getModel($this->useModel); - - if ($request->get('filter')) { - $data = new Collection(); - $data->import($request->get('filter')); - $model->addFilter($model->requestToSQL($data, $this->formSchema)); - } - return $this->getJSONList($model, $request); - } - - public function actionCSV(HttpRequest $request) - { - $model = $this->getModel($this->useModel); - $title = $request->get("title"); - if(!$title){ - $title = "noname"; - } - return $this->getCSV($model, $request, $title); - } - - private function setFormSchema() - { - $model = $this->getModel($this->useModel); - $ui = new Model_UIMapper($model); - - $this->formSchema = $ui->getFormSchema(); - } - - /** - * Сохранение формы - */ - function beforeSave(/*Model*/ $item, HttpRequest $request) - { - if (empty($this->formSchema)) { - $this->setFormSchema(); - } - // Сделать отображение Формы в обьект и обратно - foreach ($this->formSchema as $key => $conv) { - list($value, $type) = $conv; - $item->$value = call_user_func(array('Primitive', 'to_' . $type), $request->get($key)); // Здесь нужно преобразовывать тип значения - } - } - - /** - * Обновление формы - */ - function formUpdate(Form_Form $form, HttpRequest $request) { - $form->setValues($request); - } - - /** - * Загрузка формы - */ - function beforeLoad(/*.Model_Model.*/$item, Form_Form $form) - { - if (empty($this->formSchema)) { - $this->setFormSchema(); - } - // Вставка значений из данных в форму - // Отображение обьекта в поля формы - $form->fill($item, $this->formSchema); - } - - function beforeFirstLoad(Form_Form $form) - { - - } - - // Проверка ввода - protected function validate(Validator_Validator $validator, Collection $request) - { - } - - /** - * Действие для проверки формы - */ - public function actionValidate($request) - { - $validator = new Validator_Validator(); - $validator->addRuleList($this->schema); - - // Действия до проверки формы - $this->validate($validator, $request); // <--| - $validator->validate($request); // --| - // Проверка формы - if (!$validator->isValid()) { - return json_encode($validator->getErrorMsg()); - } - return json_encode(true); - } - - /** - * Инициализация формы - */ - protected function formSetup(Form_Form $form, $id = null, $ref = null) - { - if (empty($this->schema)) { - $model = $this->getModel($this->useModel); - $ui = new Model_UIMapper($model); - $schema = $ui->getEditSchema(); - - $form->addFieldList($schema); - } else { - $form->addFieldList($this->schema); - } - } - - /** - * Добавление - */ - public function actionAdd(HttpRequest $request) - { - // {{{ тоже может быть один ref или несколько - $ref = $request->get('ref'); - $this->addParameter('ref', $ref); // Добавляет параметр в url - /// }}} - - // Проверка - $validator = new Validator_Validator(); - $validator->addRuleList($this->schema); - - // Действия до проверки формы - $this->validate($validator, $request); // <--| - $validator->validate($request); // --| - // Проверка формы - if (!$validator->isValid()) { - return json_encode(array('result'=>'fail','errors'=>$validator->getErrorMsg())); - } - // Нужен тест для формы - $model = $this->getModel($this->useModel); - $className = $model->className; - $item = new $className(); - - // Сохраняем значение в базе данных - $item->id = $request->get('id'); - // Если таблица связана с другой таблицей - if ($request->get('ref') && $model->reference[1]) { - $ref_id = $model->reference[1]; - $item->$ref_id = $request->get('ref'); - } - - // Подготовка к сохранению - $this->beforeSave($item, $request); // Сюдаже и истрия переходов - // nextId ??? или выход или новая форма для создания новости - - $id = $model->saveDB($item, $request); - - // Для страницы со списком id -> идентификатор родительской таблицы !!?? -// $request->set('id', $request->get('ref')); - if ($request->get('apply')) { - $request->setAction('form'); - return (string) $this->forward('actionForm', $request); - } - //$request->setAction('index'); - $result = array('result'=>'ok'); - if($id){ - $result['action'] = forceUrl($this->nUrl('add', array('id' => $id, 'ref' => $request->get('ref')))); - } - return json_encode($result); - } - - /** - * Заголовок - */ - private function setTitlePath($ref) - { - if ($ref) { - $model = $this->getModel($this->useModel); - if (is_array($model->reference) && $model->reference[0]) { - $refmodel = $this->getModel($model->reference[0]); - try { - $parent = $refmodel->findById($ref); - $this->path->addTitle($parent->getTitle()); // Заголовок к подписям путей - } catch (Exception $e) { - // Не найден заголовок потому что неправильно определен родительский элемент - } - } - } - } - - /** - * Форма для редактирования - */ - public function actionForm(HttpRequest $request) - { - $this->getActionPath($request); - $ref = $request->get('ref'); - $this->addParameter('ref', $ref); // Добавляет параметр в url - $this->setTitlePath($ref); - - $model = $this->getModel($this->useModel); - $form = new Form_Form(); // Показываем форму - $form->header = 'Редактирование записи'; - $this->formSetup($form, $request->get('id'), $request->get('ref')); // Инициализация формы - - $list = $request->get('table_item'); - $id = ($list[0]) ? $list[0] : $request->get('id'); - // - $tpl = $this->formPage($form, $request); - if ($id) { // Редактирование - $form->action = forceUrl($this->nUrl('add', array('id' => $id, 'page' => $this->getPageId($request)))); // action Свойство формы - $item = $model->findById($id); - // Загрузка формы - $this->beforeLoad($item, $form); - }else{//Создание нового элемента - $this->beforeFirstLoad($form); - } - return json_encode($tpl); - } - - /** - */ - function tableSetup(Widgets_ListTable $table, $id = null, $ref = null) - { - // FIXME: После замены везде $tableSchema -> table->setHeader удалить! - if ($this->tableSchema) { - $table->setHeader($this->tableSchema); - } else { - // Настройка таблицы отображения по схеме данных - $model = $this->getModel($this->useModel); - $ui = new Model_UIMapper($model); - $ui->hidden = $table->hidden; - - $schema = $ui->getTableSchema(); - $schema[0]['action'] = forceUrl($table->getFirstItem()); - - $table->setHeader($schema); - } - } - - /** - */ - public function actionDefault(HttpRequest $request) - { - $this->getActionPath($request, 'index'); - // Такое мета действие наверное можно вынести в отдельный класс - return $this->metaActionIndex($request, array($this, 'tableSetup'), $this->aUrl('list')); - } - - /** - * Страница по умолчанию - */ - public function metaActionIndex(HttpRequest $request, $setup, $list) - { - // может быть одно ref или несколько - // {{{ история переходов - $ref = null; - if ($request->get('ref')) { - $ref = $request->get('ref'); - } else if ($request->session()->get('ref')) { - $ref = $request->session()->get('ref'); - } - - $request->session()->set('ref', $ref); - $this->addParameter('ref', $ref); - // }}} - $this->setTitlePath($ref); - - $tpl = new stdClass(); - - // Помощники действий - $this->callHelpers($request); - // Таблица - if ($request->session()->get(strtolower(get_class($this)))) { - $session = $request->session()->get(strtolower(get_class($this))); - if (isset($session['view'])) { - $this->table->setView($session['view']); - } - $this->table->setData('state', array( - 'page' => $session['page'], - 'size' => $session['size'], - 'desc' => $session['desc'])); - - //$this->table->setData('sorter', $session['key']); - if (isset($session['desc'])) { - $this->table->setData('desc', $session['desc']); - } - } - - call_user_func($setup, $this->table, $request->get('id'), $ref);// --> Эквивалент formSetup - $this->table->setAction($list); - if (!$this->table->getData('module')) { - $this->table->setData('module', strtolower($this->useModel)); - } - $tpl->menu_path = $this->path->getItems(); - - $this->table->makeData(); - $tpl->table = array('data' => $this->table->data); - $tpl->menu = $this->menu->menu->getItems(); - $tpl->path = $this->path->getItems(); - - return json_encode($tpl); - } - - /** - */ - public function actionSetup(HttpRequest $request) { - $left = explode(",", $request->get('left')); - $right = explode(",", $request->get('right')); - - $request->session()->set(strtolower(get_class($this)), - array('view' => array('left' => $left, 'right' => $right), 'page' => 1, 'size' => 0, 'desc' => 'asc', 'key' => false)); - - return $this->forward('actionIndex', $request); - } - - /** - */ - protected function formPage($form, $request, $template = 'form') { - $view = new stdClass();//$this->getView($template); - $view->form = $form; - $form->action = forceUrl($this->nUrl('add', array('page' => $this->getPageId($request)))); // Действие для формы - - $view->path = $this->path->getItems(); - $view->back = $this->path->getPrev(); - return $view; - } - - function _getActionPath() { - return new Controller_State('index'); - } - - // Тоже убрать в метод Controller_Model - function getActionPath(HttpRequest $request, $action = null) { - $this->_getActionPath()->getPath($this, ($action) ? $action : $request->getAction()); - } - - - function parse_params($expression) { - $expression = htmlspecialchars_decode($expression); - $offset = strpos($expression, '?'); - $url = parse_url($expression); - - $arguments = array(); - if ($offset === false) { - $path = $expression; - } else if (is_int($offset)) { - $path = substr($expression, 0, $offset); - $query = substr($expression, $offset+1); - parse_str($query, $arguments); - } - return $arguments; - } - - public function actionFormPage(HttpRequest $request) { - //$tpl = $this->getView('formpage', 'View_Top'); - - $view = $this->getView('formpage', 'View_Top'); - - $params = $this->parse_params($request->get('params')); - - -// $model = $this->getModel($this->useModel); - $form = new Form_Form(); // Показываем форму - $form->header = 'Редактирование записи'; - $this->formSetup($form, $request->get('id'), $request->get('ref')); // Инициализация формы - /* - $ui = new Model_UIMapper($model); - $schema = $ui->getEditSchema(); - $form->addFieldList($schema); - */ - - $list = $request->get('table_item'); - $id = ($list[0]) ? $list[0] : $request->get('id'); - -// $tpl = $this->formPage($form, $request); - - $view->setView('form', $form); - $view->action = forceUrl($this->nUrl('addpage', array('ref' => $params['id']))); // Действие для формы - -// $view->menu_path = $this->path->getItems(); - $view->back = ''; - return $view; - -// return $tpl; - } - - /* Для поддержки редактрования на сайте */ - public function actionAddPage(HttpRequest $request) - { - // {{{ тоже может быть один ref или несколько - $ref = $request->get('ref'); - $this->addParameter('ref', $ref); // Добавляет параметр в url - /// }}} - $validator = new Validator_Validator(); - $validator->addRuleList($this->schema); - - // Действия до проверки формы - $this->validate($validator, $request); // <--| - $validator->validate($request); // --| - // Проверка формы - if (!$validator->isValid()) { - return $validator; - } - - // Нужен тест для формы - $model = $this->getModel($this->useModel); - $className = $model->className; - $item = new $className(); - - // Сохраняем значение в базе данных - $item->id = $request->get('id'); - // Если таблица связана с другой таблицей - if ($request->get('ref') && $model->reference[1]) { - $ref_id = $model->reference[1]; - $item->$ref_id = $request->get('ref'); - } - - // Подготовка к сохранению - $this->beforeSave($item, $request); // Сюдаже и истрия переходов - $model->saveDB($item, $request); - - return null; - } -} diff --git a/src/Controller/Service.php b/src/Controller/Service.php index 87aa3bd..46f96aa 100644 --- a/src/Controller/Service.php +++ b/src/Controller/Service.php @@ -36,8 +36,6 @@ class Controller_Service */ public function getModel($name) { - require_once 'mapper/mapper.php'; - require_once ($this->getModelPath ($name)); $modelName = $name . "Mapper"; $model = new $modelName (); diff --git a/src/Database/PDOStatement.php b/src/Database/PDOStatement.php index 4df5db7..0cbd058 100644 --- a/src/Database/PDOStatement.php +++ b/src/Database/PDOStatement.php @@ -1,6 +1,6 @@