/** * @param string $moduleName * @param bool $forceEmptyResults * Return an empty listView * @return View */ public function getListView($moduleName, $forceEmptyResults = false) { assert('is_string($moduleName)'); $pageSize = $this->pageSize; $module = Yii::app()->findModule($moduleName); $searchFormClassName = $module::getGlobalSearchFormClassName(); $modelClassName = $module::getPrimaryModelName(); $model = new $modelClassName(false); $searchForm = new $searchFormClassName($model); $sanitizedSearchAttributes = MixedTermSearchUtil::getGlobalSearchAttributeByModuleAndPartialTerm($module, $this->term); $metadataAdapter = new SearchDataProviderMetadataAdapter($searchForm, $this->user->id, $sanitizedSearchAttributes); $listViewClassName = $module::getPluralCamelCasedName() . 'ForMixedModelsSearchListView'; $sortAttribute = SearchUtil::resolveSortAttributeFromGetArray($modelClassName); $sortDescending = SearchUtil::resolveSortDescendingFromGetArray($modelClassName); if ($forceEmptyResults) { $dataProviderClass = 'EmptyRedBeanModelDataProvider'; $emptyText = ''; } else { $dataProviderClass = 'RedBeanModelDataProvider'; $emptyText = null; } $dataProvider = RedBeanModelDataProviderUtil::makeDataProvider($metadataAdapter->getAdaptedMetadata(false), $modelClassName, $dataProviderClass, $sortAttribute, $sortDescending, $pageSize, $module->getStateMetadataAdapterClassName()); $listView = new $listViewClassName('default', $module->getId(), $modelClassName, $dataProvider, GetUtil::resolveSelectedIdsFromGet(), '-' . $moduleName, array('route' => '', 'class' => 'SimpleListLinkPager', 'firstPageLabel' => '<span>first</span>', 'prevPageLabel' => '<span>previous</span>', 'nextPageLabel' => '<span>next</span>', 'lastPageLabel' => '<span>last</span>')); $listView->setRowsAreSelectable(false); $listView->setEmptyText($emptyText); return $listView; }
/** * Supports setting metadata on both models. The MyListForm model and the SearchModel * @see ModalConfigEditView::setMetadataFromPost() */ public function setMetadataFromPost($postArray) { parent::setMetadataFromPost($postArray); $sanitizedPostArray = PostUtil::sanitizePostByDesignerTypeForSavingModel($this->searchModel, ArrayUtil::getArrayValue($_POST, $this->getSearchModelPostArrayName())); $searchAttributes = SearchUtil::getSearchAttributesFromSearchArrayForSavingExistingSearchCriteria($sanitizedPostArray); $searchAttributesAdaptedToSetInModel = SearchUtil::adaptSearchAttributesToSetInRedBeanModel($searchAttributes, $this->searchModel); $this->searchAttributes = $searchAttributesAdaptedToSetInModel; }
private function getQueryKey () { $optionsCopy = $this->searchOptions; $optionsCopy->clVars['query'] = SearchUtil::getKey ($this->searchOptions->clVars['query']); return $this->searchOptions->clType . '/' . md5 (serialize ($optionsCopy)); }
public function resolveSearchAttributesFromSourceData() { $anyMixedAttributes = SearchUtil::resolveSearchAttributesFromGetArray(get_class($this->model), get_class($this->model)); if ($anyMixedAttributes != null) { return $anyMixedAttributes; } if ($this->model->anyMixedAttributes != null) { //might need to run this through the @see SearchUtil::getSearchAttributesFromSearchArray but not sure. return array('anyMixedAttributes' => $this->model->anyMixedAttributes); } return array(); }
/** * Utilizes information from the dataCollection object to * make a RedBeanDataProvider. Either looks at saved search information or params in the $_GET array. * variables: * modelName_sort * modelName * where modelName is Account for example. * Typically utilized by a listView action. */ public function makeRedBeanDataProviderByDataCollection($searchModel, $pageSize, $stateMetadataAdapterClassName = null, $dataCollection = null) { assert('is_int($pageSize)'); assert('$stateMetadataAdapterClassName == null || is_string($stateMetadataAdapterClassName)'); assert('$dataCollection instanceof SearchAttributesDataCollection || $dataCollection == null'); $listModelClassName = get_class($searchModel->getModel()); if ($dataCollection == null) { $dataCollection = new SearchAttributesDataCollection($searchModel); } $searchAttributes = $dataCollection->resolveSearchAttributesFromSourceData(); $dataCollection->resolveAnyMixedAttributesScopeForSearchModelFromSourceData(); $dataCollection->resolveSelectedListAttributesForSearchModelFromSourceData(); $sanitizedSearchAttributes = GetUtil::sanitizePostByDesignerTypeForSavingModel($searchModel, $searchAttributes); $sortAttribute = SearchUtil::resolveSortAttributeFromGetArray($listModelClassName); $sortDescending = SearchUtil::resolveSortDescendingFromGetArray($listModelClassName); $metadataAdapter = new SearchDataProviderMetadataAdapter($searchModel, Yii::app()->user->userModel->id, $sanitizedSearchAttributes); $metadata = static::resolveDynamicSearchMetadata($searchModel, $metadataAdapter->getAdaptedMetadata(), $dataCollection); return RedBeanModelDataProviderUtil::makeDataProvider($metadata, $listModelClassName, 'RedBeanModelDataProvider', $sortAttribute, $sortDescending, $pageSize, $stateMetadataAdapterClassName); }
protected function makeDataProviderBySearchAttributeData($searchAttributeData) { assert('is_array($searchAttributeData)'); $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType('subListPageSize'); $sortAttribute = SearchUtil::resolveSortAttributeFromGetArray($this->modelClassName); $sortDescending = SearchUtil::resolveSortDescendingFromGetArray($this->modelClassName); return new RedBeanModelDataProvider($this->modelClassName, $sortAttribute, (bool) $sortDescending, $searchAttributeData, array('pagination' => array('pageSize' => $pageSize))); }
/** * @param string $getArrayName */ public static function getDynamicSearchAttributesFromGetArray($getArrayName) { assert('is_string($getArrayName)'); if (!empty($_GET[$getArrayName]) && isset($_GET[$getArrayName][DynamicSearchForm::DYNAMIC_NAME])) { $dynamicSearchAttributes = SearchUtil::getSearchAttributesFromSearchArray($_GET[$getArrayName][DynamicSearchForm::DYNAMIC_NAME]); if (isset($dynamicSearchAttributes[DynamicSearchForm::DYNAMIC_STRUCTURE_NAME])) { unset($dynamicSearchAttributes[DynamicSearchForm::DYNAMIC_STRUCTURE_NAME]); } foreach ($dynamicSearchAttributes as $key => $data) { if (is_string($data) && $data == 'undefined' || $data == null) { unset($dynamicSearchAttributes[$key]); } } return $dynamicSearchAttributes; } }
/** * @depends testSetAndGetMultiSelectDropDownAttribute */ public function testSearchForMultiSelectDropDownAttributePlacedForAccountsModule() { //Test that the multiple select attribute can query properly for search. $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; //Create an account to test searching multiple fields on for search. $account = new Account(); $this->assertEquals(1, $account->testHobbiesCstm->values->count()); $account->name = 'my test account'; $account->owner = Yii::app()->user->userModel; $customFieldValue2 = new CustomFieldValue(); $customFieldValue2->value = 'Reading'; $account->testHobbiesCstm->values->add($customFieldValue2); $this->assertTrue($account->save()); $accountId = $account->id; $account = Account::getById($accountId); $this->assertEquals(2, $account->testHobbiesCstm->values->count()); $this->assertContains('Writing', $account->testHobbiesCstm->values); $this->assertContains('Reading', $account->testHobbiesCstm->values); //Create a second account with different hobbies $account = new Account(); //Remove the default value of 'Writing'; $account->testHobbiesCstm->values->removeByIndex(0); $account->name = 'my test account2'; $account->owner = Yii::app()->user->userModel; $customFieldValue1 = new CustomFieldValue(); $customFieldValue1->value = 'Singing'; $account->testHobbiesCstm->values->add($customFieldValue1); $customFieldValue2 = new CustomFieldValue(); $customFieldValue2->value = 'Surfing'; $account->testHobbiesCstm->values->add($customFieldValue2); $this->assertTrue($account->save()); $accountId = $account->id; $account = Account::getById($accountId); $this->assertEquals(2, $account->testHobbiesCstm->values->count()); $this->assertContains('Singing', $account->testHobbiesCstm->values); $this->assertContains('Surfing', $account->testHobbiesCstm->values); //Searching with a custom field that is not blank should not produce an errors. $searchPostData = array('name' => 'my test account', 'officePhone' => '', 'testHobbies' => array('values' => array(0 => '')), 'officeFax' => ''); $modifiedSearchPostData = SearchUtil::getSearchAttributesFromSearchArray($searchPostData); $this->assertEquals(array('name' => 'my test account', 'officePhone' => null, 'officeFax' => null), $modifiedSearchPostData); $account = new Account(false); $searchForm = new AccountsSearchForm($account); $metadataAdapter = new SearchDataProviderMetadataAdapter($searchForm, $super->id, $modifiedSearchPostData); $searchAttributeData = $metadataAdapter->getAdaptedMetadata(); //Make sure the search params are empty $compareClauses = array(1 => array('attributeName' => 'name', 'operatorType' => 'startsWith', 'value' => 'my test account')); $compareStructure = '1'; $this->assertEquals($compareClauses, $searchAttributeData['clauses']); $this->assertEquals($compareStructure, $searchAttributeData['structure']); //Run search and make sure the data returned matches how many total accounts are available. $dataProvider = new RedBeanModelDataProvider('Account', null, false, $searchAttributeData); $data = $dataProvider->getData(); $this->assertEquals(2, count($data)); }
public function resolveFilteredByFromSourceData() { SearchUtil::resolveFilteredByFromArray($this->model, get_class($this->model), $this->getSourceData()); }
protected function makeDataProviderBySearchAttributeData($searchAttributeData) { assert('is_array($searchAttributeData)'); list($sortAttribute, $sortDescending) = SearchUtil::resolveSortFromStickyData($this->modelClassName, $this->uniqueLayoutId); $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType('dashboardListPageSize'); $redBeanModelDataProvider = new RedBeanModelDataProvider($this->modelClassName, $sortAttribute, $sortDescending, $searchAttributeData, array('pagination' => array('pageSize' => $pageSize))); $sort = new RedBeanSort($redBeanModelDataProvider->modelClassName); $sort->sortVar = $redBeanModelDataProvider->getId() . '_sort'; $sort->route = 'default/index'; $redBeanModelDataProvider->setSort($sort); return $redBeanModelDataProvider; }
private function makeDataCollectionAndResolveSavedSearch($searchModel, $stickySearchKey = null, $setSticky = true) { $dataCollection = new SearchAttributesDataCollection($searchModel); if ($searchModel instanceof SavedDynamicSearchForm) { $getData = GetUtil::getData(); if ($stickySearchKey != null && isset($getData['clearingSearch']) && $getData['clearingSearch']) { StickySearchUtil::clearDataByKey($stickySearchKey); } if ($stickySearchKey != null && null != ($stickySearchData = StickySearchUtil::getDataByKey($stickySearchKey))) { SavedSearchUtil::resolveSearchFormByStickyDataAndModel($stickySearchData, $searchModel); SavedSearchUtil::resolveSearchFormByStickySortData($getData, $searchModel, $stickySearchData); SearchUtil::resolveSearchFormByStickyFilterByStarredData($getData, $searchModel, $stickySearchData); SearchUtil::resolveSearchFormByStickyFilteredByData($getData, $searchModel, $stickySearchData); SearchUtil::resolveSearchFormByStickyFilteredByData($getData, $searchModel, $stickySearchData); $dataCollection = new SavedSearchAttributesDataCollection($searchModel); } else { SavedSearchUtil::resolveSearchFormByData($getData, $searchModel); if ($searchModel->savedSearchId != null) { $dataCollection = new SavedSearchAttributesDataCollection($searchModel); } } if ($stickySearchKey != null && ($setSticky || $searchModel->getKanbanBoard() != null && $searchModel->getKanbanBoard()->getClearSticky())) { if ($stickySearchData == null) { $stickySearchData = array(); } SavedSearchUtil::setDataByKeyAndDataCollection($stickySearchKey, $dataCollection, $stickySearchData); } $searchModel->loadSavedSearchUrl = Yii::app()->createUrl($this->getModule()->getId() . '/' . $this->getId() . '/list/'); } return $dataCollection; }
/** * Checks if the empty values are properly converted to null when nested */ public function testGetSearchAttributesFromSearchArrayWithRecursiveNullResolution() { $searchArray = array('a' => 'apple', 'b' => array('relatedModelData' => true, 'bMember' => ''), 'c' => array('relatedModelData' => true, 'd' => array('relatedModelData' => true, 'dMember' => ''))); $testArray = array('a' => 'apple', 'b' => array('relatedModelData' => true, 'bMember' => null), 'c' => array('relatedModelData' => true, 'd' => array('relatedModelData' => true, 'dMember' => null))); $newArray = SearchUtil::getSearchAttributesFromSearchArray($searchArray); $this->assertEquals($testArray, $newArray); }
?> </div> <div class="next left nav"><img width="10" height="10" src="<?php echo $_zp_themeroot; ?> /resources/images/chevron.png" /></div> <div class="clear"></div> </div> </div> <div> <?php foreach ($years as $year => $months) { echo "<div id='year-detail-wrapper-{$year}' class='year-detail-wrapper'><ul id='year-detail-{$year}' class='year-detail'>"; foreach ($months as $month => $a) { $link = SearchUtil::getArchiveMonthLink($year, $month, $a[0], $a[1], 'a'); echo "<li text='{$month} {$year}'>{$link}</li>"; } echo "</ul></div>\n"; } ?> </div> </div> <div id="image-wrap-scroll" class="archive"> <div> <div id="image-wrapper"> <div id="image-full-preview-container" class="opa80"></div> </div> </div>
protected function makeDataProviderBySearchAttributeData($searchAttributeData) { assert('is_array($searchAttributeData)'); $sortAttribute = SearchUtil::resolveSortAttributeFromArray($this->modelClassName, $_GET); $sortDescending = SearchUtil::resolveSortDescendingFromArray($this->modelClassName, $_GET); if ($sortAttribute === null) { $sortAttribute = $this->getSortAttributeForDataProvider(); $sortDescending = $this->resolveSortDescendingForDataProvider(); } return new RedBeanModelDataProvider($this->modelClassName, $sortAttribute, (bool) $sortDescending, $searchAttributeData, $this->resolveConfigForDataProvider()); }
protected function resolveAndSanitizeDynamicSearchAttributesByPostData($postData, DynamicSearchForm $searchForm) { if (isset($postData['dynamicClauses'])) { $dynamicSearchAttributes = SearchUtil::getSearchAttributesFromSearchArray($postData['dynamicClauses']); $sanitizedDynamicSearchAttributes = SearchUtil::sanitizeDynamicSearchAttributesByDesignerTypeForSavingModel($searchForm, $dynamicSearchAttributes); $postData['dynamicClauses'] = $sanitizedDynamicSearchAttributes; } return $postData; }
protected function makeDataProviderBySearchAttributeData($searchAttributeData) { assert('is_array($searchAttributeData)'); list($sortAttribute, $sortDescending) = SearchUtil::resolveSortFromStickyData($this->modelClassName, $this->uniqueLayoutId); $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType('dashboardListPageSize'); if ($sortAttribute === null) { $sortAttribute = $this->getSortAttributeForDataProvider(); $sortDescending = $this->resolveSortDescendingForDataProvider(); } $redBeanModelDataProvider = new RedBeanModelDataProvider($this->modelClassName, $sortAttribute, $sortDescending, $searchAttributeData, array('pagination' => array('pageSize' => $pageSize))); $sort = new RedBeanSort($redBeanModelDataProvider->modelClassName); $sort->sortVar = $redBeanModelDataProvider->getId() . '_sort'; $sort->route = 'defaultPortlet/myListDetails'; $sort->params = array_merge(GetUtil::getData(), array('portletId' => $this->params['portletId'])); $redBeanModelDataProvider->setSort($sort); return $redBeanModelDataProvider; }
public function resolveSortDescendingFromSourceData($name) { assert('is_string($name)'); $sortDescending = SearchUtil::resolveSortDescendingFromGetArray($name); if ($sortDescending === false) { if (!empty($this->model->sortDescending)) { $sortDescending = true; } else { $sortDescending = false; } } return $sortDescending; }
<div class="left"> <img id='search-icon' src="<?php echo PersonalityUtil::getPersonaIconURL("search", "{$_zp_themeroot}/resources/images/search.png"); ?> " width="64" height="64"/> <?php PersonalityUtil::printPersonalityIconSwitcher('search'); ?> </div> <div id="search_words" class="text left"> <span> <em class="wrap"><?php echo gettext('Search'); ?> : <a><?php echo SearchUtil::getSearchQuery(); ?> </a></em> </span> </div> <div class="clear"></div> </div> <div id="image-wrap-scroll"> <div> <div id="image-wrapper"> <div id="image-full-preview-container" class="opa80"></div> </div> </div> <div id="scroller" class="opa80">
public function testGetFilteredByFromArray() { $getArrayName = 'someArray'; $result = SearchUtil::getFilteredByFromArray($getArrayName, $_GET); $this->assertNull($result); $_GET['someArray']['filteredBy'] = 'all'; $result = SearchUtil::getFilteredByFromArray($getArrayName, $_GET); $this->assertEquals('all', $result); $_GET['someArray']['filteredBy'] = 'none'; $result = SearchUtil::getFilteredByFromArray($getArrayName, $_GET); $this->assertEquals('none', $result); }
public function resolveFilterByStarredFromSourceData() { SearchUtil::resolveFilterByStarredFromGetArray($this->model, get_class($this->model)); }
public static function renderDynamicSearchAttributeInput($viewClassName, $modelClassName, $formModelClassName, $rowNumber, $attributeIndexOrDerivedType, $searchAttributes = array(), $suffix = null) { assert('is_string($viewClassName)'); assert('is_string($modelClassName)'); assert('is_string($formModelClassName)'); assert('is_int($rowNumber)'); assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null'); assert('is_array($searchAttributes)'); assert('is_string($suffix) || $suffix == null'); $content = null; if (count(explode(FormModelUtil::RELATION_DELIMITER, $attributeIndexOrDerivedType)) > 1) { $model = new $modelClassName(false); $nestedAttributes = explode(FormModelUtil::RELATION_DELIMITER, $attributeIndexOrDerivedType); $inputPrefix = array($formModelClassName, DynamicSearchForm::DYNAMIC_NAME, $rowNumber); $totalNestedCount = count($nestedAttributes); $processCount = 1; $nestedSearchAttributes = $searchAttributes; foreach ($nestedAttributes as $attribute) { if ($processCount < $totalNestedCount && isset($nestedSearchAttributes[$attribute])) { $nestedSearchAttributes = $nestedSearchAttributes[$attribute]; if (isset($nestedSearchAttributes['relatedData'])) { unset($nestedSearchAttributes['relatedData']); } } if ($processCount < $totalNestedCount) { $model = SearchUtil::resolveModelToUseByModelAndAttributeName($model, $attribute); $inputPrefix[] = $attribute; $relatedDataName = Element::resolveInputNamePrefixIntoString($inputPrefix) . '[relatedData]'; $content .= ZurmoHtml::hiddenField($relatedDataName, true); } $processCount++; } $attributeIndexOrDerivedType = $attribute; $modelToUse = $model; $modelToUse->setAttributes($nestedSearchAttributes); $cellElementModelClassName = get_class($model->getModel()); //Dynamic Search needs to always assume there is an available SearchForm //Always assumes the SearchView to use matches the exact pluralCamelCasedName. //Does not support nested relations to leads persay. It will resolve as a Contact. //This is not a problem since you can't relate a model to a lead, it is related to a contact. //So this scenario would not come up naturally. $moduleClassName = $model->getModel()->getModuleClassName(); $viewClassName = $moduleClassName::getPluralCamelCasedName() . 'SearchView'; $element = DynamicSearchUtil::getCellElement($viewClassName, $cellElementModelClassName, $attributeIndexOrDerivedType); } else { $model = new $modelClassName(false); $model->setScenario('importModel'); //this is so attributes such as modified user can be set $modelToUse = new $formModelClassName($model); $modelToUse->setAttributes($searchAttributes); $inputPrefix = array($formModelClassName, DynamicSearchForm::DYNAMIC_NAME, $rowNumber); $element = DynamicSearchUtil::getCellElement($viewClassName, $modelClassName, $attributeIndexOrDerivedType); } $form = new NoRequiredsActiveForm(); $form->id = "search-form"; $element['inputPrefix'] = $inputPrefix; $elementclassname = $element['type'] . 'Element'; $element = new $elementclassname($modelToUse, $element['attributeName'], $form, array_slice($element, 2)); $element->editableTemplate = '{content}{error}'; $content .= $element->render(); DropDownUtil::registerScripts(CClientScript::POS_END); return $content; }
public static function resolveSortDescendingFromSourceData($name) { assert('is_string($name)'); return SearchUtil::resolveSortDescendingFromGetArray(${$name}); }