123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Config form fieldset renderer
- */
- namespace Magento\Config\Block\System\Config\Form;
- use Magento\Framework\Data\Form\Element\AbstractElement;
- /**
- * @api
- * @since 100.0.2
- */
- class Fieldset extends \Magento\Backend\Block\AbstractBlock implements
- \Magento\Framework\Data\Form\Element\Renderer\RendererInterface
- {
- /**
- * @var \Magento\Backend\Model\Auth\Session
- */
- protected $_authSession;
- /**
- * @var \Magento\Framework\View\Helper\Js
- */
- protected $_jsHelper;
- /**
- * Whether is collapsed by default
- *
- * @var bool
- */
- protected $isCollapsedDefault = false;
- /**
- * @param \Magento\Backend\Block\Context $context
- * @param \Magento\Backend\Model\Auth\Session $authSession
- * @param \Magento\Framework\View\Helper\Js $jsHelper
- * @param array $data
- */
- public function __construct(
- \Magento\Backend\Block\Context $context,
- \Magento\Backend\Model\Auth\Session $authSession,
- \Magento\Framework\View\Helper\Js $jsHelper,
- array $data = []
- ) {
- $this->_jsHelper = $jsHelper;
- $this->_authSession = $authSession;
- parent::__construct($context, $data);
- }
- /**
- * Render fieldset html
- *
- * @param AbstractElement $element
- * @return string
- */
- public function render(AbstractElement $element)
- {
- $this->setElement($element);
- $header = $this->_getHeaderHtml($element);
- $elements = $this->_getChildrenElementsHtml($element);
- $footer = $this->_getFooterHtml($element);
- return $header . $elements . $footer;
- }
- /**
- * @param AbstractElement $element
- * @return string
- * @since 100.1.0
- */
- protected function _getChildrenElementsHtml(AbstractElement $element)
- {
- $elements = '';
- foreach ($element->getElements() as $field) {
- if ($field instanceof \Magento\Framework\Data\Form\Element\Fieldset) {
- $elements .= '<tr id="row_' . $field->getHtmlId() . '">'
- . '<td colspan="4">' . $field->toHtml() . '</td></tr>';
- } else {
- $elements .= $field->toHtml();
- }
- }
- return $elements;
- }
- /**
- * Return header html for fieldset
- *
- * @param AbstractElement $element
- * @return string
- */
- protected function _getHeaderHtml($element)
- {
- if ($element->getIsNested()) {
- $html = '<tr class="nested"><td colspan="4"><div class="' . $this->_getFrontendClass($element) . '">';
- } else {
- $html = '<div class="' . $this->_getFrontendClass($element) . '">';
- }
- $html .= '<div class="entry-edit-head admin__collapsible-block">' .
- '<span id="' .
- $element->getHtmlId() .
- '-link" class="entry-edit-head-link"></span>';
- $html .= $this->_getHeaderTitleHtml($element);
- $html .= '</div>';
- $html .= '<input id="' .
- $element->getHtmlId() .
- '-state" name="config_state[' .
- $element->getId() .
- ']" type="hidden" value="' .
- (int)$this->_isCollapseState(
- $element
- ) . '" />';
- $html .= '<fieldset class="' . $this->_getFieldsetCss() . '" id="' . $element->getHtmlId() . '">';
- $html .= '<legend>' . $element->getLegend() . '</legend>';
- $html .= $this->_getHeaderCommentHtml($element);
- // field label column
- $html .= '<table cellspacing="0" class="form-list"><colgroup class="label" /><colgroup class="value" />';
- if ($this->getRequest()->getParam('website') || $this->getRequest()->getParam('store')) {
- $html .= '<colgroup class="use-default" />';
- }
- $html .= '<colgroup class="scope-label" /><colgroup class="" /><tbody>';
- return $html;
- }
- /**
- * Get frontend class
- *
- * @param AbstractElement $element
- * @return string
- */
- protected function _getFrontendClass($element)
- {
- $group = $element->getGroup();
- $cssClass = isset($group['fieldset_css']) ? $group['fieldset_css'] : '';
- return 'section-config' . (empty($cssClass) ? '' : ' ' . $cssClass);
- }
- /**
- * Return header title part of html for fieldset
- *
- * @param AbstractElement $element
- * @return string
- */
- protected function _getHeaderTitleHtml($element)
- {
- return '<a id="' .
- $element->getHtmlId() .
- '-head" href="#' .
- $element->getHtmlId() .
- '-link" onclick="Fieldset.toggleCollapse(\'' .
- $element->getHtmlId() .
- '\', \'' .
- $this->getUrl(
- '*/*/state'
- ) . '\'); return false;">' . $element->getLegend() . '</a>';
- }
- /**
- * Return header comment part of html for fieldset
- *
- * @param AbstractElement $element
- * @return string
- */
- protected function _getHeaderCommentHtml($element)
- {
- return $element->getComment() ? '<div class="comment">' . $element->getComment() . '</div>' : '';
- }
- /**
- * Return full css class name for form fieldset
- *
- * @return string
- */
- protected function _getFieldsetCss()
- {
- /** @var \Magento\Config\Model\Config\Structure\Element\Group $group */
- $group = $this->getGroup();
- $configCss = $group->getFieldsetCss();
- return 'config admin__collapsible-block' . ($configCss ? ' ' . $configCss : '');
- }
- /**
- * Return footer html for fieldset
- * Add extra tooltip comments to elements
- *
- * @param AbstractElement $element
- * @return string
- */
- protected function _getFooterHtml($element)
- {
- $html = '</tbody></table>';
- foreach ($element->getElements() as $field) {
- if ($field->getTooltip()) {
- $html .= sprintf(
- '<div id="row_%s_comment" class="system-tooltip-box" style="display:none;">%s</div>',
- $field->getId(),
- $field->getTooltip()
- );
- }
- }
- $html .= '</fieldset>' . $this->_getExtraJs($element);
- if ($element->getIsNested()) {
- $html .= '</td></tr>';
- } else {
- $html .= '</div>';
- }
- return $html;
- }
- /**
- * Return js code for fieldset:
- * - observe fieldset rows;
- * - apply collapse;
- *
- * @param AbstractElement $element
- * @return string
- */
- protected function _getExtraJs($element)
- {
- $htmlId = $element->getHtmlId();
- $output = "require(['prototype'], function(){Fieldset.applyCollapse('{$htmlId}');});";
- return $this->_jsHelper->getScript($output);
- }
- /**
- * Collapsed or expanded fieldset when page loaded?
- *
- * @param AbstractElement $element
- * @return bool
- */
- protected function _isCollapseState($element)
- {
- if ($element->getExpanded() ||
- ($element->getForm() && $element->getForm()->getElements()->count() === 1)
- ) {
- return true;
- }
- $extra = $this->_authSession->getUser()->getExtra();
- if (isset($extra['configState'][$element->getId()])) {
- return $extra['configState'][$element->getId()];
- }
- return $this->isCollapsedDefault;
- }
- }
|