123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <?php
- namespace Drupal\Core\Render\Element;
- use Drupal\Component\Utility\Html as HtmlUtility;
- use Drupal\Core\Form\FormStateInterface;
- use Drupal\Core\Render\Element;
- /**
- * Provides a render element that wraps child elements in a container.
- *
- * Surrounds child elements with a <div> and adds attributes such as classes or
- * an HTML ID.
- *
- * Properties:
- * - #optional: Indicates whether the container should render when it has no
- * visible children. Defaults to FALSE.
- *
- * Usage example:
- * @code
- * $form['needs_accommodation'] = array(
- * '#type' => 'checkbox',
- * '#title' => $this->t('Need Special Accommodations?'),
- * );
- *
- * $form['accommodation'] = array(
- * '#type' => 'container',
- * '#attributes' => array(
- * 'class' => 'accommodation',
- * ),
- * '#states' => array(
- * 'invisible' => array(
- * 'input[name="needs_accommodation"]' => array('checked' => FALSE),
- * ),
- * ),
- * );
- *
- * $form['accommodation']['diet'] = array(
- * '#type' => 'textfield',
- * '#title' => $this->t('Dietary Restrictions'),
- * );
- * @endcode
- *
- * @RenderElement("container")
- */
- class Container extends RenderElement {
- /**
- * {@inheritdoc}
- */
- public function getInfo() {
- $class = get_class($this);
- return [
- '#optional' => FALSE,
- '#process' => [
- [$class, 'processGroup'],
- [$class, 'processContainer'],
- ],
- '#pre_render' => [
- [$class, 'preRenderGroup'],
- [$class, 'preRenderContainer'],
- ],
- '#theme_wrappers' => ['container'],
- ];
- }
- /**
- * Processes a container element.
- *
- * @param array $element
- * An associative array containing the properties and children of the
- * container.
- * @param \Drupal\Core\Form\FormStateInterface $form_state
- * The current state of the form.
- * @param array $complete_form
- * The complete form structure.
- *
- * @return array
- * The processed element.
- */
- public static function processContainer(&$element, FormStateInterface $form_state, &$complete_form) {
- // Generate the ID of the element if it's not explicitly given.
- if (!isset($element['#id'])) {
- $element['#id'] = HtmlUtility::getUniqueId(implode('-', $element['#parents']) . '-wrapper');
- }
- return $element;
- }
- /**
- * Prevents optional containers from rendering if they have no children.
- *
- * @param array $element
- * An associative array containing the properties and children of the
- * container.
- *
- * @return array
- * The modified element.
- */
- public static function preRenderContainer($element) {
- // Do not render optional container elements if there are no children.
- if (empty($element['#printed']) && !empty($element['#optional']) && !Element::getVisibleChildren($element)) {
- $element['#printed'] = TRUE;
- }
- return $element;
- }
- }
|