Hi Cindy, Unfortunately, I have no idea what's causing your error - but since what's going wrong is possibly a basic MediaWiki issue, I would recommend writing to the wikitech-l mailing list with this question:
https://lists.wikimedia.org/mailman/listinfo/wikitech-l There are many more MediaWiki developers on that list, so there's a better chance that someone could help you. Beyond that, I can only say that I hope you keep going with trying to get this code working, and release the code to the public once you do - it sounds like a useful extension! -Yaron On Sat, Nov 13, 2010 at 7:35 AM, Cicalese, Cindy <cical...@mitre.org> wrote: > Hello. I’m developing a Semantic MediaWiki extension to partition an ask > query based upon the first character of one of the queried properties so > that the user can page through partitions of what would otherwise be a very > large query result. For example, I’d like to query all pages in > Category:Author in my wiki, but there are almost 4,000 of those, so I want > to partition the results dynamically by the first character of the author’s > last name. I have a working version, but I’m in the process of enhancing it > to use Ajax so that it only needs to refresh the <div> with the new query > results rather than the entire page as well as retaining previous partitions > in hidden <div>’s so previous queries don’t need to be repeated. (I may need > to figure out a way to purge some of those <div>’s if performance becomes a > problem after wandering through the partitions, but that’s a problem for > another day.) I’m having two parsing issues in the Ajax callback. I do not > believe that they are related to Ajax per se. The second issue may be caused > by my inexpert fix to the first issue, although I ran across the same second > issue previously in a different context. I have reproduced both issues in a > vastly simplified, minimal test program that I will discuss below. > > > > I’m using MediaWiki 1.16.0 and SemanticMediaWiki 1.5.2. > > > > The first issue is that I need access to the parser in the Ajax callback so > I can call recursiveTagParse on the results for the query. I tried using > $wgParser, but it does not appear to be in a good state in the callback. I > had a series of errors where the parser was calling functions on > non-objects. I played around with it a bit and was able to get past all of > these errors with this rather ugly code: > > > > global $wgParser; > > $wgParser->mOptions = new ParserOptions; > > $wgParser->initialiseVariables(); > > $wgParser->clearState(); > > $wgParser->setTitle(new Title($title)); > > > > where $title is the title retrieved using getTitle on the original > (pre-Ajax) working parser and sent as a parameter to JavaScript and back. > These calls allow me to get a parser that does not give me run-time errors, > but I’m not at all confident that this is the correct approach. > > > > The second issue I’m having is that when I call recursiveTagParse on the > data returned from the query in the Ajax callback, some of the data is > “disappears”. I should note that I’m invoking the same query and parsing > code in both the initial display of the page and in the Ajax callback. It > works initially but does not work in the callback using the questionable > parser instance described above. However, I had also seen the same blanking > behavior in a previous task where I did not have the first contributing > issue. In that case, I changed my approach completely to avoid the > recursiveTagParse, but I don’t believe I have the option of doing that here, > unless there is some option in the SMW query code that will return the > results already parsed. > > > > I’m reproducing my simplified test case below. You can run it by placing the > following wikitext on a page: > > > > {{#testQuery:[[Category:Author]] > > |limit=5 > > |searchlabel= > > |format=table > > }} > > > > replacing [[Category:Author]] with the query term of your choice. When you > install the PHP extension code below, you’ll see a page with a button and a > table containing up to 5 query results. When you press the button, the same > query is invoked, but the table is empty. If you comment out the line that > contains the call to recursiveTagParse in the PHP code below, you’ll see > that the query results are indeed being returned in both cases, but they are > getting obliterated in the Ajax callback by recursiveTagParse. > > > > It may very well be that solving the first issue will solve the second one, > but since I saw the second issue in another context previously, I wonder if > they really are two separate issues. > > > > Thank you very much for any assistance in working through these issues! > > > > Cindy > > > > PHP extension code: > > > > <?php > > > > /** > > * To activate the functionality of this extension include the following > > * in your LocalSettings.php file: > > * include_once("$IP/extensions/TestQuery/TestQuery.php"); > > */ > > > > if( !defined( 'MEDIAWIKI' ) ) die( "This is an extension to the MediaWiki > > package and cannot be run standalone." ); > > > > # credits > > $wgExtensionCredits['parserhook'][] = array ( > > 'name' => 'TestQuery', > > 'version' => '1.0', > > 'author' => "Cindy Cicalese", > > 'description' => "Bug test" > > ); > > > > $wgUseAjax = true; > > $wgAjaxExportList[] = 'testQueryPopulateDiv'; > > > > $wgHooks['LanguageGetMagic'][] = 'wfExtensionTestQuery_Magic'; > > $wgHooks['ParserFirstCallInit'][] = 'efTestQueryParserFunction_Setup'; > > > > function efTestQueryParserFunction_Setup (& $parser) { > > $parser->setFunctionHook('testQuery', 'testQuery'); > > return true; > > } > > > > function wfExtensionTestQuery_Magic(& $magicWords, $langCode) { > > $magicWords['testQuery'] = array (0, 'testQuery'); > > return true; > > } > > > > function testQuery($parser, $query) { > > $params = func_get_args(); > > array_shift($params); // first is $parser; strip it > > array_shift($params); // second is query string; strip it > > $testQuery = new TestQuery(); > > $output = $testQuery->firstVisit($parser, $query, $params); > > $parser->disableCache(); > > return array($parser->insertStripItem($output, $parser->mStripState), > > 'noparse' => false); > > } > > > > function testQueryPopulateDiv($query, $paramString, $title) { > > $params = explode("|", $paramString); > > $testQuery = new TestQuery(); > > $output = $testQuery->populateDiv($query, $params, $title); > > return $output; > > } > > > > class TestQuery { > > > > private $template = false; > > > > function firstVisit($parser, $query, $params) { > > $js = <<<EOT > > <script type="text/javascript"> > > function buttonClicked() { > > var query = document.forms['TestQuery'].Query.value; > > var params = document.forms['TestQuery'].Params.value; > > var title = document.forms['TestQuery'].Title.value; > > var div = document.getElementById('TestDiv'); > > sajax_do_call('testQueryPopulateDiv', [query, params, title], div); > > } > > </script> > > EOT; > > $parser->mOutput->addHeadItem($js); > > $this->parseParameters($params); > > $output = $this->buildForm($query, $params, $parser->getTitle()); > > $result = $this->getData($parser, $query, $params); > > $output .= $this->buildDiv($result); > > return $output; > > } > > > > function populateDiv($query, $params, $title) { > > global $wgParser; > > $wgParser->mOptions = new ParserOptions; > > $wgParser->initialiseVariables(); > > $wgParser->clearState(); > > $wgParser->setTitle(new Title($title)); > > $this->parseParameters($params); > > $currentPartitionData = $this->getData($wgParser, $query, $params); > > return $currentPartitionData; > > } > > > > private function parseParameters($params) { > > foreach ($params as $param) { > > if (preg_match("/^ *format *= *template *$/", $param) === 1) { > > $this->template = true; > > } > > } > > } > > > > private function buildForm($query, $params, $title) { > > $paramString = implode("|", $params); > > $out = <<<EOT > > <center> > > <button type='button' id='TestButton' onClick="buttonClicked()">Test > Button</button> > > <form id='TestQuery' method='post' action=''> > > <input type='hidden' name='Query' value='$query'> > > <input type='hidden' name='Params' value='$paramString'> > > <input type='hidden' name='Title' value='$title'> > > </form> > > </center><br> > > EOT; > > return $out; > > } > > > > private function getData($parser, $query, $params) { > > $result = $this->doSMWAsk($parser, $query, $params); > > $result = $parser->recursiveTagParse($result); > > return $result; > > } > > > > private function doSMWAsk($parser, $query, $rawParams) { > > SMWQueryProcessor::processFunctionParams($rawParams, $qs, $params, > > $printouts); > > $output = SMWQueryProcessor::getResultFromQueryString($query, $params, > > $printouts, SMW_OUTPUT_WIKI); > > return $output; > > } > > > > private function buildDiv($result) { > > $output = "<div id='TestDiv' display='block'>"; > > $output .= $result; > > $output .= "</div>"; > > return $output; > > } > > } > > > > -- > > Dr. Cynthia Cicalese > > Lead Software Systems Engineer > > The MITRE Corporation > > ------------------------------------------------------------------------------ > Centralized Desktop Delivery: Dell and VMware Reference Architecture > Simplifying enterprise desktop deployment and management using > Dell EqualLogic storage and VMware View: A highly scalable, end-to-end > client virtualization framework. Read more! > http://p.sf.net/sfu/dell-eql-dev2dev > _______________________________________________ > Semediawiki-devel mailing list > Semediawiki-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/semediawiki-devel > > -- WikiWorks · MediaWiki Consulting · http://wikiworks.com ------------------------------------------------------------------------------ Beautiful is writing same markup. Internet Explorer 9 supports standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3. Spend less time writing and rewriting code and more time creating great experiences on the web. Be a part of the beta today http://p.sf.net/sfu/msIE9-sfdev2dev _______________________________________________ Semediawiki-devel mailing list Semediawiki-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/semediawiki-devel