Skip to content

Instantly share code, notes, and snippets.

@blar
Created January 31, 2016 17:21
Show Gist options
  • Save blar/a46847596e9366c863f0 to your computer and use it in GitHub Desktop.
Save blar/a46847596e9366c863f0 to your computer and use it in GitHub Desktop.
<?php
namespace TYPO3\CMS\CssStyledContent\Controller;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\MathUtility;
class CssStyledContentController extends \TYPO3\CMS\Frontend\Plugin\AbstractPlugin {
/**
* Rendering the IMGTEXT content element, called from TypoScript (tt_content.textpic.20)
*
* @param string $content Content input. Not used, ignore.
* @param array $conf TypoScript configuration. See TSRef "IMGTEXT". This function aims to be compatible.
* @return string HTML output.
* @coauthor Ernesto Baschny <ernst@cron-it.de>
* @coauthor Patrick Broens <patrick@patrickbroens.nl>
*/
public function render_textpic($content, $conf) {
// Look for hook before running default code for function
if (method_exists($this, 'hookRequest') && ($hookObj = $this->hookRequest('render_textpic'))) {
return $hookObj->render_textpic($content, $conf);
}
$renderMethod = $this->cObj->stdWrap($conf['renderMethod'], $conf['renderMethod.']);
// Render using the default IMGTEXT code (table-based)
if (!$renderMethod || $renderMethod == 'table') {
return $this->cObj->IMGTEXT($conf);
}
$restoreRegisters = FALSE;
if (isset($conf['preRenderRegisters.'])) {
$restoreRegisters = TRUE;
$this->cObj->LOAD_REGISTER($conf['preRenderRegisters.'], 'LOAD_REGISTER');
}
// Specific configuration for the chosen rendering method
if (is_array($conf['rendering.'][$renderMethod . '.'])) {
$conf = array_replace_recursive($conf, $conf['rendering.'][$renderMethod . '.']);
}
// Image or Text with Image?
if (is_array($conf['text.'])) {
$content = $this->cObj->stdWrap($this->cObj->cObjGet($conf['text.'], 'text.'), $conf['text.']);
}
$imgList = trim($this->cObj->stdWrap($conf['imgList'], $conf['imgList.']));
if (!$imgList) {
// No images, that's easy
if ($restoreRegisters) {
$this->cObj->LOAD_REGISTER(array(), 'RESTORE_REGISTER');
}
return $content;
}
$imgs = GeneralUtility::trimExplode(',', $imgList, TRUE);
if (count($imgs) === 0) {
// The imgList was not empty but did only contain empty values
if ($restoreRegisters) {
$this->cObj->LOAD_REGISTER(array(), 'RESTORE_REGISTER');
}
return $content;
}
$imgStart = (int)$this->cObj->stdWrap($conf['imgStart'], $conf['imgStart.']);
$imgCount = count($imgs) - $imgStart;
$imgMax = (int)$this->cObj->stdWrap($conf['imgMax'], $conf['imgMax.']);
if ($imgMax) {
$imgCount = MathUtility::forceIntegerInRange($imgCount, 0, $imgMax);
}
$imgPath = $this->cObj->stdWrap($conf['imgPath'], $conf['imgPath.']);
// Does we need to render a "global caption" (below the whole image block)?
$renderGlobalCaption = !$conf['captionSplit'] && !$conf['imageTextSplit'] && is_array($conf['caption.']);
if ($imgCount == 1) {
// If we just have one image, the caption relates to the image, so it is not "global"
$renderGlobalCaption = FALSE;
}
$imgListContainsReferenceUids = (bool)(isset($conf['imgListContainsReferenceUids.'])
? $this->cObj->stdWrap($conf['imgListContainsReferenceUids'], $conf['imgListContainsReferenceUids.'])
: $conf['imgListContainsReferenceUids']);
// Use the calculated information (amount of images, if global caption is wanted) to choose a different rendering method for the images-block
$GLOBALS['TSFE']->register['imageCount'] = $imgCount;
$GLOBALS['TSFE']->register['renderGlobalCaption'] = $renderGlobalCaption;
$fallbackRenderMethod = '';
if ($conf['fallbackRendering']) {
$fallbackRenderMethod = $this->cObj->cObjGetSingle($conf['fallbackRendering'], $conf['fallbackRendering.']);
}
if ($fallbackRenderMethod && is_array($conf['rendering.'][$fallbackRenderMethod . '.'])) {
$conf = array_replace_recursive($conf, $conf['rendering.'][$fallbackRenderMethod . '.']);
}
// Set the accessibility mode which uses a different type of markup, used 4.7+
$accessibilityMode = FALSE;
if (strpos(strtolower($renderMethod), 'caption') || strpos(strtolower($fallbackRenderMethod), 'caption')) {
$accessibilityMode = TRUE;
}
// Global caption
$globalCaption = '';
if ($renderGlobalCaption) {
$globalCaption = $this->cObj->stdWrap($this->cObj->cObjGet($conf['caption.'], 'caption.'), $conf['caption.']);
}
// Positioning
$position = $this->cObj->stdWrap($conf['textPos'], $conf['textPos.']);
// 0,1,2 = center,right,left
$imagePosition = $position & 7;
// 0,8,16,24 (above,below,intext,intext-wrap)
$contentPosition = $position & 24;
$textMargin = (int)$this->cObj->stdWrap($conf['textMargin'], $conf['textMargin.']);
if (!$conf['textMargin_outOfText'] && $contentPosition < 16) {
$textMargin = 0;
}
$colspacing = (int)$this->cObj->stdWrap($conf['colSpace'], $conf['colSpace.']);
$border = (int)$this->cObj->stdWrap($conf['border'], $conf['border.']) ? 1 : 0;
$borderThickness = (int)$this->cObj->stdWrap($conf['borderThick'], $conf['borderThick.']);
$borderThickness = $borderThickness ?: 1;
$borderSpace = $conf['borderSpace'] && $border ? (int)$conf['borderSpace'] : 0;
// Generate cols
$cols = (int)$this->cObj->stdWrap($conf['cols'], $conf['cols.']);
$colCount = $cols > 1 ? $cols : 1;
if ($colCount > $imgCount) {
$colCount = $imgCount;
}
$rowCount = ceil($imgCount / $colCount);
// Generate rows
$rows = (int)$this->cObj->stdWrap($conf['rows'], $conf['rows.']);
if ($rows > 1) {
$rowCount = $rows;
if ($rowCount > $imgCount) {
$rowCount = $imgCount;
}
$colCount = $rowCount > 1 ? ceil($imgCount / $rowCount) : $imgCount;
}
// Max Width
$maxW = (int)$this->cObj->stdWrap($conf['maxW'], $conf['maxW.']);
$maxWInText = (int)$this->cObj->stdWrap($conf['maxWInText'], $conf['maxWInText.']);
$fiftyPercentWidthInText = round($maxW / 100 * 50);
// in Text
if ($contentPosition >= 16) {
if (!$maxWInText) {
// If maxWInText is not set, it's calculated to the 50% of the max
$maxW = $fiftyPercentWidthInText;
} else {
$maxW = $maxWInText;
}
}
// max usuable width for images (without spacers and borders)
$netW = $maxW - $colspacing * ($colCount - 1) - $colCount * $border * ($borderThickness + $borderSpace) * 2;
// Specify the maximum width for each column
$columnWidths = $this->getImgColumnWidths($conf, $colCount, $netW);
$image_compression = (int)$this->cObj->stdWrap($conf['image_compression'], $conf['image_compression.']);
$image_effects = (int)$this->cObj->stdWrap($conf['image_effects'], $conf['image_effects.']);
$image_frames = (int)$this->cObj->stdWrap($conf['image_frames.']['key'], $conf['image_frames.']['key.']);
// EqualHeight
$equalHeight = (int)$this->cObj->stdWrap($conf['equalH'], $conf['equalH.']);
if ($equalHeight) {
$relations_cols = array();
// contains the individual width of all images after scaling to $equalHeight
$imgWidths = array();
for ($a = 0; $a < $imgCount; $a++) {
$imgKey = $a + $imgStart;
/** @var $file \TYPO3\CMS\Core\Resource\File */
if (MathUtility::canBeInterpretedAsInteger($imgs[$imgKey])) {
if ($imgListContainsReferenceUids) {
$file = $this->getResourceFactory()->getFileReferenceObject((int)$imgs[$imgKey])->getOriginalFile();
} else {
$file = $this->getResourceFactory()->getFileObject((int)$imgs[$imgKey]);
}
} else {
$file = $this->getResourceFactory()->getFileObjectFromCombinedIdentifier($imgPath . $imgs[$imgKey]);
}
// relationship between the original height and the wished height
$rel = $file->getProperty('height') / $equalHeight;
// if relations is zero, then the addition of this value is omitted as the image is not expected to display because of some error.
if ($rel) {
$imgWidths[$a] = $file->getProperty('width') / $rel;
// counts the total width of the row with the new height taken into consideration.
$relations_cols[(int)floor($a / $colCount)] += $imgWidths[$a];
}
}
}
// Fetches pictures
$splitArr = array();
$splitArr['imgObjNum'] = $conf['imgObjNum'];
$splitArr = $GLOBALS['TSFE']->tmpl->splitConfArray($splitArr, $imgCount);
// Contains the width of every image row
$imageRowsFinalWidths = array();
// Array index of $imgsTag will be the same as in $imgs, but $imgsTag only contains the images that are actually shown
$imgsTag = array();
$origImages = array();
$rowIdx = 0;
for ($a = 0; $a < $imgCount; $a++) {
$imgKey = $a + $imgStart;
// If the image cannot be interpreted as integer (therefore filename and no FAL id), add the image path
if (MathUtility::canBeInterpretedAsInteger($imgs[$imgKey])) {
$totalImagePath = (int)$imgs[$imgKey];
$this->initializeCurrentFileInContentObjectRenderer($totalImagePath, $imgListContainsReferenceUids);
} else {
$totalImagePath = $imgPath . $imgs[$imgKey];
}
// register IMG_NUM is kept for backwards compatibility
$GLOBALS['TSFE']->register['IMAGE_NUM'] = $imgKey;
$GLOBALS['TSFE']->register['IMAGE_NUM_CURRENT'] = $imgKey;
$GLOBALS['TSFE']->register['ORIG_FILENAME'] = $totalImagePath;
$this->cObj->data[$this->cObj->currentValKey] = $totalImagePath;
$imgObjNum = (int)$splitArr[$a]['imgObjNum'];
$imgConf = $conf[$imgObjNum . '.'];
if ($equalHeight) {
if ($a % $colCount == 0) {
// A new row starts
// Reset accumulated net width
$accumWidth = 0;
// Reset accumulated desired width
$accumDesiredWidth = 0;
$rowTotalMaxW = $relations_cols[$rowIdx];
if ($rowTotalMaxW > $netW && $netW > 0) {
$scale = $rowTotalMaxW / $netW;
} else {
$scale = 1;
}
$desiredHeight = $equalHeight / $scale;
$rowIdx++;
}
// This much width is available for the remaining images in this row (int)
$availableWidth = $netW - $accumWidth;
// Theoretical width of resized image. (float)
$desiredWidth = $imgWidths[$a] / $scale;
// Add this width. $accumDesiredWidth becomes the desired horizontal position
$accumDesiredWidth += $desiredWidth;
// Calculate width by comparing actual and desired horizontal position.
// this evenly distributes rounding errors across all images in this row.
$suggestedWidth = round($accumDesiredWidth - $accumWidth);
// finalImgWidth may not exceed $availableWidth
$finalImgWidth = (int)min($availableWidth, $suggestedWidth);
$accumWidth += $finalImgWidth;
$imgConf['file.']['width'] = $finalImgWidth;
$imgConf['file.']['height'] = round($desiredHeight);
// other stuff will be calculated accordingly:
unset($imgConf['file.']['maxW']);
unset($imgConf['file.']['maxH']);
unset($imgConf['file.']['minW']);
unset($imgConf['file.']['minH']);
unset($imgConf['file.']['width.']);
unset($imgConf['file.']['maxW.']);
unset($imgConf['file.']['maxH.']);
unset($imgConf['file.']['minW.']);
unset($imgConf['file.']['minH.']);
} else {
$imgConf['file.']['maxW'] = $columnWidths[$a % $colCount];
}
$titleInLink = $this->cObj->stdWrap($imgConf['titleInLink'], $imgConf['titleInLink.']);
$titleInLinkAndImg = $this->cObj->stdWrap($imgConf['titleInLinkAndImg'], $imgConf['titleInLinkAndImg.']);
$oldATagParms = $GLOBALS['TSFE']->ATagParams;
if ($titleInLink) {
// Title in A-tag instead of IMG-tag
$titleText = trim($this->cObj->stdWrap($imgConf['titleText'], $imgConf['titleText.']));
if ($titleText) {
// This will be used by the IMAGE call later:
$GLOBALS['TSFE']->ATagParams .= ' title="' . htmlspecialchars($titleText) . '"';
}
}
// hook to allow custom rendering of a single element
// This hook is needed to render alternative content which is not just a plain image,
// like showing other FAL content, like videos, things which need to be embedded as JS, ...
$customRendering = '';
if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['css_styled_content']['pi1_hooks']['render_singleMediaElement'])
&& is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['css_styled_content']['pi1_hooks']['render_singleMediaElement'])) {
$hookParameters = array(
'file' => $totalImagePath,
'imageConfiguration' => $imgConf
);
foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['css_styled_content']['pi1_hooks']['render_singleMediaElement'] as $reference) {
$customRendering = \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction($reference, $hookParameters, $this);
// if there is a renderer found, don't run through the other renderers
if (!empty($customRendering)) {
break;
}
}
}
if (!empty($customRendering)) {
$imgsTag[$imgKey] = $customRendering;
} elseif ($imgConf || $imgConf['file']) {
if ($this->cObj->image_effects[$image_effects]) {
$imgConf['file.']['params'] .= ' ' . $this->cObj->image_effects[$image_effects];
}
if ($image_frames) {
if (is_array($conf['image_frames.'][$image_frames . '.'])) {
$imgConf['file.']['m.'] = $conf['image_frames.'][$image_frames . '.'];
}
}
if ($image_compression && $imgConf['file'] != 'GIFBUILDER') {
if ($image_compression == 1) {
$tempImport = $imgConf['file.']['import'];
$tempImport_dot = $imgConf['file.']['import.'];
$tempTreatIdAsReference = $imgConf['file.']['treatIdAsReference'];
unset($imgConf['file.']);
$imgConf['file.']['import'] = $tempImport;
$imgConf['file.']['import.'] = $tempImport_dot;
$imgConf['file.']['treatIdAsReference'] = $tempTreatIdAsReference;
} elseif (isset($this->cObj->image_compression[$image_compression])) {
$imgConf['file.']['params'] .= ' ' . $this->cObj->image_compression[$image_compression]['params'];
$imgConf['file.']['ext'] = $this->cObj->image_compression[$image_compression]['ext'];
unset($imgConf['file.']['ext.']);
}
}
if ($titleInLink && !$titleInLinkAndImg) {
// Check if the image will be linked
$link = $this->cObj->imageLinkWrap('', $this->cObj->getCurrentFile() ?: $totalImagePath, $imgConf['imageLinkWrap.']);
if ($link) {
// Title in A-tag only (set above: ATagParams), not in IMG-tag
unset($imgConf['titleText']);
unset($imgConf['titleText.']);
$imgConf['emptyTitleHandling'] = 'removeAttr';
}
}
$imgsTag[$imgKey] = $this->cObj->IMAGE($imgConf);
} else {
// currentValKey !!!
$imgsTag[$imgKey] = $this->cObj->IMAGE(array('file' => $totalImagePath));
}
// Restore our ATagParams
$GLOBALS['TSFE']->ATagParams = $oldATagParms;
// Store the original filepath
$origImages[$imgKey] = $GLOBALS['TSFE']->lastImageInfo;
if ($GLOBALS['TSFE']->lastImageInfo[0] == 0) {
$imageRowsFinalWidths[(int)floor($a / $colCount)] += $this->cObj->data['imagewidth'];
} else {
$imageRowsFinalWidths[(int)floor($a / $colCount)] += $GLOBALS['TSFE']->lastImageInfo[0];
}
}
// How much space will the image-block occupy?
$imageBlockWidth = max($imageRowsFinalWidths) + $colspacing * ($colCount - 1) + $colCount * $border * ($borderSpace + $borderThickness) * 2;
$GLOBALS['TSFE']->register['rowwidth'] = $imageBlockWidth;
$GLOBALS['TSFE']->register['rowWidthPlusTextMargin'] = $imageBlockWidth + $textMargin;
// noRows is in fact just one ROW, with the amount of columns specified, where the images are placed in.
// noCols is just one COLUMN, each images placed side by side on each row
$noRows = $this->cObj->stdWrap($conf['noRows'], $conf['noRows.']);
$noCols = $this->cObj->stdWrap($conf['noCols'], $conf['noCols.']);
// noRows overrides noCols. They cannot exist at the same time.
if ($noRows) {
$noCols = 0;
$rowCount = 1;
}
if ($noCols) {
$colCount = 1;
}
// Edit icons:
if (!is_array($conf['editIcons.'])) {
$conf['editIcons.'] = array();
}
$editIconsHTML = $conf['editIcons'] && $GLOBALS['TSFE']->beUserLogin ? $this->cObj->editIcons('', $conf['editIcons'], $conf['editIcons.']) : '';
// If noRows, we need multiple imagecolumn wraps
$imageWrapCols = 1;
if ($noRows) {
$imageWrapCols = $colCount;
}
// User wants to separate the rows, but only do that if we do have rows
$separateRows = $this->cObj->stdWrap($conf['separateRows'], $conf['separateRows.']);
if ($noRows) {
$separateRows = 0;
}
if ($rowCount == 1) {
$separateRows = 0;
}
if ($accessibilityMode) {
$imagesInColumns = round($imgCount / ($rowCount * $colCount), 0, PHP_ROUND_HALF_UP);
// Apply optionSplit to the list of classes that we want to add to each column
$addClassesCol = $conf['addClassesCol'];
if (isset($conf['addClassesCol.'])) {
$addClassesCol = $this->cObj->stdWrap($addClassesCol, $conf['addClassesCol.']);
}
$addClassesColConf = $GLOBALS['TSFE']->tmpl->splitConfArray(array('addClassesCol' => $addClassesCol), $colCount);
// Apply optionSplit to the list of classes that we want to add to each image
$addClassesImage = $conf['addClassesImage'];
if (isset($conf['addClassesImage.'])) {
$addClassesImage = $this->cObj->stdWrap($addClassesImage, $conf['addClassesImage.']);
}
$addClassesImageConf = $GLOBALS['TSFE']->tmpl->splitConfArray(array('addClassesImage' => $addClassesImage), $imagesInColumns);
$rows = array();
$currentImage = 0;
// Set the class for the caption (split or global)
$classCaptionAlign = array(
'center' => 'csc-textpic-caption-c',
'right' => 'csc-textpic-caption-r',
'left' => 'csc-textpic-caption-l'
);
$captionAlign = $this->cObj->stdWrap($conf['captionAlign'], $conf['captionAlign.']);
// Iterate over the rows
for ($rowCounter = 1; $rowCounter <= $rowCount; $rowCounter++) {
$rowColumns = array();
// Iterate over the columns
for ($columnCounter = 1; $columnCounter <= $colCount; $columnCounter++) {
$columnImages = array();
// Iterate over the amount of images allowed in a column
for ($imagesCounter = 1; $imagesCounter <= $imagesInColumns; $imagesCounter++) {
$image = NULL;
$splitCaption = NULL;
$imageMarkers = ($captionMarkers = array());
$single = '&nbsp;';
// Set the key of the current image
$imageKey = $currentImage + $imgStart;
// Register IMAGE_NUM_CURRENT for the caption
$GLOBALS['TSFE']->register['IMAGE_NUM_CURRENT'] = $imageKey;
$this->cObj->data[$this->cObj->currentValKey] = $origImages[$imageKey]['origFile'];
if (MathUtility::canBeInterpretedAsInteger($imgs[$imageKey])) {
$this->initializeCurrentFileInContentObjectRenderer((int)$imgs[$imageKey], $imgListContainsReferenceUids);
} elseif (!isset($imgs[$imageKey])) {
// If not all columns in the last row are filled $imageKey gets larger than
// the array. In that case we clear the current file.
$this->cObj->setCurrentFile(NULL);
}
// Get the image if not an empty cell
if (isset($imgsTag[$imageKey])) {
$image = $this->cObj->stdWrap($imgsTag[$imageKey], $conf['imgTagStdWrap.']);
// Add the edit icons
if ($editIconsHTML) {
$image .= $this->cObj->stdWrap($editIconsHTML, $conf['editIconsStdWrap.']);
}
// Wrap the single image
$single = $this->cObj->stdWrap($image, $conf['singleStdWrap.']);
// Get the caption
if (!$renderGlobalCaption) {
$imageMarkers['caption'] = $this->cObj->stdWrap($this->cObj->cObjGet($conf['caption.'], 'caption.'), $conf['caption.']);
if ($captionAlign) {
$captionMarkers['classes'] = ' ' . $classCaptionAlign[$captionAlign];
}
$imageMarkers['caption'] = $this->cObj->substituteMarkerArray($imageMarkers['caption'], $captionMarkers, '###|###', 1, 1);
}
if ($addClassesImageConf[$imagesCounter - 1]['addClassesImage']) {
$imageMarkers['classes'] = ' ' . $addClassesImageConf[($imagesCounter - 1)]['addClassesImage'];
}
}
$columnImages[] = $this->cObj->substituteMarkerArray($single, $imageMarkers, '###|###', 1, 1);
$currentImage++;
}
$rowColumn = $this->cObj->stdWrap(implode(LF, $columnImages), $conf['columnStdWrap.']);
// Start filling the markers for columnStdWrap
$columnMarkers = array();
if ($addClassesColConf[$columnCounter - 1]['addClassesCol']) {
$columnMarkers['classes'] = ' ' . $addClassesColConf[($columnCounter - 1)]['addClassesCol'];
}
$rowColumns[] = $this->cObj->substituteMarkerArray($rowColumn, $columnMarkers, '###|###', 1, 1);
}
if ($noRows) {
$rowConfiguration = $conf['noRowsStdWrap.'];
} elseif ($rowCounter == $rowCount) {
$rowConfiguration = $conf['lastRowStdWrap.'];
} else {
$rowConfiguration = $conf['rowStdWrap.'];
}
$row = $this->cObj->stdWrap(implode(LF, $rowColumns), $rowConfiguration);
// Start filling the markers for columnStdWrap
$rowMarkers = array();
$rows[] = $this->cObj->substituteMarkerArray($row, $rowMarkers, '###|###', 1, 1);
}
$images = $this->cObj->stdWrap(implode(LF, $rows), $conf['allStdWrap.']);
// Start filling the markers for allStdWrap
$allMarkers = array();
$classes = array();
// Add the global caption to the allStdWrap marker array if set
if ($globalCaption) {
$allMarkers['caption'] = $globalCaption;
if ($captionAlign) {
$classes[] = $classCaptionAlign[$captionAlign];
}
}
// Set the margin for image + text, no wrap always to avoid multiple stylesheets
$noWrapMargin = (int)(($maxWInText ? $maxWInText : $fiftyPercentWidthInText) + (int)$this->cObj->stdWrap($conf['textMargin'], $conf['textMargin.']));
$this->addPageStyle('.csc-textpic-intext-right-nowrap .csc-textpic-text', 'margin-right: ' . $noWrapMargin . 'px;');
$this->addPageStyle('.csc-textpic-intext-left-nowrap .csc-textpic-text', 'margin-left: ' . $noWrapMargin . 'px;');
// Beside Text where the image block width is not equal to maxW
if ($contentPosition == 24 && $maxW != $imageBlockWidth) {
$noWrapMargin = $imageBlockWidth + $textMargin;
// Beside Text, Right
if ($imagePosition == 1) {
$this->addPageStyle('.csc-textpic-intext-right-nowrap-' . $noWrapMargin . ' .csc-textpic-text', 'margin-right: ' . $noWrapMargin . 'px;');
$classes[] = 'csc-textpic-intext-right-nowrap-' . $noWrapMargin;
} elseif ($imagePosition == 2) {
$this->addPageStyle('.csc-textpic-intext-left-nowrap-' . $noWrapMargin . ' .csc-textpic-text', 'margin-left: ' . $noWrapMargin . 'px;');
$classes[] = 'csc-textpic-intext-left-nowrap-' . $noWrapMargin;
}
}
// Add the border class if needed
if ($border) {
$classes[] = $conf['borderClass'] ?: 'csc-textpic-border';
}
// Add the class for equal height if needed
if ($equalHeight) {
$classes[] = 'csc-textpic-equalheight';
}
$addClasses = $this->cObj->stdWrap($conf['addClasses'], $conf['addClasses.']);
if ($addClasses) {
$classes[] = $addClasses;
}
if ($classes) {
$class = ' ' . implode(' ', $classes);
}
// Fill the markers for the allStdWrap
$images = $this->cObj->substituteMarkerArray($images, $allMarkers, '###|###', 1, 1);
} else {
// Apply optionSplit to the list of classes that we want to add to each image
$addClassesImage = $conf['addClassesImage'];
if (isset($conf['addClassesImage.'])) {
$addClassesImage = $this->cObj->stdWrap($addClassesImage, $conf['addClassesImage.']);
}
$addClassesImageConf = $GLOBALS['TSFE']->tmpl->splitConfArray(array('addClassesImage' => $addClassesImage), $colCount);
// Render the images
$images = '';
for ($c = 0; $c < $imageWrapCols; $c++) {
$tmpColspacing = $colspacing;
if ($c == $imageWrapCols - 1 && $imagePosition == 2 || $c == 0 && ($imagePosition == 1 || $imagePosition == 0)) {
// Do not add spacing after column if we are first column (left) or last column (center/right)
$tmpColspacing = 0;
}
$thisImages = '';
$allRows = '';
$maxImageSpace = 0;
$imgsTagCount = count($imgsTag);
for ($i = $c; $i < $imgsTagCount; $i = $i + $imageWrapCols) {
$imgKey = $i + $imgStart;
$colPos = $i % $colCount;
if ($separateRows && $colPos == 0) {
$thisRow = '';
}
// Render one image
if ($origImages[$imgKey][0] == 0) {
$imageSpace = $this->cObj->data['imagewidth'] + $border * ($borderSpace + $borderThickness) * 2;
} else {
$imageSpace = $origImages[$imgKey][0] + $border * ($borderSpace + $borderThickness) * 2;
}
$GLOBALS['TSFE']->register['IMAGE_NUM'] = $imgKey;
$GLOBALS['TSFE']->register['IMAGE_NUM_CURRENT'] = $imgKey;
$GLOBALS['TSFE']->register['ORIG_FILENAME'] = $origImages[$imgKey]['origFile'];
$GLOBALS['TSFE']->register['imagewidth'] = $origImages[$imgKey][0];
$GLOBALS['TSFE']->register['imagespace'] = $imageSpace;
$GLOBALS['TSFE']->register['imageheight'] = $origImages[$imgKey][1];
if (MathUtility::canBeInterpretedAsInteger($imgs[$imgKey])) {
$this->initializeCurrentFileInContentObjectRenderer(intval($imgs[$imgKey]), $imgListContainsReferenceUids);
}
if ($imageSpace > $maxImageSpace) {
$maxImageSpace = $imageSpace;
}
$thisImage = '';
$thisImage .= $this->cObj->stdWrap($imgsTag[$imgKey], $conf['imgTagStdWrap.']);
if (!$renderGlobalCaption) {
$thisImage .= $this->cObj->stdWrap($this->cObj->cObjGet($conf['caption.'], 'caption.'), $conf['caption.']);
}
if ($editIconsHTML) {
$thisImage .= $this->cObj->stdWrap($editIconsHTML, $conf['editIconsStdWrap.']);
}
$thisImage = $this->cObj->stdWrap($thisImage, $conf['oneImageStdWrap.']);
$classes = '';
if ($addClassesImageConf[$colPos]['addClassesImage']) {
$classes = ' ' . $addClassesImageConf[$colPos]['addClassesImage'];
}
$thisImage = str_replace('###CLASSES###', $classes, $thisImage);
if ($separateRows) {
$thisRow .= $thisImage;
} else {
$allRows .= $thisImage;
}
$GLOBALS['TSFE']->register['columnwidth'] = $maxImageSpace + $tmpColspacing;
// Close this row at the end (colCount), or the last row at the final end
if ($separateRows && $i + 1 == count($imgsTag)) {
// Close the very last row with either normal configuration or lastRow stdWrap
$allRows .= $this->cObj->stdWrap(
$thisRow,
is_array($conf['imageLastRowStdWrap.']) ? $conf['imageLastRowStdWrap.'] : $conf['imageRowStdWrap.']
);
} elseif ($separateRows && $colPos == $colCount - 1) {
$allRows .= $this->cObj->stdWrap($thisRow, $conf['imageRowStdWrap.']);
}
}
if ($separateRows) {
$thisImages .= $allRows;
} else {
$thisImages .= $this->cObj->stdWrap($allRows, $conf['noRowsStdWrap.']);
}
if ($noRows) {
// Only needed to make columns, rather than rows:
$images .= $this->cObj->stdWrap($thisImages, $conf['imageColumnStdWrap.']);
} else {
$images .= $thisImages;
}
}
// Add the global caption, if not split
if ($globalCaption) {
$images .= $globalCaption;
}
// CSS-classes
$captionClass = '';
$classCaptionAlign = array(
'center' => 'csc-textpic-caption-c',
'right' => 'csc-textpic-caption-r',
'left' => 'csc-textpic-caption-l'
);
$captionAlign = $this->cObj->stdWrap($conf['captionAlign'], $conf['captionAlign.']);
if ($captionAlign) {
$captionClass = $classCaptionAlign[$captionAlign];
}
$borderClass = '';
if ($border) {
$borderClass = $conf['borderClass'] ?: 'csc-textpic-border';
}
// Multiple classes with all properties, to be styled in CSS
$class = '';
$class .= $borderClass ? ' ' . $borderClass : '';
$class .= $captionClass ? ' ' . $captionClass : '';
$class .= $equalHeight ? ' csc-textpic-equalheight' : '';
$addClasses = $this->cObj->stdWrap($conf['addClasses'], $conf['addClasses.']);
$class .= $addClasses ? ' ' . $addClasses : '';
// Do we need a width in our wrap around images?
$imgWrapWidth = '';
if ($position == 0 || $position == 8) {
// For 'center' we always need a width: without one, the margin:auto trick won't work
$imgWrapWidth = $imageBlockWidth;
}
if ($rowCount > 1) {
// For multiple rows we also need a width, so that the images will wrap
$imgWrapWidth = $imageBlockWidth;
}
if ($globalCaption) {
// If we have a global caption, we need the width so that the caption will wrap
$imgWrapWidth = $imageBlockWidth;
}
// Wrap around the whole image block
$GLOBALS['TSFE']->register['totalwidth'] = $imgWrapWidth;
if ($imgWrapWidth) {
$images = $this->cObj->stdWrap($images, $conf['imageStdWrap.']);
} else {
$images = $this->cObj->stdWrap($images, $conf['imageStdWrapNoWidth.']);
}
}
$output = str_replace(
array(
'###TEXT###',
'###IMAGES###',
'###CLASSES###'
),
array(
$content,
$images,
$class
),
$this->cObj->cObjGetSingle($conf['layout'], $conf['layout.'])
);
if ($restoreRegisters) {
$this->cObj->LOAD_REGISTER(array(), 'RESTORE_REGISTER');
}
return $output;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment