On 11-03-14 10:53 AM, Daniel Barrett wrote: > What is the recommended way to get a parser tag like<foo> and another hook > callback to communicate or have a shared state? Here's a simple use case: > > 1. Use a<foo> parser tag to generate some wikitext > 2. Use the SkinAfterBottomScripts hook to inject that wikitext at the > bottom of the page > > In this case, what's the best way for the callbacks for<foo> and > SkinAfterBottomScripts to share information (in this case, the generated > wikitext)? I can think of a few places that<foo> could put its generated > wikitext for SkinAfterBottomScripts to access : > > Method 1: Put the two callbacks in the same class and create a static > variable to hold the wikitext. I don't like this method because it feels > like an ancient "shared memory" solution (with all the usual pitfalls& > risks). > > Method 2: Create a custom property in the ParserOutput object > ($parser->mOutput) and hang the generated wikitext there. This feels a little > better, but unfortunately the parameter list for the SkinAfterBottomScripts > hook doesn't include a Parser or ParserOutput object, so it can't access the > data. (Theoretically one could use $wgParser, but when I tried this, > something in between deleted my custom property.) > > This is just one example. The real question is: what's the best practice for > sharing data/state between two callbacks in a MediaWiki extension? > > Thank you very much. > DanB Method 1 is doomed to fail in situations where we fetch from the parser cache. Which is ideally most of the visitor page views.
You may be able to use a combination of the ParserCache and it's setProperty, OutputPageParserOutput, and BeforePageDisplay. iirc I used something like that in the Description2 extension. SkinAfterBottomScripts looks annoying without an $out param though. ~Daniel Friesen (Dantman, Nadir-Seen-Fire) [http://daniel.friesen.name] _______________________________________________ Wikitech-l mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/wikitech-l
