29. Условная логика для разработчиков | Field Forge - Произвольные поля, созданные для скорости
Скачать Войти

29. Условная логика для разработчиков

Условная логика управляет тем, какие поля видны в админке в зависимости от значений других полей. Этот раздел объясняет, как настроить условную логику программно.

Структура условной логики

Каждое поле может иметь свойство conditional_logic — массив групп OR, где каждая группа является массивом условий AND.

php
FIELDFORGE_Field_Groups::instance()->create( [
    'title'  => 'Event Settings',
    'fields' => [
        [
            'key'   => 'field_evt_type',
            'label' => 'Event Type',
            'name'  => 'event_type',
            'type'  => 'select',
            'choices' => [ 'in_person' => 'In Person', 'virtual' => 'Virtual', 'hybrid' => 'Hybrid' ],
        ],
        [
            'key'   => 'field_evt_venue',
            'label' => 'Venue Address',
            'name'  => 'venue_address',
            'type'  => 'text',
            'conditional_logic' => [
                // Show when event_type is 'in_person' OR 'hybrid'
                [ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'in_person' ] ],
                [ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'hybrid' ] ],
            ],
        ],
        [
            'key'   => 'field_evt_url',
            'label' => 'Stream URL',
            'name'  => 'stream_url',
            'type'  => 'url',
            'conditional_logic' => [
                // Show when event_type is 'virtual' OR 'hybrid'
                [ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'virtual' ] ],
                [ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'hybrid' ] ],
            ],
        ],
        [
            'key'   => 'field_evt_capacity',
            'label' => 'Max Capacity',
            'name'  => 'max_capacity',
            'type'  => 'number',
            'conditional_logic' => [
                // Show when in_person AND has a venue address
                [
                    [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'in_person' ],
                    [ 'field' => 'field_evt_venue', 'operator' => '!=empty', 'value' => '' ],
                ],
            ],
        ],
    ],
    'location_rules' => [
        [ [ 'param' => 'post_type', 'operator' => '==', 'value' => 'event' ] ],
    ],
] );

Каноническая форма схемы

Выполняющий оценщик читает каноническую форму { enabled: true, rules: [...] }. Field Forge также принимает устаревшую форму ACF в виде голого массива (только внешний массив правил) и нормализует его при сохранении:

php
'conditional_logic' => [
    'enabled' => true,
    'rules' => [           // outer = OR
        [                  // inner = AND
            [ 'field' => 'event_type', 'operator' => '==', 'value' => 'in_person' ],
            [ 'field' => 'venue', 'operator' => '!=empty', 'value' => '' ],
        ],
    ],
]

Ключ field внутри каждого условия сопоставляется по имени поля name (не ключу). Используйте то же имя, которое вы передали бы в get_field().

Доступные операторы

Все операторы зеркально отражаются между PHP (FIELDFORGE_Conditional_Logic::compare()) и JS (assets/js/conditional-logic.js). Держите оба списка синхронизированными, если вы форкаете.

ОператорОписаниеПример
==Равно (свободно, строковое приведение; для массивов, истинно, если ожидаемое значение находится в массиве)'value' => 'in_person'
!=Не равно'value' => 'draft'
==containsСовпадение подстроки'value' => 'admin'
!=containsОбратное совпадение подстроки'value' => 'spam'
==patternСовпадение по регулярному выражению. Автоматически оборачивается в /.../, если не предоставлены разделители.'value' => '/^v\d+/i'
==emptyИстинно, когда значение равно null, », ‘0’, false или пустому массиву'value' => ''
!=emptyОбратное к ==empty'value' => ''
> < >= <=Числовое (floatval с обеих сторон)'value' => '50'

Выполняющий оценщик

  • Сторона PHP (FIELDFORGE_Field_Renderer::render_field) выполняет первоначальную серверную оценку, так что поля, правила которых ложны, выводятся с style="display:none" — без мигания всех полей при загрузке страницы.
  • Сторона JS (assets/js/conditional-logic.js) переоценивает при каждом событии change / input внутри метабокса. Каждый метабокс содержит JSON-карту data-fieldforge-cond-rules; каждая условная цель содержит data-fieldforge-cond-target="".
  • Скрытый триггер короткое замыкание: если триггерное поле само скрыто (по своему собственному условному правилу), условия на нем считаются ложными. Цепочки (A управляет B управляет C) автоматически каскадируются — когда A скрывает B, JS повторно запускается до достижения согласования, так что C также скрывается.
  • Обязательный атрибут: когда поле скрывается, любой потомок атрибута [required] сохраняется как data-fieldforge-cond-required="1", и атрибут required удаляется, чтобы браузер не блокировал отправку. Он восстанавливается, когда поле снова становится видимым.
  • Область подполей: v1 оценивает правила только на верхнем уровне полей (непосредственные потомки группы полей). Правила, размещенные на подполях внутри Повторителя / Группы / Гибкого содержимого, сохраняются и проходят через экспорт/импорт, но метабокс всегда отображает их.

Программная оценка

FIELDFORGE_Conditional_Logic::evaluate( $logic, $values ) выставляется как тот же оценщик, который использует рендерер, так что безголовые вызовы могут спрашивать "покажет ли это поле, учитывая эти значения?" без DOM:
php
$logic = $field['conditional_logic']; // { enabled, rules }
$values = [
    'event_type' => 'hybrid',
    'venue'      => '',
];
$visible = FIELDFORGE_Conditional_Logic::evaluate( $logic, $values );

Условная логика в шаблонах

Условная логика — это только проблема пользовательского интерфейса — она не влияет на вывод get_field(). Скрытое поле все еще сохраняет свое значение. Всегда проверяйте на пустые значения в шаблонах:

php
$venue = get_field( 'venue_address' );
if ( $venue ) {
    echo '<p>Venue: ' . esc_html( $venue ) . '</p>';
}

---

ИИ-ассистент Forge Онлайн

Привет! Я ИИ-ассистент Field Forge. Спрашивайте меня о чём угодно по плагину — настройка, возможности, устранение неполадок или разработка.

Только что
На базе Forge AI · Просмотр документации