Пример #1
0
 /**
  * Возвращает данные виджета, для передачи в шаблон
  *
  * @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;
 }
Пример #2
0
 /**
  * Главная страница
  * 
  * @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);
     }
 }
Пример #3
0
 /**
  * Смещение раздела
  *
  * @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/');
     }
 }
Пример #4
0
 /**
  * Возвращает дерево видимых в системе разделов
  *
  * @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;
 }
Пример #5
0
 /**
  * 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;
 }
Пример #6
0
 /**
  * Сохранение данных о группе
  * 
  * @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;
 }
Пример #7
0
 /**
  * Готовим данные для подгрузки в таблицу 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] .= '&nbsp;<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]) : '&mdash;';
             }
             // Фильтры (простые функции с одним параметром в виде текущего значения)
             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);
 }
Пример #8
0
 /**
  * Определяем массив разделов и дергаем родительский конструктор
  *
  * @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);
 }