public function editAll()
{
$return = '';
if ($GLOBALS['TL_DCA'][$this->strTable]['config']['notEditable']) {
throw new InternalServerErrorException('Table "' . $this->strTable . '" is not editable.');
}
/** @var SessionInterface $objSession */
$objSession = \System::getContainer()->get('session');
// Get current IDs from session
$session = $objSession->all();
$ids = $session['CURRENT']['IDS'];
// Save field selection in session
if (\Input::post('FORM_SUBMIT') == $this->strTable . '_all' && \Input::get('fields')) {
$session['CURRENT'][$this->strTable] = \Input::post('all_fields');
$objSession->replace($session);
}
$fields = $session['CURRENT'][$this->strTable];
// Add fields
if (!empty($fields) && is_array($fields) && \Input::get('fields')) {
$class = 'tl_tbox';
// Walk through each record
foreach ($ids as $id) {
$this->intId = $id;
$this->strPalette = \StringUtil::trimsplit('[;,]', $this->getPalette());
$objModel = null;
$objVersions = null;
// Get the DB entry
if ($this->blnIsDbAssisted && \Dbafs::shouldBeSynchronized($id)) {
$objModel = \FilesModel::findByPath($id);
if ($objModel === null) {
$objModel = \Dbafs::addResource($id);
}
$this->objActiveRecord = $objModel;
$this->blnCreateNewVersion = false;
/** @var FilesModel $objModel */
$objVersions = new \Versions($this->strTable, $objModel->id);
$objVersions->initialize();
} else {
// Unset the database fields
$this->strPalette = array_filter($this->strPalette, function ($val) {
return $val == 'name' || $val == 'protected';
});
}
$return .= '
<div class="' . $class . '">';
$class = 'tl_box';
$formFields = array();
$strHash = md5($id);
foreach ($this->strPalette as $v) {
// Check whether field is excluded
if ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$this->strField]['exclude']) {
continue;
}
if (!in_array($v, $fields)) {
continue;
}
$this->strField = $v;
$this->strInputName = $v . '_' . $strHash;
$formFields[] = $v . '_' . $strHash;
// Load the current value
if ($v == 'name') {
$objFile = is_dir(TL_ROOT . '/' . $id) ? new \Folder($id) : new \File($id);
$this->strPath = str_replace(TL_ROOT . '/', '', $objFile->dirname);
$this->strExtension = $objFile->origext != '' ? '.' . $objFile->origext : '';
$this->varValue = $objFile->filename;
// Fix hidden Unix system files
if (strncmp($this->varValue, '.', 1) === 0) {
$this->strExtension = '';
}
} else {
$this->varValue = $objModel !== null ? $objModel->{$v} : null;
}
// Call load_callback
if (is_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$this->strField]['load_callback'])) {
foreach ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$this->strField]['load_callback'] as $callback) {
if (is_array($callback)) {
$this->import($callback[0]);
$this->varValue = $this->{$callback[0]}->{$callback[1]}($this->varValue, $this);
} elseif (is_callable($callback)) {
$this->varValue = $callback($this->varValue, $this);
}
}
}
// Build the current row
$return .= $this->row();
}
// Close box
$return .= '
<input type="hidden" name="FORM_FIELDS_' . $strHash . '[]" value="' . \StringUtil::specialchars(implode(',', $formFields)) . '">
</div>';
// Save the record
if (\Input::post('FORM_SUBMIT') == $this->strTable && !$this->noReload) {
// Call onsubmit_callback
if (is_array($GLOBALS['TL_DCA'][$this->strTable]['config']['onsubmit_callback'])) {
foreach ($GLOBALS['TL_DCA'][$this->strTable]['config']['onsubmit_callback'] as $callback) {
if (is_array($callback)) {
$this->import($callback[0]);
$this->{$callback[0]}->{$callback[1]}($this);
} elseif (is_callable($callback)) {
$callback($this);
}
}
}
// Create a new version
if ($this->blnCreateNewVersion && $objModel !== null) {
$objVersions->create();
// Call the onversion_callback
if (is_array($GLOBALS['TL_DCA'][$this->strTable]['config']['onversion_callback'])) {
@trigger_error('Using the onversion_callback has been deprecated and will no longer work in Contao 5.0. Use the oncreate_version_callback instead.', E_USER_DEPRECATED);
foreach ($GLOBALS['TL_DCA'][$this->strTable]['config']['onversion_callback'] as $callback) {
if (is_array($callback)) {
$this->import($callback[0]);
$this->{$callback[0]}->{$callback[1]}($this->strTable, $objModel->id, $this);
} elseif (is_callable($callback)) {
$callback($this->strTable, $objModel->id, $this);
}
}
}
}
// Set the current timestamp (-> DO NOT CHANGE ORDER version - timestamp)
if ($this->blnIsDbAssisted && $objModel !== null) {
$this->Database->prepare("UPDATE " . $this->strTable . " SET tstamp=? WHERE id=?")->execute(time(), $objModel->id);
}
}
}
// Submit buttons
$arrButtons = array();
$arrButtons['save'] = '<button type="submit" name="save" id="save" class="tl_submit" accesskey="s">' . $GLOBALS['TL_LANG']['MSC']['save'] . '</button>';
$arrButtons['saveNclose'] = '<button type="submit" name="saveNclose" id="saveNclose" class="tl_submit" accesskey="c">' . $GLOBALS['TL_LANG']['MSC']['saveNclose'] . '</button>';
// Call the buttons_callback (see #4691)
if (is_array($GLOBALS['TL_DCA'][$this->strTable]['edit']['buttons_callback'])) {
foreach ($GLOBALS['TL_DCA'][$this->strTable]['edit']['buttons_callback'] as $callback) {
if (is_array($callback)) {
$this->import($callback[0]);
$arrButtons = $this->{$callback[0]}->{$callback[1]}($arrButtons, $this);
} elseif (is_callable($callback)) {
$arrButtons = $callback($arrButtons, $this);
}
}
}
if (count($arrButtons) < 3) {
$strButtons = implode(' ', $arrButtons);
} else {
$strButtons = array_shift($arrButtons) . ' ';
$strButtons .= '<div class="split-button">';
$strButtons .= array_shift($arrButtons) . '<button type="button" id="sbtog">' . \Image::getHtml('navcol.svg') . '</button> <ul class="invisible">';
foreach ($arrButtons as $strButton) {
$strButtons .= '<li>' . $strButton . '</li>';
}
$strButtons .= '</ul></div>';
}
// Add the form
$return = '
<form action="' . ampersand(\Environment::get('request'), true) . '" id="' . $this->strTable . '" class="tl_form" method="post">
<div class="tl_formbody_edit nogrid">
<input type="hidden" name="FORM_SUBMIT" value="' . $this->strTable . '">
<input type="hidden" name="REQUEST_TOKEN" value="' . REQUEST_TOKEN . '">' . ($this->noReload ? '
<p class="tl_error">' . $GLOBALS['TL_LANG']['ERR']['general'] . '</p>' : '') . $return . '
</div>
<div class="tl_formbody_submit">
<div class="tl_submit_container">
' . $strButtons . '
</div>
</div>
</form>';
// Set the focus if there is an error
if ($this->noReload) {
$return .= '
<script>
window.addEvent(\'domready\', function() {
Backend.vScrollTo(($(\'' . $this->strTable . '\').getElement(\'label.error\').getPosition().y - 20));
});
</script>';
}
// Reload the page to prevent _POST variables from being sent twice
if (\Input::post('FORM_SUBMIT') == $this->strTable && !$this->noReload) {
if (isset($_POST['saveNclose'])) {
\System::setCookie('BE_PAGE_OFFSET', 0, 0);
$this->redirect($this->getReferer());
}
$this->reload();
}
} else {
$options = '';
$fields = array();
// Add fields of the current table
$fields = array_merge($fields, array_keys($GLOBALS['TL_DCA'][$this->strTable]['fields']));
// Show all non-excluded fields
foreach ($fields as $field) {
if (!$GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['exclude'] && !$GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['eval']['doNotShow'] && (strlen($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['inputType']) || is_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['input_field_callback']))) {
$options .= '
<input type="checkbox" name="all_fields[]" id="all_' . $field . '" class="tl_checkbox" value="' . \StringUtil::specialchars($field) . '"> <label for="all_' . $field . '" class="tl_checkbox_label">' . (($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'][0] ?: ($GLOBALS['TL_LANG']['MSC'][$field][0] ?: $field)) . ' <span style="color:#999;padding-left:3px">[' . $field . ']</span>') . '</label><br>';
}
}
$blnIsError = $_POST && empty($_POST['all_fields']);
// Return the select menu
$return .= '
<form action="' . ampersand(\Environment::get('request'), true) . '&fields=1" id="' . $this->strTable . '_all" class="tl_form" method="post">
<div class="tl_formbody_edit">
<input type="hidden" name="FORM_SUBMIT" value="' . $this->strTable . '_all">
<input type="hidden" name="REQUEST_TOKEN" value="' . REQUEST_TOKEN . '">' . ($blnIsError ? '
<p class="tl_error">' . $GLOBALS['TL_LANG']['ERR']['general'] . '</p>' : '') . '
<div class="tl_tbox">
<div class="widget">
<fieldset class="tl_checkbox_container">
<legend' . ($blnIsError ? ' class="error"' : '') . '>' . $GLOBALS['TL_LANG']['MSC']['all_fields'][0] . '</legend>
<input type="checkbox" id="check_all" class="tl_checkbox" onclick="Backend.toggleCheckboxes(this)"> <label for="check_all" style="color:#a6a6a6"><em>' . $GLOBALS['TL_LANG']['MSC']['selectAll'] . '</em></label><br>' . $options . '
</fieldset>' . ($blnIsError ? '
<p class="tl_error">' . $GLOBALS['TL_LANG']['ERR']['all_fields'] . '</p>' : (\Config::get('showHelp') && strlen($GLOBALS['TL_LANG']['MSC']['all_fields'][1]) ? '
<p class="tl_help tl_tip">' . $GLOBALS['TL_LANG']['MSC']['all_fields'][1] . '</p>' : '')) . '
</div>
</div>
</div>
<div class="tl_formbody_submit">
<div class="tl_submit_container">
<button type="submit" name="save" id="save" class="tl_submit" accesskey="s">' . $GLOBALS['TL_LANG']['MSC']['continue'] . '</button>
</div>
</div>
</form>';
}
// Return
return '
<div id="tl_buttons">
<a href="' . $this->getReferer(true) . '" class="header_back" title="' . \StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['backBTTitle']) . '" accesskey="b" onclick="Backend.getScrollOffset()">' . $GLOBALS['TL_LANG']['MSC']['backBT'] . '</a>
</div>' . $return;
}