2015-04-27 14:05:31 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class PortableInfoboxRenderService extends WikiaService {
|
|
|
|
const LOGGER_LABEL = 'portable-infobox-render-not-supported-type';
|
2015-05-06 14:16:16 +00:00
|
|
|
const THUMBNAIL_WIDTH = 270;
|
2015-04-27 14:05:31 +00:00
|
|
|
|
|
|
|
private $templates = [
|
|
|
|
'wrapper' => 'PortableInfoboxWrapper.mustache',
|
|
|
|
'title' => 'PortableInfoboxItemTitle.mustache',
|
|
|
|
'header' => 'PortableInfoboxItemHeader.mustache',
|
|
|
|
'image' => 'PortableInfoboxItemImage.mustache',
|
2015-05-04 10:48:57 +00:00
|
|
|
'data' => 'PortableInfoboxItemData.mustache',
|
2015-04-27 14:05:31 +00:00
|
|
|
'group' => 'PortableInfoboxItemGroup.mustache',
|
|
|
|
'comparison' => 'PortableInfoboxItemComparison.mustache',
|
|
|
|
'comparison-set' => 'PortableInfoboxItemComparisonSet.mustache',
|
|
|
|
'comparison-set-header' => 'PortableInfoboxItemComparisonSetHeader.mustache',
|
|
|
|
'comparison-set-item' => 'PortableInfoboxItemComparisonSetItem.mustache',
|
|
|
|
'footer' => 'PortableInfoboxItemFooter.mustache'
|
|
|
|
];
|
|
|
|
private $templateEngine;
|
|
|
|
|
|
|
|
function __construct() {
|
|
|
|
$this->templateEngine = ( new Wikia\Template\MustacheEngine )
|
|
|
|
->setPrefix( dirname( __FILE__ ) . '/../templates' );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* renders infobox
|
|
|
|
*
|
|
|
|
* @param array $infoboxdata
|
|
|
|
* @return string - infobox HTML
|
|
|
|
*/
|
|
|
|
public function renderInfobox( array $infoboxdata ) {
|
|
|
|
wfProfileIn( __METHOD__ );
|
|
|
|
$infoboxHtmlContent = '';
|
|
|
|
|
|
|
|
foreach ( $infoboxdata as $item ) {
|
|
|
|
$data = $item[ 'data' ];
|
|
|
|
$type = $item[ 'type' ];
|
|
|
|
|
|
|
|
if ( $item['isEmpty'] ) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ( $type ) {
|
|
|
|
case 'comparison':
|
|
|
|
$infoboxHtmlContent .= $this->renderComparisonItem( $data['value'] );
|
|
|
|
break;
|
|
|
|
case 'group':
|
|
|
|
$infoboxHtmlContent .= $this->renderGroup( $data['value'] );
|
|
|
|
break;
|
|
|
|
case 'footer':
|
|
|
|
$infoboxHtmlContent .= $this->renderItem( 'footer', $data );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if ( $this->validateType( $type ) ) {
|
|
|
|
$infoboxHtmlContent .= $this->renderItem( $type, $data );
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!empty($infoboxHtmlContent)) {
|
|
|
|
$output = $this->renderItem( 'wrapper', [ 'content' => $infoboxHtmlContent ] );
|
|
|
|
} else {
|
|
|
|
$output = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
wfProfileOut( __METHOD__ );
|
|
|
|
|
|
|
|
return $output;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* renders comparison infobox component
|
|
|
|
*
|
|
|
|
* @param array $comparisonData
|
|
|
|
* @return string - comparison HTML
|
|
|
|
*/
|
2015-05-04 14:30:40 +00:00
|
|
|
private function renderComparisonItem( $comparisonData )
|
|
|
|
{
|
2015-04-27 14:05:31 +00:00
|
|
|
$comparisonHTMLContent = '';
|
|
|
|
|
2015-05-04 14:30:40 +00:00
|
|
|
foreach ($comparisonData as $set) {
|
2015-04-27 14:05:31 +00:00
|
|
|
$setHTMLContent = '';
|
|
|
|
|
2015-05-04 14:30:40 +00:00
|
|
|
if ($set['isEmpty']) {
|
2015-04-27 14:05:31 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2015-05-04 14:30:40 +00:00
|
|
|
foreach ($set['data']['value'] as $item) {
|
|
|
|
$type = $item['type'];
|
2015-04-27 14:05:31 +00:00
|
|
|
|
2015-05-04 14:30:40 +00:00
|
|
|
if ($item['isEmpty']) {
|
2015-04-27 14:05:31 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2015-05-04 14:30:40 +00:00
|
|
|
if ($type === 'header') {
|
2015-04-27 14:05:31 +00:00
|
|
|
$setHTMLContent .= $this->renderItem(
|
|
|
|
'comparison-set-header',
|
2015-05-04 14:30:40 +00:00
|
|
|
['content' => $this->renderItem($type, $item['data'])]
|
2015-04-27 14:05:31 +00:00
|
|
|
);
|
|
|
|
} else {
|
2015-05-04 14:30:40 +00:00
|
|
|
if ($this->validateType($type)) {
|
2015-04-27 14:05:31 +00:00
|
|
|
$setHTMLContent .= $this->renderItem(
|
|
|
|
'comparison-set-item',
|
2015-05-04 14:30:40 +00:00
|
|
|
['content' => $this->renderItem($type, $item['data'])]
|
2015-04-27 14:05:31 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$comparisonHTMLContent .= $this->renderItem( 'comparison-set', [ 'content' => $setHTMLContent ] );
|
|
|
|
}
|
|
|
|
|
2015-05-04 14:30:40 +00:00
|
|
|
if ( !empty( $comparisonHTMLContent ) ) {
|
|
|
|
$output = $this->renderItem('comparison', [ 'content' => $comparisonHTMLContent ] );
|
|
|
|
} else {
|
|
|
|
$output = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
return $output;
|
2015-04-27 14:05:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* renders group infobox component
|
|
|
|
*
|
|
|
|
* @param array $groupData
|
|
|
|
* @return string - group HTML markup
|
|
|
|
*/
|
|
|
|
private function renderGroup( $groupData ) {
|
|
|
|
$groupHTMLContent = '';
|
|
|
|
|
|
|
|
foreach ( $groupData as $item ) {
|
|
|
|
$type = $item['type'];
|
|
|
|
|
|
|
|
if ( $item['isEmpty'] ) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( $this->validateType( $type ) ) {
|
|
|
|
$groupHTMLContent .= $this->renderItem( $type, $item['data'] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->renderItem( 'group', [ 'content' => $groupHTMLContent ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* renders part of infobox
|
|
|
|
*
|
|
|
|
* @param string $type
|
|
|
|
* @param array $data
|
|
|
|
* @return string - HTML
|
|
|
|
*/
|
|
|
|
private function renderItem( $type, array $data ) {
|
2015-05-06 14:02:44 +00:00
|
|
|
if ( $type === 'image' ) {
|
|
|
|
$data[ 'thumbnail' ] = VignetteRequest::fromUrl( $data[ 'url' ] )
|
|
|
|
->width( self::THUMBNAIL_WIDTH )
|
|
|
|
->url();
|
|
|
|
}
|
|
|
|
|
2015-04-27 14:05:31 +00:00
|
|
|
return $this->templateEngine->clearData()
|
|
|
|
->setData( $data )
|
|
|
|
->render( $this->templates[ $type ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* check if item type is supported and logs unsupported types
|
|
|
|
*
|
|
|
|
* @param string $type - template type
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
private function validateType( $type ) {
|
|
|
|
$isValid = true;
|
|
|
|
|
|
|
|
if ( !isset( $this->templates[ $type ] ) ) {
|
|
|
|
Wikia\Logger\WikiaLogger::instance()->info( self::LOGGER_LABEL, [
|
|
|
|
'type' => $type
|
|
|
|
] );
|
|
|
|
|
|
|
|
$isValid = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $isValid;
|
|
|
|
}
|
|
|
|
}
|