コード例 #1
0
ファイル: DefaultController.php プロジェクト: Cranky4/npfs
    private function main()
    {
        /**
         * @var $model DaActiveRecord
         * @var $object DaObject
         * @var $view DaObjectView
         */
        $object = Yii::app()->backend->object;
        $view = Yii::app()->backend->objectView;
        $model = $object->getModel();
        $idObject = $object->id_object;
        $idView = $view->id_object_view;
        $this->pageDescription = $view->description;
        if ($this->_groupInstance != null) {
            $linkObject = Yii::app()->createUrl(BackendModule::ROUTE_INSTANCE_LIST, array(ObjectUrlRule::PARAM_OBJECT_PARENT => $this->_groupInstance->getIdParent(), ObjectUrlRule::PARAM_OBJECT => $this->_groupInstance->getIdObject(), ObjectUrlRule::PARAM_PAGER_NUM => ObjectUrlRule::getCurrentParameter(ObjectUrlRule::PARAM_PAGER_NUM_BACK)));
            //$tmpPage->setProperty(DA_URL_GO, $urlPage->GET(DA_URL_BACK_PAGE));  // TODO !!!!!
            $linkInstance = Yii::app()->createUrl(BackendModule::ROUTE_INSTANCE_LIST, array(ObjectUrlRule::PARAM_OBJECT_PARENT => $this->_groupInstance->getIdParent(), ObjectUrlRule::PARAM_OBJECT => $this->_groupInstance->getIdObject(), ObjectUrlRule::PARAM_OBJECT_INSTANCE => $this->_groupInstance->getIdInstance()));
            $caption = '"' . strip_tags($this->_groupInstance->getInstanceCaption()) . '"';
            $this->caption .= ' ' . $caption;
            $this->breadcrumbs[$this->_groupParameter->caption] = $linkObject;
            $this->breadcrumbs[$caption] = $linkInstance;
            $this->breadcrumbs[$object->name] = '/';
        }
        $idParent = null;
        $parentModel = null;
        $idParentField = $view->id_parent;
        if ($idParentField != null) {
            $idParent = HU::get(ObjectUrlRule::PARAM_OBJECT_PARENT);
            if ($idParent != null) {
                if (($parentModel = $model->findByPk($idParent)) == null) {
                    $idParent = null;
                } else {
                    $this->caption = $parentModel->getInstanceCaption();
                    $link = Yii::app()->createUrl(BackendModule::ROUTE_INSTANCE_LIST, array(ObjectUrlRule::PARAM_OBJECT_PARENT => $parentModel->{$idParentField}, ObjectUrlRule::PARAM_OBJECT_VIEW => $idView, ObjectUrlRule::PARAM_OBJECT => $idObject));
                    $this->buttons[] = array('url' => $link, 'caption' => '<i class="glyphicon glyphicon-arrow-up icon-white"></i> Вверх', 'class' => 'btn-primary');
                    $this->breadcrumbs = array();
                    $tmp = $parentModel;
                    while ($tmp != null) {
                        $link = Yii::app()->createUrl(BackendModule::ROUTE_INSTANCE_LIST, array(ObjectUrlRule::PARAM_OBJECT_PARENT => $tmp->{$idParentField}, ObjectUrlRule::PARAM_OBJECT_VIEW => $idView, ObjectUrlRule::PARAM_OBJECT => $idObject));
                        $this->breadcrumbs[$tmp->getInstanceCaption()] = $link;
                        if ($tmp->{$idParentField} != null) {
                            $tmp = $model->findByPk($tmp->{$idParentField});
                        } else {
                            $tmp = null;
                        }
                    }
                    $this->breadcrumbs[$object->name] = Yii::app()->createUrl(BackendModule::ROUTE_INSTANCE_LIST, array(ObjectUrlRule::PARAM_OBJECT_VIEW => $idView, ObjectUrlRule::PARAM_OBJECT => $idObject));
                    $this->breadcrumbs = array_reverse($this->breadcrumbs);
                }
            }
        }
        // вновь восстанавливаем чистую модель, т.к. конструкции типа $model->findByPk затирают resetScope
        $model = $object->getModel();
        // кнопка создать
        if (Yii::app()->authManager->canCreateInstance($idObject, Yii::app()->user->id)) {
            $link = ObjectUrlRule::createUrlFromCurrent(BackendModule::ROUTE_INSTANCE_LIST, array(ObjectUrlRule::PARAM_OBJECT_INSTANCE => -1));
            array_unshift($this->buttons, array('url' => $link, 'caption' => '<i class="glyphicon glyphicon-plus icon-white"></i> Создать', 'class' => 'btn-success', 'code' => 'create'));
        }
        $dataProvider = $this->buildDataProvider($view, $model);
        $criteria = $dataProvider->getCriteria();
        // поиск
        $searchModel = new ParameterSearchForm($object);
        foreach ($searchModel->getSearchParameters() as $searchParam) {
            $event = new ParameterAvailableToSearchEvent($this, $searchParam->parameter);
            $this->raiseEvent(DefaultController::EVENT_ON_PARAMETER_AVAILABLE_TO_SEARCH, $event);
            $searchParam->visible = $event->visible;
        }
        if (isset($_GET['ParameterSearchForm'])) {
            $searchModel->attributes = $_GET['ParameterSearchForm'];
        } else {
            if (isset($_GET['ParameterSearchForm[parameter]']) && isset($_GET['ParameterSearchForm[value]'])) {
                $searchModel->parameter = $_GET['ParameterSearchForm[parameter]'];
                $searchModel->value = $_GET['ParameterSearchForm[value]'];
            }
        }
        $searchActive = false;
        if ($searchModel->getHasVisibleSearchParameters()) {
            $this->searchModel = $searchModel;
            // Условия поиска по параметрам:
            if ($this->searchModel->validate() && $this->searchModel->value != null) {
                $searchActive = true;
                $searchCriteria = $this->searchModel->getSearchCriteria();
                $criteria->mergeWith($searchCriteria);
            }
        }
        // условие по родителю
        if (!$searchActive && $this->getGroupInstance() == null && $idParentField != null) {
            if ($idParent == null) {
                $criteria->addCondition($idParentField . " IS NULL");
            } else {
                $criteria->addCondition($idParentField . " = :id_parent");
                $criteria->params[':id_parent'] = $idParent;
            }
        } else {
            if ($this->getGroupInstance() != null) {
                // Добавляем ограничения по подчинённым сущностям.
                $criteria->addCondition("t." . $this->getGroupParameter()->getFieldName() . " = :group_instance");
                $criteria->params[':group_instance'] = $this->getGroupInstance()->getIdInstance();
            }
        }
        // сортировка путем перемещения строк таблицы
        $seqKey = null;
        // если идет поиск, то отключаем сотрировку перетаскиваением
        if (!$searchActive && ($seqKey = $object->getParameterObjectByField($object->getFieldByType(DataType::SEQUENCE))) != null) {
            $event = new ParameterAvailableEvent($this, $model, $seqKey);
            $event->params = array('mode' => 'seqKey');
            $this->raiseEvent(ViewController::EVENT_ON_PARAMETER_AVAILABLE, $event);
            if ($event->status != ViewController::ENTITY_STATUS_AVAILABLE) {
                $seqKey = null;
            }
        }
        // сортировка грида
        $oby = $view->getOrderBy();
        if ($oby == null && $object->id_field_order != null) {
            //Если есть порядок сортировки, то добавляем сортировку
            //Загружаем информацию по св-ву сортировки:
            $op = $object->getParameterObjectByIdParameter($object->id_field_order);
            $name = "t." . $op->getFieldName();
            $direction = $object->order_type;
            if ($direction == 1) {
                $direction = "ASC";
            } else {
                if ($direction == 2) {
                    $direction = "DESC";
                }
            }
            $oby = $name . " " . $direction;
        }
        $sort = new BackendSort();
        $sort->attributes = $model->attributeNames();
        $sort->model = $model;
        $sort->params = array_merge(ObjectUrlRule::getCurrentParams(), HU::arrayToQueryArray('ParameterSearchForm', HU::get('ParameterSearchForm', array())));
        $sort->defaultOrder = $oby;
        $dataProvider->sort = $sort;
        // $instanceQuery->setFrom($objectRazdel->getFrom()); // TODO ???
        // пагинатор
        $withSwitchPages = $seqKey == null;
        // если есть сортировка на странице, то не выводим переключатель страниц
        $paginatorConfig = $withSwitchPages ? array('pageSize' => $view->getCountData(), 'pageVar' => 'go', 'params' => array_merge(ObjectUrlRule::getCurrentParams(), HU::arrayToQueryArray('ParameterSearchForm', HU::get('ParameterSearchForm', array())))) : false;
        $dataProvider->pagination = $paginatorConfig;
        Yii::import('backend.components.column.*');
        $gridColumns = array();
        $pk = $model->getInstanceKeyName();
        // колонка с ид объекта
        $gridColumns[] = array('name' => $pk, 'header' => 'id', 'htmlOptions' => array('class' => 'col-id'));
        // колонка сортировки
        if ($seqKey != null) {
            $isSortAjax = $sort->defaultOrder == $sort->getOrderBy();
            if ($isSortAjax) {
                $gridColumns[] = array('sortable' => false, 'header' => '&nbsp;', 'type' => 'raw', 'value' => '\'<i class="glyphicon glyphicon-resize-vertical"></i>\'', 'htmlOptions' => array('class' => 'col-num sorter', 'title' => 'Перетащите элемент для изменения последовательности'));
                Yii::app()->clientScript->registerScript('admin.sequence-order.init_client', '$(".b-instance-list").daInstanceSequence(' . CJavaScript::encode(array('idObject' => $idObject, 'isAjax' => $isSortAjax)) . ');', CClientScript::POS_READY);
                $js = 'function da_sortInstances(idObject, m_seq) {
  ' . CHtml::ajax(array('type' => 'POST', 'dataType' => 'json', 'url' => Yii::app()->createUrl('backend/ygin/sort'), 'data' => 'js:{idObject:idObject, data:m_seq}', 'success' => 'function(data){if (data.error !== undefined) {$.daSticker({text:data.error, type:"error"}); return;} $.daSticker({text:data.message, type:"success"}); }')) . '
}';
                Yii::app()->clientScript->registerScript('admin.sequence-order.init_server', $js, CClientScript::POS_HEAD);
            }
            //$gridColumns[] = array('class'=>'backend.components.column.SortColumn');
            /*        $daPage->addIdAjax(DA_AJAX_SORT_INSTANCES);
                          if (!$isSortAjax) {
                            $this->buttons[] = array(
                              'html' => '<button class="btn btn-default" onclick="$(\".b-instance-list\").daUpdateSequence({\"idObject\":'.$idObject.', \"isNotify\":true});"><i class="glyphicon glyphicon-indent-right"></i> Упорядочить</button>',
                            );
                          }
                  */
        }
        // пустая колонка (верстка)
        $gridColumns[] = array('sortable' => false, 'header' => '&nbsp;', 'type' => 'raw', 'value' => '\'&nbsp;\'', 'headerHtmlOptions' => array('class' => 'col-void'));
        // колонки представлений
        $columns = $view->columns;
        $selectFields = array();
        foreach ($columns as $column) {
            if ($column->getIdObjectParameter() != null) {
                $objParam = $view->object->getParameterObjectByIdParameter($column->getIdObjectParameter());
                if ($objParam != null) {
                    $selectFields[] = $objParam->getFieldName();
                }
            }
            // Если у отображаемого объекта есть группирующее свойство, то колонку для него пропускаем.
            if ($this->getGroupParameter() != null && $this->getGroupParameter()->getIdParameter() == $column->getIdObjectParameter()) {
                continue;
            }
            $header = $column->getCaption();
            $columnConfig = array('sortable' => $header == null ? false : true, 'class' => 'BaseColumn', 'header' => $header === null ? '' : $header, 'name' => $column->getField(), 'object' => $object, 'objectParameter' => $column->getIdObjectParameter() == null ? null : $object->getParameterObjectByIdParameter($column->getIdObjectParameter()));
            $phpScript = $column->getIdPhpScript() == null ? null : ($phpScript = $column->columnClass);
            if ($phpScript == null) {
                $type = $column->getType();
                switch ($type) {
                    case DataType::BOOLEAN:
                        $columnConfig['class'] = 'BooleanColumn';
                        break;
                    case DataType::FILE:
                        $columnConfig['class'] = 'FileColumn';
                        break;
                    case DataType::OBJECT:
                        $columnConfig['class'] = 'ObjectColumn';
                        break;
                    case DataType::REFERENCE:
                        $columnConfig['class'] = 'ReferenceColumn';
                        break;
                    case DataType::TIMESTAMP:
                        $columnConfig['htmlOptions'] = array('class' => 'col-num');
                        $columnConfig['type'] = 'datetime';
                        if ($column->getIdObjectParameter() != null) {
                            $objParam = $view->object->getParameterObjectByIdParameter($column->getIdObjectParameter());
                            if ($objParam != null && intval($objParam->getAdditionalParameter()) === 1) {
                                $columnConfig['type'] = 'date';
                            }
                        }
                        break;
                    case DataType::TEXTAREA:
                        $columnConfig['type'] = 'Ntext';
                        break;
                    case DataType::INT:
                    case DataType::VARCHAR:
                    case DataType::EDITOR:
                        $columnConfig['type'] = 'text';
                        break;
                    default:
                        throw new Exception("Для колонки (id=" . $column->getIdColumn() . ") c типом=" . $type . " не определен класс-обработчик");
                }
            } else {
                $columnConfig['class'] = $phpScript->file_path;
            }
            $gridColumns[] = $columnConfig;
        }
        $select = $pk . (count($selectFields) > 0 ? ', ' . implode(',', $selectFields) : '');
        if ($view->getSelect() != null) {
            $select .= ', ' . $view->getSelect();
        }
        if ($view->id_parent != null) {
            $select .= ',' . $view->id_parent;
        }
        $criteria->select = $select;
        // колонка со связями
        // Подчинённые объекты
        $relationParams = $object->relationParameters;
        // Узнаём о том, может ли пользователь работать хотя бы с одним дочерним объектом:
        $isChildDataAvailable = false;
        $tmpIdObject = null;
        foreach ($relationParams as $parameter) {
            if ($parameter->isRelation() == false) {
                continue;
            }
            $idObjectTmp = $parameter->getIdObjectParameter();
            if ($idObjectTmp == $tmpIdObject) {
                continue;
            }
            if (Yii::app()->authManager->checkObject(DaDbAuthManager::OPERATION_LIST, Yii::app()->user->id, $idObjectTmp)) {
                $isChildDataAvailable = true;
                break;
            }
            $tmpIdObject = $idObjectTmp;
        }
        if (count($relationParams) > 0 && $isChildDataAvailable) {
            $gridColumns[] = array('class' => 'RelationsColumn', 'childData' => $relationParams, 'object' => $object);
        }
        // Зайти в папку
        if ($view->id_parent != null && $this->getGroupInstance() == null) {
            $gridColumns[] = array('class' => 'FolderColumn', 'parentField' => $view->id_parent);
        }
        $gridColumns[] = array('class' => 'ActionViewColumn', 'object' => $object);
        $gridColumns[] = array('class' => 'ActionUpdateColumn', 'object' => $object);
        $gridColumns[] = array('class' => 'ActionDeleteColumn', 'object' => $object);
        Yii::import('zii.widgets.grid.CGridView', true);
        $grid = Yii::app()->getWidgetFactory()->createWidget($this, 'CGridView', array('dataProvider' => $dataProvider, 'columns' => $gridColumns, 'pager' => array('class' => 'LinkPagerWidget', 'pagerCssClass' => '', 'firstPageLabel' => '<i class="glyphicon glyphicon-chevron-left"></i>', 'lastPageLabel' => '<i class="glyphicon glyphicon-chevron-right"></i>', 'htmlOptions' => array('class' => 'yiiPager pagination pagination-sm')), 'enablePagination' => $withSwitchPages, 'summaryCssClass' => 'b-instance-list-count', 'pagerCssClass' => 'b-pagination-container', 'cssFile' => false, 'itemsCssClass' => 'table table-bordered b-instance-list daGallery', 'rowCssClass' => array('base', 'alt'), 'template' => "{summary}{pager}\n{items}\n{summary}{pager}", 'beforeAjaxUpdate' => 'function(){$(document).trigger("beforeGridUpdate") }', 'afterAjaxUpdate' => 'function(){$(document).trigger("afterGridUpdate") }', 'rowHtmlOptionsExpression' => 'array("id" => "ygin_inst_".$data->getIdInstance());'));
        Yii::app()->clientScript->registerScript('admin.paginator.init', '
$(document).on("afterGridUpdate", function(e) {  $(".pagination .b-ajax-process").removeClass("b-ajax-process-active"); });
$(document).on("beforeGridUpdate", function(e) {  $(".pagination .b-ajax-process").addClass("b-ajax-process-active"); });
', CClientScript::POS_READY);
        $event = new BeforeGridEvent($this, $idView, $grid);
        $this->raiseEvent(DefaultController::EVENT_ON_BEFORE_GRID, $event);
        $this->render('/index', array('grid' => $grid));
    }