Ejemplo n.º 1
0
 function execute($query)
 {
     global $wgRequest, $wgOut, $wgTitle;
     global $sdgScriptPath, $sdgContLang, $sdgNumResultsPerPage;
     if ($wgTitle->getNamespace() != NS_SPECIAL) {
         global $wgParser;
         $wgParser->disableCache();
     }
     $this->setHeaders();
     $wgOut->addModules('ext.semanticdrilldown.main');
     $wgOut->addScript('<!--[if IE]><link rel="stylesheet" href="' . $sdgScriptPath . '/skins/SD_IEfixes.css" media="screen" /><![endif]-->');
     // set default
     if ($sdgNumResultsPerPage == null) {
         $sdgNumResultsPerPage = 250;
     }
     list($limit, $offset) = wfCheckLimits($sdgNumResultsPerPage, 'sdlimit');
     $filters = array();
     // get information on current category, subcategory and filters
     // that have already been applied from the query string
     $category = str_replace('_', ' ', $wgRequest->getVal('_cat'));
     // if query string did not contain this variables, try the URL
     if (!$category) {
         $queryparts = explode('/', $query, 1);
         $category = isset($queryparts[0]) ? $queryparts[0] : '';
     }
     if (!$category) {
         $category_title = wfMessage('browsedata')->text();
     } else {
         $category_title = SDUtils::getDrilldownTitleForCategory($category);
         if ($category_title == '') {
             $category_title = wfMessage('browsedata')->text() . html_entity_decode(wfMessage('colon-separator')->text()) . str_replace('_', ' ', $category);
         }
     }
     // if no category was specified, go with the first
     // category on the site, alphabetically
     if (!$category) {
         $categories = SDUtils::getCategoriesForBrowsing();
         if (count($categories) == 0) {
             // There are apparently no top-level
             // categories in this wiki - just exit now.
             return 0;
         }
         $category = $categories[0];
     }
     $subcategory = $wgRequest->getVal('_subcat');
     $filters = SDUtils::loadFiltersForCategory($category);
     $filters_used = array();
     foreach ($filters as $i => $filter) {
         $filter_used[] = false;
     }
     $applied_filters = array();
     $remaining_filters = array();
     foreach ($filters as $i => $filter) {
         $filter_name = str_replace(array(' ', "'"), array('_', "\\'"), $filter->name);
         $search_terms = $wgRequest->getArray('_search_' . $filter_name);
         $lower_date = $wgRequest->getArray('_lower_' . $filter_name);
         $upper_date = $wgRequest->getArray('_upper_' . $filter_name);
         if ($vals_array = $wgRequest->getArray($filter_name)) {
             foreach ($vals_array as $j => $val) {
                 $vals_array[$j] = str_replace('_', ' ', $val);
             }
             $applied_filters[] = SDAppliedFilter::create($filter, $vals_array);
             $filter_used[$i] = true;
         } elseif ($search_terms != null) {
             $applied_filters[] = SDAppliedFilter::create($filter, array(), $search_terms);
             $filter_used[$i] = true;
         } elseif ($lower_date != null || $upper_date != null) {
             $applied_filters[] = SDAppliedFilter::create($filter, array(), null, $lower_date, $upper_date);
             $filter_used[$i] = true;
         }
     }
     // add every unused filter to the $remaining_filters array,
     // unless it requires some other filter that hasn't been applied
     foreach ($filters as $i => $filter) {
         $matched_all_required_filters = true;
         foreach ($filter->required_filters as $required_filter) {
             $found_match = false;
             foreach ($applied_filters as $af) {
                 if ($af->filter->name == $required_filter) {
                     $found_match = true;
                 }
             }
             if (!$found_match) {
                 $matched_all_required_filters = false;
                 continue;
             }
         }
         if ($matched_all_required_filters) {
             if (!$filter_used[$i]) {
                 $remaining_filters[] = $filter;
             }
         }
     }
     $wgOut->addHTML("\n\t\t\t<div class=\"drilldown-results\">\n");
     $rep = new SDBrowseDataPage($category, $subcategory, $applied_filters, $remaining_filters, $offset, $limit);
     $num = $rep->execute($query);
     $wgOut->addHTML("\n\t\t\t</div> <!-- drilldown-results -->\n");
     // This has to be set last, because otherwise the QueryPage
     // code will overwrite it.
     $wgOut->setPageTitle($category_title);
     return $num;
 }