PortableInfobox/services/Helpers/PortableInfoboxRenderServiceHelper.php

191 lines
4.6 KiB
PHP
Raw Normal View History

<?php
namespace Wikia\PortableInfobox\Helpers;
use \Wikia\Logger\WikiaLogger;
class PortableInfoboxRenderServiceHelper {
const LOGGER_LABEL = 'portable-infobox-render-not-supported-type';
2015-07-29 11:51:55 +00:00
//todo: https://wikia-inc.atlassian.net/browse/DAT-3075
//todo: figure out what to do when user changes default infobox width via custom theming
const DESKTOP_THUMBNAIL_WIDTH = 270;
const MOBILE_THUMBNAIL_WIDTH = 360;
const MINIMAL_HERO_IMG_WIDTH = 300;
2015-09-08 14:29:41 +00:00
const MAX_DESKTOP_INFOBOX_IMAGE_HEIGHT = 500;
2015-09-08 14:29:41 +00:00
function __construct() {
}
/**
* creates special data structure for horizontal group from group data
*
* @param array $groupData
* @return array
*/
public function createHorizontalGroupData( $groupData ) {
2015-09-08 14:29:41 +00:00
$horizontalGroupData = [
'labels' => [],
'values' => [],
'renderLabels' => false
];
foreach ( $groupData as $item ) {
2015-09-08 14:29:41 +00:00
$data = $item['data'];
2015-09-08 14:29:41 +00:00
if ( $item['type'] === 'data' ) {
array_push( $horizontalGroupData['labels'], $data['label'] );
array_push( $horizontalGroupData['values'], $data['value'] );
2015-09-08 14:29:41 +00:00
if (!empty($data['label'])) {
$horizontalGroupData['renderLabels'] = true;
}
}
else {
if ( $item['type'] === 'header' ) {
$horizontalGroupData['header'] = $data['value'];
}
}
}
return $horizontalGroupData;
}
/**
* checks if infobox item is the title or title inside the hero module
* and if so, removes from it all HTML tags.
*
* @param string $type type of infobox item
* @param array $data infobox item data
* @return array infobox $data with sanitized title param if needed
*/
public function sanitizeInfoboxTitle( $type, $data ) {
2015-09-08 14:29:41 +00:00
if ( $type === 'title' && !empty( $data['value']) ) {
$data['value'] = trim( strip_tags( $data['value']) );
return $data;
}
2015-09-08 14:29:41 +00:00
if ( $type === 'hero-mobile' && !empty( $data['title']['value'] ) ) {
$data['title']['value'] = trim( strip_tags( $data['title']['value'] ) );
return $data;
}
return $data;
}
/**
* extends image data
*
* @param array $data
*
* @return bool|array
*/
public function extendImageData( $data ) {
2015-09-08 14:29:41 +00:00
$thumbnail = $this->getThumbnail( $data['name'] );
2015-09-08 14:29:41 +00:00
if ( !$thumbnail ) {
return false;
}
2015-09-08 14:29:41 +00:00
$data['height'] = $thumbnail->getHeight();
$data['width'] = $thumbnail->getWidth();
$data['thumbnail'] = $thumbnail->getUrl();
$data['key'] = urlencode($data['key']);
$data['media-type'] = $data['isVideo'] ? 'video' : 'image';
return $data;
}
/**
* checks if infobox data item is valid hero component data.
* If image is smaller than MINIMAL_HERO_IMG_WIDTH const, doesn't render the hero module.
*
* @param array $item - infobox data item
* @param array $heroData - hero component data
*
* @return bool
*/
public function isValidHeroDataItem( $item, $heroData ) {
2015-09-08 14:29:41 +00:00
$type = $item['type'];
if ( $type === 'title' && !array_key_exists( 'title', $heroData ) ) {
return true;
}
if ( $type === 'image' && !array_key_exists( 'image', $heroData ) ) {
2015-09-08 14:29:41 +00:00
$imageWidth = $this->getFileWidth( $item['data']['name'] );
if ( $imageWidth >= self::MINIMAL_HERO_IMG_WIDTH ) {
return true;
}
}
return false;
}
/**
* required for testing mobile template rendering
* @return bool
*/
public function isWikiaMobile() {
return \F::app()->checkSkin( 'wikiamobile' );
}
/**
* check if item type is supported and logs unsupported types
*
* @param string $type - template type
* @param array $templates - array of supported templates
*
* @return bool
*/
2015-07-29 11:51:55 +00:00
public function isTypeSupportedInTemplates( $type, $templates ) {
$isValid = true;
2015-09-08 14:29:41 +00:00
if ( !isset( $templates[$type] ) ) {
WikiaLogger::instance()->info( self::LOGGER_LABEL, [
'type' => $type
] );
$isValid = false;
}
return $isValid;
}
/**
* return real width of the image.
* @param Title $title
* @return int number
*/
private function getFileWidth( $title ) {
$file = \WikiaFileHelper::getFileFromTitle( $title );
2015-09-08 14:29:41 +00:00
if ($file) {
return $file->getWidth();
}
}
/**
2015-09-08 14:29:41 +00:00
* @desc create a thumb of the image from file title.
* Height cannot be bigger than 500px
* Width have to be adjusted to const for mobile or desktop infobox
* @param Title $title
* @return bool|MediaTransformOutput
*/
private function getThumbnail( $title ) {
$file = \WikiaFileHelper::getFileFromTitle( $title );
if ( $file ) {
2015-09-08 14:29:41 +00:00
$height = min( self::MAX_DESKTOP_INFOBOX_IMAGE_HEIGHT, $file->getHeight() );
$width = $this->isWikiaMobile() ?
self::MOBILE_THUMBNAIL_WIDTH :
self::DESKTOP_THUMBNAIL_WIDTH;
2015-09-08 14:29:41 +00:00
$thumb = $file->transform( ['width' => $width, 'height' => $height] );
if ( !is_null( $thumb ) && !$thumb->isError() ) {
return $thumb;
}
}
return false;
}
}