Ferreteria/archive/smw-base.php: Difference between revisions
(→Notes: more accurately) |
(current version, after getting v3 working) |
||
Line 1: | Line 1: | ||
==Notes== | ==Notes== | ||
* '''Requires''': {{l/same|smw-base-v2.php}} or {{l/same|smw-base-v3.php}}, depending on what version of SMW is in use | * '''Requires''': {{l/same|smw-base-v2.php}} or {{l/same|smw-base-v3.php}}, depending on what version of SMW is in use | ||
==Code== | ==Code== | ||
<php> | <php> | ||
Line 76: | Line 75: | ||
*/ | */ | ||
public function is_filled() { | 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> | </php> |
Revision as of 19:19, 14 February 2013
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>