<?php /** * TeamList for Contao * * Copyright (c) 2016 Benjamin Roth * * @license LGPL-3.0+ */ /** * Table tl_eSM_team */ use Contao\DC_Table; use Contao\DataContainer; $GLOBALS['TL_DCA']['tl_eSM_team'] = array ( // Config 'config' => array ( 'dataContainer' => DC_Table::class, 'ptable' => 'tl_eSM_team_group', 'enableVersioning' => true, 'sql' => array ( 'keys' => array ( 'id' => 'primary', 'pid' => 'index', 'pid,published' => 'index' ) ) ), // List 'list' => array ( 'sorting' => array ( 'mode' => DataContainer::MODE_PARENT, 'fields' => array('division', 'lastname'), 'headerFields' => array('title'), 'panelLayout' => 'filter,search;sort,limit', 'child_record_callback' => array('tl_eSM_team', 'listMembers') ), 'label' => array ( ), 'global_operations' => array ( 'all' => array ( 'href' => 'act=select', 'class' => 'header_edit_all', 'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"' ) ), 'operations' => array ( 'edit' => array ( 'href' => 'act=edit', 'icon' => 'edit.svg' ), 'copy' => array ( 'href' => 'act=paste&mode=copy', 'attributes' => 'onclick="Backend.getScrollOffset()"', 'icon' => 'copy.svg' ), 'cut' => array ( 'href' => 'act=paste&mode=cut', 'icon' => 'cut.svg', 'attributes' => 'onclick="Backend.getScrollOffset()"' ), 'delete' => array ( 'href' => 'act=delete', 'icon' => 'delete.svg', 'attributes' => 'onclick="if(!confirm(\'' . ($GLOBALS['TL_LANG']['MSC']['deleteConfirm'] ?? null) . '\'))return false;Backend.getScrollOffset()"' ), 'toggle' => array ( 'href' => 'act=toggle&field=invisible', 'icon' => 'visible.svg', // 'button_callback' => array('tl_eSM_team', 'toggleIcon') ), 'show' => array ( 'href' => 'act=show', 'icon' => 'show.svg' ) ) ), // Palettes 'palettes' => array ( 'default' => '{person_legend},firstname,lastname,comment;{company_legend},position,division;{picture_legend},singleSRC;{publish_legend:hide},published' ), // Subpalettes 'subpalettes' => array ( ), // Fields 'fields' => array ( 'id' => array ( 'sql' => "int(10) unsigned NOT NULL auto_increment" ), 'pid' => array ( 'foreignKey' => 'tl_faq_category.title', 'sql' => "int(10) unsigned NOT NULL default '0'", 'relation' => array('type'=>'belongsTo', 'load'=>'eager') ), 'tstamp' => array ( 'sql' => "int(10) unsigned NOT NULL default '0'" ), 'firstname' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['firstname'], 'exclude' => true, 'search' => true, 'inputType' => 'text', 'eval' => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'), 'sql' => "varchar(128) NOT NULL default ''" ), 'lastname' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['lastname'], 'exclude' => true, 'search' => true, 'inputType' => 'text', 'eval' => array('mandatory'=>false, 'maxlength'=>128, 'tl_class'=>'w50'), 'sql' => "varchar(128) NOT NULL default ''" ), 'position' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['position'], 'exclude' => true, 'search' => true, 'inputType' => 'text', 'eval' => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'), 'sql' => "varchar(128) NOT NULL default ''" ), 'comment' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['comment'], 'exclude' => true, 'inputType' => 'textarea', 'eval' => array('mandatory'=>false, 'maxlength'=>128, 'tl_class'=>'clr'), 'sql' => "varchar(128) NOT NULL default ''" ), 'division' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['division'], 'exclude' => true, 'filter' => true, 'inputType' => 'select', 'options' => $GLOBALS['eSM_team']['divisions'], 'reference' => &$GLOBALS['TL_LANG']['REF']['divisions'], 'eval' => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'), 'sql' => "varchar(128) NOT NULL default ''" ), 'singleSRC' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['singleSRC'], 'exclude' => true, 'inputType' => 'fileTree', 'eval' => array('filesOnly'=>true, 'extensions'=>Config::get('validImageTypes'), 'fieldType'=>'radio', 'mandatory'=>true), 'sql' => "binary(16) NULL" ), 'published' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_eSM_team']['published'], 'exclude' => true, 'filter' => true, 'inputType' => 'checkbox', 'default' => '1', 'eval' => array('doNotCopy'=>true), 'sql' => "char(1) NOT NULL default ''" ), ) ); /** * Provide miscellaneous methods that are used by the data configuration array. */ class tl_eSM_team extends Backend { /** * Import the back end user object */ public function __construct() { parent::__construct(); $this->import('BackendUser', 'User'); } /** * Add the type of input field * * @param array $arrRow * * @return string */ public function listMembers($arrRow) { return ' <div style="float: left; width: 35%;">' . $arrRow['firstname'] . ' ' . $arrRow['lastname'] . '</div> <div style="font-size: .625rem; color: #c6c6c6;"><strong>[' . $arrRow['position'] . ']</strong></div>' . "\n"; } /** * 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_eSM_team::published', 'alexf')) { return ''; } $href .= '&tid='.$row['id'].'&state='.($row['published'] ? '' : 1); if (!$row['published']) { $icon = 'invisible.gif'; } return '<a href="'.$this->addToUrl($href).'" title="'.specialchars($title).'"'.$attributes.'>'.Image::getHtml($icon, $label, 'data-state="' . ($row['published'] ? 1 : 0) . '"').'</a> '; } /** * Disable/enable a user group * * @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 } // Check the field access if (!$this->User->hasAccess('tl_eSM_team::published', 'alexf')) { $this->log('Not enough permissions to publish/unpublish teammember ID "'.$intId.'"', __METHOD__, TL_ERROR); $this->redirect('contao/main.php?act=error'); } $objVersions = new Versions('tl_eSM_team', $intId); $objVersions->initialize(); // Trigger the save_callback if (is_array($GLOBALS['TL_DCA']['tl_news']['fields']['published']['save_callback'])) { foreach ($GLOBALS['TL_DCA']['tl_news']['fields']['published']['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_eSM_team SET tstamp=". time() .", published='" . ($blnVisible ? '1' : '') . "' WHERE id=?") ->execute($intId); $objVersions->create(); $this->log('A new version of record "tl_eSM_team.id='.$intId.'" has been created'.$this->getParentEntries('tl_eSM_team', $intId), __METHOD__, TL_GENERAL); } }