Clone wiki

CMS / Админка. Дополнительные поля

Дополнительные поля AtomM CMS позволяют изменять стандартные формы добавления и редактирования материалов. Например, вы можете добавить в форму регистрации поле "Ваша машина" в котором юзеры смогут написать какая же у них машина и более того - вы можете делать эти поля обязательными для заполнения. Впрочем о настройке и управлении полями речь пойдет дальше.

Добавление/редактирование поля: Несет следующие настройки: тип, видимое название, доп.параметры, максимальный размер, обязательно для заполнения. Теперь по-порядку.

  • Тип - text|checkbox|select
  • Видимое название - Имя, под которым поле будет упоминаться в сообщениях об ошибках. Название говорит само за себя :)
  • Максимальный размер - Если тип text эта настройка не позволит сохранить текст с большим количеством символов.
  • Обязательно для заполнения - Обязательно ли это поле для заполнения. На тип checkbox не влияет.

После добавления и настройки доп.полей в админке их надо добавить в шаблон там, где вы хотите. Стоит обратить внимание, что маркер для вывода поля будет показан вам после его создания в списке дополнительных полей. С маркерами полей в шаблонах есть несколько особенностей, которые вам надо обязательно знать. Дополнительные поля работают с шаблоном так же, как и обычные поля. Тоесть метка поля ( например {{ context.add_field_1 }} ) выведет значение поля, а не саму html форму поля(так было раньше в Atom-M 4 и познее и как это в AtomX сейчас). Это сделано для того, чтобы поле можно было изменять под любой шаблон, добавлять специфические атрибуты и прочее. Рассмотрим классический пример текстового поля:

<input type="text" name="add_field_1" value="{{ context.add_field_1 }}"/>

Такой вид формы справедлив для форм добавления и редактирования материала. При добавлении метка выведет пустое значение, а при редактировании введенное значение. В случае ошибки ввода формы, в обоих вариантах будут выведены данные, которые вы ввели для отправки на сервер.

Для страниц-"не форм" вывод значения поля будет аналогичен выводу обычных полей:

<!-- Обычное поле для вывода заголовка материала -->
{{ entity.title }}

<!-- Дополнительное поле, с именем add_field_1 -->
{{ entity.add_field_1 }}

Для стандартных модулей можно изъясниться так: Маркеры имеют вид {{ entity.add_field_ID }} в list.html и material.html, и вид {{ context.add_field_ID }} в addform.html и editform.html, где ID это id поля.

Тип select разберем подробнее: Тип select дает возможность создавать поле для выбора одного значения из нескольких предоставленных, заданных при конфигурировании доп. поля. Кроме того, каждое из значений, помимо самого себя(значения) должно иметь имя. Эти пары имя-значение нужно тоже как-то получать в шаблоне, не записывать же их в ручную в каждый шаблон, тогда бы и тип select был не нужен - тип text с этим бы справился. Так вот, тип select предоставляет нам еще одну метку {{ entity.add_field_select_1 }}, метку с ассоциативным массивом из значение-имя!. В итоге вывести список значений для выбора можно так:

<select name="add_field_1">
     {% for val,name in context.add_field_select_1 %}
        <option value="{{ val }}">{{ name }}</option>
     {% endfor %}
</select>

А для редактирования(но советую и для формы добавления использовать именно этот вариант) вот так:

<select name="add_field_1">
     {% for val,name in context.add_field_select_1 %}
        <option value="{{ val }}"{% if val ==  context.add_field_1 %} selected{% endif %}>{{ name }}</option>
     {% endfor %}
</select>

⚠ Запомните, что метка {{ context.add_field_select_1 }} содержит массив из пар "значение-имя", а не наоборот. Обратите внимание на порядок в выше перечисленных примерах.

⚠ При задании значения как 0 и проведении проверки со значком == будет использоваться нестрогое сравнение, и 0 будет считаться незаполненным полем, пустым полем. Тоесть "" == 0 == false . Для решения этого артефакта очень советую использовать строгую проверку === (🆕 в Atom-M 5) . В старых версиях CMS советую начинать нумерацию с единицы(если вам нужны цифры) т.к. в старых версиях в шаблонизаторе не предусмотрен оператор строгой проверки ===. Конечно, существует некрасивое решение, которое следует использовать только в крайних случаях. Оно основано на встроенных в шаблонизатор функциях проверки типов и позволяет сделать имитацию строгой проверки, но его лучше не использовать.

⚠ шаблон вывода значения селекта на страницах материалов:

    {% for val,name in entity.add_field_select_1 %}
        {% if val == entity.add_field_1 %}
            {{ name }}
        {% endif %}
    {% endfor %}

Updated