/** * Информация о разделе * * @return void */ public function viewAction() { if (isset($this->_params['categoryid']) && ($CategoryInfo = $this->Categories->getCategoryInfo($this->_params['categoryid']))) { $CategoryInfo['acl'] = array('mvc' => $this->_usersession->UserData['acl']['mvc']['control']['categories'], 'category' => $this->_usersession->UserData['acl']['categories'][$CategoryInfo['categoryid']]); $this->view->assign("CategoryInfo", $CategoryInfo); $this->view->assign("Header", $CategoryInfo['categoryname']); $MoveForm = new Phorm_Form('forms/control/categories.xml', 'move'); $MoveForm->setAction($this->view->siteUrl() . '/control/categories/move/categoryid/' . $CategoryInfo['categoryid']); $this->view->assign('MoveForm', $MoveForm); if (!empty($CategoryInfo['moduleid'])) { $Resource = new Phorm_Resource($CategoryInfo['moduleid']); $options = $Resource->getGridOptions('category'); $options['url'] = '/control/resource/index/moduleid/' . $CategoryInfo['moduleid'] . '/categoryid/' . $CategoryInfo['categoryid'] . '/section/category/'; $this->view->assign('ResourceDataTable', $this->view->DataGrid('ResourceDataTable', $options)); } /** * Обновление дерева разделов */ if (isset($this->_params['tree']) && $this->_params['tree'] == 'reload') { $js = 'window.parent.trees.categories.reload(\'' . $this->view->siteUrl() . '/control/?categoryid=' . $CategoryInfo['categoryid'] . '\');'; $this->_boot->jquery->addOnload($js); } } else { // Ошибка 404... надо что-то придумать } }
/** * Определяем массив модулей и дергаем родительский конструктор * * @param mixed $spec * @param array $options */ public function __construct($spec, $options = null) { require_once 'Phorm/Resource.php'; $Resource = new Phorm_Resource(); $pairs = isset($options['multioptions']) && is_array($options['multioptions']) ? $options['multioptions'] : array(); $options['multioptions'] = $pairs + $Resource->getModulesListAsPairs(); parent::__construct($spec, $options); }
/** * Рисуем кнопку * * @param string $id Id HTML-элемента * @param mixed $value Значение элемента * @param array $params Массив параметров, передаваемых в JS-скрипт инициализации UI-компоненты * @param array $attribs Массив атрибутов HTML-элемента * @return string */ public function selectResource($id, $value = null, array $params = array(), $attribs = null) { $translate = $this->view->translate()->getTranslator(); $id_button = $id . '_button'; $hiddenname = isset($params['multiple']) && $params['multiple'] == 1 ? $id . '[]' : $id; if (is_string($value)) { $value = array($value); } /** * Определяем параметры JQueryUI Dialog */ $dialog_params = array('title' => $translate->_('Выбор материалов сайта')); /** * Добавляем кнопочку, инициализирующую диалог с DataGrid * При загрузке диалога устанавливаем в него идентификатор кнопки, по которому из грида будем искать место для вставки записей * @see /application/configs/resources/grids.xml[section=select] */ $button = $this->view->Button($id_button, $translate->_('Выбрать')); $js = '$("#' . $id_button . '").click(function(){ $("<iframe src=\\"' . $this->view->BaseUrl() . '/control/resource/index/section/select/\\"></iframe>").load(function(){ $(this).contents().find("body").attr("rel","' . $id_button . '"); }).phormDialog(); })'; $this->jquery->addOnLoad($js); /** * Формируем скрытое поле, выполняющее роль JS-шаблона и Устанавливаем значения */ $xhtml = '<ul class="ui-phorm-multi-list">' . PHP_EOL; if (count($value) > 0) { $Resource = new Phorm_Resource(); foreach ($value as $resourceid) { if ($ResourceInfo = $Resource->getResourceBaseInfo($resourceid)) { $xhtml .= '<li class="ui-widget-content">' . '<span class="title"><a href="#">' . $ResourceInfo['resourcename'] . '</a></span>' . '<input type="hidden" name="' . $hiddenname . '" value="' . $ResourceInfo['resourceid'] . '" />' . '<a href="#" class="delete ui-corner-all ui-button ui-state-default" title="' . $translate->_('Удалить') . '"><span class="ui-icon ui-icon-close"></span></a>' . '</li>' . PHP_EOL; } } } $xhtml .= '<li class="hidden ui-widget-content">' . '<span class="title"></span>' . '<input type="hidden" name="' . $hiddenname . '" disabled="disabled" />' . '<a href="#" class="delete ui-corner-all ui-button ui-state-default" title="' . $translate->_('Удалить') . '"><span class="ui-icon ui-icon-close"></span></a>' . '<div class="clear"></div>' . '</li>' . PHP_EOL; $xhtml .= '</ul>' . PHP_EOL; /** * Вешаем событие на кнопки удаления */ $js = '$("#' . $id_button . '").next("ul").find("li .delete").on("click",function(){ if(confirm("' . $translate->_('Удалить') . '?")) $(this).parent("li").remove(); return false; });'; $this->jquery->addOnLoad($js); /** * Сортировка выбранных элементов */ if (isset($params['sortable']) && $params['sortable'] == 1 && isset($params['multiple']) && $params['multiple'] == 1) { $js = '$("#' . $id_button . '").next("ul").sortable().find("li").css({cursor:"move"});'; $this->jquery->addOnLoad($js); } /** * Возвращаем кнопку и текущие элементы */ return $button . $xhtml; }
public function getData($widgetid) { // Определяем количество возвращаемых строк if (isset($this->_options["rowsperpage"]) && (int) $this->_options["rowsperpage"] > 0) { $this->_options["rowsperpage"] = (int) $this->_options["rowsperpage"]; } else { $this->_options["rowsperpage"] = $this->getPerPage(); } // Получаем список материалов $Resource = new Phorm_Resource(); $Resource->setModule($this->_params["module"]); $out = array(); $out["resources"] = $Resource->getResourcesList($this->_options + array("widgetid" => $widgetid, "getdepends" => true)); $out["paginator"] = $Resource->getPaginator(array("perpage" => $this->_options["rowsperpage"], "widgetid" => $widgetid)); return $out; }
/** * Генерация идентификатора материала * * @return void */ public function generateAction() { if ($this->_request->isXmlHttpRequest() && isset($this->_params['txt'])) { $this->_helper->json($this->Resource->getUidGenerated($this->_params['txt'])); } else { die('error'); } }
/** * Браузер материалов сайта * * @return void */ public function resourcesAction() { $this->Resource = new Phorm_Resource(); $options = Phorm_Config::xml('grids/control/browser.xml', 'resources'); if ($this->_request->isXmlHttpRequest()) { $categories = $this->Resource->getCategoriesPathsByModule(); foreach ($categories as $category) { $options['headings']['categoryid']['optiondata'][] = array('categoryid' => $category['categoryid'], 'categoryname' => str_repeat(' ', $category['clevel'] * 3) . $category['categoryname']); } //$options['headings']['categoryid']['optiondata'] = $this->Resource->getCategoriesListByModule(); //$options['headings']['categoryid']['optiondata'] = $categories; $rows = $this->Resource->getResourcesList($this->_params); $paginator = $this->Resource->getPaginator(); $this->_helper->json(Phorm_JQuery_DataGrid::data($rows, $paginator, $options)); } else { $this->view->assign('ResourcesDataTable', $this->view->DataGrid('ResourcesDataTable', $options)); } }
/** * Главная страница * * @return void * @todo Подумать над более красивым решением проблемы с escape * @todo Что за die?!!!! */ public function indexAction() { if ($this->_request->isXmlHttpRequest()) { if (isset($this->_params['categoryid'])) { $Categories = new Phorm_Categories(); $this->view->setEscape('trim'); $Menu = $this->view->navigation()->menu($Categories->getNavigationMenu($this->_params['categoryid']))->render(); die($Menu); } } else { $Mvc = new Phorm_Mvc(); $this->view->assign('MvcTree', $this->view->navigation()->menu($Mvc->getNavigationMenu())->render()); $Resource = new Phorm_Resource(); $this->view->assign('ModulesList', $Resource->getModulesList()); $Categories = new Phorm_Categories(); $this->view->setEscape('trim'); $Menu = $this->view->navigation()->menu($Categories->getNavigationMenu())->render(); $this->view->setEscape('htmlspecialchars'); $this->view->assign('CategoriesTree', $Menu); } }
/** * Проверяет, имеет ли пользователь доступ к текущей странице на основе параметров запроса * * @return boolean */ protected function isAllow() { // Проверяем доступ к MVC-компоненте if (!isset($this->_usersession->UserData['acl']['mvc'][$this->_params['module']][$this->_params['controller']][$this->_params['action']])) { return false; } // При форвардах игнорируем проверку доступа к разделу и материалу if (isset($this->_params['isfwd']) && $this->_params['isfwd'] == true) { return true; } // Проверяем доступ к разделу if (isset($this->_params['categoryinfo'])) { if ($this->_usersession->UserData['acl']['categories'][$this->_params['categoryinfo']['categoryid']] <= 200) { return false; } } // Проверяем доступ к материалу if (isset($this->_params['resourceinfo'])) { $Resource = new Phorm_Resource(); return $Resource->isAllowedAction('view', $this->_params['categoryinfo']['categoryid'], $this->_params['resourceinfo']['creator']); } return true; }
/** * Конструктор * * @return void */ public function __construct() { parent::__construct($this->_moduleid); }
/** * Matches a user submitted path with parts defined by a map. Assigns and * returns an array of variables on a successful match. * * @param string $path Path used to match against this routing map * @return array|false An array of assigned values or a false on a mismatch */ public function match($path, $partial = false) { $params = array(); $Mvc = new Phorm_Mvc(); // Проверяем существование идентификатора материала в пути // @todo Сделать возможность конфигурирования паттернов урлов материалов if (preg_match("#^(/.*?)(/([а-яa-z0-9_-]+)\\.html)?\$#iu", $path, $pathinfo)) { // Если мы получили идентификатор материала, то устанавливаем CategoriesController if (isset($pathinfo[3])) { $params["module"] = "default"; $params["controller"] = "categories"; $params["action"] = "index"; $params["resourceid"] = $pathinfo[3]; $params["categorypath"] = $pathinfo[1] == "/" ? "/" : $pathinfo[1] . "/"; $params["categorypath"] = $pathinfo[1] == "/" ? "/" : $pathinfo[1] . "/"; // Иначе получаем модуль, контроллер и действие из родительского math } else { $params = parent::match($path, $partial); // Проверяем существование MVC-ресурса в базе if ($params['mvcinfo'] = $Mvc->getMvcInfo($params)) { $params['WidgetSetId'] = $params['mvcinfo']['widgetssetid']; //print_r($params); return $params; // Если MVC-ресурс не найден, то устанавливаем CategoriesController } else { $params["module"] = "default"; $params["controller"] = "categories"; $params["action"] = "index"; $params["categorypath"] = preg_match("#/\$#", $pathinfo[1]) ? $pathinfo[1] : $pathinfo[1] . "/"; } } } // После всех экзекуций у нас должны остаться только ресурсы для CategoriesControllerа $Categories = new Phorm_Categories(); $Categories->setModule($params["module"]); // Проверяем существование раздела if ($CategoryInfo = $Categories->getCategoryInfoByPath($params["categorypath"])) { $params["categoryinfo"] = $CategoryInfo; $params["WidgetSetId"] = $CategoryInfo["widgetssetid"]; // Если мы на главной странице раздела и есть материал для замещения, то переопределяем идентификатор материала if (!isset($params["resourceid"]) && $CategoryInfo["mainresourceid"] > 0) { $params["resourceid"] = $CategoryInfo["mainresourceid"]; } // Проверяем существование материала в текущем разделе и модуле по его идентификатору if (isset($params["resourceid"])) { $Resource = new Phorm_Resource(); $Resource->setModule($params["module"]); $options = array("categoryid" => $CategoryInfo["categoryid"], "moduleid" => $CategoryInfo["moduleid"]); if ($ResourceInfo = $Resource->getResourceInfo($params["resourceid"], $options)) { $params["module"] = "default"; $params["controller"] = $CategoryInfo["modulecontroller"]; $params["action"] = "view"; $params["resourceinfo"] = $ResourceInfo; $params["mvcinfo"] = $Mvc->getMvcInfo($params); $params["WidgetSetId"] = $ResourceInfo["widgetssetid"]; //print_r($params); return $params; } } else { $params["mvcinfo"] = $Mvc->getMvcInfo($params); //print_r($params); return $params; } } // Все, что не смогло вернуться выше, попадает в ErrorController notfoundAction $params["module"] = "default"; $params["controller"] = "error"; $params["action"] = "notfound"; $params["mvcinfo"] = $Mvc->getMvcInfo($params); $params["WidgetSetId"] = $params["mvcinfo"]["widgetssetid"]; return $params; }
/** * Готовим данные для подгрузки в таблицу Datagrid * * @param array $data * @param Zend_Paginator $paginator * @param mixed $params */ public static function data(array $data, $paginator, $params = array()) { if ($params instanceof Zend_Config) { $params = $params->toArray(); } $front = Zend_Controller_Front::getInstance(); $boot = $front->getParam('bootstrap'); $view = $boot->getResource('View'); $translate = $boot->getResource('Translate'); $rows = array(); foreach ($data as $key => $row) { foreach ($row as $field => $value) { // Перевод $value = $translate->_($value); // Простые значения $rows[$key][$field] = $value; // Пустые значения if ($value == '' || is_null($value)) { $rows[$key][$field] = '—'; } // Заменяем url if (isset($params['headings'][$field]['url'])) { $url = self::replaceField($params['headings'][$field]['url'], $data[$key]); $rows[$key][$field] = '<a class="ui-phorm-grid-label" href="' . $view->getSiteUrl() . urldecode($url) . '">' . $value . '</a>'; } // Картинка if (isset($params['headings'][$field]['image'])) { $url = self::replaceField($params['headings'][$field]['image'], $data[$key]); //$data[$key][$field] = '<img src="'.$front->getBaseUrl().$url.'" align="left" hspace="4" /> ' . $value; $rows[$key][$field] = '<img src="' . $front->getBaseUrl() . $url . '" align="left" hspace="4" title="' . $value . '" /> '; } // Чекбоксы if (isset($params['headings'][$field]['checkbox'])) { $rows[$key][$field] = '<input type="checkbox" name="' . $field . '[]" class="' . $field . '" value="' . $row[$params['headings'][$field]['checkbox']] . '" />'; } // Заменяем действия if (isset($params['headings'][$field]['actions'])) { $rows[$key][$field] = ''; foreach ($params['headings'][$field]['actions'] as $action => $opts) { if (!empty($opts)) { $url = isset($opts['url']) ? self::replaceField($view->getSiteUrl() . $opts['url'], $data[$key]) : '#'; $title = isset($opts['title']) ? $translate->_($opts['title']) : ''; $icon = isset($opts['icon']) ? '<span class="ui-icon ui-icon-' . $opts['icon'] . '"></span>' : ''; $text = isset($opts['text']) ? '<span class="ui-button-text">' . $opts['text'] . '</span>' : ''; $iconclass = isset($opts['text']) ? 'ui-button-text-icons' : ''; $class = isset($opts['class']) ? $opts['class'] . ' ' : ''; $rows[$key][$field] .= ' <a href="' . $url . '" class="' . $class . $action . ' ui-corner-all ui-button ' . $iconclass . ' ui-state-default" title="' . $translate->_($title) . '">' . $icon . $translate->_($text) . '</a>'; } } } // Замена подстрок if (isset($params['headings'][$field]['replace'])) { $search = $params['headings'][$field]['replace']['search']; $replace = $params['headings'][$field]['replace']['replace']; if (is_array($replace)) { foreach ($replace as $k => $v) { $replace[$k] = $translate->_($v); } } else { $replace = $translate->_($replace); } $rows[$key][$field] = str_replace($search, $replace, $data[$key][$field]); } // Форматирование даты if (isset($params['headings'][$field]['dateformat'])) { $rows[$key][$field] = $data[$key][$field] > 0 ? date($params['headings'][$field]['dateformat'], $data[$key][$field]) : '—'; } // Фильтры (простые функции с одним параметром в виде текущего значения) if (isset($params['headings'][$field]['filters']) && is_array($params['headings'][$field]['filters'])) { foreach ($params['headings'][$field]['filters'] as $filter) { if (function_exists($filter)) { $rows[$key][$field] = call_user_func($filter, $data[$key][$field]); } } } } } // @todo Здесь нам надо отловить поля, которые есть в headings, но нет в списке данных и убрать actions в запросах // $headings = array(); $position = 0; foreach ($params['headings'] as $id => $val) { if (isset($val['label'])) { /** * Пропускаем невидимые столбцы */ if (isset($val['visible']) && (bool) $val['visible'] === false) { continue; } /** * Устанавливаем заголовок столбца */ $val['label'] = $translate->_($val['label']); $val['id'] = $id; /** * Чекбоксы */ if (isset($val['checkbox'])) { $val['label'] = '<input type="checkbox" name="' . $id . '_all" class="' . $id . '_all" title="' . $translate->_($val['label']) . '" />'; } /** * Порядок сортировки */ if (isset($val['position'])) { $position = $val['position']; foreach ($headings as $y => $z) { if ($y >= $position) { unset($headings[$y]); $headings[++$y] = $z; } } } else { $position++; } $headings[$position] = $val; } } ksort($headings); $headings = array_values($headings); /** * Накидываем справочники на поисковые формы */ $search = array(); if (isset($params['search']) && is_array($params['search'])) { foreach ($params['search'] as $id => $val) { // Переводчик if (isset($val['label']) && trim($val['label']) != '') { $val['label'] = $translate->_($val['label']); } // Список модулей if ($val['type'] == 'SelectModule') { $Resource = new Phorm_Resource(); $val['optiondata'] = $Resource->getModulesListAsPairs(); // Список разделов } elseif ($val['type'] == 'SelectCategory') { $Categories = new Phorm_Categories(); if (isset($params['moduleid'])) { $val['optiondata'] = $Categories->getCategoriesPathsByModule($params['moduleid']); } else { $val['optiondata'] = $Categories->getList(); } } // Перевод справочников if (isset($val['optiondata']) && is_array($val['optiondata'])) { foreach ($val['optiondata'] as $k => $v) { if (is_string($v)) { $val['optiondata'][$k] = $translate->_($v); } } } $val['id'] = $id; $search[] = $val; } } return array("pager" => array("page" => $paginator->current, "pages" => $paginator->pageCount, "found" => $paginator->totalItemCount, "displayingStart" => $paginator->firstItemNumber, "displayingEnd" => $paginator->lastItemNumber, "perPage" => $paginator->itemCountPerPage), "headings" => $headings, "search" => empty($search) ? null : $search, "rows" => $rows); }
/** * Возвращает список материалов по тегу * * @param int $tagid Id тега * * @return array */ public function getSearchResults($tagid) { $Resource = new Phorm_Resource(); return $Resource->getResourcesList(array("tags" => array($tagid))); }