<?php /** * Slick slider for Contao * * Copyright (c) 2016 Benjamin Roth * * @license LGPL-3.0+ */ /** * Table tl_content */ /** * Add callback */ $GLOBALS['TL_DCA']['tl_content']['config']['onload_callback'][] = array('tl_content_eSM_slick', 'showJsLibraryHint'); $GLOBALS['TL_DCA']['tl_content']['config']['onsubmit_callback'][] = array('tl_content_eSM_slick', 'insertEndElement'); /** * Add palettes to tl_content */ $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'eSM_addImage'; $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'eSM_addText'; $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'eSM_slick_addImageLink'; $GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderStart'] = '{type_legend},type;{slickSlider_legend},eSM_slick_autoPlaySpeed,eSM_slick_speed,eSM_slick_initialSlide,eSM_slick_lazyLoad,eSM_slick_slidesToShow,eSM_slick_slidesToScroll,eSM_slick_infinite,eSM_slick_arrows,eSM_slick_pagination,eSM_slick_pause,eSM_slick_fade,eSM_slick_adaptiveHeight;{image_legend},eSM_addImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop'; $GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderStop'] = '{type_legend},type;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop'; $GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderSlideStart'] = '{type_legend},type;{slickSlider_legend},eSM_addImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop'; $GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderSlideStop'] = '{type_legend},type;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop'; $GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderImage'] = '{type_legend},type;{slickSlider_legend},multiSRC,size,eSM_slick_bgSize,eSM_slick_bgPosition,eSM_slick_minHeight,eSM_slick_bgOpacity,eSM_slick_bgRepeat,eSM_slick_addImageLink,eSM_addText;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop'; $GLOBALS['TL_DCA']['tl_content']['subpalettes']['eSM_addImage'] = 'multiSRC,size,eSM_slick_bgSize,eSM_slick_bgPosition,eSM_slick_minHeight,eSM_slick_bgOpacity,eSM_slick_bgRepeat'; $GLOBALS['TL_DCA']['tl_content']['subpalettes']['eSM_addText'] = 'eSM_slick_text,eSM_slick_url'; $GLOBALS['TL_DCA']['tl_content']['subpalettes']['eSM_slick_addImageLink'] = 'imageUrl,fullsize'; /** * Add fields to tl_content */ $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_autoPlaySpeed'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_autoPlaySpeed'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('tl_class'=>'w50','rgxp'=>'digit'), 'sql' => "int(10) unsigned NOT NULL default '0'" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_speed'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_speed'], 'exclude' => true, 'inputType' => 'text', 'default' => '500', 'eval' => array('tl_class'=>'w50','rgxp'=>'digit'), 'sql' => "int(10) unsigned NOT NULL default '0'" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_initialSlide'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_initialSlide'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('tl_class'=>'w50','rgxp'=>'digit'), 'sql' => "int(10) unsigned NOT NULL default '0'" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_slidesToShow'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slidesToShow'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('rgxp'=>'natural','minval'=>1,'tl_class'=>'w50'), 'sql' => "int(10) unsigned NOT NULL default '1'" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_slidesToScroll'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slidesToScroll'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('rgxp'=>'natural','minval'=>1,'tl_class'=>'w50'), 'sql' => "int(10) unsigned NOT NULL default '1'" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_infinite'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_infinite'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_arrows'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_arrows'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_pagination'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_pagination'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_pause'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_pause'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_lazyLoad'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_lazyLoad'], 'exclude' => true, 'inputType' => 'select', 'default' => 'ondemand', 'options' => array('ondemand','progressive'), 'reference' => &$GLOBALS['TL_LANG']['MSC']['slick_lazyLoad'], 'eval' => array('tl_class'=>'w50','includeBlankOption'=>true), 'sql' => "varchar(16) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_fade'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_fade'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_adaptiveHeight'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_adaptiveHeight'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_text'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_text'], 'exclude' => true, 'inputType' => 'textarea', 'eval' => array('rows'=>2,'style'=>'height: 2em;', 'maxlength'=>64), 'sql' => "varchar(64) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_url'] = array ( 'label' => &$GLOBALS['TL_LANG']['MSC']['url'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('rgxp'=>'url', 'decodeEntities'=>true, 'maxlength'=>255, 'fieldType'=>'radio', 'filesOnly'=>true, 'tl_class'=>'w50 wizard'), 'wizard' => array ( array('tl_content', 'pagePicker') ), 'sql' => "varchar(255) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_addImage'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['addImage'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange'=>true), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_addText'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_addText'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'clr', 'submitOnChange'=>true), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_minHeight'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_minHeight'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_addImageLink'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_addImageLink'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'clr w50','submitOnChange'=>true), 'sql' => "char(1) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgPosition'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgPosition'], 'exclude' => true, 'inputType' => 'select', 'options' => array ( '0 0' => 'Links | Oben', '50% 0' => 'Mitte | Oben', '100% 0' => 'Rechts | Oben', '0 50%' => 'Links | Mitte', '50% 50%' => 'Mitte | Mitte', '100% 50%' => 'Rechts | Mitte', '0 100%' => 'Links | Unten', '50% 100%' => 'Mitte | Unten', '100% 100%' => 'Rechts | Unten', ), 'eval' => array('tl_class' => 'w50','includeBlankOption'=>true), 'sql' => "varchar(16) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgSize'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgSize'], 'exclude' => true, 'inputType' => 'select', 'options' => array ( 'contain' => 'Proportional', '100% 100%' => 'Verzerrt', 'auto auto' => 'Originalgröße', ), 'eval' => array('tl_class' => 'w50','includeBlankOption'=>true,'blankOptionLabel'=>'Beschnitten'), 'sql' => "varchar(16) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgRepeat'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgRepeat'], 'exclude' => true, 'inputType' => 'select', 'options' => array ( 'repeat-x' => 'Horizontal wiederholen', 'repeat-y' => 'Vertikal wiedeholen', 'no-repeat' => 'Nicht wiederholen', ), 'eval' => array('tl_class' => 'w50','includeBlankOption'=>true,'blankOptionLabel'=>'Wiederholen'), 'sql' => "varchar(16) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgOpacity'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgOpacity'], 'exclude' => true, 'inputType' => 'select', 'options' => array ( '10' => '10%', '20' => '20%', '30' => '30%', '40' => '40%', '50' => '50%', '60' => '60%', '70' => '70%', '80' => '80%', '90' => '90%', '100' => '100%', ), 'eval' => array('tl_class' => 'w50','includeBlankOption'=>true), 'sql' => "varchar(16) NOT NULL default ''" ); $GLOBALS['TL_DCA']['tl_content']['fields']['multiSRC']['load_callback'][] = array('tl_content_eSM_slick', 'setMultiSrcFlags'); class tl_content_eSM_slick extends Backend { /** * Import the back end user object */ public function __construct() { parent::__construct(); $this->import('BackendUser', 'User'); } /** * Show a hint if a JavaScript library needs to be included in the page layout * * @param object */ public function showJsLibraryHint($dc) { if ($_POST || Input::get('act') != 'edit') { return; } // Return if the user cannot access the layout module (see #6190) if (!$this->User->hasAccess('themes', 'modules') || !$this->User->hasAccess('layout', 'themes')) { return; } $objCte = ContentModel::findByPk($dc->id); if ($objCte === null) { return; } switch ($objCte->type) { case 'slickSliderStart': case 'slickSliderStop': Message::addInfo(sprintf($GLOBALS['TL_LANG']['tl_content']['includeTemplatesJQuery'], 'j_slickslider')); break; } } /** * Automatically insert end element if start element ist about to be added * * @param DataContainer $dc */ public function insertEndElement(\DataContainer $dc) { $activeRecord = $dc->activeRecord; if (!$activeRecord) { return; } if ($activeRecord->type === 'slickSliderStart' || $activeRecord->type === 'slickSliderSlideStart') { // Find the next boxwrapper element $nextElement = \Database::getInstance() ->prepare(" SELECT type FROM tl_content WHERE pid = ? AND (ptable = ? OR ptable = ?) AND type IN ('slickSliderSlideStart', 'slickSliderSlideStop','slickSliderStart', 'slickSliderStop') AND sorting > ? ORDER BY sorting ASC LIMIT 1 ") ->execute( $activeRecord->pid, $activeRecord->ptable ?: 'tl_article', $activeRecord->ptable === 'tl_article' ? '' : $activeRecord->ptable, $activeRecord->sorting ); // Check if a stop element should be created if ( !$nextElement->type || ($activeRecord->type === 'slickSliderStart' && ($nextElement->type === 'slickSliderStart')) || ($activeRecord->type === 'slickSliderSlideStart' && ($nextElement->type === 'slickSliderSlideStart' || $nextElement->type === 'slickSliderStart' || $nextElement->type === 'slickSliderStop')) ) { \Database::getInstance() ->prepare('INSERT INTO tl_content %s') ->set(array( 'pid' => $activeRecord->pid, 'ptable' => $activeRecord->ptable ?: 'tl_article', 'type' => substr($activeRecord->type, 0, -5) . 'Stop', 'sorting' => $activeRecord->sorting + 1, 'tstamp' => time(), )) ->execute(); } } } /** * Dynamically add flags to the "multiSRC" field * * @param mixed $varValue * @param Contao\DataContainer $dc * * @return mixed */ public function setMultiSrcFlags($varValue, Contao\DataContainer $dc) { if ($dc->activeRecord) { switch ($dc->activeRecord->type) { case 'slickSliderStart': case 'slickSliderSlideStart': case 'slickSliderImage': $GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['isGallery'] = true; $GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['extensions'] = Contao\Config::get('validImageTypes').'mp4,ogv,webm,mov'; break; } } return $varValue; } }