コード例 #1
0
ファイル: Categories.php プロジェクト: ei-grad/phorm
 /**
  * Информация о разделе
  * 
  * @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... надо что-то придумать
     }
 }
コード例 #2
0
ファイル: Modules.php プロジェクト: ei-grad/phorm
 /**
  * Определяем массив модулей и дергаем родительский конструктор
  *
  * @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);
 }
コード例 #3
0
ファイル: SelectResource.php プロジェクト: ei-grad/phorm
    /**
     * Рисуем кнопку
     *
     * @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;
    }
コード例 #4
0
ファイル: DependsList.php プロジェクト: ei-grad/phorm
 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;
 }
コード例 #5
0
ファイル: Resource.php プロジェクト: ei-grad/phorm
 /**
  * Генерация идентификатора материала
  * 
  * @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');
     }
 }
コード例 #6
0
ファイル: Browser.php プロジェクト: ei-grad/phorm
 /**
  * Браузер материалов сайта
  * 
  * @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('&nbsp;', $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));
     }
 }
コード例 #7
0
ファイル: Index.php プロジェクト: ei-grad/phorm
 /**
  * Главная страница
  * 
  * @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);
     }
 }
コード例 #8
0
ファイル: Controller.php プロジェクト: ei-grad/phorm
 /**
  * Проверяет, имеет ли пользователь доступ к текущей странице на основе параметров запроса
  * 
  * @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;
 }
コード例 #9
0
ファイル: Forms.php プロジェクト: ei-grad/phorm
 /**
  * Конструктор
  * 
  * @return void
  */
 public function __construct()
 {
     parent::__construct($this->_moduleid);
 }
コード例 #10
0
ファイル: Route.php プロジェクト: ei-grad/phorm
 /**
  * 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;
 }
コード例 #11
0
ファイル: DataGrid.php プロジェクト: ei-grad/phorm
 /**
  * Готовим данные для подгрузки в таблицу 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] = '&mdash;';
             }
             // Заменяем 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);
 }
コード例 #12
0
ファイル: Tags.php プロジェクト: ei-grad/phorm
 /**
  * Возвращает список материалов по тегу
  * 
  * @param int $tagid Id тега
  * 
  * @return array
  */
 public function getSearchResults($tagid)
 {
     $Resource = new Phorm_Resource();
     return $Resource->getResourcesList(array("tags" => array($tagid)));
 }