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; }