ExpressionEngine: условно отображать настраиваемые поля в форме ввода канала

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

**EXAMPLE
Channel > Article
    Fields:
       - Title
       - Post Body
       - Image
       - Tags

    Additional Fields for a category:
       - Price
       - Product Bio

Это возможно?

3 ответа

Решение

Насколько вы опытны с JavaScript? Вы можете использовать расширение CSS CSS и JS Брэндона Келли. Затем используйте небольшой пользовательский JavaScript для создания этой функциональности. Не идеально, но, вероятно, быстрее, чем написание собственного расширения. Примерно, вы бы сделали это:

  1. Создайте группу полей канала и все каналы и назначьте эту группу вашему каналу.
  2. Чтобы сделать его немного более удобным, нужно, чтобы селектор категорий находился на той же вкладке "Публикация", что и поля: создайте собственный макет публикации для этого канала, который перемещает поле "Категории" со вкладки "Категории" на вкладку "Публикация".
  3. Найдите номера идентификаторов полей канала, которые вы хотите скрыть, поскольку они будут идентификаторами HTML на странице публикации, которые выглядят как "hold_field_ID#"
  4. Определите идентификатор категории, по которой нужно щелкнуть, чтобы открыть дополнительные поля. На странице публикации эта категория будет отображаться в поле Категории с атрибутом "value=ID".
  5. Время сценария! Перейдите в раздел Надстройки> Расширения> Настройки CP CSS и JS и добавьте JS в поле "Пользовательский Javascript".

Что-то вроде этого:

$(document).ready(function() { 

   // Cache the divs with your channel fields  
   var $theSecretFields = $('#hold_field_5, #hold_field_6');

   // Hide them
   $theSecretFields.each(function() {
       // But only if they're empty (no previous saved data)
       // If you're using a textarea or something else, change the .find selector
       if ( $(this).find('input').val() === ''  ) { $(this).hide() };
   });

   // When you click the category ID (the input[value="id"] selector)...  
   $('#hold_field_category').find('input[value="12"]').click(function() {  
      // Toggle the visibility of the channel fields
      // Again, only show/hide them if they're empty
      $theSecretFields.each( function() {
         // Again, change the .find selector for your field type if necessary
         if ( $(this).find('input').val() === ''  ) { $(this).toggle() };
      });
   });  
};

Возможно, вам придется встроить некоторую дополнительную логику в обработчик кликов, чтобы убедиться, что поля отображаются только при установленном флажке (среди прочего), но это основная идея.

Вы хотите это в панели управления или в передней части сайта?

Чтобы сделать это с категориями в качестве триггера, вам нужно написать собственное расширение, которое добавляет javascript для отображения и скрытия.

Возможно, вы захотите взглянуть на дополнение типа ввода, которое позволяет использовать раскрывающееся меню для изменения отображаемых полей.

Другие вопросы по тегам