public function testResolveAndAddViewDefinedNestedAttributes()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $attributeIndexOrDerivedTypeAndLabels = array();
     DynamicSearchUtil::resolveAndAddViewDefinedNestedAttributes(new Contact(), 'ContactsSearchView', $attributeIndexOrDerivedTypeAndLabels);
     $compareData = array('account___name' => 'Account - Name');
     $this->assertEquals($compareData, $attributeIndexOrDerivedTypeAndLabels);
     //Test adding more rercursive attributes.
     $metadata = ContactsSearchView::getMetadata();
     $tempMetadata = $metadata;
     $metadata['global']['definedNestedAttributes'] = array(array('account' => array('opportunities' => array('name'))), array('opportunities' => array('account' => array('name'))));
     ContactsSearchView::setMetadata($metadata);
     DynamicSearchUtil::resolveAndAddViewDefinedNestedAttributes(new Contact(), 'ContactsSearchView', $attributeIndexOrDerivedTypeAndLabels);
     $compareData = array('account___name' => 'Account - Name', 'account___opportunities___name' => 'Account - Opportunities - Name', 'opportunities___account___name' => 'Opportunities - Account - Name');
     $this->assertEquals($compareData, $attributeIndexOrDerivedTypeAndLabels);
     //Reset metadata.
     ContactsSearchView::setMetadata($tempMetadata);
 }
Пример #2
0
 public static function renderDynamicSearchRowContent($viewClassName, $modelClassName, $formModelClassName, $rowNumber, $attributeIndexOrDerivedType, $inputContent, $suffix = null, $renderAsAjax = false)
 {
     assert('is_string($viewClassName)');
     assert('is_string($modelClassName)');
     assert('is_string($formModelClassName)');
     assert('is_int($rowNumber)');
     assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null');
     assert('is_string($suffix) || $suffix == null');
     assert('is_bool($renderAsAjax)');
     $searchableAttributeIndicesAndDerivedTypes = DynamicSearchUtil::getSearchableAttributesAndLabels($viewClassName, $modelClassName);
     $ajaxOnChangeUrl = Yii::app()->createUrl("zurmo/default/dynamicSearchAttributeInput", array('viewClassName' => $viewClassName, 'modelClassName' => $modelClassName, 'formModelClassName' => $formModelClassName, 'rowNumber' => $rowNumber, 'suffix' => $suffix));
     $rowView = new DynamicSearchRowView($searchableAttributeIndicesAndDerivedTypes, (int) $rowNumber, $suffix, $formModelClassName, $ajaxOnChangeUrl, $attributeIndexOrDerivedType, $inputContent);
     if (!$renderAsAjax) {
         $view = $rowView;
     } else {
         $view = new AjaxPageView($rowView);
     }
     return ZurmoHtml::tag('div', array('class' => 'dynamic-search-row'), $view->render());
 }
 /**
  * List all models that satisfy provided criteria
  * @param array $params
  * @throws ApiException
  * @return ApiResult
  */
 protected function processList($params)
 {
     $modelClassName = $this->getModelName();
     $searchFormClassName = static::getSearchFormClassName();
     try {
         $filterParams = array();
         if (strtolower($_SERVER['REQUEST_METHOD']) != 'post') {
             if (isset($params['filter']) && $params['filter'] != '') {
                 parse_str($params['filter'], $filterParams);
             }
         } else {
             $filterParams = $params['data'];
         }
         $pageSize = Yii::app()->pagination->getGlobalValueByType('apiListPageSize');
         if (isset($filterParams['pagination']['pageSize'])) {
             $pageSize = (int) $filterParams['pagination']['pageSize'];
         }
         if (isset($filterParams['pagination']['page'])) {
             $_GET[$modelClassName . '_page'] = (int) $filterParams['pagination']['page'];
         }
         if (isset($filterParams['sort'])) {
             $_GET[$modelClassName . '_sort'] = $filterParams['sort'];
         }
         if (isset($filterParams['search']) && isset($searchFormClassName)) {
             $_GET[$searchFormClassName] = $filterParams['search'];
         }
         if (isset($filterParams['dynamicSearch']) && isset($searchFormClassName) && !empty($filterParams['dynamicSearch']['dynamicClauses']) && !empty($filterParams['dynamicSearch']['dynamicStructure'])) {
             // Convert model ids into item ids, so we can perform dynamic search
             DynamicSearchUtil::resolveDynamicSearchClausesForModelIdsNeedingToBeItemIds($modelClassName, $filterParams['dynamicSearch']['dynamicClauses']);
             $_GET[$searchFormClassName]['dynamicClauses'] = $filterParams['dynamicSearch']['dynamicClauses'];
             $_GET[$searchFormClassName]['dynamicStructure'] = $filterParams['dynamicSearch']['dynamicStructure'];
         }
         $model = new $modelClassName(false);
         if (isset($searchFormClassName)) {
             $searchForm = new $searchFormClassName($model);
         } else {
             throw new NotSupportedException();
         }
         $stateMetadataAdapterClassName = $this->resolveStateMetadataAdapterClassName();
         $dataProvider = $this->makeRedBeanDataProviderByDataCollection($searchForm, $pageSize, $stateMetadataAdapterClassName);
         if (isset($filterParams['pagination']['page']) && (int) $filterParams['pagination']['page'] > 0) {
             $currentPage = (int) $filterParams['pagination']['page'];
         } else {
             $currentPage = 1;
         }
         $totalItems = $dataProvider->getTotalItemCount();
         $data = array();
         $data['totalCount'] = $totalItems;
         $data['currentPage'] = $currentPage;
         if ($totalItems > 0) {
             $formattedData = $dataProvider->getData();
             foreach ($formattedData as $model) {
                 $data['items'][] = static::getModelToApiDataUtilData($model);
             }
             $result = new ApiResult(ApiResponse::STATUS_SUCCESS, $data, null, null);
         } else {
             $result = new ApiResult(ApiResponse::STATUS_SUCCESS, $data, null, null);
         }
     } catch (Exception $e) {
         $message = $e->getMessage();
         throw new ApiException($message);
     }
     return $result;
 }
 protected function renderDynamicAdvancedSearchRows($panel, $maxCellsPerRow, $form)
 {
     assert('$form != null');
     $content = $form->errorSummary($this->model);
     $content .= $this->renderDynamicClausesValidationHelperContent($form);
     $rowCount = 0;
     $suffix = $this->getSearchFormId();
     $viewClassName = get_class($this);
     $modelClassName = get_class($this->model->getModel());
     $formModelClassName = get_class($this->model);
     if ($this->model->dynamicClauses != null) {
         foreach ($this->model->dynamicClauses as $dynamicClause) {
             $attributeIndexOrDerivedType = ArrayUtil::getArrayValue($dynamicClause, 'attributeIndexOrDerivedType');
             if ($attributeIndexOrDerivedType != null) {
                 $searchAttributes = self::resolveSearchAttributeValuesForDynamicRow($dynamicClause, $attributeIndexOrDerivedType);
                 $inputContent = DynamicSearchUtil::renderDynamicSearchAttributeInput($viewClassName, $modelClassName, $formModelClassName, (int) $rowCount, $attributeIndexOrDerivedType, $searchAttributes, $suffix);
                 $content .= DynamicSearchUtil::renderDynamicSearchRowContent($viewClassName, $modelClassName, $formModelClassName, $rowCount, $attributeIndexOrDerivedType, $inputContent, $suffix);
                 $rowCount++;
             }
         }
     }
     $content .= $this->renderAddExtraRowContent($rowCount);
     $content .= $this->renderAfterAddExtraRowContent($form);
     $content .= $this->renderDynamicSearchStructureContent($form);
     return $content;
 }
 public function actionDynamicSearchAttributeInput($viewClassName, $modelClassName, $formModelClassName, $rowNumber, $attributeIndexOrDerivedType, $suffix = null)
 {
     if ($attributeIndexOrDerivedType == null) {
         Yii::app()->end(0, false);
     }
     $content = DynamicSearchUtil::renderDynamicSearchAttributeInput($viewClassName, $modelClassName, $formModelClassName, (int) $rowNumber, $attributeIndexOrDerivedType, array(), $suffix);
     Yii::app()->getClientScript()->setToAjaxMode();
     Yii::app()->getClientScript()->render($content);
     echo $content;
 }