Ejemplo n.º 1
0
	/**
	 * 
	 * @return SMWQuery
	 */
	protected function getQuery( $queryString, array $printouts ) {
		SMWQueryProcessor::addThisPrintout( $printouts, $this->parameters );
		
		return SMWQueryProcessor::createQuery(
			$queryString,
			SMWQueryProcessor::getProcessedParams( $this->parameters, $printouts ),
			SMWQueryProcessor::SPECIAL_PAGE,
			'',
			$printouts
		);
	}
Ejemplo n.º 2
0
 /**
  * Handler for the #compound_query parser function.
  * 
  * @param Parser $parser
  * 
  * @return string
  */
 public static function doCompoundQuery(Parser &$parser)
 {
     global $smwgQEnabled, $smwgIQRunningNumber;
     if (!$smwgQEnabled) {
         return smwfEncodeMessages(array(wfMsgForContent('smw_iq_disabled')));
     }
     $smwgIQRunningNumber++;
     $params = func_get_args();
     array_shift($params);
     // We already know the $parser.
     $other_params = array();
     $results = array();
     $printRequests = array();
     $queryParams = array();
     foreach ($params as $param) {
         // Very primitive heuristic - if the parameter
         // includes a square bracket, then it's a
         // sub-query; otherwise it's a regular parameter.
         if (strpos($param, '[') !== false) {
             $queryParams[] = $param;
         } else {
             $parts = explode('=', $param, 2);
             if (count($parts) >= 2) {
                 $other_params[strtolower(trim($parts[0]))] = $parts[1];
                 // don't trim here, some params care for " "
             }
         }
     }
     foreach ($queryParams as $param) {
         $subQueryParams = self::getSubParams($param);
         if (array_key_exists('format', $other_params) && !array_key_exists('format', $subQueryParams)) {
             $subQueryParams['format'] = $other_params['format'];
         }
         $next_result = self::getQueryResultFromFunctionParams($subQueryParams, SMW_OUTPUT_WIKI);
         $results = self::mergeSMWQueryResults($results, $next_result->getResults());
         $printRequests = self::mergeSMWPrintRequests($printRequests, $next_result->getPrintRequests());
     }
     // Sort results so that they'll show up by page name
     uasort($results, array('SCQQueryProcessor', 'compareQueryResults'));
     $query_result = new SCQQueryResult($printRequests, new SMWQuery(), $results, smwfGetStore());
     if (version_compare(SMW_VERSION, '1.6.1', '>')) {
         SMWQueryProcessor::addThisPrintout($printRequests, $other_params);
         $other_params = parent::getProcessedParams($other_params, $printRequests);
     }
     return self::getResultFromQueryResult($query_result, $other_params, SMW_OUTPUT_WIKI);
 }
Ejemplo n.º 3
0
 /**
  * Method for handling the ask concept function.
  * 
  * @todo The possible use of this in an HTML or Specal page context needs to be revisited. The code mentions it, but can this actually happen?
  * @todo The escaping of symbols in concept queries needs to be revisited.
  * 
  * @since 1.5.3
  * 
  * @param Parser $parser
  */
 public static function render(Parser &$parser)
 {
     global $wgContLang, $wgTitle;
     $title = $parser->getTitle();
     $pconc = new SMWDIProperty('_CONC');
     if ($title->getNamespace() != SMW_NS_CONCEPT) {
         $result = smwfEncodeMessages(array(wfMsgForContent('smw_no_concept_namespace')));
         SMWOutputs::commitToParser($parser);
         return $result;
     } elseif (count(SMWParseData::getSMWdata($parser)->getPropertyValues($pconc)) > 0) {
         $result = smwfEncodeMessages(array(wfMsgForContent('smw_multiple_concepts')));
         SMWOutputs::commitToParser($parser);
         return $result;
     }
     // process input:
     $params = func_get_args();
     array_shift($params);
     // We already know the $parser ...
     // Use first parameter as concept (query) string.
     $concept_input = str_replace(array('&gt;', '&lt;'), array('>', '<'), array_shift($params));
     // second parameter, if any, might be a description
     $concept_docu = array_shift($params);
     // NOTE: the str_replace above is required in MediaWiki 1.11, but not in MediaWiki 1.14
     $query = SMWQueryProcessor::createQuery($concept_input, SMWQueryProcessor::getProcessedParams(array('limit' => 20, 'format' => 'list')), SMWQueryProcessor::CONCEPT_DESC);
     $concept_text = $query->getDescription()->getQueryString();
     if (!is_null(SMWParseData::getSMWData($parser))) {
         $diConcept = new SMWDIConcept($concept_text, $concept_docu, $query->getDescription()->getQueryFeatures(), $query->getDescription()->getSize(), $query->getDescription()->getDepth());
         SMWParseData::getSMWData($parser)->addPropertyObjectValue($pconc, $diConcept);
     }
     // display concept box:
     $rdflink = SMWInfolink::newInternalLink(wfMsgForContent('smw_viewasrdf'), $wgContLang->getNsText(NS_SPECIAL) . ':ExportRDF/' . $title->getPrefixedText(), 'rdflink');
     SMWOutputs::requireResource('ext.smw.style');
     // TODO: escape output, preferably via Html or Xml class.
     $result = '<div class="smwfact"><span class="smwfactboxhead">' . wfMsgForContent('smw_concept_description', $title->getText()) . (count($query->getErrors()) > 0 ? ' ' . smwfEncodeMessages($query->getErrors()) : '') . '</span>' . '<span class="smwrdflink">' . $rdflink->getWikiText() . '</span>' . '<br />' . ($concept_docu ? "<p>{$concept_docu}</p>" : '') . '<pre>' . str_replace('[', '&#x005B;', $concept_text) . "</pre>\n</div>";
     if (!is_null($wgTitle) && $wgTitle->isSpecialPage()) {
         global $wgOut;
         SMWOutputs::commitToOutputPage($wgOut);
     } else {
         SMWOutputs::commitToParser($parser);
     }
     return $result;
 }
Ejemplo n.º 4
0
 /**
  * Executes the query.
  *
  * This method can be called once $queryString, $parameters, $printOuts
  * are set either by using the setQueryString(), setParams() and
  * setPrintOuts() followed by extractParameters(), or one of the static
  * factory methods such as makeForInfoLink() or makeForUI().
  *
  * Errors, if any can be accessed from hasError() and getErrors().
  */
 public function execute()
 {
     $errors = array();
     if ($this->queryString !== '') {
         // FIXME: this is a hack
         SMWQueryProcessor::addThisPrintout($this->printOuts, $this->parameters);
         $params = SMWQueryProcessor::getProcessedParams($this->parameters, $this->printOuts);
         $this->parameters['format'] = $params['format'];
         $this->params = $params;
         $query = SMWQueryProcessor::createQuery($this->queryString, $params, SMWQueryProcessor::SPECIAL_PAGE, $this->parameters['format'], $this->printOuts);
         $res = smwfGetStore()->getQueryResult($query);
         $this->queryResult = $res;
         $errors = array_merge($errors, $res->getErrors());
         if (!empty($errors)) {
             $this->errorsOccured = true;
             $this->errors = array_merge($errors, $this->errors);
         }
         // BEGIN: Try to be smart for rss/ical if no description/title is given and we have a concept query
         if ($this->parameters['format'] == 'rss') {
             $descKey = 'rssdescription';
             $titleKey = 'rsstitle';
         } elseif ($this->parameters['format'] == 'icalendar') {
             $descKey = 'icalendardescription';
             $titleKey = 'icalendartitle';
         } else {
             $descKey = false;
         }
         if ($descKey && $query->getDescription() instanceof SMWConceptDescription && (!isset($this->parameters[$descKey]) || !isset($this->parameters[$titleKey]))) {
             $concept = $query->getDescription()->getConcept();
             if (!isset($this->parameters[$titleKey])) {
                 $this->parameters[$titleKey] = $concept->getText();
             }
             if (!isset($this->parameters[$descKey])) {
                 // / @bug The current SMWStore will never return SMWConceptValue (an SMWDataValue) here; it might return SMWDIConcept (an SMWDataItem)
                 $dv = end(smwfGetStore()->getPropertyValues(SMWWikiPageValue::makePageFromTitle($concept), new SMWDIProperty('_CONC')));
                 if ($dv instanceof SMWConceptValue) {
                     $this->parameters[$descKey] = $dv->getDocu();
                 }
             }
         }
         // END: Try to be smart for rss/ical if no description/title is given and we have a concept query
         /*
          * If parameters have been passed in the infolink-style and the
          * mimie-type of format is defined, generate the export, instead of
          * showing more html.
          */
         $printer = SMWQueryProcessor::getResultPrinter($this->parameters['format'], SMWQueryProcessor::SPECIAL_PAGE);
         $resultMime = $printer->getMimeType($res);
         if ($this->context == self::WIKI_LINK && $resultMime != false) {
             global $wgOut;
             $result = $printer->getResult($res, $this->parameters, SMW_OUTPUT_FILE);
             $resultName = $printer->getFileName($res);
             $wgOut->disable();
             header("Content-type: {$resultMime}; charset=UTF-8");
             if ($resultName !== false) {
                 header("content-disposition: attachment; filename={$resultName}");
             }
             echo $result;
         }
     }
 }
Ejemplo n.º 5
0
 /**
  * @param String $term
  *
  * @return SMWQuery | null
  */
 private function getSearchQuery($term)
 {
     if (!is_string($term) || trim($term) === '') {
         return null;
     }
     if (!array_key_exists($term, $this->queryCache)) {
         $params = \SMWQueryProcessor::getProcessedParams(array());
         $query = \SMWQueryProcessor::createQuery($term, $params);
         $description = $query->getDescription();
         if ($description === null || is_a($description, 'SMWThingDescription')) {
             $query = null;
         }
         $this->queryCache[$term] = $query;
     }
     return $this->queryCache[$term];
 }
Ejemplo n.º 6
0
 /**
  * TODO: document
  */
 protected function makeHTMLResult()
 {
     global $wgOut;
     // TODO: hold into account $smwgAutocompleteInSpecialAsk
     $wgOut->addModules('ext.smw.ask');
     $result = '';
     $result_mime = false;
     // output in MW Special page as usual
     // build parameter strings for URLs, based on current settings
     $urlArgs['q'] = $this->m_querystring;
     $tmp_parray = array();
     foreach ($this->m_params as $key => $value) {
         if (!in_array($key, array('sort', 'order', 'limit', 'offset', 'title'))) {
             $tmp_parray[$key] = $value;
         }
     }
     $urlArgs['p'] = SMWInfolink::encodeParameters($tmp_parray);
     $printoutstring = '';
     /**
      * @var SMWPrintRequest $printout
      */
     foreach ($this->m_printouts as $printout) {
         $printoutstring .= $printout->getSerialisation() . "\n";
     }
     if ($printoutstring !== '') {
         $urlArgs['po'] = $printoutstring;
     }
     if (array_key_exists('sort', $this->m_params)) {
         $urlArgs['sort'] = $this->m_params['sort'];
     }
     if (array_key_exists('order', $this->m_params)) {
         $urlArgs['order'] = $this->m_params['order'];
     }
     if ($this->m_querystring !== '') {
         // FIXME: this is a hack
         SMWQueryProcessor::addThisPrintout($this->m_printouts, $this->m_params);
         $params = SMWQueryProcessor::getProcessedParams($this->m_params, $this->m_printouts);
         $this->m_params['format'] = $params['format']->getValue();
         $this->params = $params;
         $queryobj = SMWQueryProcessor::createQuery($this->m_querystring, $params, SMWQueryProcessor::SPECIAL_PAGE, $this->m_params['format'], $this->m_printouts);
         /**
          * @var SMWQueryResult $res
          */
         // Determine query results
         $res = $params['source']->getValue()->getQueryResult($queryobj);
         // Try to be smart for rss/ical if no description/title is given and we have a concept query:
         if ($this->m_params['format'] == 'rss') {
             $desckey = 'rssdescription';
             $titlekey = 'rsstitle';
         } elseif ($this->m_params['format'] == 'icalendar') {
             $desckey = 'icalendardescription';
             $titlekey = 'icalendartitle';
         } else {
             $desckey = false;
         }
         if ($desckey && $queryobj->getDescription() instanceof SMWConceptDescription && (!isset($this->m_params[$desckey]) || !isset($this->m_params[$titlekey]))) {
             $concept = $queryobj->getDescription()->getConcept();
             if (!isset($this->m_params[$titlekey])) {
                 $this->m_params[$titlekey] = $concept->getText();
             }
             if (!isset($this->m_params[$desckey])) {
                 // / @bug The current SMWStore will never return SMWConceptValue (an SMWDataValue) here; it might return SMWDIConcept (an SMWDataItem)
                 $dv = end(smwfGetStore()->getPropertyValues(SMWWikiPageValue::makePageFromTitle($concept), new SMWDIProperty('_CONC')));
                 if ($dv instanceof SMWConceptValue) {
                     $this->m_params[$desckey] = $dv->getDocu();
                 }
             }
         }
         $printer = SMWQueryProcessor::getResultPrinter($this->m_params['format'], SMWQueryProcessor::SPECIAL_PAGE);
         global $wgRequest;
         $hidequery = $wgRequest->getVal('eq') == 'no';
         if (!$printer->isExportFormat()) {
             if ($res->getCount() > 0) {
                 if ($this->m_editquery) {
                     $urlArgs['eq'] = 'yes';
                 } elseif ($hidequery) {
                     $urlArgs['eq'] = 'no';
                 }
                 $navigation = $this->getNavigationBar($res, $urlArgs);
                 $result .= '<div style="text-align: center;">' . "\n" . $navigation . "\n</div>\n";
                 $query_result = $printer->getResult($res, $params, SMW_OUTPUT_HTML);
                 if (is_array($query_result)) {
                     $result .= $query_result[0];
                 } else {
                     $result .= $query_result;
                 }
                 $result .= '<div style="text-align: center;">' . "\n" . $navigation . "\n</div>\n";
             } else {
                 $result = '<div style="text-align: center;">' . wfMessage('smw_result_noresults')->escaped() . '</div>';
             }
         }
     }
     if (isset($printer) && $printer->isExportFormat()) {
         $wgOut->disable();
         /**
          * @var SMWIExportPrinter $printer
          */
         $printer->outputAsFile($res, $params);
     } else {
         if ($this->m_querystring) {
             $wgOut->setHTMLtitle($this->m_querystring);
         } else {
             $wgOut->setHTMLtitle(wfMessage('ask')->text());
         }
         $urlArgs['offset'] = $this->m_params['offset'];
         $urlArgs['limit'] = $this->m_params['limit'];
         $result = $this->getInputForm($printoutstring, wfArrayToCGI($urlArgs)) . $result;
         $wgOut->addHTML($result);
     }
 }
Ejemplo n.º 7
0
 /**
  * This function returns to results of a certain query
  * This functions is part of the extension Semantic Tasks by Steren Giannini & Ryan Lane
  * released under GNU GPLv2 (or later)
  * http://www.mediawiki.org/wiki/Extension:Semantic_Tasks
  * @param $query_string String : the query
  * @param $properties_to_display array(String): array of property names to display
  * @param $display_title Boolean : add the page title in the result
  * @return TODO
  */
 static function getQueryResults($query_string, $properties_to_display, $display_title)
 {
     // We use the Semantic MediaWiki Processor
     // $smwgIP is defined by Semantic MediaWiki, and we don't allow
     // this file to be sourced unless Semantic MediaWiki is included.
     global $smwgIP;
     include_once $smwgIP . "/includes/query/SMW_QueryProcessor.php";
     $params = array();
     $inline = true;
     $printlabel = "";
     $printouts = array();
     // add the page name to the printouts
     if ($display_title) {
         if (version_compare(SMW_VERSION, '1.7', '>')) {
             SMWQueryProcessor::addThisPrintout($printouts, $params);
         } else {
             $to_push = new SMWPrintRequest(SMWPrintRequest::PRINT_THIS, $printlabel);
             array_push($printouts, $to_push);
         }
     }
     // Push the properties to display in the printout array.
     foreach ($properties_to_display as $property) {
         if (class_exists('SMWPropertyValue')) {
             // SMW 1.4
             $to_push = new SMWPrintRequest(SMWPrintRequest::PRINT_PROP, $property, SMWPropertyValue::makeUserProperty($property));
         } else {
             $to_push = new SMWPrintRequest(SMWPrintRequest::PRINT_PROP, $property, Title::newFromText($property, SMW_NS_PROPERTY));
         }
         array_push($printouts, $to_push);
     }
     if (version_compare(SMW_VERSION, '1.6.1', '>')) {
         $params = SMWQueryProcessor::getProcessedParams($params, $printouts);
         $format = null;
     } else {
         $format = 'auto';
     }
     $query = SMWQueryProcessor::createQuery($query_string, $params, $inline, $format, $printouts);
     $results = smwfGetStore()->getQueryResult($query);
     return $results;
 }
Ejemplo n.º 8
0
 /**
  * returns an array of pages that are result of the semantic query
  * @param $rawQueryString string - the query string like [[Category:Trees]][[age::>1000]]
  * @return array of SMWDIWikiPage objects representing the result
  */
 public static function getAllPagesForQuery($rawQuery)
 {
     $rawQueryArray = array($rawQuery);
     SMWQueryProcessor::processFunctionParams($rawQueryArray, $queryString, $processedParams, $printouts);
     SMWQueryProcessor::addThisPrintout($printouts, $processedParams);
     $processedParams = SMWQueryProcessor::getProcessedParams($processedParams, $printouts);
     $queryObj = SMWQueryProcessor::createQuery($queryString, $processedParams, SMWQueryProcessor::SPECIAL_PAGE, '', $printouts);
     $res = smwfGetStore()->getQueryResult($queryObj);
     $pages = $res->getResults();
     return $pages;
 }
 /**
  * Returns all results that have a value near to the searched for value
  * on the property, ordered, and sorted by ending with the smallest one.
  *
  * @param[in] $count int  How many entities have the exact same value on the property?
  * @param[in] $greater bool  Should the values be bigger? Set false for smaller values
  *
  * @return array of array of SMWWikiPageValue, SMWDataValue with the first being the entity, and the second the value
  */
 private function getNearbyResults($count, $greater = true)
 {
     $options = new SMWRequestOptions();
     $options->limit = $this->limit + 1;
     $options->sort = true;
     // Note: printrequests change the caption of properties they get (they expect properties to be given to them)
     // Since we want to continue using the property for our purposes, we give a clone to the print request.
     $printrequest = new SMWPrintRequest(SMWPrintRequest::PRINT_PROP, '', clone $this->property);
     $params = array();
     $params['format'] = 'ul';
     $params['sort'] = $this->propertystring;
     $params['order'] = 'DESC';
     if ($greater) {
         $params['order'] = 'ASC';
     }
     $cmp = '<';
     if ($greater) {
         $cmp = '>';
     }
     $querystring = '[[' . $this->propertystring . '::' . $cmp . $this->valuestring . ']]';
     $printouts = array($printrequest);
     SMWQueryProcessor::addThisPrintout($printouts, $params);
     $params = SMWQueryProcessor::getProcessedParams($params, $printouts);
     $queryobj = SMWQueryProcessor::createQuery($querystring, $params, SMWQueryProcessor::SPECIAL_PAGE, 'ul', $printouts);
     $queryobj->querymode = SMWQuery::MODE_INSTANCES;
     $queryobj->setLimit($this->limit);
     $queryobj->setOffset($count);
     $results = smwfGetStore()->getQueryResult($queryobj);
     /* array of SMWResultArray */
     $result = $results->getNext();
     $ret = array();
     while ($result) {
         $r = array($result[0]->getNextDataValue());
         if (array_key_exists(1, $result)) {
             $r[] = $result[1]->getNextDataValue();
         }
         $ret[] = $r;
         $result = $results->getNext();
     }
     if (!$greater) {
         $ret = array_reverse($ret);
     }
     return $ret;
 }
Ejemplo n.º 10
0
 /**
  * Handles Ajax call
  * @param integer $pageId
  * @param type $template
  * @param type $printrequests
  * @return type
  */
 public static function handleGetResult($pageId, $template, $printrequests)
 {
     $title = Title::newFromID($pageId)->getPrefixedText();
     $rp = new SMWListResultPrinter('template', true);
     $paramDefinitions = ParamDefinition::getCleanDefinitions($rp->getParamDefinitions(array()));
     $params = array();
     /**
      * @param IParamDefinition $def
      */
     foreach ($paramDefinitions as $def) {
         $params[$def->getName()] = $def->getDefault();
     }
     $params = array_merge($params, array('format' => 'template', 'template' => $template, 'mainlabel' => '', 'sort' => '', 'order' => '', 'intro' => null, 'outro' => null, 'searchlabel' => null, 'link' => null, 'default' => null, 'headers' => null, 'introtemplate' => '', 'outrotemplate' => ''));
     $params = SMWQueryProcessor::getProcessedParams($params, array());
     $p = json_decode($printrequests, true);
     $extraprintouts = array();
     foreach ($p as $key => $prData) {
         // if printout mode is PRINT_PROP
         if ($prData[0] == SMWPrintRequest::PRINT_PROP) {
             // create property from property key
             $data = SMWPropertyValue::makeUserProperty($prData[2]);
         } else {
             $data = null;
         }
         // create printrequest from request mode, label, property name, output format, parameters
         $extraprintouts[] = new SMWPrintRequest($prData[0], $prData[1], $data, $prData[3], $prData[4]);
     }
     return SMWQueryProcessor::getResultFromQueryString('[[' . $title . ']]', $params, $extraprintouts, SMW_OUTPUT_HTML, SMWQueryProcessor::INLINE_QUERY);
 }
Ejemplo n.º 11
0
 /**
  * Format and output report results using the given information plus
  * OutputPage
  *
  * @param OutputPage $out OutputPage to print to
  * @param Skin $skin User skin to use
  * @param Database $dbr Database (read) connection to use
  * @param int $res Result pointer
  * @param int $num Number of available result rows
  * @param int $offset Paging offset
  */
 protected function outputResults($out, $skin, $dbr, $res, $num, $offset)
 {
     global $wgContLang;
     $all_display_params = SDUtils::getDisplayParamsForCategory($this->category);
     $querystring = null;
     $printouts = $params = array();
     // only one set of params is handled for now
     if (count($all_display_params) > 0) {
         $display_params = array_map('trim', $all_display_params[0]);
         SMWQueryProcessor::processFunctionParams($display_params, $querystring, $params, $printouts);
     }
     if (!empty($querystring)) {
         $query = SMWQueryProcessor::createQuery($querystring, $params);
     } else {
         $query = new SMWQuery();
     }
     if (!array_key_exists('format', $params)) {
         $params['format'] = 'category';
     }
     if (array_key_exists('mainlabel', $params)) {
         $mainlabel = $params['mainlabel'];
     } else {
         $mainlabel = '';
     }
     $r = $this->addSemanticResultWrapper($dbr, $res, $num, $query, $mainlabel, $printouts);
     $printer = SMWQueryProcessor::getResultPrinter($params['format'], SMWQueryProcessor::SPECIAL_PAGE, $r);
     if (version_compare(SMW_VERSION, '1.6.1', '>')) {
         SMWQueryProcessor::addThisPrintout($printouts, $params);
         $params = SMWQueryProcessor::getProcessedParams($params, $printouts);
     }
     $prresult = $printer->getResult($r, $params, SMW_OUTPUT_HTML);
     $prtext = is_array($prresult) ? $prresult[0] : $prresult;
     SMWOutputs::commitToOutputPage($out);
     // Crappy hack to get the contents of SMWOutputs::$mHeadItems,
     // which may have been set in the result printer, and dump into
     // headItems of $out.
     // How else can we do this?
     global $wgParser;
     SMWOutputs::commitToParser($wgParser);
     if (!is_null($wgParser->mOutput)) {
         // getHeadItems() was added in MW 1.16
         if (method_exists($wgParser->getOutput(), 'getHeadItems')) {
             $headItems = $wgParser->getOutput()->getHeadItems();
         } else {
             $headItems = $wgParser->getOutput()->mHeadItems;
         }
         foreach ($headItems as $key => $item) {
             $out->addHeadItem($key, $item);
         }
         // Force one more parser function, so links appear.
         $wgParser->replaceLinkHolders($prtext);
     }
     $html = array();
     $html[] = $prtext;
     if (!$this->listoutput) {
         $html[] = $this->closeList();
     }
     $html = $this->listoutput ? $wgContLang->listToText($html) : implode('', $html);
     $out->addHTML($html);
 }
Ejemplo n.º 12
0
 protected function getResults($input)
 {
     $query = "[[Collection::" . $input . "]]|?Expression|?Language";
     $rawParams = explode('|', $query);
     list($queryString, $parameters, $printouts) = SMWQueryProcessor::getComponentsFromFunctionParams($rawParams, false);
     SMWQueryProcessor::addThisPrintout($printouts, $parameters);
     $smwQuery = SMWQueryProcessor::createQuery($queryString, SMWQueryProcessor::getProcessedParams($parameters, $printouts), SMWQueryProcessor::SPECIAL_PAGE, '', $printouts);
     $smwQuery->setUnboundLimit(50000);
     $smwQueryResult = smwfGetStore()->getQueryResult($smwQuery);
     $results = $smwQueryResult->toArray()['results'];
     $modified_results = array();
     foreach (array_keys($results) as $key) {
         $short_key = explode("#", $key)[0];
         $lang = $results[$key]['printouts']['Language'][0];
         $langs[$lang] = null;
         $expression = explode(":", $results[$key]['printouts']['Expression'][0]['fulltext'])[1];
         $modified_results[$short_key][$lang][] = $expression;
     }
     return array('data' => $modified_results, 'langs' => array_keys($langs));
 }
Ejemplo n.º 13
0
 private function getExtraDownloadLinks()
 {
     $downloadLinks = '';
     if ($this->m_querystring === '') {
         return $downloadLinks;
     }
     $params = $this->m_params;
     $params = SMWQueryProcessor::getProcessedParams($params, $this->m_printouts);
     $query = SMWQueryProcessor::createQuery($this->m_querystring, $params, SMWQueryProcessor::SPECIAL_PAGE, '', $this->m_printouts);
     $link = QueryLinker::get($query);
     $link->setParameter('true', 'prettyprint');
     $link->setParameter('true', 'unescape');
     $link->setParameter('json', 'format');
     $link->setCaption('JSON');
     $downloadLinks .= $link->getHtml();
     $link = QueryLinker::get($query);
     $link->setCaption('CSV');
     $link->setParameter('csv', 'format');
     $downloadLinks .= ' | ' . $link->getHtml();
     $link = QueryLinker::get($query);
     $link->setCaption('RSS');
     $link->setParameter('rss', 'format');
     $downloadLinks .= ' | ' . $link->getHtml();
     $link = QueryLinker::get($query);
     $link->setCaption('RDF');
     $link->setParameter('rdf', 'format');
     $downloadLinks .= ' | ' . $link->getHtml();
     return '(' . $downloadLinks . ')';
 }
Ejemplo n.º 14
0
	/**
	 * TODO: document
	 */
	protected function makeHTMLResult() {
		global $wgOut, $smwgAutocompleteInSpecialAsk;

		$delete_msg = wfMsg( 'delete' );

		// Javascript code for the dynamic parts of the page
		$javascript_text = <<<END
<script type="text/javascript">
function updateOtherOptions(strURL) {
	jQuery.ajax({ url: strURL, context: document.body, success: function(data){
		jQuery("#other_options").html(data);
	}});
}

// code for handling adding and removing the "sort" inputs
var num_elements = {$this->m_num_sort_values};

function addInstance(starter_div_id, main_div_id) {
	var starter_div = document.getElementById(starter_div_id);
	var main_div = document.getElementById(main_div_id);

	//Create the new instance
	var new_div = starter_div.cloneNode(true);
	var div_id = 'sort_div_' + num_elements;
	new_div.className = 'multipleTemplate';
	new_div.id = div_id;
	new_div.style.display = 'block';

	var children = new_div.getElementsByTagName('*');
	var x;
	for (x = 0; x < children.length; x++) {
		if (children[x].name)
			children[x].name = children[x].name.replace(/_num/, '[' + num_elements + ']');
	}

	//Create 'delete' link
	var remove_button = document.createElement('span');
	remove_button.innerHTML = '[<a href="javascript:removeInstance(\'sort_div_' + num_elements + '\')">{$delete_msg}</a>]';
	new_div.appendChild(remove_button);

	//Add the new instance
	main_div.appendChild(new_div);
	num_elements++;
}

function removeInstance(div_id) {
	var olddiv = document.getElementById(div_id);
	var parent = olddiv.parentNode;
	parent.removeChild(olddiv);
}
</script>

END;

		$wgOut->addScript( $javascript_text );

		if ( $smwgAutocompleteInSpecialAsk ) {
			self::addAutocompletionJavascriptAndCSS();
		}

		$result = '';
		$result_mime = false; // output in MW Special page as usual

		// build parameter strings for URLs, based on current settings
		$urlArgs['q'] = $this->m_querystring;

		$tmp_parray = array();
		foreach ( $this->m_params as $key => $value ) {
			if ( !in_array( $key, array( 'sort', 'order', 'limit', 'offset', 'title' ) ) ) {
				$tmp_parray[$key] = $value;
			}
		}

		$urlArgs['p'] = SMWInfolink::encodeParameters( $tmp_parray );
		$printoutstring = '';

		foreach ( $this->m_printouts as /* SMWPrintRequest */ $printout ) {
			$printoutstring .= $printout->getSerialisation() . "\n";
		}

		if ( $printoutstring !== '' ) $urlArgs['po'] = $printoutstring;
		if ( array_key_exists( 'sort', $this->m_params ) )  $urlArgs['sort'] = $this->m_params['sort'];
		if ( array_key_exists( 'order', $this->m_params ) ) $urlArgs['order'] = $this->m_params['order'];

		if ( $this->m_querystring !== '' ) {
			// FIXME: this is a hack
			SMWQueryProcessor::addThisPrintout( $this->m_printouts, $this->m_params );
			$params = SMWQueryProcessor::getProcessedParams( $this->m_params, $this->m_printouts );
			$this->m_params['format'] = $params['format'];

			$queryobj = SMWQueryProcessor::createQuery(
				$this->m_querystring,
				$params,
				SMWQueryProcessor::SPECIAL_PAGE ,
				$this->m_params['format'],
				$this->m_printouts
			);

			$res = smwfGetStore()->getQueryResult( $queryobj );

			// Try to be smart for rss/ical if no description/title is given and we have a concept query:
			if ( $this->m_params['format'] == 'rss' ) {
				$desckey = 'rssdescription';
				$titlekey = 'rsstitle';
			} elseif ( $this->m_params['format'] == 'icalendar' ) {
				$desckey = 'icalendardescription';
				$titlekey = 'icalendartitle';
			} else { $desckey = false; }

			if ( ( $desckey ) && ( $queryobj->getDescription() instanceof SMWConceptDescription ) &&
			     ( !isset( $this->m_params[$desckey] ) || !isset( $this->m_params[$titlekey] ) ) ) {
				$concept = $queryobj->getDescription()->getConcept();

				if ( !isset( $this->m_params[$titlekey] ) ) {
					$this->m_params[$titlekey] = $concept->getText();
				}

				if ( !isset( $this->m_params[$desckey] ) ) {
					// / @bug The current SMWStore will never return SMWConceptValue (an SMWDataValue) here; it might return SMWDIConcept (an SMWDataItem)
					$dv = end( smwfGetStore()->getPropertyValues( SMWWikiPageValue::makePageFromTitle( $concept ), new SMWDIProperty( '_CONC' ) ) );
					if ( $dv instanceof SMWConceptValue ) {
						$this->m_params[$desckey] = $dv->getDocu();
					}
				}
			}

			$printer = SMWQueryProcessor::getResultPrinter( $this->m_params['format'], SMWQueryProcessor::SPECIAL_PAGE );
			$result_mime = $printer->getMimeType( $res );

			global $wgRequest;

			$hidequery = $wgRequest->getVal( 'eq' ) == 'no';

			// if it's an export format (like CSV, JSON, etc.),
			// don't actually export the data if 'eq' is set to
			// either 'yes' or 'no' in the query string - just
			// show the link instead
			if ( $this->m_editquery || $hidequery ) $result_mime = false;

			if ( $result_mime == false ) {
				if ( $res->getCount() > 0 ) {
					if ( $this->m_editquery ) {
						$urlArgs['eq'] = 'yes';
					}
					elseif ( $hidequery ) {
						$urlArgs['eq'] = 'no';
					}

					$navigation = $this->getNavigationBar( $res, $urlArgs );
					$result .= '<div style="text-align: center;">' . "\n" . $navigation . "\n</div>\n";
					$query_result = $printer->getResult( $res, $params, SMW_OUTPUT_HTML );

					if ( is_array( $query_result ) ) {
						$result .= $query_result[0];
					} else {
						$result .= $query_result;
					}

					$result .= '<div style="text-align: center;">' . "\n" . $navigation . "\n</div>\n";
				} else {
					$result = '<div style="text-align: center;">' . wfMsgHtml( 'smw_result_noresults' ) . '</div>';
				}
			} else { // make a stand-alone file
				$result = $printer->getResult( $res, $params, SMW_OUTPUT_FILE );
				$result_name = $printer->getFileName( $res ); // only fetch that after initialising the parameters
			}
		}

		if ( $result_mime == false ) {
			if ( $this->m_querystring ) {
				$wgOut->setHTMLtitle( $this->m_querystring );
			} else {
				$wgOut->setHTMLtitle( wfMsg( 'ask' ) );
			}

			$urlArgs['offset'] = $this->m_params['offset'];
			$urlArgs['limit'] = $this->m_params['limit'];

			$result = $this->getInputForm(
				$printoutstring,
				wfArrayToCGI( $urlArgs )
			) . $result;

			$wgOut->addHTML( $result );
		} else {
			$wgOut->disable();

			header( "Content-type: $result_mime; charset=UTF-8" );

			if ( $result_name !== false ) {
				header( "content-disposition: attachment; filename=$result_name" );
			}

			echo $result;
		}
	}