Příručka:Databázová tabulka page_props
↑ Manuál:Obsah | MediaWiki schéma databáze | Tabulka page_props |
Verze MediaWiki: | ≥ 1.13 |
Tabulka page_props obsahuje vlastnosti o stránkách nastavené analyzátorem prostřednictvím ParserOutput::setPageProperty()
, jako je zobrazení titulku a výchozí klíč kategorie.
Zejména se zde automaticky zaznamenávají všechna kouzelná slova dvojitého podtržení. Také mnoho rozšíření používá tuto tabulku k ukládání svých vlastních dat.
Vezměte prosím na vědomí, že během přepracování obsahu stránky dojde k vymazání všech vlastností co měla nastavena z této tabulky, a jejich nahrazení hodnotami novými, takže tahle tabulka není vhodná pro ukládání dat, která se nedají během přepracování obnovit.
Pole
pp_page
page_id , podle kterého je indexován pár název/hodnota
pp_propname
Název vlastnosti stránky
pp_value
Hodnota vlastnosti stránky
pp_sortkey
Verze MediaWiki: | ≥ 1.24 |
Je to proto, aby bylo možné efektivně vyhledávat stránky a třídit je podle hodnoty vlastnosti (viz úkol T60032).
Přehled změn ve schématu tabulky
Verze MediaWiki: | ≥ 1.38 |
DESCRIBE page_props;
+-------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+-------+ | pp_page | int(10) unsigned | NO | PRI | NULL | | | pp_propname | varbinary(60) | NO | PRI | NULL | | | pp_value | blob | NO | | NULL | | | pp_sortkey | float | YES | | NULL | | +-------------+------------------+------+-----+---------+-------+
Verze MediaWiki: | 1.24 – 1.37 |
DESCRIBE page_props;
+-------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------+------+-----+---------+-------+ | pp_page | int(11) | NO | PRI | NULL | | | pp_propname | varbinary(60) | NO | PRI | NULL | | | pp_value | blob | NO | | NULL | | | pp_sortkey | float | YES | | NULL | | +-------------+---------------+------+-----+---------+-------+
Verze MediaWiki: | 1.19 – 1.23 |
DESCRIBE page_props;
+-------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------+------+-----+---------+-------+ | pp_page | int(11) | NO | PRI | NULL | | | pp_propname | varbinary(60) | NO | PRI | NULL | | | pp_value | blob | NO | | NULL | | +-------------+---------------+------+-----+---------+-------+
Indexy
Verze MediaWiki: | ≥ 1.32 |
SHOW INDEX IN page_props;
+------------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +------------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | page_props | 0 | PRIMARY | 1 | pp_page | A | 0 | NULL | NULL | | BTREE | | | | page_props | 0 | PRIMARY | 2 | pp_propname | A | 0 | NULL | NULL | | BTREE | | | | page_props | 0 | pp_propname_page | 1 | pp_propname | A | 0 | NULL | NULL | | BTREE | | | | page_props | 0 | pp_propname_page | 2 | pp_page | A | 0 | NULL | NULL | | BTREE | | | | page_props | 0 | pp_propname_sortkey_page | 1 | pp_propname | A | 0 | NULL | NULL | | BTREE | | | | page_props | 0 | pp_propname_sortkey_page | 2 | pp_sortkey | A | 0 | NULL | NULL | YES | BTREE | | | | page_props | 0 | pp_propname_sortkey_page | 3 | pp_page | A | 0 | NULL | NULL | | BTREE | | | +------------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
Ukázkový dotaz
Zde je ukázkový dotaz k nalezení používaných vlastností stránky (viz také API:Pagepropnames ).
MariaDB [enwiki_p]> SELECT DISTINCT pp_propname FROM page_props;
+------------------------------+
| pp_propname |
+------------------------------+
| defaultsort |
| disambiguation |
| displaytitle |
| forcetoc |
| graph_specs |
| hiddencat |
| index |
| jsonconfig_getdata |
| kartographer |
| kartographer_frames |
| kartographer_links |
| newsectionlink |
| nocontentconvert |
| noeditsection |
| noexternallanglinks |
| nogallery |
| noindex |
| nonewsectionlink |
| notitleconvert |
| notoc |
| page_image |
| page_image_free |
| page_top_level_section_count |
| score |
| staticredirect |
| templatedata |
| wikibase-badge-Q17437796 |
| wikibase-badge-Q17437798 |
| wikibase-badge-Q17506997 |
| wikibase-badge-Q17559452 |
| wikibase-badge-Q17580674 |
| wikibase-badge-Q20748091 |
| wikibase-badge-Q20748092 |
| wikibase-badge-Q20748093 |
| wikibase-badge-Q20748094 |
| wikibase-badge-Q51759403 |
| wikibase-shortdesc |
| wikibase_item |
+------------------------------+
Jednoduchý příklad využití této tabulky u rozšíření
Zde je příklad rozšíření, které ukládá svou vlastní vlastnost stránky do tabulky page_props
.
Definuje dva tagy analyzátoru (háčky) <getprop> a <setprop> které manipulují s jeho vlastností s názvem SimpleSetPropExtension.
Umožňují editoru wiki nastavit hodnotu vlastnosti ve wikitextu pomocí <setprop>Nějaký náhodný text</setprop> a zobrazit její hodnotu pomocí < getprop/> (pro aktuální stránku) nebo pomocí <getprop page="nějaká stránka"/> (pro její hodnotu na jiné stránce strana).
<?php
$wgHooks['ParserFirstCallInit'][] = 'wfSampleParserInit';
function wfSampleParserInit( Parser &$parser ) {
// This does <setprop>Some random text</setprop>
// And then <getprop/> to retrieve a prop
// Or <getprop page="somepage"> to retrieve for
// something other than the current page.
$parser->setHook( 'getprop', 'wfSampleGetProp' );
$parser->setHook( 'setprop', 'wfSampleSetProp' );
// Always return true from this function. The return value does not denote
// success or otherwise have meaning - it just must always be true.
return true;
}
function wfSampleSetProp( $input, array $args, Parser $parser, PPFrame $frame ) {
$parsed = $parser->recursiveTagParse( $input, $frame );
// Since this can span different parses, we need to take account of
// the fact recursiveTagParse only half parses the text. or strip tags
// (UNIQ's) will be exposed. (Alternative would be to just call
// $parser->replaceLinkHolders() and $parser->mStripState->unstripBoth()
// right here right now.
$serialized = serialize( $parser->serializeHalfParsedText( $parsed ) );
$parser->getOutput()->setPageProperty( 'SimpleSetPropExtension', $serialized );
// Note if other pages change based on a property, you should see $wgPagePropLinkInvalidations
// to automatically invalidate dependent page. In this example that would be pages that
// use <getprop page="something>. However that would require adding a linking table
// (since none of the standard ones work for this example) which is a bit beyond the
// scope of this simple example.
return '';
}
function wfSampleGetProp( $input, array $args, Parser $parser, PPFrame $frame ) {
$pageId = $parser->getTitle()->getArticleID();
if ( isset( $args['page'] ) ) {
$title = Title::newFromText( $args['page'] );
if ( !$title || $title->getArticleID() === 0 ) {
// In a real extension, this would be i18n-ized.
return '<span class="error">Invalid page ' . htmlspecialchars( $args['page'] ) . ' specified.</span>';
}
// Do for some page other then current one.
$dbl = MediaWikiServices::getInstance()->getDBLoadBalancer();
$dbr = $dbl->getConnection( DB_REPLICA );
$propValue = $dbr->selectField( 'page_props', // table to use
'pp_value', // Field to select
[ 'pp_page' => $title->getArticleID(), 'pp_propname' => "SimpleSetPropExtension" ], // where conditions
__METHOD__
);
if ( $propValue === false ) {
// No prop stored for this page
// In a real extension, this would be i18n-ized.
return '<span class="error">No prop set for page ' . htmlspecialchars( $args['page'] ) . ' specified.</span>';
}
// We found the prop. Unserialize (First level of serialization)
$prop = unserialize( $propValue );
if ( !$parser->isValidHalfParsedText( $prop ) ) {
// Probably won't ever happen.
return '<span class="error">Error retrieving prop</span>';
} else {
// Everything should be good.
return $parser->unserializeHalfParsedText( $prop );
}
} else {
// Second case, current page.
// Can't query db, because could be set earlier in the page and not saved yet.
// So have to use the parserOutput object.
$prop = unserialize( $parser->getOutput()->getPageProperty( 'SimpleSetPropExtension' ) );
if ( !$parser->isValidHalfParsedText( $prop ) ) {
// Probably won't ever happen.
return '<span class="error">Error retrieving prop</span>';
} else {
// Everything should be good.
return $parser->unserializeHalfParsedText( $prop );
}
}
}