Файл: contao-3.5.8/system/modules/core/dca/tl_content.php
Строк: 1667
<?php
/**
* Contao Open Source CMS
*
* Copyright (c) 2005-2016 Leo Feyer
*
* @license LGPL-3.0+
*/
/**
* Table tl_content
*/
$GLOBALS['TL_DCA']['tl_content'] = array
(
// Config
'config' => array
(
'dataContainer' => 'Table',
'enableVersioning' => true,
'ptable' => '',
'dynamicPtable' => true,
'onload_callback' => array
(
array('tl_content', 'showJsLibraryHint')
),
'sql' => array
(
'keys' => array
(
'id' => 'primary',
'pid,ptable,invisible,sorting' => 'index'
)
)
),
// List
'list' => array
(
'sorting' => array
(
'mode' => 4,
'fields' => array('sorting'),
'panelLayout' => 'filter;search,limit',
'headerFields' => array('title', 'headline', 'author', 'inColumn', 'tstamp', 'showTeaser', 'published', 'start', 'stop'),
'child_record_callback' => array('tl_content', 'addCteType')
),
'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_content']['edit'],
'href' => 'act=edit',
'icon' => 'edit.gif'
),
'copy' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['copy'],
'href' => 'act=paste&mode=copy',
'icon' => 'copy.gif',
'attributes' => 'onclick="Backend.getScrollOffset()"'
),
'cut' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['cut'],
'href' => 'act=paste&mode=cut',
'icon' => 'cut.gif',
'attributes' => 'onclick="Backend.getScrollOffset()"'
),
'delete' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['delete'],
'href' => 'act=delete',
'icon' => 'delete.gif',
'attributes' => 'onclick="if(!confirm('' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . ''))return false;Backend.getScrollOffset()"',
'button_callback' => array('tl_content', 'deleteElement')
),
'toggle' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['toggle'],
'icon' => 'visible.gif',
'attributes' => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleVisibility(this,%s)"',
'button_callback' => array('tl_content', 'toggleIcon')
),
'show' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['show'],
'href' => 'act=show',
'icon' => 'show.gif'
)
),
),
// Palettes
'palettes' => array
(
'__selector__' => array('type', 'addImage', 'sortable', 'useImage', 'protected'),
'default' => '{type_legend},type',
'headline' => '{type_legend},type,headline;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'text' => '{type_legend},type,headline;{text_legend},text;{image_legend},addImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'html' => '{type_legend},type;{text_legend},html;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop',
'list' => '{type_legend},type,headline;{list_legend},listtype,listitems;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'table' => '{type_legend},type,headline;{table_legend},tableitems;{tconfig_legend},summary,thead,tfoot,tleft;{sortable_legend:hide},sortable;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'accordionStart' => '{type_legend},type;{moo_legend},mooHeadline,mooStyle,mooClasses;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'accordionStop' => '{type_legend},type;{moo_legend},mooClasses;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop',
'accordionSingle' => '{type_legend},type;{moo_legend},mooHeadline,mooStyle,mooClasses;{text_legend},text;{image_legend},addImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'sliderStart' => '{type_legend},type,headline;{slider_legend},sliderDelay,sliderSpeed,sliderStartSlide,sliderContinuous;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'sliderStop' => '{type_legend},type;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop',
'code' => '{type_legend},type,headline;{text_legend},highlight,shClass,code;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'markdown' => '{type_legend},type,headline;{text_legend},code;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'hyperlink' => '{type_legend},type,headline;{link_legend},url,target,linkTitle,embed,titleText,rel;{imglink_legend:hide},useImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'toplink' => '{type_legend},type,linkTitle;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'image' => '{type_legend},type,headline;{source_legend},singleSRC;{image_legend},alt,title,size,imagemargin,imageUrl,fullsize,caption;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'gallery' => '{type_legend},type,headline;{source_legend},multiSRC,sortBy,metaIgnore;{image_legend},size,imagemargin,perRow,fullsize,perPage,numberOfItems;{template_legend:hide},galleryTpl,customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,useHomeDir,cssID,space;{invisible_legend:hide},invisible,start,stop',
'player' => '{type_legend},type,headline;{source_legend},playerSRC;{poster_legend:hide},posterSRC;{player_legend},playerSize,autoplay;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'youtube' => '{type_legend},type,headline;{source_legend},youtube;{poster_legend:hide},posterSRC;{player_legend},playerSize,autoplay;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'download' => '{type_legend},type,headline;{source_legend},singleSRC;{dwnconfig_legend},linkTitle,titleText;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'downloads' => '{type_legend},type,headline;{source_legend},multiSRC,sortBy,metaIgnore;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,useHomeDir,cssID,space;{invisible_legend:hide},invisible,start,stop',
'alias' => '{type_legend},type;{include_legend},cteAlias;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'article' => '{type_legend},type;{include_legend},articleAlias;{protected_legend:hide},protected;{invisible_legend:hide},invisible,start,stop',
'teaser' => '{type_legend},type;{include_legend},article;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'form' => '{type_legend},type,headline;{include_legend},form;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop',
'module' => '{type_legend},type;{include_legend},module;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop'
),
// Subpalettes
'subpalettes' => array
(
'addImage' => 'singleSRC,alt,title,size,imagemargin,imageUrl,fullsize,caption,floating',
'sortable' => 'sortIndex,sortOrder',
'useImage' => 'singleSRC,alt,title,size,caption',
'protected' => 'groups'
),
// Fields
'fields' => array
(
'id' => array
(
'sql' => "int(10) unsigned NOT NULL auto_increment"
),
'pid' => array
(
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'ptable' => array
(
'sql' => "varchar(64) NOT NULL default ''"
),
'sorting' => array
(
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'tstamp' => array
(
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'type' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['type'],
'default' => 'text',
'exclude' => true,
'filter' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getContentElements'),
'reference' => &$GLOBALS['TL_LANG']['CTE'],
'eval' => array('helpwizard'=>true, 'chosen'=>true, 'submitOnChange'=>true),
'sql' => "varchar(32) NOT NULL default ''"
),
'headline' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['headline'],
'exclude' => true,
'search' => true,
'inputType' => 'inputUnit',
'options' => array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'),
'eval' => array('maxlength'=>200),
'sql' => "varchar(255) NOT NULL default ''"
),
'text' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['text'],
'exclude' => true,
'search' => true,
'inputType' => 'textarea',
'eval' => array('mandatory'=>true, 'rte'=>'tinyMCE', 'helpwizard'=>true),
'explanation' => 'insertTags',
'sql' => "mediumtext NULL"
),
'addImage' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['addImage'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('submitOnChange'=>true),
'sql' => "char(1) NOT NULL default ''"
),
'singleSRC' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['singleSRC'],
'exclude' => true,
'inputType' => 'fileTree',
'eval' => array('filesOnly'=>true, 'fieldType'=>'radio', 'mandatory'=>true, 'tl_class'=>'clr'),
'load_callback' => array
(
array('tl_content', 'setSingleSrcFlags')
),
'save_callback' => array
(
array('tl_content', 'storeFileMetaInformation')
),
'sql' => "binary(16) NULL"
),
'alt' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['alt'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'title' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['title'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'size' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['size'],
'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 ''"
),
'imagemargin' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['imagemargin'],
'exclude' => true,
'inputType' => 'trbl',
'options' => $GLOBALS['TL_CSS_UNITS'],
'eval' => array('includeBlankOption'=>true, 'tl_class'=>'w50'),
'sql' => "varchar(128) NOT NULL default ''"
),
'imageUrl' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['imageUrl'],
'exclude' => true,
'search' => 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 ''"
),
'fullsize' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['fullsize'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50 m12'),
'sql' => "char(1) NOT NULL default ''"
),
'caption' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['caption'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'allowHtml'=>true, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'floating' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['floating'],
'default' => 'above',
'exclude' => true,
'inputType' => 'radioTable',
'options' => array('above', 'left', 'right', 'below'),
'eval' => array('cols'=>4, 'tl_class'=>'w50'),
'reference' => &$GLOBALS['TL_LANG']['MSC'],
'sql' => "varchar(32) NOT NULL default ''"
),
'html' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['html'],
'exclude' => true,
'search' => true,
'inputType' => 'textarea',
'eval' => array('mandatory'=>true, 'allowHtml'=>true, 'class'=>'monospace', 'rte'=>'ace|html', 'helpwizard'=>true),
'explanation' => 'insertTags',
'sql' => "mediumtext NULL"
),
'listtype' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['listtype'],
'exclude' => true,
'inputType' => 'select',
'options' => array('ordered', 'unordered'),
'reference' => &$GLOBALS['TL_LANG']['tl_content'],
'sql' => "varchar(32) NOT NULL default ''"
),
'listitems' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['listitems'],
'exclude' => true,
'inputType' => 'listWizard',
'eval' => array('allowHtml'=>true),
'xlabel' => array
(
array('tl_content', 'listImportWizard')
),
'sql' => "blob NULL"
),
'tableitems' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['tableitems'],
'exclude' => true,
'inputType' => 'tableWizard',
'eval' => array('allowHtml'=>true, 'doNotSaveEmpty'=>true, 'style'=>'width:142px;height:66px'),
'xlabel' => array
(
array('tl_content', 'tableImportWizard')
),
'sql' => "mediumblob NULL"
),
'summary' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['summary'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'thead' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['thead'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50 m12'),
'sql' => "char(1) NOT NULL default ''"
),
'tfoot' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['tfoot'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50'),
'sql' => "char(1) NOT NULL default ''"
),
'tleft' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['tleft'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50'),
'sql' => "char(1) NOT NULL default ''"
),
'sortable' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sortable'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('submitOnChange'=>true),
'sql' => "char(1) NOT NULL default ''"
),
'sortIndex' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sortIndex'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('rgxp'=>'natural', 'tl_class'=>'w50'),
'sql' => "smallint(5) unsigned NOT NULL default '0'"
),
'sortOrder' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sortOrder'],
'default' => 'ascending',
'exclude' => true,
'inputType' => 'select',
'options' => array('ascending', 'descending'),
'reference' => &$GLOBALS['TL_LANG']['MSC'],
'eval' => array('tl_class'=>'w50'),
'sql' => "varchar(32) NOT NULL default ''"
),
'mooHeadline' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['mooHeadline'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'allowHtml'=>true),
'sql' => "varchar(255) NOT NULL default ''"
),
'mooStyle' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['mooStyle'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'decodeEntities'=>true, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'mooClasses' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['mooClasses'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('multiple'=>true, 'size'=>2, 'rgxp'=>'alnum', 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'highlight' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['highlight'],
'exclude' => true,
'inputType' => 'select',
'options' => array('ApacheConf', 'AS3', 'Bash', 'C', 'CSharp', 'CSS', 'Delphi', 'Diff', 'Groovy', 'HTML', 'Java', 'JavaFx', 'JavaScript', 'Perl', 'PHP', 'PowerShell', 'Python', 'Ruby', 'Scala', 'SQL', 'Text', 'VB', 'XHTML', 'XML'),
'eval' => array('includeBlankOption'=>true, 'tl_class'=>'w50'),
'sql' => "varchar(32) NOT NULL default ''"
),
'shClass' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['shClass'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('tl_class'=>'w50', 'helpwizard'=>true),
'explanation' => 'highlighter',
'sql' => "varchar(255) NOT NULL default ''"
),
'code' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['code'],
'exclude' => true,
'search' => true,
'inputType' => 'textarea',
'eval' => array('mandatory'=>true, 'preserveTags'=>true, 'decodeEntities'=>true, 'class'=>'monospace', 'rte'=>'ace', 'helpwizard'=>true, 'tl_class'=>'clr'),
'explanation' => 'insertTags',
'load_callback' => array
(
array('tl_content', 'setRteSyntax')
),
'sql' => "text NULL"
),
'url' => array
(
'label' => &$GLOBALS['TL_LANG']['MSC']['url'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('mandatory'=>true, '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 ''"
),
'target' => array
(
'label' => &$GLOBALS['TL_LANG']['MSC']['target'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50 m12'),
'sql' => "char(1) NOT NULL default ''"
),
'titleText' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['titleText'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'linkTitle' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['linkTitle'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'embed' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['embed'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>255, 'tl_class'=>'w50'),
'sql' => "varchar(255) NOT NULL default ''"
),
'rel' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['rel'],
'exclude' => true,
'search' => true,
'inputType' => 'text',
'eval' => array('maxlength'=>64, 'tl_class'=>'w50'),
'sql' => "varchar(64) NOT NULL default ''"
),
'useImage' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['useImage'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('submitOnChange'=>true),
'sql' => "char(1) NOT NULL default ''"
),
'multiSRC' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['multiSRC'],
'exclude' => true,
'inputType' => 'fileTree',
'eval' => array('multiple'=>true, 'fieldType'=>'checkbox', 'orderField'=>'orderSRC', 'files'=>true, 'mandatory'=>true),
'sql' => "blob NULL",
'load_callback' => array
(
array('tl_content', 'setMultiSrcFlags')
)
),
'orderSRC' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['orderSRC'],
'sql' => "blob NULL"
),
'useHomeDir' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['useHomeDir'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50'),
'sql' => "char(1) NOT NULL default ''"
),
'perRow' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['perRow'],
'default' => 4,
'exclude' => true,
'inputType' => 'select',
'options' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
'eval' => array('tl_class'=>'w50'),
'sql' => "smallint(5) unsigned NOT NULL default '0'"
),
'perPage' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['perPage'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('rgxp'=>'natural', 'tl_class'=>'w50'),
'sql' => "smallint(5) unsigned NOT NULL default '0'"
),
'numberOfItems' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['numberOfItems'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('rgxp'=>'natural', 'tl_class'=>'w50'),
'sql' => "smallint(5) unsigned NOT NULL default '0'"
),
'sortBy' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sortBy'],
'exclude' => true,
'inputType' => 'select',
'options' => array('custom', 'name_asc', 'name_desc', 'date_asc', 'date_desc', 'random'),
'reference' => &$GLOBALS['TL_LANG']['tl_content'],
'eval' => array('tl_class'=>'w50'),
'sql' => "varchar(32) NOT NULL default ''"
),
'metaIgnore' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['metaIgnore'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50 m12'),
'sql' => "char(1) NOT NULL default ''"
),
'galleryTpl' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['galleryTpl'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getGalleryTemplates'),
'eval' => array('tl_class'=>'w50'),
'sql' => "varchar(64) NOT NULL default ''"
),
'customTpl' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['customTpl'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getElementTemplates'),
'eval' => array('includeBlankOption'=>true, 'chosen'=>true, 'tl_class'=>'w50'),
'sql' => "varchar(64) NOT NULL default ''"
),
'playerSRC' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['playerSRC'],
'exclude' => true,
'inputType' => 'fileTree',
'eval' => array('multiple'=>true, 'fieldType'=>'checkbox', 'files'=>true, 'mandatory'=>true),
'sql' => "blob NULL"
),
'youtube' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['youtube'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('rgxp'=>'url', 'mandatory'=>true),
'sql' => "varchar(16) NOT NULL default ''"
),
'posterSRC' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['posterSRC'],
'exclude' => true,
'inputType' => 'fileTree',
'eval' => array('filesOnly'=>true, 'fieldType'=>'radio'),
'sql' => "binary(16) NULL"
),
'playerSize' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['playerSize'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('multiple'=>true, 'size'=>2, 'rgxp'=>'natural', 'nospace'=>true, 'tl_class'=>'w50'),
'sql' => "varchar(64) NOT NULL default ''"
),
'autoplay' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['autoplay'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50 m12'),
'sql' => "char(1) NOT NULL default ''"
),
'sliderDelay' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sliderDelay'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('tl_class'=>'w50'),
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'sliderSpeed' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sliderSpeed'],
'default' => 300,
'exclude' => true,
'inputType' => 'text',
'eval' => array('tl_class'=>'w50'),
'sql' => "int(10) unsigned NOT NULL default '300'"
),
'sliderStartSlide' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sliderStartSlide'],
'default' => 0,
'exclude' => true,
'inputType' => 'text',
'eval' => array('tl_class'=>'w50'),
'sql' => "smallint(5) unsigned NOT NULL default '0'"
),
'sliderContinuous' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['sliderContinuous'],
'exclude' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50 m12'),
'sql' => "char(1) NOT NULL default ''"
),
'cteAlias' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['cteAlias'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getAlias'),
'eval' => array('mandatory'=>true, 'chosen'=>true, 'submitOnChange'=>true),
'wizard' => array
(
array('tl_content', 'editAlias')
),
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'articleAlias' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['articleAlias'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getArticleAlias'),
'eval' => array('mandatory'=>true, 'chosen'=>true, 'submitOnChange'=>true),
'wizard' => array
(
array('tl_content', 'editArticleAlias')
),
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'article' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['article'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getArticles'),
'eval' => array('mandatory'=>true, 'chosen'=>true, 'submitOnChange'=>true),
'wizard' => array
(
array('tl_content', 'editArticle')
),
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'form' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['form'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getForms'),
'eval' => array('mandatory'=>true, 'chosen'=>true, 'submitOnChange'=>true),
'wizard' => array
(
array('tl_content', 'editForm')
),
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'module' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['module'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => array('tl_content', 'getModules'),
'eval' => array('mandatory'=>true, 'chosen'=>true, 'submitOnChange'=>true),
'wizard' => array
(
array('tl_content', 'editModule')
),
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'protected' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['protected'],
'exclude' => true,
'filter' => true,
'inputType' => 'checkbox',
'eval' => array('submitOnChange'=>true),
'sql' => "char(1) NOT NULL default ''"
),
'groups' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['groups'],
'exclude' => true,
'inputType' => 'checkbox',
'foreignKey' => 'tl_member_group.name',
'eval' => array('mandatory'=>true, 'multiple'=>true),
'sql' => "blob NULL",
'relation' => array('type'=>'hasMany', 'load'=>'lazy')
),
'guests' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['guests'],
'exclude' => true,
'filter' => true,
'inputType' => 'checkbox',
'eval' => array('tl_class'=>'w50'),
'sql' => "char(1) NOT NULL default ''"
),
'cssID' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['cssID'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('multiple'=>true, 'size'=>2, 'tl_class'=>'w50 clr'),
'sql' => "varchar(255) NOT NULL default ''"
),
'space' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['space'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('multiple'=>true, 'size'=>2, 'rgxp'=>'digit', 'nospace'=>true, 'tl_class'=>'w50'),
'sql' => "varchar(64) NOT NULL default ''"
),
'invisible' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['invisible'],
'exclude' => true,
'filter' => true,
'inputType' => 'checkbox',
'sql' => "char(1) NOT NULL default ''"
),
'start' => array
(
'exclude' => true,
'label' => &$GLOBALS['TL_LANG']['tl_content']['start'],
'inputType' => 'text',
'eval' => array('rgxp'=>'datim', 'datepicker'=>true, 'tl_class'=>'w50 wizard'),
'sql' => "varchar(10) NOT NULL default ''"
),
'stop' => array
(
'exclude' => true,
'label' => &$GLOBALS['TL_LANG']['tl_content']['stop'],
'inputType' => 'text',
'eval' => array('rgxp'=>'datim', 'datepicker'=>true, 'tl_class'=>'w50 wizard'),
'sql' => "varchar(10) NOT NULL default ''"
)
)
);
/**
* Dynamically add the permission check and parent table (see #5241)
*/
if (Input::get('do') == 'article' || Input::get('do') == 'page')
{
$GLOBALS['TL_DCA']['tl_content']['config']['ptable'] = 'tl_article';
$GLOBALS['TL_DCA']['tl_content']['config']['onload_callback'][] = array('tl_content', 'checkPermission');
}
/**
* Provide miscellaneous methods that are used by the data configuration array.
*
* @author Leo Feyer <https://github.com/leofeyer>
*/
class tl_content extends Backend
{
/**
* Import the back end user object
*/
public function __construct()
{
parent::__construct();
$this->import('BackendUser', 'User');
}
/**
* Check permissions to edit table tl_content
*/
public function checkPermission()
{
// Prevent deleting referenced elements (see #4898)
if (Input::get('act') == 'deleteAll')
{
$objCes = $this->Database->prepare("SELECT cteAlias FROM tl_content WHERE (ptable='tl_article' OR ptable='') AND type='alias'")
->execute();
$session = $this->Session->getData();
$session['CURRENT']['IDS'] = array_diff($session['CURRENT']['IDS'], $objCes->fetchEach('cteAlias'));
$this->Session->setData($session);
}
if ($this->User->isAdmin)
{
return;
}
// Get the pagemounts
$pagemounts = array();
foreach ($this->User->pagemounts as $root)
{
$pagemounts[] = $root;
$pagemounts = array_merge($pagemounts, $this->Database->getChildRecords($root, 'tl_page'));
}
$pagemounts = array_unique($pagemounts);
// Check the current action
switch (Input::get('act'))
{
case 'paste':
// Allow
break;
case '': // empty
case 'create':
case 'select':
// Check access to the article
if (!$this->checkAccessToElement(CURRENT_ID, $pagemounts, true))
{
$this->redirect('contao/main.php?act=error');
}
break;
case 'editAll':
case 'deleteAll':
case 'overrideAll':
case 'cutAll':
case 'copyAll':
// Check access to the parent element if a content element is moved
if ((Input::get('act') == 'cutAll' || Input::get('act') == 'copyAll') && !$this->checkAccessToElement(Input::get('pid'), $pagemounts, (Input::get('mode') == 2)))
{
$this->redirect('contao/main.php?act=error');
}
$objCes = $this->Database->prepare("SELECT id FROM tl_content WHERE (ptable='tl_article' OR ptable='') AND pid=?")
->execute(CURRENT_ID);
$session = $this->Session->getData();
$session['CURRENT']['IDS'] = array_intersect($session['CURRENT']['IDS'], $objCes->fetchEach('id'));
$this->Session->setData($session);
break;
case 'cut':
case 'copy':
// Check access to the parent element if a content element is moved
if (!$this->checkAccessToElement(Input::get('pid'), $pagemounts, (Input::get('mode') == 2)))
{
$this->redirect('contao/main.php?act=error');
}
// NO BREAK STATEMENT HERE
default:
// Check access to the content element
if (!$this->checkAccessToElement(Input::get('id'), $pagemounts))
{
$this->redirect('contao/main.php?act=error');
}
break;
}
}
/**
* Check access to a particular content element
*
* @param integer $id
* @param array $pagemounts
* @param boolean $blnIsPid
*
* @return boolean
*/
protected function checkAccessToElement($id, $pagemounts, $blnIsPid=false)
{
if ($blnIsPid)
{
$objPage = $this->Database->prepare("SELECT p.id, p.pid, p.includeChmod, p.chmod, p.cuser, p.cgroup, a.id AS aid FROM tl_article a, tl_page p WHERE a.id=? AND a.pid=p.id")
->limit(1)
->execute($id);
}
else
{
$objPage = $this->Database->prepare("SELECT p.id, p.pid, p.includeChmod, p.chmod, p.cuser, p.cgroup, a.id AS aid FROM tl_content c, tl_article a, tl_page p WHERE c.id=? AND c.pid=a.id AND a.pid=p.id")
->limit(1)
->execute($id);
}
// Invalid ID
if ($objPage->numRows < 1)
{
$this->log('Invalid content element ID ' . $id, __METHOD__, TL_ERROR);
return false;
}
// The page is not mounted
if (!in_array($objPage->id, $pagemounts))
{
$this->log('Not enough permissions to modify article ID ' . $objPage->aid . ' on page ID ' . $objPage->id, __METHOD__, TL_ERROR);
return false;
}
// Not enough permissions to modify the article
if (!$this->User->isAllowed(BackendUser::CAN_EDIT_ARTICLES, $objPage->row()))
{
$this->log('Not enough permissions to modify article ID ' . $objPage->aid, __METHOD__, TL_ERROR);
return false;
}
return true;
}
/**
* 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;
}
/**
* Return the group of a content element
*
* @param string $element
*
* @return string
*/
public function getContentElementGroup($element)
{
foreach ($GLOBALS['TL_CTE'] as $k=>$v)
{
foreach (array_keys($v) as $kk)
{
if ($kk == $element)
{
return $k;
}
}
}
return null;
}
/**
* 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 'gallery':
Message::addInfo(sprintf($GLOBALS['TL_LANG']['tl_content']['includeTemplates'], 'moo_mediabox', 'j_colorbox'));
break;
case 'sliderStart':
case 'sliderStop':
Message::addInfo(sprintf($GLOBALS['TL_LANG']['tl_content']['includeTemplates'], 'moo_slider', 'j_slider'));
break;
case 'accordionSingle':
case 'accordionStart':
case 'accordionStop':
Message::addInfo(sprintf($GLOBALS['TL_LANG']['tl_content']['includeTemplates'], 'moo_accordion', 'j_accordion'));
break;
case 'player':
case 'youtube':
Message::addInfo(sprintf($GLOBALS['TL_LANG']['tl_content']['includeTemplate'], 'j_mediaelement'));
break;
case 'table':
if ($objCte->sortable)
{
Message::addInfo(sprintf($GLOBALS['TL_LANG']['tl_content']['includeTemplates'], 'moo_tablesort', 'j_tablesort'));
}
break;
}
}
/**
* Add the type of content element
*
* @param array $arrRow
*
* @return string
*/
public function addCteType($arrRow)
{
$key = $arrRow['invisible'] ? 'unpublished' : 'published';
$type = $GLOBALS['TL_LANG']['CTE'][$arrRow['type']][0] ?: ' ';
$class = 'limit_height';
// Remove the class if it is a wrapper element
if (in_array($arrRow['type'], $GLOBALS['TL_WRAPPERS']['start']) || in_array($arrRow['type'], $GLOBALS['TL_WRAPPERS']['separator']) || in_array($arrRow['type'], $GLOBALS['TL_WRAPPERS']['stop']))
{
$class = '';
if (($group = $this->getContentElementGroup($arrRow['type'])) !== null)
{
$type = $GLOBALS['TL_LANG']['CTE'][$group] . ' (' . $type . ')';
}
}
// Add the group name if it is a single element (see #5814)
elseif (in_array($arrRow['type'], $GLOBALS['TL_WRAPPERS']['single']))
{
if (($group = $this->getContentElementGroup($arrRow['type'])) !== null)
{
$type = $GLOBALS['TL_LANG']['CTE'][$group] . ' (' . $type . ')';
}
}
// Add the ID of the aliased element
if ($arrRow['type'] == 'alias')
{
$type .= ' ID ' . $arrRow['cteAlias'];
}
// Add the protection status
if ($arrRow['protected'])
{
$type .= ' (' . $GLOBALS['TL_LANG']['MSC']['protected'] . ')';
}
elseif ($arrRow['guests'])
{
$type .= ' (' . $GLOBALS['TL_LANG']['MSC']['guests'] . ')';
}
// Add the headline level (see #5858)
if ($arrRow['type'] == 'headline')
{
if (is_array(($headline = deserialize($arrRow['headline']))))
{
$type .= ' (' . $headline['unit'] . ')';
}
}
// Limit the element's height
if (!Config::get('doNotCollapse'))
{
$class .= ' h64';
}
$objModel = new ContentModel();
$objModel->setRow($arrRow);
return '
<div class="cte_type ' . $key . '">' . $type . '</div>
<div class="' . trim($class) . '">
' . StringUtil::insertTagToSrc($this->getContentElement($objModel)) . '
</div>' . "n";
}
/**
* Return the edit article alias wizard
*
* @param DataContainer $dc
*
* @return string
*/
public function editArticleAlias(DataContainer $dc)
{
return ($dc->value < 1) ? '' : ' <a href="contao/main.php?do=article&table=tl_content&id=' . $dc->value . '&popup=1&nb=1&rt=' . REQUEST_TOKEN . '" title="' . sprintf(specialchars($GLOBALS['TL_LANG']['tl_content']['editalias'][1]), $dc->value) . '" style="padding-left:3px" onclick="Backend.openModalIframe({'width':768,'title':'' . specialchars(str_replace("'", "\'", sprintf($GLOBALS['TL_LANG']['tl_content']['editalias'][1], $dc->value))) . '','url':this.href});return false">' . Image::getHtml('alias.gif', $GLOBALS['TL_LANG']['tl_content']['editalias'][0], 'style="vertical-align:top"') . '</a>';
}
/**
* Get all articles and return them as array (article alias)
*
* @param DataContainer $dc
*
* @return array
*/
public function getArticleAlias(DataContainer $dc)
{
$arrPids = array();
$arrAlias = array();
if (!$this->User->isAdmin)
{
foreach ($this->User->pagemounts as $id)
{
$arrPids[] = $id;
$arrPids = array_merge($arrPids, $this->Database->getChildRecords($id, 'tl_page'));
}
if (empty($arrPids))
{
return $arrAlias;
}
$objAlias = $this->Database->prepare("SELECT a.id, a.pid, a.title, a.inColumn, p.title AS parent FROM tl_article a LEFT JOIN tl_page p ON p.id=a.pid WHERE a.pid IN(". implode(',', array_map('intval', array_unique($arrPids))) .") AND a.id!=(SELECT pid FROM tl_content WHERE id=?) ORDER BY parent, a.sorting")
->execute($dc->id);
}
else
{
$objAlias = $this->Database->prepare("SELECT a.id, a.pid, a.title, a.inColumn, p.title AS parent FROM tl_article a LEFT JOIN tl_page p ON p.id=a.pid WHERE a.id!=(SELECT pid FROM tl_content WHERE id=?) ORDER BY parent, a.sorting")
->execute($dc->id);
}
if ($objAlias->numRows)
{
System::loadLanguageFile('tl_article');
while ($objAlias->next())
{
$key = $objAlias->parent . ' (ID ' . $objAlias->pid . ')';
$arrAlias[$key][$objAlias->id] = $objAlias->title . ' (' . ($GLOBALS['TL_LANG']['COLS'][$objAlias->inColumn] ?: $objAlias->inColumn) . ', ID ' . $objAlias->id . ')';
}
}
return $arrAlias;
}
/**
* Return the edit alias wizard
*
* @param DataContainer $dc
*
* @return string
*/
public function editAlias(DataContainer $dc)
{
return ($dc->value < 1) ? '' : ' <a href="contao/main.php?do=article&table=tl_content&act=edit&id=' . $dc->value . '&popup=1&nb=1&rt=' . REQUEST_TOKEN . '" title="' . sprintf(specialchars($GLOBALS['TL_LANG']['tl_content']['editalias'][1]), $dc->value) . '" style="padding-left:3px" onclick="Backend.openModalIframe({'width':768,'title':'' . specialchars(str_replace("'", "\'", sprintf($GLOBALS['TL_LANG']['tl_content']['editalias'][1], $dc->value))) . '','url':this.href});return false">' . Image::getHtml('alias.gif', $GLOBALS['TL_LANG']['tl_content']['editalias'][0], 'style="vertical-align:top"') . '</a>';
}
/**
* Get all content elements and return them as array (content element alias)
*
* @return array
*/
public function getAlias()
{
$arrPids = array();
$arrAlias = array();
if (!$this->User->isAdmin)
{
foreach ($this->User->pagemounts as $id)
{
$arrPids[] = $id;
$arrPids = array_merge($arrPids, $this->Database->getChildRecords($id, 'tl_page'));
}
if (empty($arrPids))
{
return $arrAlias;
}
$objAlias = $this->Database->prepare("SELECT c.id, c.pid, c.type, (CASE c.type WHEN 'module' THEN m.name WHEN 'form' THEN f.title WHEN 'table' THEN c.summary ELSE c.headline END) AS headline, c.text, a.title FROM tl_content c LEFT JOIN tl_article a ON a.id=c.pid LEFT JOIN tl_module m ON m.id=c.module LEFT JOIN tl_form f on f.id=c.form WHERE a.pid IN(". implode(',', array_map('intval', array_unique($arrPids))) .") AND (c.ptable='tl_article' OR c.ptable='') AND c.id!=? ORDER BY a.title, c.sorting")
->execute(Input::get('id'));
}
else
{
$objAlias = $this->Database->prepare("SELECT c.id, c.pid, c.type, (CASE c.type WHEN 'module' THEN m.name WHEN 'form' THEN f.title WHEN 'table' THEN c.summary ELSE c.headline END) AS headline, c.text, a.title FROM tl_content c LEFT JOIN tl_article a ON a.id=c.pid LEFT JOIN tl_module m ON m.id=c.module LEFT JOIN tl_form f on f.id=c.form WHERE (c.ptable='tl_article' OR c.ptable='') AND c.id!=? ORDER BY a.title, c.sorting")
->execute(Input::get('id'));
}
while ($objAlias->next())
{
$arrHeadline = deserialize($objAlias->headline, true);
if (isset($arrHeadline['value']))
{
$headline = StringUtil::substr($arrHeadline['value'], 32);
}
else
{
$headline = StringUtil::substr(preg_replace('/[nrt]+/', ' ', $arrHeadline[0]), 32);
}
$text = StringUtil::substr(strip_tags(preg_replace('/[nrt]+/', ' ', $objAlias->text)), 32);
$strText = $GLOBALS['TL_LANG']['CTE'][$objAlias->type][0] . ' (';
if ($headline != '')
{
$strText .= $headline . ', ';
}
elseif ($text != '')
{
$strText .= $text . ', ';
}
$key = $objAlias->title . ' (ID ' . $objAlias->pid . ')';
$arrAlias[$key][$objAlias->id] = $strText . 'ID ' . $objAlias->id . ')';
}
return $arrAlias;
}
/**
* Return the edit form wizard
*
* @param DataContainer $dc
*
* @return string
*/
public function editForm(DataContainer $dc)
{
return ($dc->value < 1) ? '' : ' <a href="contao/main.php?do=form&table=tl_form_field&id=' . $dc->value . '&popup=1&nb=1&rt=' . REQUEST_TOKEN . '" title="' . sprintf(specialchars($GLOBALS['TL_LANG']['tl_content']['editalias'][1]), $dc->value) . '" style="padding-left:3px" onclick="Backend.openModalIframe({'width':768,'title':'' . specialchars(str_replace("'", "\'", sprintf($GLOBALS['TL_LANG']['tl_content']['editalias'][1], $dc->value))) . '','url':this.href});return false">' . Image::getHtml('alias.gif', $GLOBALS['TL_LANG']['tl_content']['editalias'][0], 'style="vertical-align:top"') . '</a>';
}
/**
* Get all forms and return them as array
*
* @return array
*/
public function getForms()
{
if (!$this->User->isAdmin && !is_array($this->User->forms))
{
return array();
}
$arrForms = array();
$objForms = $this->Database->execute("SELECT id, title FROM tl_form ORDER BY title");
while ($objForms->next())
{
if ($this->User->hasAccess($objForms->id, 'forms'))
{
$arrForms[$objForms->id] = $objForms->title . ' (ID ' . $objForms->id . ')';
}
}
return $arrForms;
}
/**
* Return the edit module wizard
*
* @param DataContainer $dc
*
* @return string
*/
public function editModule(DataContainer $dc)
{
return ($dc->value < 1) ? '' : ' <a href="contao/main.php?do=themes&table=tl_module&act=edit&id=' . $dc->value . '&popup=1&nb=1&rt=' . REQUEST_TOKEN . '" title="' . sprintf(specialchars($GLOBALS['TL_LANG']['tl_content']['editalias'][1]), $dc->value) . '" style="padding-left:3px" onclick="Backend.openModalIframe({'width':768,'title':'' . specialchars(str_replace("'", "\'", sprintf($GLOBALS['TL_LANG']['tl_content']['editalias'][1], $dc->value))) . '','url':this.href});return false">' . Image::getHtml('alias.gif', $GLOBALS['TL_LANG']['tl_content']['editalias'][0], 'style="vertical-align:top"') . '</a>';
}
/**
* Get all modules and return them as array
*
* @return array
*/
public function getModules()
{
$arrModules = array();
$objModules = $this->Database->execute("SELECT m.id, m.name, t.name AS theme FROM tl_module m LEFT JOIN tl_theme t ON m.pid=t.id ORDER BY t.name, m.name");
while ($objModules->next())
{
$arrModules[$objModules->theme][$objModules->id] = $objModules->name . ' (ID ' . $objModules->id . ')';
}
return $arrModules;
}
/**
* Return all gallery templates as array
*
* @return array
*/
public function getGalleryTemplates()
{
return $this->getTemplateGroup('gallery_');
}
/**
* Return all content element templates as array
*
* @return array
*/
public function getElementTemplates()
{
return $this->getTemplateGroup('ce_');
}
/**
* Return the edit article teaser wizard
*
* @param DataContainer $dc
*
* @return string
*/
public function editArticle(DataContainer $dc)
{
return ($dc->value < 1) ? '' : ' <a href="contao/main.php?do=article&table=tl_article&act=edit&id=' . $dc->value . '&popup=1&nb=1&rt=' . REQUEST_TOKEN . '" title="' . sprintf(specialchars($GLOBALS['TL_LANG']['tl_content']['editarticle'][1]), $dc->value) . '" onclick="Backend.openModalIframe({'width':768,'title':'' . specialchars(str_replace("'", "\'", sprintf($GLOBALS['TL_LANG']['tl_content']['editarticle'][1], $dc->value))) . '','url':this.href});return false">' . Image::getHtml('alias.gif', $GLOBALS['TL_LANG']['tl_content']['editarticle'][0], 'style="vertical-align:top"') . '</a>';
}
/**
* Get all articles and return them as array (article teaser)
*
* @param DataContainer $dc
*
* @return array
*/
public function getArticles(DataContainer $dc)
{
$arrPids = array();
$arrArticle = array();
$arrRoot = array();
$intPid = $dc->activeRecord->pid;
if (Input::get('act') == 'overrideAll')
{
$intPid = Input::get('id');
}
// Limit pages to the website root
$objArticle = $this->Database->prepare("SELECT pid FROM tl_article WHERE id=?")
->limit(1)
->execute($intPid);
if ($objArticle->numRows)
{
$objPage = PageModel::findWithDetails($objArticle->pid);
$arrRoot = $this->Database->getChildRecords($objPage->rootId, 'tl_page');
array_unshift($arrRoot, $objPage->rootId);
}
unset($objArticle);
// Limit pages to the user's pagemounts
if ($this->User->isAdmin)
{
$objArticle = $this->Database->execute("SELECT a.id, a.pid, a.title, a.inColumn, p.title AS parent FROM tl_article a LEFT JOIN tl_page p ON p.id=a.pid" . (!empty($arrRoot) ? " WHERE a.pid IN(". implode(',', array_map('intval', array_unique($arrRoot))) .")" : "") . " ORDER BY parent, a.sorting");
}
else
{
foreach ($this->User->pagemounts as $id)
{
if (!in_array($id, $arrRoot))
{
continue;
}
$arrPids[] = $id;
$arrPids = array_merge($arrPids, $this->Database->getChildRecords($id, 'tl_page'));
}
if (empty($arrPids))
{
return $arrArticle;
}
$objArticle = $this->Database->execute("SELECT a.id, a.pid, a.title, a.inColumn, p.title AS parent FROM tl_article a LEFT JOIN tl_page p ON p.id=a.pid WHERE a.pid IN(". implode(',', array_map('intval', array_unique($arrPids))) .") ORDER BY parent, a.sorting");
}
// Edit the result
if ($objArticle->numRows)
{
System::loadLanguageFile('tl_article');
while ($objArticle->next())
{
$key = $objArticle->parent . ' (ID ' . $objArticle->pid . ')';
$arrArticle[$key][$objArticle->id] = $objArticle->title . ' (' . ($GLOBALS['TL_LANG']['COLS'][$objArticle->inColumn] ?: $objArticle->inColumn) . ', ID ' . $objArticle->id . ')';
}
}
return $arrArticle;
}
/**
* Dynamically set the ace syntax
*
* @param mixed $varValue
* @param DataContainer $dc
*
* @return string
*/
public function setRteSyntax($varValue, DataContainer $dc)
{
switch ($dc->activeRecord->highlight)
{
case 'C':
case 'CSharp':
$syntax = 'c_cpp';
break;
case 'CSS':
case 'Diff':
case 'Groovy':
case 'HTML':
case 'Java':
case 'JavaScript':
case 'Perl':
case 'PHP':
case 'PowerShell':
case 'Python':
case 'Ruby':
case 'Scala':
case 'SQL':
case 'Text':
$syntax = strtolower($dc->activeRecord->highlight);
break;
case 'VB':
$syntax = 'vbscript';
break;
case 'XML':
case 'XHTML':
$syntax = 'xml';
break;
default:
$syntax = 'text';
break;
}
if ($dc->activeRecord->type == 'markdown')
{
$syntax = 'markdown';
}
$GLOBALS['TL_DCA']['tl_content']['fields']['code']['eval']['rte'] = 'ace|' . $syntax;
return $varValue;
}
/**
* Add a link to the list items import wizard
*
* @return string
*/
public function listImportWizard()
{
return ' <a href="' . $this->addToUrl('key=list') . '" title="' . specialchars($GLOBALS['TL_LANG']['MSC']['lw_import'][1]) . '" onclick="Backend.getScrollOffset()">' . Image::getHtml('tablewizard.gif', $GLOBALS['TL_LANG']['MSC']['tw_import'][0], 'style="vertical-align:text-bottom"') . '</a>';
}
/**
* Add a link to the table items import wizard
*
* @return string
*/
public function tableImportWizard()
{
return ' <a href="' . $this->addToUrl('key=table') . '" title="' . specialchars($GLOBALS['TL_LANG']['MSC']['tw_import'][1]) . '" onclick="Backend.getScrollOffset()">' . Image::getHtml('tablewizard.gif', $GLOBALS['TL_LANG']['MSC']['tw_import'][0], 'style="vertical-align:text-bottom"') . '</a> ' . Image::getHtml('demagnify.gif', '', 'title="' . specialchars($GLOBALS['TL_LANG']['MSC']['tw_shrink']) . '" style="vertical-align:text-bottom;cursor:pointer" onclick="Backend.tableWizardResize(0.9)"') . Image::getHtml('magnify.gif', '', 'title="' . specialchars($GLOBALS['TL_LANG']['MSC']['tw_expand']) . '" style="vertical-align:text-bottom; cursor:pointer" onclick="Backend.tableWizardResize(1.1)"');
}
/**
* Return the link picker wizard
*
* @param DataContainer $dc
*
* @return string
*/
public function pagePicker(DataContainer $dc)
{
return ' <a href="' . (($dc->value == '' || strpos($dc->value, '{{link_url::') !== false) ? 'contao/page.php' : 'contao/file.php') . '?do=' . Input::get('do') . '&table=' . $dc->table . '&field=' . $dc->field . '&value=' . rawurlencode(str_replace(array('{{link_url::', '}}'), '', $dc->value)) . '&switch=1' . '" title="' . specialchars($GLOBALS['TL_LANG']['MSC']['pagepicker']) . '" onclick="Backend.getScrollOffset();Backend.openModalSelector({'width':768,'title':'' . specialchars(str_replace("'", "\'", $GLOBALS['TL_LANG']['MOD']['page'][0])) . '','url':this.href,'id':'' . $dc->field . '','tag':'ctrl_'. $dc->field . ((Input::get('act') == 'editAll') ? '_' . $dc->id : '') . '','self':this});return false">' . Image::getHtml('pickpage.gif', $GLOBALS['TL_LANG']['MSC']['pagepicker'], 'style="vertical-align:top;cursor:pointer"') . '</a>';
}
/**
* Return the delete content element button
*
* @param array $row
* @param string $href
* @param string $label
* @param string $title
* @param string $icon
* @param string $attributes
*
* @return string
*/
public function deleteElement($row, $href, $label, $title, $icon, $attributes)
{
$objElement = $this->Database->prepare("SELECT id FROM tl_content WHERE cteAlias=? AND type='alias'")
->limit(1)
->execute($row['id']);
return $objElement->numRows ? Image::getHtml(preg_replace('/.gif$/i', '_.gif', $icon)) . ' ' : '<a href="'.$this->addToUrl($href.'&id='.$row['id']).'" title="'.specialchars($title).'"'.$attributes.'>'.Image::getHtml($icon, $label).'</a> ';
}
/**
* Dynamically add flags to the "singleSRC" field
*
* @param mixed $varValue
* @param DataContainer $dc
*
* @return mixed
*/
public function setSingleSrcFlags($varValue, DataContainer $dc)
{
if ($dc->activeRecord)
{
switch ($dc->activeRecord->type)
{
case 'text':
case 'hyperlink':
case 'image':
case 'accordionSingle':
$GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['extensions'] = Config::get('validImageTypes');
break;
case 'download':
$GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['extensions'] = Config::get('allowedDownload');
break;
}
}
return $varValue;
}
/**
* Dynamically add flags to the "multiSRC" field
*
* @param mixed $varValue
* @param DataContainer $dc
*
* @return mixed
*/
public function setMultiSrcFlags($varValue, DataContainer $dc)
{
if ($dc->activeRecord)
{
switch ($dc->activeRecord->type)
{
case 'gallery':
$GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['isGallery'] = true;
$GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['extensions'] = Config::get('validImageTypes');
break;
case 'downloads':
$GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['isDownloads'] = true;
$GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['extensions'] = Config::get('allowedDownload');
break;
}
}
return $varValue;
}
/**
* Pre-fill the "alt" and "caption" fields with the file meta data
*
* @param mixed $varValue
* @param DataContainer $dc
*
* @return mixed
*/
public function storeFileMetaInformation($varValue, DataContainer $dc)
{
if ($dc->activeRecord->singleSRC != $varValue)
{
$this->addFileMetaInformationToRequest($varValue, ($dc->activeRecord->ptable ?: 'tl_article'), $dc->activeRecord->pid);
}
return $varValue;
}
/**
* Return the "toggle visibility" button
*
* @param array $row
* @param string $href
* @param string $label
* @param string $title
* @param string $icon
* @param string $attributes
*
* @return string
*/
public function toggleIcon($row, $href, $label, $title, $icon, $attributes)
{
if (strlen(Input::get('tid')))
{
$this->toggleVisibility(Input::get('tid'), (Input::get('state') == 1), (@func_get_arg(12) ?: null));
$this->redirect($this->getReferer());
}
// Check permissions AFTER checking the tid, so hacking attempts are logged
if (!$this->User->hasAccess('tl_content::invisible', 'alexf'))
{
return '';
}
$href .= '&id='.Input::get('id').'&tid='.$row['id'].'&state='.$row['invisible'];
if ($row['invisible'])
{
$icon = 'invisible.gif';
}
return '<a href="'.$this->addToUrl($href).'" title="'.specialchars($title).'"'.$attributes.'>'.Image::getHtml($icon, $label, 'data-state="' . ($row['invisible'] ? 0 : 1) . '"').'</a> ';
}
/**
* Toggle the visibility of an element
*
* @param integer $intId
* @param boolean $blnVisible
* @param DataContainer $dc
*/
public function toggleVisibility($intId, $blnVisible, DataContainer $dc=null)
{
// Set the ID and action
Input::setGet('id', $intId);
Input::setGet('act', 'toggle');
if ($dc)
{
$dc->id = $intId; // see #8043
}
$this->checkPermission();
// Check the field access
if (!$this->User->hasAccess('tl_content::invisible', 'alexf'))
{
$this->log('Not enough permissions to publish/unpublish content element ID "'.$intId.'"', __METHOD__, TL_ERROR);
$this->redirect('contao/main.php?act=error');
}
// The onload_callbacks vary depending on the dynamic parent table (see #4894)
if (is_array($GLOBALS['TL_DCA']['tl_content']['config']['onload_callback']))
{
foreach ($GLOBALS['TL_DCA']['tl_content']['config']['onload_callback'] as $callback)
{
if (is_array($callback))
{
$this->import($callback[0]);
$this->{$callback[0]}->{$callback[1]}(($dc ?: $this));
}
elseif (is_callable($callback))
{
$callback(($dc ?: $this));
}
}
}
$objVersions = new Versions('tl_content', $intId);
$objVersions->initialize();
// Trigger the save_callback
if (is_array($GLOBALS['TL_DCA']['tl_content']['fields']['invisible']['save_callback']))
{
foreach ($GLOBALS['TL_DCA']['tl_content']['fields']['invisible']['save_callback'] as $callback)
{
if (is_array($callback))
{
$this->import($callback[0]);
$blnVisible = $this->{$callback[0]}->{$callback[1]}($blnVisible, ($dc ?: $this));
}
elseif (is_callable($callback))
{
$blnVisible = $callback($blnVisible, ($dc ?: $this));
}
}
}
// Update the database
$this->Database->prepare("UPDATE tl_content SET tstamp=". time() .", invisible='" . ($blnVisible ? '' : 1) . "' WHERE id=?")
->execute($intId);
$objVersions->create();
$this->log('A new version of record "tl_content.id='.$intId.'" has been created'.$this->getParentEntries('tl_content', $intId), __METHOD__, TL_GENERAL);
}
}