<?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']['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;{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;{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;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop'; $GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderWallpaper'] = '{type_legend},type;{slickSlider_legend},eSM_slick_text,eSM_slick_url,singleSRC,size;{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'] = 'singleSRC,size,eSM_slick_slide_bgSize,eSM_slick_slide_bgPosition,eSM_slick_slide_minHeight,eSM_slick_slide_bgOpacity'; /** * 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_slick_slide_minHeight'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slide_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_slide_bgPosition'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slide_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_slide_bgSize'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slide_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_slide_bgOpacity'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slide_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 ''" ); 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(); } } } }