Current path: home/webdevt/prestashop17/src/PrestaShopBundle/Resources/views/Admin/TwigTemplateForm/
?? Go up: /home/webdevt/prestashop17/src/PrestaShopBundle/Resources/views/Admin
{#**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
*#}
{#
# This form theme is an implementation of PrestaShop UI kit, it based on the bootstrap4 layout and overrides a few
# blocks to match our expected integration of the UI kit.
#
# This theme uses/extends the basic bootstrap_4_layout meaning the form labels/inputs are displayed one under the other.
# Unlike our prestashop_ui_kit.html.twig theme which extends this base kit but uses bootstrap_4_horizontal_layout as a
# base, where labels/inputs are displayed horizontally in a column way.
#}
{#
# We need to radio_widget and checkbox_widget from the original bootstrap 4 layout because we need to add form-check-radio
# on the last wrapping div which is not possible with the attributes, so we basically copied the content, but then we cannot
# use parent() to render the internal widget because it would reuse the one from bootstrap_4_layout and duplicate content.
#
# So we extract the initial widget from the bootstrap_base_layout to inject them as the internal widget, it is important
# to do it before we use bootstrap_4_layout or the base layout will override the blocks from bootstrap_4_layout.
#
# See https://symfony.com/doc/3.4/form/form_customization.html#referencing-blocks-from-inside-the-same-template-as-the-form
#}
{% use 'bootstrap_base_layout.html.twig' with radio_widget as base_radio_widget, checkbox_widget as base_checkbox_widget %}
{# Use bootstrap4 theme (from the Symfony framework) as default base #}
{% use 'bootstrap_4_layout.html.twig' %}
{% use '@PrestaShop/Admin/TwigTemplateForm/typeahead.html.twig' %}
{% use '@PrestaShop/Admin/TwigTemplateForm/material.html.twig' %}
{# overrides from bootstrap_4_layout #}
{# Widgets #}
{%- block form_widget -%}
{% if columns_number is defined %}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-columns-' ~ columns_number)|trim}) %}
{% endif %}
{{ parent() }}
{{- block('form_help') -}}
{%- endblock form_widget -%}
{%- block form_widget_simple -%}
{{ parent() }}
{% include '@PrestaShop/Admin/TwigTemplateForm/form_max_length.html.twig' with {'attr': attr} %}
{%- endblock form_widget_simple -%}
{% block text_with_unit_widget %}
<div class="input-group">
{{- block('form_widget_simple') -}}
{% if form.vars.unit is defined %}
<div class="input-group-append">
<span class="input-group-text">{{ form.vars.unit }}</span>
</div>
{% endif %}
</div>
{{ block('form_help') }}
{% endblock text_with_unit_widget %}
{% block ip_address_text_widget %}
<div class="input-group">
{{- block('form_widget_simple') -}}
<button type="button" class="btn btn-outline-primary add_ip_button" data-ip="{{ currentIp }}">
<i class="material-icons">add_circle</i> {{ 'Add my IP'|trans({}, 'Admin.Actions') }}
</button>
</div>
{{ block('form_help') }}
{% endblock ip_address_text_widget %}
{# Rows #}
{% block form_row -%}
<div class="form-group{{ block('widget_type_class') }}{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}{% if row_attr.class is defined %} {{ row_attr.class }}{% endif %}">
{{- form_label(form) -}}
{{- block('form_prepend_alert') -}}
{{- form_widget(form) -}}
{{- form_errors(form) -}}
{{- block('form_external_link') -}}
{{- block('form_append_alert') -}}
</div>
{% if column_breaker %}
<div class="form-group form-column-breaker"></div>
{% endif %}
{%- endblock form_row %}
{% block widget_type_class %}
{% if not compound and form.vars.block_prefixes|length > 2 %}
{% spaceless %}
{% set index = form.vars.block_prefixes|length - 2 %}
{% set widgetType = form.vars.block_prefixes[index] %}
{% if widgetType == 'choice' %}
{% if not expanded %}
{% set widgetType = 'select' %}
{% elseif multiple %}
{% set widgetType = 'checboxes' %}
{% else %}
{% set widgetType = 'radio' %}
{% endif %}
{% endif %}
{{ widgetType }}-widget
{% endspaceless %}
{% endif %}
{% endblock %}
{# Labels #}
{%- block form_label -%}
{% if label is not same as(false) -%}
{% if not compound -%}
{% set label_attr = label_attr|merge({'for': id}) %}
{%- endif %}
{% if required -%}
{% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
{%- endif %}
{% if label is empty -%}
{%- if label_format is not empty -%}
{% set label = label_format|replace({
'%name%': name,
'%id%': id,
}) %}
{%- else -%}
{% set label = name|humanize %}
{%- endif -%}
{%- endif -%}
{% set labelTag = label_tag_name|default('label') %}
<{{ labelTag }}{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
{% if required %}
<span class="text-danger">*</span>
{% endif %}
{{ translation_domain is same as(false) ? label|raw : label|raw }}
{% if label_attr['tooltip'] is defined %}
{% set placement = label_attr['tooltip_placement'] is defined ? label_attr['tooltip_placement'] : 'top' %}
<i class="icon-question" data-toggle="pstooltip" data-placement="{{ placement }}"
title="{{ label_attr['tooltip'] }}"></i>
{% endif %}
{% if label_help_box is defined or label_attr['popover'] is defined %}
{% set content = label_help_box is defined ? label_help_box : label_attr['popover'] %}
{% set placement = label_attr['popover_placement'] is defined ? label_attr['popover_placement'] : 'top' %}
{% include '@Common/HelpBox/helpbox.html.twig' with { "placement" : placement, "content": content } %}
{% endif %}
</{{ labelTag }}>
{% if label_subtitle is defined %}
<p class="subtitle">{{ label_subtitle }}</p>
{% endif %}
{%- endif -%}
{%- endblock form_label -%}
{# Widgets #}
{% block textarea_widget -%}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-control')|trim}) %}
{{- parent() -}}
{% include '@PrestaShop/Admin/TwigTemplateForm/form_max_length.html.twig' with {'attr': attr} %}
{{ block('form_help') }}
{%- endblock textarea_widget %}
{% block money_widget -%}
<div class="input-group money-type">
{% set prepend = '{{' == money_pattern[0:2] %}
{% if not prepend %}
<div class="input-group-prepend">
<span class="input-group-text">{{ money_pattern|replace({ '{{ widget }}':''}) }}</span>
</div>
{% endif %}
{{- block('form_widget_simple') -}}
{% if prepend %}
<div class="input-group-append">
<span class="input-group-text">{{ money_pattern|replace({ '{{ widget }}':''}) }}</span>
</div>
{% endif %}
</div>
{{ block('form_help') }}
{%- endblock money_widget %}
{% block percent_widget -%}
<div class="input-group">
{{- block('form_widget_simple') -}}
<div class="input-group-append">
<span class="input-group-text">%</span>
</div>
</div>
{%- endblock percent_widget %}
{% block datetime_widget -%}
{% if widget == 'single_text' %}
{{- block('form_widget_simple') -}}
{% else -%}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) -%}
<div {{ block('widget_container_attributes') }}>
{{- form_errors(form.date) -}}
{{- form_errors(form.time) -}}
{{- form_widget(form.date, { datetime: true } ) -}}
{{- form_widget(form.time, { datetime: true } ) -}}
</div>
{%- endif %}
{%- endblock datetime_widget %}
{%- block url_widget -%}
{%- set type = type|default('url') -%}
{{ block('form_widget_simple') }}
{{ block('form_help') }}
{%- endblock url_widget -%}
{% block date_widget -%}
{% if widget == 'single_text' %}
{{- block('form_widget_simple') -}}
{% else -%}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) -%}
{% if datetime is not defined or not datetime -%}
<div {{ block('widget_container_attributes') -}}>
{%- endif %}
{{- date_pattern|replace({
'{{ year }}': form_widget(form.year),
'{{ month }}': form_widget(form.month),
'{{ day }}': form_widget(form.day),
})|raw -}}
{% if datetime is not defined or not datetime -%}
</div>
{%- endif -%}
{% endif %}
{%- endblock date_widget %}
{% block time_widget -%}
{% if widget == 'single_text' %}
{{- block('form_widget_simple') -}}
{% else -%}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) -%}
{% if datetime is not defined or false == datetime -%}
<div {{ block('widget_container_attributes') -}}>
{%- endif -%}
{{- form_widget(form.hour) }}:{{ form_widget(form.minute) }}{% if with_seconds %}:{{ form_widget(form.second) }}{% endif %}
{% if datetime is not defined or false == datetime -%}
</div>
{%- endif -%}
{% endif %}
{%- endblock time_widget %}
{%- block email_widget -%}
{%- set type = type|default('email') -%}
{{ block('form_widget_simple') }}
{{ block('form_help') }}
{%- endblock email_widget -%}
{% block button_widget -%}
{% set attr = attr|merge({class: (attr.class|default('btn-default') ~ ' btn')|trim}) %}
{{- parent() -}}
{%- endblock %}
{% block icon_button_widget -%}
{% set attr = attr|merge({class: (attr.class|default('btn-default') ~ ' btn')|trim}) %}
{% if button_type == 'link' %}
{% set buttonTag = 'a' %}
{# Link tags need extra class for disabled, the attribute itself is not enough #}
{% if attr.disabled|default(false) %}
{% set attr = attr|merge({class: (attr.class ~ ' disabled')|trim}) %}
{% endif %}
{% else %}
{% set buttonTag = 'button' %}
{% set attr = attr|merge({type: 'button'}) %}
{% endif %}
<{{ buttonTag }} {{ block('button_attributes') }}>
<i class="material-icons">{{ button_icon }}</i>
{{ label }}
</{{ buttonTag }}>
{%- endblock %}
{% block choice_widget %}
{{- parent() -}}
{{ block('form_help') }}
{% endblock choice_widget %}
{% block choice_widget_collapsed -%}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' custom-select')|trim}) %}
{{- parent() -}}
{%- endblock %}
{% block choice_widget_expanded -%}
{% if '-inline' in label_attr.class|default('') -%}
<div class="control-group">
{%- for child in form %}
{{- form_widget(child, {
parent_label_class: label_attr.class|default(''),
translation_domain: choice_translation_domain,
valid: valid,
}) -}}
{% endfor -%}
</div>
{%- else -%}
<div {{ block('widget_container_attributes') }}>
{%- for child in form %}
{{- form_widget(child, {
parent_label_class: label_attr.class|default(''),
translation_domain: choice_translation_domain,
valid: valid,
}) -}}
{% endfor -%}
</div>
{%- endif %}
{%- endblock choice_widget_expanded %}
{% block choice_tree_widget -%}
<div {{ block('widget_container_attributes') }} class="category-tree-overflow">
<ul class="category-tree">
<li class="form-control-label text-right main-category">{{ "Main category"|trans({}, 'Admin.Catalog.Feature') }}</li>
{%- for child in choices %}
{{ block('choice_tree_item_widget') }}
{% endfor -%}
</ul>
</div>
{%- endblock choice_tree_widget %}
{% block choice_tree_item_widget -%}
<li>
{% set checked = (form.vars.submitted_values is defined and submitted_values[child.id_category] is defined) ? 'checked="checked"' : '' %}
{% if multiple -%}
<div class="checkbox">
<label>
<input type="checkbox" name="{{ form.vars.full_name }}[tree][]" value="{{ child.id_category }}" class="category" {{ checked }}>
{% if child.active is defined and child.active == 0 %}
<i>{{ child.name }}</i>
{%- else -%}
{{ child.name }}
{% endif %}
{% if defaultCategory is defined %}
<input type="radio" value="{{ child.id_category }}" name="ignore" class="default-category" />
{% endif %}
</label>
</div>
{%- else -%}
<div class="radio">
<label>
<input type="radio" name="form[{{ form.vars.id }}][tree]" value="{{ child.id_category }}" {{ checked }} class="category">
{{ child.name }}
{% if defaultCategory is defined %}
<input type="radio" value="{{ child.id_category }}" name="ignore" class="default-category" />
{% endif %}
</label>
</div>
{%- endif %}
{% if child.children is defined %}
<ul>
{% for item in child.children %}
{% set child = item %}
{{ block('choice_tree_item_widget') }}
{% endfor -%}
</ul>
{% endif %}
</li>
{%- endblock choice_tree_item_widget %}
{% block translatefields_widget %}
{{ form_errors(form) }}
<div class="translations tabbable" id="{{ form.vars.id }}">
{% if hideTabs == false and form|length > 1 %}
<ul class="translationsLocales nav nav-pills">
{% for translationsFields in form %}
<li class="nav-item">
<a href="#" data-locale="{{ translationsFields.vars.label }}" class="{% if defaultLocale.id_lang == translationsFields.vars.name %}active{% endif %} nav-link" data-toggle="tab" data-target=".translationsFields-{{ translationsFields.vars.id }}">
{{ translationsFields.vars.label|capitalize }}
</a>
</li>
{% endfor %}
</ul>
{% endif %}
<div class="translationsFields tab-content">
{% for translationsFields in form %}
<div data-locale="{{ translationsFields.vars.label }}" class="translationsFields-{{ translationsFields.vars.id }} tab-pane translation-field {% if hideTabs == false and form|length > 1 %}panel panel-default{% endif %} {% if defaultLocale.id_lang == translationsFields.vars.name %}show active{% endif %} {% if not form.vars.valid %}field-error{% endif %} translation-label-{{ translationsFields.vars.label }}">
{{ form_errors(translationsFields) }}
{{ form_widget(translationsFields) }}
</div>
{% endfor %}
</div>
</div>
{% endblock %}
{% block translate_fields_widget -%}
{% if type is not defined or 'file' != type %}
{%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-control')|trim}) -%}
{% endif %}
{{- parent() -}}
{%- endblock translate_fields_widget %}
{% block translate_text_widget -%}
{{ form_errors(form) }}
<div class="input-group locale-input-group js-locale-input-group">
{% for translateField in form %}
{% set classes = translateField.vars.attr.class|default('') ~ ' js-locale-input'%}
{% set classes = classes ~ ' js-locale-' ~ translateField.vars.label %}
{% if default_locale.id_lang != translateField.vars.name %}
{% set classes = classes ~ ' d-none' %}
{% endif %}
{%- set attr = attr|merge({class: classes|trim}) -%}
{{ block('form_widget') }}
{% endfor %}
{% if not hide_locales %}
<div class="dropdown">
<button class="btn btn-outline-secondary dropdown-toggle js-locale-btn"
type="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
id="{{ form.vars.id }}"
>
{{ form.vars.default_locale.iso_code }}
</button>
<div class="dropdown-menu locale-dropdown-menu" aria-labelledby="{{ form.vars.id }}">
{% for locale in locales %}
<span class="dropdown-item js-locale-item" data-locale="{{ locale.iso_code }}">{{ locale.name }}</span>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{%- endblock translate_text_widget %}
{% block translate_textarea_widget -%}
{{ form_errors(form) }}
<div class="input-group locale-input-group js-locale-input-group">
{% for textarea in form %}
{% set classes = textarea.vars.attr.class|default('') ~ ' js-locale-input'%}
{% set classes = classes ~ ' js-locale-' ~ textarea.vars.label %}
{% if default_locale.id_lang != textarea.vars.name %}
{% set classes = classes ~ ' d-none' %}
{% endif %}
<div class="{{ classes }}">
{{ form_widget(textarea, {attr: {'class': classes|trim}}) }}
</div>
{% endfor %}
{% if show_locale_select %}
<div class="dropdown">
<button class="btn btn-outline-secondary dropdown-toggle js-locale-btn"
type="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
id="{{ form.vars.id }}"
>
{{ form.vars.default_locale.iso_code }}
</button>
<div class="dropdown-menu locale-dropdown-menu" aria-labelledby="{{ form.vars.id }}">
{% for locale in locales %}
<span class="dropdown-item js-locale-item"
data-locale="{{ locale.iso_code }}"
>
{{ locale.name }}
</span>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{%- endblock translate_textarea_widget %}
{% block date_picker_widget %}
{% spaceless %}
{% set attr = attr|merge({'class': ((attr.class|default('') ~ ' datepicker')|trim)}) %}
<div class="input-group datepicker">
<input type="text" class="form-control" data-format="{{ date_format }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
<div class="input-group-append">
<div class="input-group-text">
<i class="material-icons">date_range</i>
</div>
</div>
</div>
{{ block('form_help') }}
{% endspaceless %}
{% endblock date_picker_widget %}
{% block date_range_widget %}
{% spaceless %}
{{ form_widget(form.from) }}
{{ form_widget(form.to) }}
{% endspaceless %}
{% endblock date_range_widget %}
{% block search_and_reset_widget %}
{% spaceless %}
<button type="submit"
class="btn btn-primary grid-search-button d-block float-right"
title="{{ 'Search'|trans({}, 'Admin.Actions') }}"
name="{{ full_name }}[search]"
>
<i class="material-icons">search</i>
{{ 'Search'|trans({}, 'Admin.Actions') }}
</button>
{% if show_reset_button %}
<div class="js-grid-reset-button">
<div class="clearfix"></div>
<button type="reset"
name="{{ full_name }}[reset]"
class="btn btn-link js-reset-search btn d-block grid-reset-button float-right"
data-url="{{ reset_url }}"
data-redirect="{{ redirect_url }}"
>
<i class="material-icons">clear</i>
{{ 'Reset'|trans({}, 'Admin.Actions') }}
</button>
</div>
{% endif %}
{% endspaceless %}
{% endblock search_and_reset_widget %}
{% block switch_widget %}
{% spaceless %}
<div class="input-group">
<span class="ps-switch">
{% for choice in choices %}
{% set inputId = id ~'_' ~ choice.value %}
<input id="{{inputId}}" {{ block('attributes') }} name="{{ full_name }}" value="{{ choice.value }}" {%- if choice is selectedchoice(value) -%}checked="" {%- endif -%} {%- if disabled -%}disabled="" {%- endif -%} type="radio">
<label for="{{inputId}}">{{ choice.label|trans({}, choice_translation_domain) }}</label>
{% endfor %}
<span class="slide-button"></span>
</span>
</div>
{% endspaceless %}
{{- block('form_help') -}}
{% endblock switch_widget %}
{% block _form_step6_attachments_widget %}
<div class="js-options-no-attachments {{ form|length > 0 ? 'hide' : '' }}">
<small>{{ 'There is no attachment yet.'|trans({}, 'Admin.Catalog.Notification') }}</small>
</div>
<div id="product-attachments" class="panel panel-default">
<div class="panel-body js-options-with-attachments {{ form|length == 0 ? 'hide' : '' }}">
<div>
<table id="product-attachment-file" class="table">
<thead class="thead-default">
<tr>
<th class="col-md-3">{{ 'Title'|trans({}, 'Admin.Global') }}</th>
<th class="col-md-6">{{ 'File name'|trans({}, 'Admin.Global') }}</th>
<th class="col-md-2">{{ 'Type'|trans({}, 'Admin.Catalog.Feature') }}</th>
</tr>
</thead>
<tbody>
{%- for child in form %}
<tr>
<td class="col-md-3">{{ form_widget(child) }}</td>
<td class="col-md-6 file-name"><span>{{ form.vars.attr.data[loop.index0]['file_name'] }}</span></td>
<td class="col-md-2">{{ form.vars.attr.data[loop.index0]['mime'] }}</td>
</tr>
{% endfor -%}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %}
{# Labels #}
{% block choice_label -%}
{# remove the checkbox-inline and radio-inline class, it's only useful for embed labels #}
{%- set label_attr = label_attr|merge({class: label_attr.class|default('')|replace({'checkbox-inline': '', 'radio-inline': ''})|trim}) -%}
{{- block('form_label') -}}
{% endblock %}
{% block checkbox_label -%}
{{- block('checkbox_radio_label') -}}
{%- endblock checkbox_label %}
{% block radio_label -%}
{{- block('checkbox_radio_label') -}}
{%- endblock radio_label %}
{% block checkbox_radio_label %}
{# Do not display the label if widget is not defined in order to prevent double label rendering #}
{% if widget is defined %}
{% if required %}
{% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' required')|trim}) %}
{% endif %}
{% if parent_label_class is defined %}
{% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' ' ~ parent_label_class)|trim}) %}
{% endif %}
{% if label is not same as(false) and label is empty %}
{% set label = name|humanize %}
{% endif %}
{% if block_prefixes[2] == 'radio' %}
<label class="form-check-label"{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
{{- widget|raw -}}
<i class="form-check-round"></i>
{{- label is not same as(false) ? (translation_domain is same as(false) ? label|raw : label|raw) -}}
</label>
{% else %}
<div class="md-checkbox md-checkbox-inline">
<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
{{- widget|raw -}}
<i class="md-checkbox-control"></i>
{{- label is not same as(false) ? (translation_domain is same as(false) ? label|raw : label|raw) -}}
</label>
</div>
{% endif %}
{% endif %}
{% endblock checkbox_radio_label %}
{% block radio_widget -%}
{%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
{%- if 'radio-custom' in parent_label_class -%}
{%- set attr = attr|merge({class: (attr.class|default('') ~ ' custom-control-input')|trim}) -%}
<div class="custom-control custom-radio{{ 'radio-inline' in parent_label_class ? ' custom-control-inline' }}">
{{- form_label(form, null, { widget: block('base_radio_widget') }) -}}
</div>
{%- else -%}
{%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) -%}
<div class="form-check form-check-radio form-radio{{ 'radio-inline' in parent_label_class ? ' form-check-inline' }}">
{{- form_label(form, null, { widget: block('base_radio_widget') }) -}}
</div>
{%- endif -%}
{%- endblock radio_widget %}
{% block checkbox_widget -%}
{%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
{%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) -%}
<div class="form-check form-check-radio form-checkbox">
{{- form_label(form, null, { widget: block('base_checkbox_widget') }) -}}
</div>
{%- endblock checkbox_widget %}
{# Errors #}
{% block form_errors -%}
{% if attr['fieldError'] is defined and attr['fieldError'] == true %}
{{ block('form_errors_field') }}
{% else %}
{{ block('form_errors_other') }}
{% endif %}
{%- endblock form_errors %}
{% block form_errors_field %}
{% if errors|length > 0 -%}
{# If we got more then one error then we need to display popover instead of errors list #}
{%- if errors|length > 1 -%}
{% set popoverContainer = 'popover-error-container-'~form.vars.id %}
<div class="{{ popoverContainer }}"></div>
{% set popoverErrorContent %}
<div class="popover-error-list">
<ul>
{%- for error in errors -%}
<li class="text-danger"> {{
error.messagePluralization is null
? error.messageTemplate|trans(error.messageParameters, 'form_error')
: error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'form_error')
}}
</li>
{% endfor %}
</ul>
</div>
{% endset %}
<template class="js-popover-error-content" data-id="{{ form.vars.id }}">
{{ popoverErrorContent }}
</template>
{% set errorPopover %}
<span
data-toggle="form-popover-error"
data-id="{{ form.vars.id }}"
data-placement="bottom"
data-template='<div class="popover form-popover-error" role="tooltip"><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
data-trigger="hover"
data-container=".{{ popoverContainer }}"
>
<i class="material-icons form-error-icon">error_outline</i> <u> {{ '%count% errors'|transchoice(errors|length, {}, 'Admin.Global') }}</u>
</span>
{% endset %}
<div class="invalid-feedback-container">
<div class="text-danger">
{{ errorPopover }}
</div>
</div>
{# If there is only one error then display it without popover #}
{%- else -%}
<div class="d-inline-block text-danger align-top">
<i class="material-icons form-error-icon">error_outline</i>
</div>
<div class="d-inline-block">
{% for error in errors %}
<div class="text-danger">
<p> {{
error.messagePluralization is null
? error.messageTemplate|trans(error.messageParameters, 'form_error')
: error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'form_error')
}}
</p>
</div>
{%- endfor -%}
</div>
{%- endif -%}
{%- endif %}
{% endblock %}
{% block form_errors_other %}
{% if errors|length > 0 -%}
<div class="alert alert-danger d-print-none" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="material-icons">close</i></span>
</button>
<div class="alert-text">
{% for error in errors %}
<p> {{
error.messagePluralization is null
? error.messageTemplate|trans(error.messageParameters, 'form_error')
: error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'form_error')
}}
</p>
{%- endfor -%}
</div>
</div>
{% endif %}
{% endblock %}
{# Material design widgets #}
{% block material_choice_table_widget %}
{% spaceless %}
<div class="choice-table">
<table class="table table-bordered mb-0">
<thead>
<tr>
<th class="checkbox">
<div class="md-checkbox">
<label>
<input type="checkbox" class="js-choice-table-select-all">
<i class="md-checkbox-control"></i>
{{ 'Select all'|trans({}, 'Admin.Actions') }}
</label>
</div>
</th>
</tr>
</thead>
<tbody>
{% for child in form %}
<tr>
<td>
{{ form_widget(child, {'material_design': true}) }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endspaceless %}
{% endblock material_choice_table_widget %}
{% block material_multiple_choice_table_widget %}
{% spaceless %}
<div class="choice-table{% if headers_fixed %}-headers-fixed{% endif %} table-responsive">
<table class="table">
<thead>
<tr>
<th>{{ table_label }}</th>
{% for child_choice in form %}
<th class="text-center">
{% if child_choice.vars.multiple and child_choice.vars.name not in headers_to_disable %}
<a href="#"
class="js-multiple-choice-table-select-column"
data-column-num="{{ loop.index + 1 }}"
data-column-checked="false"
>
{{ child_choice.vars.label }}
</a>
{% else %}
{{ child_choice.vars.label }}
{% endif %}
</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for choice_name, choice_value in choices %}
<tr>
<td>
{{ choice_name }}
</td>
{% for child_choice_name, child_choice in form %}
<td class="text-center">
{% if child_choice_entry_index_mapping[choice_value][child_choice_name] is defined %}
{% set entry_index = child_choice_entry_index_mapping[choice_value][child_choice_name] %}
{% if child_choice.vars.multiple %}
{{ form_widget(child_choice[entry_index], {'material_design': true}) }}
{% else %}
{{ form_widget(child_choice[entry_index]) }}
{% endif %}
{% else %}
--
{% endif %}
</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endspaceless %}
{% endblock material_multiple_choice_table_widget %}
{# Copied translatablefields_widget made to be compatible with TranslatableType.php and to be used in translatable widget#}
{% block translatable_fields_with_tabs %}
<div class="translations tabbable" id="{{ form.vars.id }}">
{% if hide_locales == false and form|length > 1 %}
<ul class="translationsLocales nav nav-pills">
{% for translationsFields in form %}
<li class="nav-item">
<a href="#" data-locale="{{ translationsFields.vars.label }}" class="{% if default_locale.id_lang == translationsFields.vars.name %}active{% endif %} nav-link" data-toggle="tab" data-target=".translationsFields-{{ translationsFields.vars.id }}">
{{ translationsFields.vars.label|capitalize }}
</a>
</li>
{% endfor %}
</ul>
{% endif %}
<div class="translationsFields tab-content">
{% for translationsFields in form %}
<div data-locale="{{ translationsFields.vars.label }}" class="translationsFields-{{ translationsFields.vars.id }} tab-pane translation-field {% if hide_locales == false and form|length > 1 %}panel panel-default{% endif %} {% if default_locale.id_lang == translationsFields.vars.name %}show active{% endif %} {% if not form.vars.valid %}field-error{% endif %} translation-label-{{ translationsFields.vars.label }}">
{{ form_widget(translationsFields) }}
</div>
{% endfor %}
</div>
</div>
{% endblock %}
{% block translatable_fields_with_dropdown -%}
{% set formClass = (form.vars.attr.class|default('') ~ ' input-group locale-input-group js-locale-input-group d-flex')|trim %}
<div class="{{ formClass }}">
{% for translateField in form %}
{% set classes = translateField.vars.attr.class|default('') ~ ' js-locale-input'%}
{% set classes = classes ~ ' js-locale-' ~ translateField.vars.label %}
{% if default_locale.id_lang != translateField.vars.name %}
{% set classes = classes ~ ' d-none' %}
{% endif %}
<div class="{{ classes }}" style="flex-grow: 1;">
{{ form_widget(translateField) }}
</div>
{% endfor %}
{% if not hide_locales %}
<div class="dropdown">
<button class="btn btn-outline-secondary dropdown-toggle js-locale-btn"
type="button"
data-toggle="dropdown"
{% if change_form_language_url is defined %}
data-change-language-url="{{ form.vars.change_form_language_url }}"
{% endif %}
aria-haspopup="true"
aria-expanded="false"
id="{{ form.vars.id }}"
>
{{ form.vars.default_locale.iso_code }}
</button>
<div class="dropdown-menu locale-dropdown-menu" aria-labelledby="{{ form.vars.id }}">
{% for locale in locales %}
<span class="dropdown-item js-locale-item" data-locale="{{ locale.iso_code }}">{{ locale.name }}</span>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{%- endblock %}
{% block translatable_widget -%}
{% if use_tabs %}
{{ block('translatable_fields_with_tabs') }}
{% else %}
{{ block('translatable_fields_with_dropdown') }}
{% endif %}
{{ block('form_help') }}
{%- endblock translatable_widget %}
{% block birthday_widget %}
{% if widget == 'single_text' %}
{{- block('form_widget_simple') -}}
{% else -%}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) -%}
{% if datetime is not defined or not datetime -%}
<div {{ block('widget_container_attributes') -}}>
{%- endif %}
{% set yearWidget = '<div class="col pl-0 birthday-select-container">' ~ form_widget(form.year) ~ '</div>'|raw %}
{% set monthWidget = '<div class="col birthday-select-container">' ~ form_widget(form.month) ~ '</div>'|raw %}
{% set dayWidget = '<div class="col pr-0 birthday-select-container">' ~ form_widget(form.day) ~ '</div>'|raw %}
{{- date_pattern|replace({
'{{ year }}': yearWidget,
'{{ month }}': monthWidget,
'{{ day }}': dayWidget,
})|raw -}}
{% if datetime is not defined or not datetime -%}
</div>
{%- endif -%}
{% endif %}
{% endblock birthday_widget %}
{% block file_widget %}
<style>
.custom-file-label:after {
content: "{{ "Browse"|trans({}, 'Admin.Actions') }}";
}
</style>
<div class="custom-file">
{% set attr = attr|merge({
class: (attr.class|default('') ~ ' custom-file-input')|trim,
'data-multiple-files-text': '%count% file(s)'|trans({}, 'Admin.Global'),
'data-locale': get_context_iso_code()
}) -%}
{% if attr.disabled is defined and attr.disabled %}
{% set attr = attr|merge({
class: attr.class ~ ' disabled'
}) %}
{% endif %}
{{- block('form_widget_simple') -}}
<label class="custom-file-label" for="{{ form.vars.id }}">
{% set attributes = form.vars.attr %}
{{ attributes.placeholder is defined ? attributes.placeholder : 'Choose file(s)'|trans({}, 'Admin.Actions') }}
</label>
</div>
{{- block('form_help') -}}
{% if form.vars.download_url %}
<a target="_blank" href="{{ form.vars.download_url }}">
{{ 'Download file'|trans({}, 'Admin.Actions') }}
</a>
{% endif %}
{% endblock file_widget %}
{% block shop_restriction_checkbox_widget %}
{% if form.vars.attr.is_allowed_to_display %}
<div class="md-checkbox md-checkbox-inline">
<label>
{% set type = type|default('checkbox') %}
<input
class="js-multi-store-restriction-checkbox"
type="{{ type }}"
{{ block('widget_attributes') }}
value="{{ value }}"
>
<i class="md-checkbox-control"></i>
</label>
</div>
{% endif %}
{% endblock %}
{% block generatable_text_widget %}
<div class="input-group">
{% if compound %}
{{- block('form_widget_compound') -}}
{% else %}
{{- block('form_widget_simple') -}}
{% endif %}
<span class="input-group-btn ml-1">
<button class="btn btn-outline-secondary js-generator-btn"
type="button"
data-target-input-id="{{ id }}"
data-generated-value-length="{{ generated_value_length }}"
>
{{ 'Generate'|trans({}, 'Admin.Actions') }}
</button>
</span>
</div>
{{ block('form_help') }}
{% endblock generatable_text_widget %}
{% block text_with_recommended_length_widget %}
{% set attr = attr|merge({
'data-recommended-length-counter': '#' ~ id ~ '_recommended_length_counter',
'class': 'js-recommended-length-input'
}) -%}
{% if input_type == 'textarea' %}
{{- block('textarea_widget') -}}
{% else %}
{{- block('form_widget_simple') -}}
{% endif %}
<small class="form-text text-muted text-right"
id="{{ id }}_recommended_length_counter"
>
<em>
{{ '[1][/1] of [2][/2] characters used (recommended)'|trans({}, 'Admin.Catalog.Feature')|replace({
'[1]': '<span class="js-current-length">' ~ value|length,
'[/1]': '</span>',
'[2]': '<span>' ~ recommended_length,
'[/2]': '</span>',
})|raw }}
</em>
</small>
{% endblock %}
{% block text_with_length_counter_widget %}
<div class="input-group js-text-with-length-counter">
{% set current_length = form.vars.max_length - form.vars.value|length %}
{% if form.vars.position == 'before' %}
<div class="input-group-prepend">
<span class="input-group-text js-countable-text">{{ current_length }}</span>
</div>
{% endif %}
{% set attr = attr|merge({'data-max-length': form.vars.max_length, 'maxlength': form.vars.max_length, 'class': 'js-countable-input'}) -%}
{% set attr = attr|merge(input_attr) -%}
{% if form.vars.input == 'input' %}
{{- block('form_widget_simple') -}}
{% elseif form.vars.input == 'textarea' %}
{{- block('textarea_widget') -}}
{% else %}
{{- block('form_widget') -}}
{% endif %}
{% if form.vars.position == 'after' %}
<div class="input-group-append">
<span class="input-group-text js-countable-text">{{ current_length }}</span>
</div>
{% endif %}
</div>
{% endblock %}
{% block integer_min_max_filter_widget %}
{{ form_widget(form['min_field'], { attr: {class: 'min-field'}}) }}
{{ form_widget(form['max_field'], { attr: {class: 'max-field'}}) }}
{% endblock %}
{% block number_min_max_filter_widget %}
{{ form_widget(form['min_field'], { attr: {class: 'min-field'}}) }}
{{ form_widget(form['max_field'], { attr: {class: 'max-field'}}) }}
{% endblock %}
{%- block number_widget -%}
{%- set type = type|default('text') -%}
{{ block('form_widget_simple') }}
{{- block('form_help') -}}
{%- endblock number_widget -%}
{%- block integer_widget -%}
{%- set type = type|default('number') -%}
{{ block('form_widget_simple') }}
{{- block('form_help') -}}
{%- endblock integer_widget -%}
{% block form_help %}
{% if help %}
<small class="form-text">{{ help|raw }}</small>
{% endif %}
{% if warning is defined %}
{{ warning }}
{% endif %}
{% endblock form_help %}
{% block form_external_link %}
{% if external_link is defined %}
{%- set openingTag -%}
<a {{ block('form_external_link_attributes') }}>
<i class="material-icons">open_in_new</i>
{%- endset -%}
<div class="small font-secondary{% if external_link.align is same as('right') %} text-right{% endif %}">
{{ external_link.text|replace({'[1]': openingTag, '[/1]': '</a>'})|raw }}
</div>
{% endif %}
{% endblock form_external_link %}
{%- block form_external_link_attributes -%}
{% set external_link_attr = external_link.attr|merge({class: (external_link.attr.class|default('') ~ ' btn btn-link px-0 align-right')|trim}) %}
{% for attrname, attrvalue in external_link_attr %}
{% if attrname not in ['href', 'class'] %}
{{ attrname }}="{{ attrvalue }}"
{% endif %}
{% endfor %}
target="_blank"
href="{{ external_link.href }}"
class="{{ external_link_attr.class }}"
{%- endblock -%}
{% block custom_content_widget %}
{% include template with data %}
{% endblock %}
{% block text_widget %}
{%- set attr = attr|merge({'aria-label': '%inputId% input'|trans({'%inputId%': form.vars.id}, 'Admin.Global')}) -%}
{% if data_list is not null %}
{%- set attr = attr|merge({'list': id ~ '_datalist'}) -%}
{% endif %}
{{ form_widget(form, {'attr': attr}) }}
{% if data_list is not null %}
<datalist id="{{ id ~ '_datalist' }}">
{% for item in data_list %}
<option value="{{ item }}"></option>
{% endfor%}
</datalist>
{% endif %}
{% endblock text_widget %}
{%- block form_prepend_alert -%}
{% if alert_position is defined and alert_position == 'prepend' %}
{{- block('form_alert') -}}
{% endif %}
{% endblock %}
{%- block form_append_alert -%}
{% if alert_position is defined and alert_position == 'append' %}
{{- block('form_alert') -}}
{% endif %}
{% endblock %}
{%- block form_alert -%}
{% if alert_message is defined %}
<div class="alert alert-{{ alert_type }}{% if alert_title is defined %} expandable-alert{% endif %}" role="alert">
{% if alert_title is defined %}
<p class="alert-text">
{{ alert_title|raw }}
</p>
{% else %}
{% for message in alert_message %}
<p class="alert-text">
{{ message|raw }}
</p>
{% endfor %}
{% endif %}
{% if alert_title is defined %}
<div class="alert-more collapse" id="expandable_{{form.vars.id}}" style="">
{% for message in alert_message %}
<p>
{{ message|raw }}
</p>
{% endfor %}
</div>
<div class="read-more-container">
<button type="button" class="read-more btn-link" data-toggle="collapse" data-target="#expandable_{{form.vars.id}}" aria-expanded="true" aria-controls="collapseDanger">
{{ 'Read more'|trans({}, 'Admin.Actions') }}
</button>
</div>
{% endif %}
</div>
{% endif %}
{%- endblock -%}
{% block unavailable_widget %}
<div class="alert alert-unavailable" role="alert">
<p class="alert-text">
{{ 'Not available yet'|trans({}, 'Admin.Catalog.Feature') }}
</p>
</div>
{% endblock %}