示例#1
0
 /**
  * load up filters stored in the session from previous searches
  *
  * @param   array  &$filters  list filters
  *
  * @return  void
  */
 private function getSessionFilters(&$filters)
 {
     $profiler = JProfiler::getInstance('Application');
     $elements = $this->listModel->getElements('id');
     $identifier = $this->app->input->get('listref', $this->listModel->getRenderContext());
     $key = 'com_' . $this->package . '.list' . $identifier . '.filter';
     $sessionFilters = JArrayHelper::fromObject($this->app->getUserState($key));
     $filterKeys = array_keys($filters);
     if (!is_array($sessionFilters) || !array_key_exists('key', $sessionFilters)) {
         return;
     }
     // If we are coming from a search form ignore session filters
     $fromFormId = $this->getSearchFormId();
     $formModel = $this->listModel->getFormModel();
     if (!is_null($fromFormId) && $fromFormId !== $formModel->getId()) {
         return;
     }
     // End ignore
     $request = $this->getPostFilterArray();
     JDEBUG ? $profiler->mark('listfilter:session filters getPostFilterArray') : null;
     $key = 'com_' . $this->package . '.list' . $identifier . '.filter.searchall';
     $requestKey = $this->getSearchAllRequestKey();
     JDEBUG ? $profiler->mark('listfilter:session filters getSearchAllRequestKey') : null;
     $pluginKeys = $this->getPluginFilterKeys();
     JDEBUG ? $profiler->mark('listfilter:session filters getPluginFilterKeys') : null;
     $search = $this->app->getUserStateFromRequest($key, $requestKey);
     $postKeys = FArrayHelper::getValue($request, 'key', array());
     for ($i = 0; $i < count($sessionFilters['key']); $i++) {
         $elid = FArrayHelper::getValue($sessionFilters['elementid'], $i);
         $key = FArrayHelper::getValue($sessionFilters['key'], $i, null);
         $index = FArrayHelper::getValue($filters['elementid'], $key, false);
         $origCondition = FArrayHelper::getValue($filters['orig_condition'], $i, '');
         // Used by radius search plugin
         $sqlConds = FArrayHelper::getValue($sessionFilters, 'sqlCond', array());
         if ($index !== false) {
             foreach ($filterKeys as $fKey) {
                 if (is_array($filters[$fKey]) && array_key_exists($index, $filters[$fKey])) {
                     /**
                      * $$$rob test1
                      * with the line below uncomment, the unset caused only first filter from query string to work, e..g
                      * &element_test___user[value][0]=aaassss&element_test___user[value][1]=X Administrator&element_test___user[join][1]=OR
                      * converted to:
                      * WHERE `#__users`.`name` REGEXP 'aaassss' OR `#___users`.`name` REGEXP ' X Administrator'
                      *
                      * unset($filters[$fKey][$index]);
                      */
                     $filters[$fKey] = array_values($filters[$fKey]);
                 }
             }
         }
         $value = $sessionFilters['value'][$i];
         $key2 = array_key_exists('key2', $sessionFilters) ? FArrayHelper::getValue($sessionFilters['key2'], $i, '') : '';
         if ($elid == -1) {
             // Search all boolean mode
             $eval = 0;
             $condition = 'AGAINST';
             $origCondition = 'AGAINST';
             $join = 'AND';
             $noFiltersSetup = 0;
             $hidden = 0;
             $search_type = 'searchall';
             $match = 1;
             $fullWordsOnly = 0;
             $required = 0;
             $access = $this->defaultAccessLevel();
             $grouped = 1;
             $label = '';
             /**
              * $$$ rob force the counter to always be the same for extended search all
              * stops issue of multiple search alls being applied
              */
             $counter = 9999;
             $raw = 0;
             $sqlCond = null;
         } else {
             $elementModel = FArrayHelper::getValue($elements, $elid);
             if (!is_a($elementModel, 'plgFabrik_Element') && !in_array($elid, $pluginKeys)) {
                 continue;
             }
             // Check list plugins
             if (in_array($elid, $pluginKeys)) {
                 $condition = $sessionFilters['condition'][$i];
                 $origCondition = $sessionFilters['orig_condition'][$i];
                 $eval = $sessionFilters['eval'][$i];
                 $search_type = $sessionFilters['search_type'][$i];
                 $join = $sessionFilters['join'][$i];
                 $grouped = $sessionFilters['grouped_to_previous'][$i];
                 $noFiltersSetup = $sessionFilters['no-filter-setup'][$i];
                 $hidden = $sessionFilters['hidden'][$i];
                 $match = $sessionFilters['match'][$i];
                 $fullWordsOnly = $sessionFilters['full_words_only'][$i];
                 $required = $sessionFilters['required'][$i];
                 $access = $sessionFilters['access'][$i];
                 $label = $sessionFilters['label'][$i];
                 $sqlCond = FArrayHelper::getValue($sqlConds, $i);
                 $raw = $sessionFilters['raw'][$i];
                 $counter = $elid;
             } else {
                 $sqlCond = null;
                 $condition = array_key_exists($i, $sessionFilters['condition']) ? $sessionFilters['condition'][$i] : $elementModel->getDefaultFilterCondition();
                 $origFound = array_key_exists('orig_condition', $sessionFilters) && array_key_exists($i, $sessionFilters['orig_condition']);
                 $origCondition = $origFound ? $sessionFilters['orig_condition'][$i] : $elementModel->getDefaultFilterCondition();
                 $raw = array_key_exists($i, $sessionFilters['raw']) ? $sessionFilters['raw'][$i] : 0;
                 $eval = array_key_exists($i, $sessionFilters['eval']) ? $sessionFilters['eval'][$i] : FABRIKFILTER_TEXT;
                 if (!is_a($elementModel, 'PlgFabrik_ElementDatabasejoin')) {
                     $fieldDesc = $elementModel->getFieldDescription();
                     if (JString::stristr($fieldDesc, 'INT')) {
                         if (is_numeric($search) && $condition == '=') {
                             $eval = FABRKFILTER_NOQUOTES;
                         }
                     }
                 }
                 /**
                  * add request filter to end of filter array
                  * with advanced search and then page nav this wasn't right
                  */
                 $search_type = array_key_exists($i, $sessionFilters['search_type']) ? $sessionFilters['search_type'][$i] : $elementModel->getDefaultFilterCondition();
                 $join = $sessionFilters['join'][$i];
                 $grouped = array_key_exists($i, $sessionFilters['grouped_to_previous']) ? $sessionFilters['grouped_to_previous'][$i] : 0;
                 $element = $elementModel->getElement();
                 $elParams = $elementModel->getParams();
                 $noFiltersSetup = $element->filter_type == '' ? 1 : 0;
                 $hidden = $element->filter_type == '' ? 1 : 0;
                 $match = $element->filter_exact_match;
                 $fullWordsOnly = $elParams->get('full_words_only');
                 $required = $elParams->get('filter_required');
                 $access = $elParams->get('filter_access');
                 $label = $elementModel->getListHeading();
                 /**
                  * $$$ rob if the session filter is also in the request data then set it to use the same key as the post data
                  * when the post data is processed it should then overwrite these values
                  */
                 $counter = array_search($key, $postKeys) !== false ? array_search($key, $postKeys) : $this->counter;
             }
         }
         /**
          * $$$ hugh - attempting to stop plugin filters getting overwritten
          * PLUGIN FILTER SAGA
          * So ... if this $filter is a pluginfilter, lets NOT overwrite it
          */
         if (array_key_exists('search_type', $filters) && array_key_exists($counter, $filters['search_type']) && $filters['search_type'][$counter] == 'jpluginfilters') {
             continue;
         }
         $filters['value'][$counter] = $value;
         $filters['condition'][$counter] = $condition;
         $filters['join'][$counter] = $join;
         $filters['no-filter-setup'][$counter] = $noFiltersSetup;
         $filters['hidden'][$counter] = $hidden;
         $filters['key'][$counter] = $key;
         $filters['key2'][$counter] = $key2;
         $filters['search_type'][$counter] = $search_type;
         $filters['match'][$counter] = $match;
         $filters['full_words_only'][$counter] = $fullWordsOnly;
         $filters['eval'][$counter] = $eval;
         $filters['required'][$counter] = $required;
         $filters['access'][$counter] = $access;
         $filters['grouped_to_previous'][$counter] = $grouped;
         $filters['label'][$counter] = $label;
         $filters['elementid'][$counter] = $elid;
         $filters['sqlCond'][$counter] = $sqlCond;
         $filters['raw'][$counter] = $raw;
         $filters['orig_condition'][$counter] = $origCondition;
         if (array_search($key, $postKeys) === false) {
             $this->counter++;
         }
     }
 }