Ferreteria/archive/smw-base.php: Difference between revisions
(Woozle moved page User:Woozle/smw-base.php to User:Woozle/smw-base-v2.php) |
m (7 revisions imported: moving this project here) |
||
(6 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
==Notes== | |||
* '''Requires''': {{l/same|smw-base-v2.php}} or {{l/same|smw-base-v3.php}}, depending on what version of SMW is in use | |||
==Code== | |||
<php> | |||
<?php | |||
/* | |||
PURPOSE: Semantic MediaWiki interface classes | |||
The existing class library is poorly documented, lacking a stable API, and difficult to use. | |||
This class set goes directly to the data structures -- which may change over time, but the changes | |||
should be easier to puzzle out than changes to the SMW class library. | |||
REQUIRES: data.php | |||
USAGE: set SMW_DATA_VERSION to 2 or 3 before including this file | |||
TODO: this goes directly to the DatabaseMysql class for some functions; needs to be generalized to use abstract wrappers. | |||
HISTORY: | |||
2012-01-22 started | |||
2012-09-17 useful pieces working | |||
2013-01-24 moved clsMWData and clsDataResult_MW from to mw-base.php | |||
2013-02-12 splitting some classes off into v2 and v3 versions in separate files, to handle different SMW data schemas | |||
*/ | |||
define('WZL_SMW',TRUE); // flag to let other libraries know these classes are available | |||
// is this actually needed? | |||
clsLibMgr::AddClass('clsMWData','mw-base'); // 'mw-base' must be defined by caller | |||
// include the schema-appropriate ancestor class | |||
if (SMW_DATA_VERSION > 2) { | |||
require('smw-base-v3.php'); | |||
} else { | |||
require('smw-base-v2.php'); | |||
} | |||
class clsSMWData extends clsSMWData_version { | |||
/*---- | |||
ACTION: Convert title into normalized DB-key format | |||
*/ | |||
static public function NormalizeTitle($iTitle,$iNameSpace) { | |||
$strTitle = Sanitizer::decodeCharReferencesAndNormalize($iTitle); // convert HTML entities | |||
$strTitle = Title::capitalize($strTitle,$iNameSpace); // initial caps, if needed | |||
$strTitle = str_replace( ' ', '_',$strTitle); // convert spaces to underscores | |||
return $strTitle; | |||
} | |||
/*---- | |||
ACTION: convert DB-key formatted title into display format | |||
Basically, just convert underscores to spaces. | |||
*/ | |||
static public function VisualizeTitle($iTitle) { | |||
$strTitle = str_replace('_',' ',$iTitle); // convert spaces to underscores | |||
return $strTitle; | |||
} | |||
} | |||
// is this class necessary? | |||
class clsDataResult_SMW extends clsDataResult { | |||
public function is_okay() { | |||
} | |||
/*---- | |||
ACTION: set the record pointer so the first row in the set will be read next | |||
*/ | |||
public function do_rewind() { | |||
} | |||
/*---- | |||
ACTION: Fetch the first/next row of data from a result set | |||
*/ | |||
public function get_next() { | |||
} | |||
/*---- | |||
ACTION: Return the number of rows in the result set | |||
*/ | |||
public function get_count() { | |||
} | |||
/*---- | |||
ACTION: Return whether row currently has data. | |||
*/ | |||
public function is_filled() { | |||
} | |||
} | |||
class w3smwPage extends w3smwPage_version { | |||
private $objPageEnv; // wiki page environment object (from w3tpl) | |||
private $mwoTitle; // MediaWiki Title object, if set | |||
public function __construct(w3tpl_module $iPageEnv) { | |||
$this->objPageEnv = $iPageEnv; | |||
} | |||
/*---- | |||
RETURNS: database engine from the wiki page environment | |||
*/ | |||
protected function Engine() { | |||
return $this->PageEnv()->Engine(); | |||
} | |||
protected function PageEnv() { | |||
return $this->objPageEnv; | |||
} | |||
public function Use_TitleObject(Title $iTitle) { | |||
$this->mwoTitle = $iTitle; | |||
} | |||
public function MW_Object() { | |||
return $this->mwoTitle; | |||
} | |||
public function Use_GlobalTitle() { | |||
global $wgTitle; | |||
$this->Use_TitleObject($wgTitle); | |||
} | |||
public function Use_Title_Named($iName) { | |||
$mwoTitle = Title::newFromDBkey($iName); | |||
$this->Use_TitleObject($mwoTitle); | |||
} | |||
public function Use_Title_Keyed($iName,$iSpace=NS_MAIN) { | |||
$mwoTitle = Title::newFromText($iName,$iSpace); | |||
$this->Use_TitleObject($mwoTitle); | |||
} | |||
public function TitleKey() { | |||
return $this->mwoTitle->getDBkey(); | |||
} | |||
public function TitleShown() { | |||
return $this->mwoTitle->getText(); | |||
} | |||
public function TitleFull() { | |||
return $this->mwoTitle->getPrefixedText(); | |||
} | |||
public function Nspace() { | |||
return $this->mwoTitle->getNamespace(); | |||
} | |||
public function PageLink($iText=NULL) { | |||
$mwo = $this->mwoTitle; | |||
$sTitle = is_null($iText)?$mwo->getFullText():$iText; | |||
$url = $mwo->getLinkURL(); | |||
$out = '<a href="'.$url.'">'.$sTitle.'</a>'; | |||
return $out; | |||
} | |||
/*---- | |||
RETURNS: array if multiple values found, otherwise just the value string | |||
ASSUMES: smw_sortkey is the non-underscored version of smw_title | |||
USAGE: when there's no reason to expect multiple values | |||
*/ | |||
public function GetPropVal($iPropName) { | |||
$ar = $this->GetPropVals($iPropName); | |||
$cnt = count($ar); | |||
if ($cnt > 1) { | |||
return $ar; | |||
} elseif ($cnt == 1) { | |||
return array_shift($ar); // return just the first element | |||
} else { | |||
return NULL; // nothing found | |||
} | |||
} | |||
/*---- | |||
RETURNS: nicely-formatted list of property values with links | |||
Sometimes it's just easier to use the existing code. | |||
This is just GetProperty_OLD() with the no-link option removed. | |||
*/ | |||
public function GetPropLinks($iPropName) { | |||
$strPgTitle = $this->TitleKey(); | |||
$arArgs = array($strPgTitle,'?'.$iPropName); | |||
// get list of targets (usually just one, but could be more) | |||
$htVal = SMWQueryProcessor::getResultFromFunctionParams( | |||
$arArgs, | |||
SMW_OUTPUT_FILE, | |||
SMWQueryProcessor::INLINE_QUERY, | |||
TRUE); // treat as if #show (rather than #ask) | |||
return $htVal; | |||
} | |||
/*---- | |||
NOTE: This is the old klugey version of GetPropLinks(), which I'm keeping here (for now) for posterity. | |||
*/ | |||
public function GetProperty_OLD($iPropName,array $iarOptions=NULL) { | |||
$strPgTitle = $this->TitleKey(); | |||
$arArgs = array($strPgTitle,'?'.$iPropName); | |||
if (is_array($iarOptions)) { | |||
$doLink = NzArray($iarOptions,'link'); | |||
} else { | |||
$doLink = FALSE; | |||
} | |||
if (!$doLink) { | |||
$arArgs[] = 'link=none'; | |||
// without this, SMW defaults to using links | |||
} | |||
// get list of targets (usually just one, but could be more) | |||
$htVal = SMWQueryProcessor::getResultFromFunctionParams( | |||
$arArgs, | |||
SMW_OUTPUT_FILE, | |||
SMWQueryProcessor::INLINE_QUERY, | |||
TRUE); // treat as if #show (rather than #ask) | |||
return $htVal; | |||
} | |||
} | |||
</php> |
Latest revision as of 16:42, 22 May 2022
Notes
- Requires: smw-base-v2.php or smw-base-v3.php, depending on what version of SMW is in use
Code
<php> <?php /*
PURPOSE: Semantic MediaWiki interface classes The existing class library is poorly documented, lacking a stable API, and difficult to use. This class set goes directly to the data structures -- which may change over time, but the changes should be easier to puzzle out than changes to the SMW class library. REQUIRES: data.php USAGE: set SMW_DATA_VERSION to 2 or 3 before including this file TODO: this goes directly to the DatabaseMysql class for some functions; needs to be generalized to use abstract wrappers. HISTORY: 2012-01-22 started 2012-09-17 useful pieces working 2013-01-24 moved clsMWData and clsDataResult_MW from to mw-base.php 2013-02-12 splitting some classes off into v2 and v3 versions in separate files, to handle different SMW data schemas
- /
define('WZL_SMW',TRUE); // flag to let other libraries know these classes are available // is this actually needed?
clsLibMgr::AddClass('clsMWData','mw-base'); // 'mw-base' must be defined by caller
// include the schema-appropriate ancestor class if (SMW_DATA_VERSION > 2) {
require('smw-base-v3.php');
} else {
require('smw-base-v2.php');
}
class clsSMWData extends clsSMWData_version {
/*---- ACTION: Convert title into normalized DB-key format */ static public function NormalizeTitle($iTitle,$iNameSpace) {
$strTitle = Sanitizer::decodeCharReferencesAndNormalize($iTitle); // convert HTML entities $strTitle = Title::capitalize($strTitle,$iNameSpace); // initial caps, if needed $strTitle = str_replace( ' ', '_',$strTitle); // convert spaces to underscores return $strTitle;
} /*---- ACTION: convert DB-key formatted title into display format
Basically, just convert underscores to spaces.
*/ static public function VisualizeTitle($iTitle) {
$strTitle = str_replace('_',' ',$iTitle); // convert spaces to underscores return $strTitle;
}
}
// is this class necessary? class clsDataResult_SMW extends clsDataResult {
public function is_okay() { } /*---- ACTION: set the record pointer so the first row in the set will be read next */ public function do_rewind() { } /*---- ACTION: Fetch the first/next row of data from a result set */ public function get_next() { } /*---- ACTION: Return the number of rows in the result set */ public function get_count() { } /*---- ACTION: Return whether row currently has data. */ public function is_filled() { }
}
class w3smwPage extends w3smwPage_version {
private $objPageEnv; // wiki page environment object (from w3tpl) private $mwoTitle; // MediaWiki Title object, if set
public function __construct(w3tpl_module $iPageEnv) {
$this->objPageEnv = $iPageEnv;
} /*---- RETURNS: database engine from the wiki page environment */ protected function Engine() {
return $this->PageEnv()->Engine();
} protected function PageEnv() {
return $this->objPageEnv;
}
public function Use_TitleObject(Title $iTitle) {
$this->mwoTitle = $iTitle;
} public function MW_Object() {
return $this->mwoTitle;
} public function Use_GlobalTitle() {
global $wgTitle; $this->Use_TitleObject($wgTitle);
} public function Use_Title_Named($iName) {
$mwoTitle = Title::newFromDBkey($iName); $this->Use_TitleObject($mwoTitle);
} public function Use_Title_Keyed($iName,$iSpace=NS_MAIN) {
$mwoTitle = Title::newFromText($iName,$iSpace); $this->Use_TitleObject($mwoTitle);
} public function TitleKey() {
return $this->mwoTitle->getDBkey();
} public function TitleShown() {
return $this->mwoTitle->getText();
} public function TitleFull() {
return $this->mwoTitle->getPrefixedText();
} public function Nspace() {
return $this->mwoTitle->getNamespace();
} public function PageLink($iText=NULL) {
$mwo = $this->mwoTitle; $sTitle = is_null($iText)?$mwo->getFullText():$iText; $url = $mwo->getLinkURL(); $out = '<a href="'.$url.'">'.$sTitle.'</a>'; return $out;
} /*---- RETURNS: array if multiple values found, otherwise just the value string ASSUMES: smw_sortkey is the non-underscored version of smw_title USAGE: when there's no reason to expect multiple values */ public function GetPropVal($iPropName) {
$ar = $this->GetPropVals($iPropName); $cnt = count($ar); if ($cnt > 1) { return $ar; } elseif ($cnt == 1) { return array_shift($ar); // return just the first element } else { return NULL; // nothing found }
} /*---- RETURNS: nicely-formatted list of property values with links
Sometimes it's just easier to use the existing code. This is just GetProperty_OLD() with the no-link option removed.
*/ public function GetPropLinks($iPropName) {
$strPgTitle = $this->TitleKey();
$arArgs = array($strPgTitle,'?'.$iPropName);
// get list of targets (usually just one, but could be more) $htVal = SMWQueryProcessor::getResultFromFunctionParams( $arArgs, SMW_OUTPUT_FILE, SMWQueryProcessor::INLINE_QUERY, TRUE); // treat as if #show (rather than #ask) return $htVal;
} /*---- NOTE: This is the old klugey version of GetPropLinks(), which I'm keeping here (for now) for posterity. */ public function GetProperty_OLD($iPropName,array $iarOptions=NULL) {
$strPgTitle = $this->TitleKey();
$arArgs = array($strPgTitle,'?'.$iPropName);
if (is_array($iarOptions)) { $doLink = NzArray($iarOptions,'link'); } else { $doLink = FALSE; } if (!$doLink) { $arArgs[] = 'link=none'; // without this, SMW defaults to using links }
// get list of targets (usually just one, but could be more) $htVal = SMWQueryProcessor::getResultFromFunctionParams( $arArgs, SMW_OUTPUT_FILE, SMWQueryProcessor::INLINE_QUERY, TRUE); // treat as if #show (rather than #ask) return $htVal;
}
} </php>