189 lines
6.3 KiB
PHP
189 lines
6.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @package Joomla.Site
|
|
* @subpackage Layout
|
|
*
|
|
* @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\HTML\HTMLHelper;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\Layout\LayoutHelper;
|
|
|
|
$app = Factory::getApplication();
|
|
$form = $displayData->getForm();
|
|
$fieldSets = $form->getFieldsets();
|
|
$helper = $displayData->get('useCoreUI', false) ? 'uitab' : 'bootstrap';
|
|
|
|
if (empty($fieldSets)) {
|
|
return;
|
|
}
|
|
|
|
$ignoreFieldsets = $displayData->get('ignore_fieldsets') ?: [];
|
|
$outputFieldsets = $displayData->get('output_fieldsets') ?: [];
|
|
$ignoreFieldsetFields = $displayData->get('ignore_fieldset_fields') ?: [];
|
|
$ignoreFields = $displayData->get('ignore_fields') ?: [];
|
|
$extraFields = $displayData->get('extra_fields') ?: [];
|
|
$tabName = $displayData->get('tab_name') ?: 'myTab';
|
|
|
|
// These are required to preserve data on save when fields are not displayed.
|
|
$hiddenFieldsets = $displayData->get('hiddenFieldsets') ?: [];
|
|
|
|
// These are required to configure showing and hiding fields in the editor.
|
|
$configFieldsets = $displayData->get('configFieldsets') ?: [];
|
|
|
|
// Handle the hidden fieldsets when show_options is set false
|
|
if (!$displayData->get('show_options', 1)) {
|
|
// The HTML buffer
|
|
$html = [];
|
|
|
|
// Loop over the fieldsets
|
|
foreach ($fieldSets as $name => $fieldSet) {
|
|
// Check if the fieldset should be ignored
|
|
if (in_array($name, $ignoreFieldsets, true)) {
|
|
continue;
|
|
}
|
|
|
|
// If it is a hidden fieldset, render the inputs
|
|
if (in_array($name, $hiddenFieldsets)) {
|
|
// Loop over the fields
|
|
foreach ($form->getFieldset($name) as $field) {
|
|
// Add only the input on the buffer
|
|
$html[] = $field->input;
|
|
}
|
|
|
|
// Make sure the fieldset is not rendered twice
|
|
$ignoreFieldsets[] = $name;
|
|
}
|
|
|
|
// Check if it is the correct fieldset to ignore
|
|
if (strpos($name, 'basic') === 0) {
|
|
// Ignore only the fieldsets which are defined by the options not the custom fields ones
|
|
$ignoreFieldsets[] = $name;
|
|
}
|
|
}
|
|
|
|
// Echo the hidden fieldsets
|
|
echo implode('', $html);
|
|
}
|
|
|
|
$opentab = false;
|
|
|
|
$xml = $form->getXml();
|
|
|
|
// Loop again over the fieldsets
|
|
foreach ($fieldSets as $name => $fieldSet) {
|
|
// Ensure any fieldsets we don't want to show are skipped (including repeating formfield fieldsets)
|
|
if (
|
|
(isset($fieldSet->repeat) && $fieldSet->repeat === true)
|
|
|| in_array($name, $ignoreFieldsets)
|
|
|| (!empty($configFieldsets) && in_array($name, $configFieldsets, true))
|
|
|| (!empty($hiddenFieldsets) && in_array($name, $hiddenFieldsets, true))
|
|
) {
|
|
continue;
|
|
}
|
|
|
|
// Determine the label
|
|
if (!empty($fieldSet->label)) {
|
|
$label = Text::_($fieldSet->label);
|
|
} else {
|
|
$label = strtoupper('JGLOBAL_FIELDSET_' . $name);
|
|
if (Text::_($label) === $label) {
|
|
$label = strtoupper($app->getInput()->get('option') . '_' . $name . '_FIELDSET_LABEL');
|
|
}
|
|
$label = Text::_($label);
|
|
}
|
|
|
|
$hasChildren = $xml->xpath('//fieldset[@name="' . $name . '"]//fieldset[not(ancestor::field/form/*)]');
|
|
$hasParent = $xml->xpath('//fieldset//fieldset[@name="' . $name . '"]');
|
|
$isGrandchild = $xml->xpath('//fieldset//fieldset//fieldset[@name="' . $name . '"]');
|
|
|
|
if (!$isGrandchild && $hasParent) {
|
|
echo '<fieldset id="fieldset-' . $name . '" class="options-form ' . (!empty($fieldSet->class) ? $fieldSet->class : '') . '">';
|
|
echo '<legend>' . $label . '</legend>';
|
|
|
|
// Include the description when available
|
|
if (!empty($fieldSet->description)) {
|
|
echo '<div class="alert alert-info">';
|
|
echo '<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('INFO') . '</span> ';
|
|
echo Text::_($fieldSet->description);
|
|
echo '</div>';
|
|
}
|
|
|
|
echo '<div class="form-grid">';
|
|
} elseif (!$hasParent) {
|
|
// Tabs
|
|
if ($opentab) {
|
|
if ($opentab > 1) {
|
|
echo '</div>';
|
|
echo '</fieldset>';
|
|
}
|
|
|
|
// End previous tab
|
|
echo HTMLHelper::_($helper . '.endTab');
|
|
}
|
|
|
|
// Start the tab
|
|
echo HTMLHelper::_($helper . '.addTab', $tabName, 'attrib-' . $name, $label);
|
|
|
|
$opentab = 1;
|
|
|
|
// Directly add a fieldset if we have no children
|
|
if (!$hasChildren) {
|
|
echo '<fieldset id="fieldset-' . $name . '" class="options-form ' . (!empty($fieldSet->class) ? $fieldSet->class : '') . '">';
|
|
echo '<legend>' . $label . '</legend>';
|
|
|
|
// Include the description when available
|
|
if (!empty($fieldSet->description)) {
|
|
echo '<div class="alert alert-info">';
|
|
echo '<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('INFO') . '</span> ';
|
|
echo Text::_($fieldSet->description);
|
|
echo '</div>';
|
|
}
|
|
|
|
echo '<div class="form-grid">';
|
|
|
|
$opentab = 2;
|
|
} elseif (!empty($fieldSet->description)) {
|
|
// Include the description when available
|
|
echo '<div class="alert alert-info alert-parent">';
|
|
echo '<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('INFO') . '</span> ';
|
|
echo Text::_($fieldSet->description);
|
|
echo '</div>';
|
|
}
|
|
}
|
|
|
|
// We're on the deepest level => output fields
|
|
if (!$hasChildren) {
|
|
// The name of the fieldset to render
|
|
$displayData->fieldset = $name;
|
|
|
|
// Force to show the options
|
|
$displayData->showOptions = true;
|
|
|
|
// Render the fieldset
|
|
echo LayoutHelper::render('joomla.edit.fieldset', $displayData);
|
|
}
|
|
|
|
// Close open fieldset
|
|
if (!$isGrandchild && $hasParent) {
|
|
echo '</div>';
|
|
echo '</fieldset>';
|
|
}
|
|
}
|
|
|
|
if ($opentab) {
|
|
if ($opentab > 1) {
|
|
echo '</div>';
|
|
echo '</fieldset>';
|
|
}
|
|
|
|
// End previous tab
|
|
echo HTMLHelper::_($helper . '.endTab');
|
|
}
|