store = $store;
$this->settings = $settings;
}
/**
* @codeCoverageIgnore
* Returns available cache information (takes into account user preferences)
*
* @since 1.9
*
* @return string
*/
public function getCacheInfo() {
if ( $this->listLookup->isFromCache() ) {
return $this->msg( 'smw-sp-properties-cache-info', $this->getLanguage()->userTimeAndDate( $this->listLookup->getTimestamp(), $this->getUser() ) )->parse();
}
return '';
}
/**
* @return string
*/
function getPageHeader() {
return Html::rawElement(
'p',
[ 'class' => 'smw-sp-properties-docu' ],
$this->msg( 'smw-sp-properties-docu' )->parse()
) . $this->getSearchForm( $this->getRequest()->getVal( 'property' ), $this->getCacheInfo() ) .
Html::element(
'h2',
[],
$this->msg( 'smw-sp-properties-header-label' )->text()
);
}
/**
* @codeCoverageIgnore
* @return string
*/
function getName() {
return 'Properties';
}
/**
* Format a result in the list of results as a string. We expect the
* result to be an array with one object of type SMWDIProperty
* (normally) or maybe SMWDIError (if something went wrong), followed
* by a number (how often the property is used).
*
* @param Skin $skin provided by MediaWiki, not needed here
* @param mixed $result
* @return String
* @throws PropertyNotFoundException if the result was not of a supported type
*/
function formatResult( $skin, $result ) {
list ( $dataItem, $useCount ) = $result;
if ( $dataItem instanceof DIProperty ) {
return $this->formatPropertyItem( $dataItem, $useCount );
} elseif ( $dataItem instanceof SMWDIError ) {
return $this->getMessageFormatter()->clear()
->setType( 'warning' )
->addFromArray( [ $dataItem->getErrors(), 'ID: ' . ( isset( $dataItem->id ) ? $dataItem->id : 'N/A' ) ] )
->getHtml();
}
throw new PropertyNotFoundException( 'PropertiesQueryPage expects results that are properties or errors.' );
}
/**
* Produce a formatted string representation for showing a property and
* its usage count in the list of used properties.
*
* @since 1.8
*
* @param DIProperty $property
* @param integer $useCount
* @return string
*/
protected function formatPropertyItem( DIProperty $property, $useCount ) {
// Clear formatter before invoking messages
$this->getMessageFormatter()->clear();
$diWikiPage = $property->getDiWikiPage();
$title = $diWikiPage !== null ? $diWikiPage->getTitle() : null;
if ( $useCount == 0 && !$this->settings->get( 'smwgPropertyZeroCountDisplay' ) ) {
return '';
}
if ( $property->isUserDefined() ) {
if ( $title === null ) {
// Show even messed up property names.
$typestring = '';
$proplink = $property->getLabel();
$this->getMessageFormatter()
->addFromArray( [ 'ID: ' . ( isset( $property->id ) ? $property->id : 'N/A' ) ] )
->addFromKey( 'smw_notitle', $proplink );
} else {
list( $typestring, $proplink ) = $this->getUserDefinedPropertyInfo( $title, $property, $useCount );
}
$infoLink = '';
// Add a link to SearchByProperty to hopefully identify the
// "hidden" reference
if ( $useCount < 1 ) {
$infoLink = ' ' . \SMWInfolink::newPropertySearchLink( '+', $property->getLabel(), '' )->getHTML( $this->getLinker() );
}
$proplink .= $infoLink;
} else {
list( $typestring, $proplink ) = $this->getPredefinedPropertyInfo( $property );
}
if ( $typestring === '' ) { // Built-ins have no type
// @todo Should use numParams for $useCount?
return $this->msg( 'smw_property_template_notype' )
->rawParams( $proplink )->numParams( $useCount )->text() . ' ' .
$this->getMessageFormatter()
->setType( 'warning' )
->escape( false )->getHtml();
} else {
// @todo Should use numParams for $useCount?
return $this->msg( 'smw_property_template' )
->rawParams( $proplink, $typestring )->numParams( $useCount )->escaped() . ' ' .
$this->getMessageFormatter()
->setType( 'warning' )
->escape( false )->getHtml();
}
}
/**
* Returns information related to user-defined properties
*
* @since 1.9
*
* @param Title $title
* @param DIProperty $property
* @param integer $useCount
*
* @return array
*/
private function getUserDefinedPropertyInfo( $title, $property, $useCount ) {
if ( $useCount <= $this->settings->get( 'smwgPropertyLowUsageThreshold' ) ) {
$this->getMessageFormatter()->addFromKey( 'smw_propertyhardlyused' );
}
// User defined types default to Page
$typestring = SMWTypesValue::newFromTypeId( $this->settings->get( 'smwgPDefaultType' ) )->getLongHTMLText( $this->getLinker() );
$label = htmlspecialchars( $property->getLabel() );
$linkAttributes = [];
if ( isset( $property->id ) ) {
$linkAttributes['title'] = 'ID: ' . $property->id;
}
$dataValue = DataValueFactory::getInstance()->newDataValueByItem( $property );
$dataValue->setLinkAttributes( $linkAttributes );
$proplink = $dataValue->getFormattedLabel(
DataValueFormatter::HTML_SHORT,
$this->getLinker()
);
if ( !$title->exists() ) {
$this->getMessageFormatter()->addFromKey( 'smw_propertylackspage' );
}
$typeProperty = new DIProperty( '_TYPE' );
$types = $this->store->getPropertyValues( $property->getDiWikiPage(), $typeProperty );
if ( is_array( $types ) && count( $types ) >= 1 ) {
$typeDataValue = DataValueFactory::getInstance()->newDataValueByItem( current( $types ), $typeProperty );
$typestring = $typeDataValue->getLongHTMLText( $this->getLinker() );
} else {
$this->getMessageFormatter()->addFromKey( 'smw_propertylackstype', $typestring );
}
return [ $typestring, $proplink ];
}
/**
* Returns information related to predefined properties
*
* @since 1.9
*
* @param DIProperty $property
*
* @return array
*/
private function getPredefinedPropertyInfo( DIProperty $property ) {
$dataValue = DataValueFactory::getInstance()->newDataValueByItem( $property, null );
$dataValue->setLinkAttributes( [
'title' => 'ID: ' . ( isset( $property->id ) ? $property->id : 'N/A' ) . ' (' . $property->getKey() . ')'
] );
$label = $dataValue->getFormattedLabel(
DataValueFormatter::HTML_SHORT,
$this->getLinker()
);
return [
SMWTypesValue::newFromTypeId( $property->findPropertyTypeID() )->getLongHTMLText( $this->getLinker() ),
$label
];
}
/**
* Get the list of results.
*
* @param SMWRequestOptions $requestOptions
* @return array of array( SMWDIProperty|SMWDIError, integer )
*/
function getResults( $requestOptions ) {
$this->listLookup = $this->store->getPropertiesSpecial( $requestOptions );
return $this->listLookup->fetchList();
}
}