Удалить поля как параметр в модуле apostrophe-cms

В настоящее время я пытаюсь заставить мои модули работать должным образом. Расширение модулей путем добавления полей прекрасно работает. Я использую несколько модулей (например, "тизер"), которые расширяют "контейнер", который определяет основные параметры, такие как размер.

Это мой контейнер, определяющий параметр "размер":

module.exports = {
  extend: 'apostrophe-widgets',
  label: 'Container',
  contextualOnly: true,
  addFields: [{
    name: 'contentBlock',
    type: 'area',
    label: 'Content Block',
  }],
  beforeConstruct: function(self, options) {
    options.addFields = [{
      name: 'size',
      label: 'Modulbreite',
      type: 'select',
      choices: [{
          label: 'Content width',
          value: 'content-width'
        },
        {
          label: 'Full width',
          value: 'full-width'
        }
      ],
      required: true
    }].concat(options.addFields || []);
  }
};

А это мой тизер, расширяющий контейнер:

module.exports = {
  extend: 'container-widgets',
  label: 'Teaser',
  contextualOnly: false,
  addFields: [
    {
      name: 'teasertext',
      label: 'Text',
      type: 'string',
      textarea: true
    },
    {
      name: 'teaserurl',
      label: 'Link',
      type: 'string',
      required: true
    },
    {
      name: 'image',
      label: 'Teaser Image',
      type: 'singleton',
      widgetType: 'apostrophe-images',
      options: {
        limit: 1
      },
      required: true
    }
  ]
};

Затем я включаю контейнер в разметку страницы:

{{ apos.area(data.page, 'body', { widgets: { 'container': {} } }) }}

И тизер в разметке контейнера:

{{ apos.area(data.widget, 'contentBlock', { widgets: { 'teaser': {} } }) }}

Проблема в том, что в некоторых случаях я не хочу давать пользователю опцию "размер", потому что тизер может быть вложен в какой-то другой модуль, который уже определяет размер. Поэтому я хочу передать аргумент для удаления опции "размер". Это не работает, как я думал, но я не знаю, возможно ли это вообще так.

Я попытался включить тизер в этом случае, как это:

{{ apos.area(data.widget, 'contentBlock', { widgets: {
    'teaser': {
      removeFields: ['size']
    }
 } }) }}

Это невозможно или я что-то не так понял?

1 ответ

Решение

Вы не можете использовать removeFields в опциях, переданных apos.area потому что схема виджета определяется во время запуска, для всех виджетов этого типа.

Тем не менее, вы можете extend ваш teaser-widgets модуль, чтобы сделать simple-teaser-widgets модуль, который использует removeFields удалить size поле. Затем вы можете поместить виджет, который вы хотите, в каждой области и пропустить другой.

index.js за simple-teaser-widgets действительно очень просто:

module.exports = {
  extend: 'teaser-widgets',
  label: 'Simple Teaser'
};
Другие вопросы по тегам