Добавление параметров непосредственно в виджеты-изображения-апострофы

Я улучшил несколько виджетов изображений, напрямую расширив 'apostrophe-images-widgets'. Возможно, это не лучшая практика, но я использовал это с самого начала. Я начал кодировать с помощью apostrophe-cms, и он работал хорошо. Мой виджет слайдов, например, использует только эти строки в index.js:

module.exports = {
  extend: 'apostrophe-images-widgets',
  piecesModuleName: 'apostrophe-images',
  label: 'Slider Widget'
};

Теперь мой widget.html выглядит следующим образом:

<div class="slider fullscreen">
  <ul class="slides">

    {% block items %}

      {% for entry in data.widget._pieces %}
        {% set image = entry.item or entry %}
        {% set relationship = entry.relationship %}

        <li>
          <img
            data-image src="{{ apos.attachments.url(image.attachment, { size: data.options.size or 'full', crop: relationship }) }}"
            srcset="{{ apos.images.srcset(image.attachment) }}"
            sizes="{{ data.options.sizesAttr or '100vw' }}"
            alt="{{ image.title }}"
          >

          <div class="caption {{ image.align }}">

            {% block title %}
              <h3 class="accent-color truncate hide-on-small-only"
                {% if image.titleColor %}
                  style="color:{{ image.titleColor }}"
                {% endif %}
              >
                {{ image.title }}
              </h3>
            {% endblock %}

            {% block description %}
              {% if image.description %}
                <p class="flow-text"
                  {% if image.descriptionColor %}
                    style="color:{{ image.descriptionColor }}"
                  {% endif %}
                >
                  {{ image.description | nlbr }}
                </p>
              {% endif %}
            {% endblock %}

          </div>

          {% block credit %}
            {% if image.credit %}
              <div class="credit">
                {% if image.creditUrl %}
                    <a href="{{ image.creditUrl }}" target="_blank">
                {% endif %}
                      <span>{{ image.credit }}</span>
                {% if image.creditUrl %}
                    </a>
                {% endif %}
            </div>
            {% endif %}
          {% endblock %}

        </li>

      {% endfor %}
    {% endblock %}

  </ul>
</div>

Теперь у меня вопрос: как добавить в виджет "Ползунок" такие параметры, как sizesAttr и focalPoint: true?

Как я уже сказал выше, если это возможно, я не хочу добавлять дополнительные поля, как вы объяснили здесь:

  addFields: [
    {
      name: '_image',
      type: 'joinByOne',
      withType: 'apostrophe-image',
      label: 'Image',
      required: true,
      idField: 'imageId',
      filters: {
        projection: {
          attachment: true,
          description: true,
          title: true
        }
      }
    }
  ]

Надо бы виджет переписать для расширения: apostrope-pieces-widgets вместо apostrope-images-widgets и так далее. Итак, моя идея состоит в том, чтобы добавить желаемые параметры напрямую с beforeConstruct, к сожалению, это не сработало, поэтому я застрял там:

module.exports = {
  extend: 'apostrophe-images-widgets',
  piecesModuleName: 'apostrophe-images',
  label: 'Slider Widget',
  beforeConstruct: function(self, options) {
    if (options.focalPoint === undefined) {
      options.focalPoint = true;
    }
  }
};

Может быть, у вас есть подсказка, как я могу это сделать? Может быть, в вашем коде есть пример того, как вы добавляли параметры с помощью beforeConstruct или даже в html с помощью nujucks с такими переменными, как эта {%- set data.widget.options ... -%}?


person Felix    schedule 28.05.2020    source источник


Ответы (1)


Здесь вы имеете дело с двумя разными типами опций, но оба они объявлены в одном месте. focalPoint - это встроенная опция, включающая пользовательский интерфейс координационной точки (который затем позволяет вам получить информацию о фокусной точке позже), а sizesAttr - это пример из документации настраиваемой опции, которую вы можете создать для своих конкретных нужд.

В обоих случаях они передаются в параметры виджета области в шаблоне страницы или фрагмента страницы. Таким образом, это может быть default.html для страницы "по умолчанию" или show.html для страницы показа отдельного типа, например:

{{ apos.area(data.page, 'content', {
  widgets: {
    'image': {
      sizesAttr: '(min-width: 1024px) 50vw, 100vw',
      focalPoint: true
    }
  }
}) }}

(data.page будет специфичным для страницы, но будет data.piece для страницы показа части)

Затем в шаблонах виджетов (ваш widget.html) они упоминаются как свойства на data.options, как вы можете видеть с помощью sizesAttr в вашем примере. Аналогичным образом вы можете добавить любую случайную опцию, например foo: 'bar', в конфигурацию виджета области, а затем указать ее как data.options.foo в шаблоне виджета.

На focalPoint не так полезно ссылаться напрямую. В качестве встроенной опции он включает специальные функции для точки фокусировки, на которую затем ссылаются в шаблонах с помощью таких методов, как apos.attachments.hasFocalPoint(). есть подробности.

person alexbea    schedule 28.05.2020
comment
Чтобы прояснить свой вопрос: я не использую какие-либо области или синглтоны для этих конкретных типов виджетов. Боюсь, у нас тут недоразумение. Я прочитал указанную вами документацию около 100 раз и потратил около 1000 часов на изучение апострофа. Я уже связал это в своем вопросе выше и сказал, что на мой вопрос нет ответа. - person Felix; 28.05.2020
comment
Я разобрался сейчас и добавил свой ответ для пояснения. В любом случае спасибо за быстрый ответ - person Felix; 28.05.2020