/** * Возвращает данные виджета, для передачи в шаблон * * @return array */ public function getData($widgetid) { $out = array(); if (isset($this->_options["subtitle"])) { $out["subtitle"] = $this->_options["subtitle"]; } if (isset($this->_params["categoryinfo"]["categoryid"])) { $Categories = new Phorm_Categories(); if (isset($this->_options["categories"]) && $this->_options["categories"] != "null") { $fromcategories = explode(",", $this->_options["categories"]); } else { $fromcategories = array(); } $out["categories"] = $Categories->getDependedCategoriesList($this->_params["categoryinfo"]["categoryid"], $fromcategories); } return $out; }
/** * Главная страница * * @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 void */ public function shiftAction() { if (isset($this->_params['direction']) && isset($this->_params['categoryid']) && ($CategoryInfo = $this->Categories->getCategoryInfo($this->_params['categoryid']))) { $redirect = '/control/categories/view/categoryid/' . $CategoryInfo['categoryid'] . '/'; if ($this->Categories->isAllowedAction('shift', $CategoryInfo['categoryid'])) { if ($this->Categories->changePosition($CategoryInfo, $this->_params['direction'])) { return $this->composeSuccessMessage('Изменения внесены', $redirect . 'tree/reload/'); } else { return $this->composeErrorMessage('Невозможно перенести выбранный раздел', $redirect); } } else { return $this->composeErrorMessage('Недостаточно прав для переноса раздела', $redirect); } } else { return $this->composeErrorMessage('Раздел с указанным Id не найден', '/control/categories/'); } }
/** * Возвращает дерево видимых в системе разделов * * @return array * @todo Заменить eval на рекурсию */ private function getCategoriesTree() { $cache = $this->getCache('categories'); // Определяем наличие дерева в кэше if ($cache->test('CategoriesVisibleTree')) { $CategoriesTree = $cache->load('CategoriesVisibleTree'); } else { $Categories = new Phorm_Categories(); // Делаем из плоского дерева иерархическое дерево foreach ($Categories->getVisibleList() as $data) { $fullpath = explode('/', $data['fullpath']); unset($fullpath[count($fullpath) - 1]); $array = array_merge(array("id" => $data["categoryid"], "label" => $data["menuname"], "name" => $data["categoryname"], "uri" => $data["fullpath"], "order" => $data["cleft"], "pages" => array()), $data); eval('$CategoriesTree["' . implode('"]["pages"]["', $fullpath) . '"] = $array;'); } $cache->save($CategoriesTree, 'CategoriesVisibleTree'); } return $CategoriesTree; }
/** * 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; }
/** * Сохранение данных о группе * * @param array $data Массив данных для сохранения * * @return array Массив данных о группе */ public function saveRoleInfo($data) { /** * Выделяем из массива данных поля для вставки в основную таблицу pw_roles */ $maindata = $this->getFilteredValuesByTableCols('pw_roles', $data); /** * Сохранение данных */ $this->_db->beginTransaction(); try { /** * Гостевая, административная группа и группа по умолчанию должны быть в единственном кол-ве */ foreach (array('isdefault', 'isguest', 'isadmin') as $role) { if (isset($maindata[$role]) && $maindata[$role] == 'yes') { $this->_db->update('pw_roles', array($role => 'no')); } } /*if(isset($maindata['isdefault']) && $maindata['isdefault']=='yes') { $this->_db->update('pw_roles',array('isdefault'=>'no')); } if(isset($maindata['isguest']) && $maindata['isguest']=='yes') { $this->_db->update('pw_roles',array('isguest'=>'no')); } if(isset($maindata['isadmin']) && $maindata['isadmin']=='yes') { $this->_db->update('pw_roles',array('isadmin'=>'no')); }*/ /** * Сохранение данных */ if (isset($data['roleid'])) { // Обновление существующей записи $this->_db->update('pw_roles', $maindata, 'roleid=' . (int) $data['roleid']); $action = 'update'; } else { // Создание новой записи $this->_db->insert('pw_roles', $maindata); $data['roleid'] = $this->_db->lastInsertId(); $action = 'insert'; } /** * Права доступа к разделам */ if (isset($data['acl_categories']) && is_int($data['acl_categories'])) { $this->_db->delete('pw_categories_acl', 'roleid=' . (int) $data['roleid']); $Categories = new Phorm_Categories(); foreach ($Categories->getFullList() as $category) { $this->_db->insert('pw_categories_acl', array('categoryid' => $category['categoryid'], 'roleid' => $data['roleid'], 'accesslevel' => $data['acl_categories'])); } } /** * Права доступа к виджетам * @todo Сделать в виджетах методы типа pack и unpack */ if (isset($data['acl_widgets']) && in_array($data['acl_widgets'], array('yes', 'no'))) { $Widget = new Phorm_Widget(); foreach ($Widget->getWidgetsSetsFullList() as $set) { if (!empty($set['widgets']) && ($widgets = Zend_Json::decode($set['widgets']))) { foreach ($widgets as $layoutname => $layout) { foreach ($layout as $i => $widget) { $widget = Zend_Json::decode($widget); $aclid = array_search($data['roleid'], $widget['acl']); if ($aclid !== false) { unset($widget['acl'][$aclid]); } if ($data['acl_widgets'] == 'yes') { $widget['acl'][] = $data['roleid']; } $widget['acl'] = array_values($widget['acl']); $widgets[$layoutname][$i] = Zend_Json::encode($widget); } } $this->_db->update('pw_widgets_sets', array('widgets' => Zend_Json::encode($widgets)), 'setid=' . (int) $set['setid']); } } } /** * Логирование */ $this->setLog($action, array('url' => '/control/users/roleedit/roleid/' . (int) $data['roleid'] . '/', 'name' => $data['rolename'], 'tablename' => 'pw_roles', 'identity' => (int) $data['roleid'], 'fieldname' => 'roleid')); $this->_db->commit(); return $data; } catch (Exception $e) { $this->_db->rollBack(); $this->_errors[] = $e->getMessage(); } return false; }
/** * Готовим данные для подгрузки в таблицу 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 mixed $spec * @param array $options */ public function __construct($spec, $options = null) { /** * Определяем тип элемента * select, radio - одиночный выбор * multiselect, checkbox - множественный выбор */ $this->type = isset($options['type']) && in_array(strtolower($options['type']), array('select', 'multiselect', 'checkbox', 'radio')) ? strtolower($options['type']) : 'select'; if ($this->type == 'multiselect') { $this->_isArray = true; $this->multiple = 'multiple'; } if ($this->type == 'checkbox') { $this->_isArray = true; } /** * Переопределяем помощник вида при использовании Canonical и чекбоксов */ if ($this->type == 'checkbox' && isset($options['usecanonical']) && $options['usecanonical'] == true) { $this->helper = 'selectCanonical'; // Враппер к formCategories с добавлением JQuery-логики } /** * Манипуляция с разделами */ require_once "Phorm/Categories.php"; $Categories = new Phorm_Categories(); /** * Получаем список разделов */ if (isset($options['moduleid'])) { $CategoriesList = $Categories->getCategoriesPathsByModule($options['moduleid']); } else { $CategoriesList = $Categories->getList(); } /** * Собираем массив пар для мультиопций */ $pairs = isset($options['multioptions']) && is_array($options['multioptions']) ? $options['multioptions'] : array(); foreach ($CategoriesList as $category) { if (isset($options['moduleid']) && $category['moduleid'] != $options['moduleid']) { continue; } $pairs[$category['categoryid']] = $category['categoryname']; } /** * Добавляем разделы для визуализации вложенности в хелпере */ if (isset($options['multioptions']) && is_array($options['multioptions'])) { // Унифицируем опции, заданные в конфигурационном файле формы foreach ($options['multioptions'] as $key => $val) { if (is_string($val) && is_string($key)) { $options['multioptions'][$key] = array('categoryid' => $key, 'categoryname' => $val, 'clevel' => 0, 'visible' => 'yes'); } } $options['categories'] = $options['multioptions'] + $CategoriesList; } else { $options['categories'] = $CategoriesList; } /** * Добавляем мультиопции для валидации */ $options['multioptions'] = $pairs; /** * Инициализируем родительский конструктор */ parent::__construct($spec, $options); }