array ( 'dataContainer' => 'Table', 'ptable' => 'tl_theme', 'switchToEdit' => true, 'onload_callback' => array ( array('tl_article_layouts', 'checkPermission'), ), 'enableVersioning' => true, 'sql' => array ( 'keys' => array ( 'id' => 'primary' ) ) ), // List 'list' => array ( 'sorting' => array ( 'mode' => 4, 'flag' => 11, 'fields' => array('sorting'), 'panelLayout' => 'filter;search,limit', 'headerFields' => array('name', 'author', 'tstamp'), 'child_record_callback' => array('tl_article_layouts', 'listLayout'), 'disableGrouping' => true ), 'global_operations' => array ( 'all' => array ( 'label' => &$GLOBALS['TL_LANG']['MSC']['all'], 'href' => 'act=select', 'class' => 'header_edit_all', 'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"' ) ), 'operations' => array ( 'edit' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['edit'], 'href' => 'table=tl_article_layouts&act=edit', 'icon' => 'edit.gif' ), 'copy' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['copy'], 'href' => 'act=paste&mode=copy', 'icon' => 'copy.gif' ), 'cut' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['cut'], 'href' => 'act=paste&mode=cut', 'icon' => 'cut.gif', 'attributes' => 'onclick="Backend.getScrollOffset()"' ), 'delete' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['delete'], 'href' => 'act=delete', 'icon' => 'delete.gif', 'attributes' => 'onclick="if(!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\'))return false;Backend.getScrollOffset()"' ), 'show' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['show'], 'href' => 'act=show', 'icon' => 'show.gif' ) ) ), // Palettes 'palettes' => array ( '__selector__' => array('showBackgroundImage','restrictContentElements'), 'default' => '{title_legend},title,alias;{content_legend},maxWidth,center,useHelper;{image_legend},showBackgroundImage;{expert_legend:hide},restrictContentElements,isDefault' ), // Subpalettes 'subpalettes' => array ( 'showBackgroundImage' => 'bgImageSize,bgStyle', 'restrictContentElements' => 'allowedElements' ), // Fields 'fields' => array ( 'id' => array ( 'sql' => "int(10) unsigned NOT NULL auto_increment" ), 'pid' => array ( 'foreignKey' => 'tl_theme.name', 'sql' => "int(10) unsigned NOT NULL default '0'", 'relation' => array('type'=>'belongsTo', 'load'=>'lazy') ), 'sorting' => array ( 'sql' => "int(10) unsigned NOT NULL default '0'" ), 'tstamp' => array ( 'sql' => "int(10) unsigned NOT NULL default '0'" ), 'title' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['title'], 'inputType' => 'text', 'exclude' => true, 'search' => true, 'eval' => array('mandatory'=>true, 'rgxp'=>'extnd', 'maxlength'=>64, 'tl_class'=>'w50'), 'sql' => "varchar(64) NULL" ), 'alias' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['alias'], 'exclude' => true, 'inputType' => 'text', 'search' => true, 'eval' => array('rgxp'=>'alias', 'doNotCopy'=>true, 'maxlength'=>128, 'tl_class'=>'w50'), 'save_callback' => array ( array('tl_article_layouts', 'generateAlias') ), 'sql' => "varchar(128) COLLATE utf8_bin NOT NULL default ''" ), 'showBackgroundImage' => array ( 'exclude' => true, 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['showBackgroundImage'], 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12','submitOnChange'=>true), 'sql' => "char(1) NOT NULL default ''" ), 'bgImageSize' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['bgImageSize'], 'exclude' => true, 'inputType' => 'imageSize', 'options' => System::getImageSizes(), 'reference' => &$GLOBALS['TL_LANG']['MSC'], 'eval' => array('rgxp'=>'natural', 'includeBlankOption'=>true, 'nospace'=>true, 'helpwizard'=>true, 'tl_class'=>'w50'), 'sql' => "varchar(64) NOT NULL default ''" ), 'center' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['center'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ), 'maxWidth' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['maxWidth'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ), 'useHelper' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['useHelper'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('tl_class'=>'w50 m12'), 'sql' => "char(1) NOT NULL default ''" ), 'bgStyle' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['bgStyle'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('tl_class'=>'long','maxlength'=>1055,'decodeEntities'=>true), 'sql' => "text NULL" ), 'restrictContentElements' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['restrictContentElements'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange'=>true), 'sql' => "char(1) NOT NULL default ''" ), 'allowedElements' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['allowedElements'], 'exclude' => true, 'inputType' => 'checkbox', 'options_callback' => array('tl_article_layouts','getContentElements'), 'reference' => &$GLOBALS['TL_LANG']['CTE'], 'eval' => array('multiple'=>true,'mandatory'=>true), 'sql' => "blob NULL" ), 'isDefault' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article_layouts']['isDefault'], 'exclude' => true, 'inputType' => 'checkbox', 'eval' => array('doNotCopy'=>true, 'tl_class'=>'clr'), 'save_callback' => array ( array('tl_article_layouts', 'checkDefault') ), 'sql' => "char(1) NOT NULL default ''" ), ) ); /** * Provide miscellaneous methods that are used by the data configuration array. * * @author Benjamin Roth */ class tl_article_layouts extends \Backend { /** * Import the back end user object */ public function __construct() { parent::__construct(); $this->import('BackendUser', 'User'); } /** * Check permissions to edit the table */ public function checkPermission() { if ($this->User->isAdmin) { return; } if (!$this->User->hasAccess('artLayout', 'themes')) { $this->log('Not enough permissions to access the article layouts module', __METHOD__, TL_ERROR); $this->redirect('contao/main.php?act=error'); } } /** * Auto-generate an article layout alias if it has not been set yet * * @param mixed $varValue * @param DataContainer $dc * * @return string * * @throws Exception */ public function generateAlias($varValue, \DataContainer $dc) { $autoAlias = false; // Generate an alias if there is none if ($varValue == '') { $autoAlias = true; $varValue = StringUtil::generateAlias($dc->activeRecord->title); } $objAlias = $this->Database->prepare("SELECT id FROM tl_article_layouts WHERE pid = ? AND (id=? OR alias=?)") ->execute($dc->activeRecord->pid,$dc->id, $varValue); // Check whether the page alias exists if ($objAlias->numRows > 1) { if (!$autoAlias) { throw new Exception(sprintf($GLOBALS['TL_LANG']['ERR']['aliasExists'], $varValue)); } $varValue .= '-' . $dc->id; } return $varValue; } /** * List an article layout * * @param array $row * * @return string */ public function listLayout($row) { return '
'. $row['title'] .' ['.$row['alias']."]
\n"; } /** * Return all content elements as array * * @return array */ public function getContentElements() { $groups = array(); foreach ($GLOBALS['TL_CTE'] as $k=>$v) { foreach (array_keys($v) as $kk) { $groups[$k][] = $kk; } } return $groups; } /** * Make sure there is only one default per pid * * @param mixed $varValue * @param DataContainer $dc * * @return mixed * * @throws Exception */ public function checkDefault($varValue, DataContainer $dc) { if ($varValue == '') { return ''; } $objPage = $this->Database->prepare("SELECT id FROM tl_article_layouts WHERE `isDefault`=1 AND pid=? AND id!=?") ->execute($dc->activeRecord->pid, $dc->activeRecord->id); if ($objPage->numRows) { throw new Exception($GLOBALS['TL_LANG']['ERR']['multipleArticleLayoutDefaults']); } return $varValue; } }