2017-02-02 7 views
0

Я пытаюсь создать настраиваемый макет apostrophe-images-widgets для моего сайта. В настоящее время я создал переопределение уровня проекта для html-шаблона в lib/modules/apostrophe-images-widgets/views/widget.html. Проблема, которую я имею, - это когда я выбираю изображение для размещения в моей настраиваемой области, apos.attachments.url вызывается дважды: один раз с выбранным мной изображением и снова с вложением undefined.apostrophe-images-widgets пользовательский виджет call apos.attachments.url дважды

Мой заказ widget.html выглядит так:

<a href="/"><img class="logo" src="{{ apos.attachments.url(image.attachment, { size: 'full'}) }}" /></a> 

Мой весь каталог lib выглядит так:

custom lib

app.js Мой настроен с настройками по умолчанию.

Мой заказ layout.html ссылается на изображения следующим образом:

{{ 
    apos.area(data.page, 'web-logo', { 
     widgets: { 
      'apostrophe-images': { 
       size: 'full' 
      } 
     } 
    }) 
}} 

Я не уверен, что другие информационные веб я могу вам дать, кроме исключения брошено здесь в apostrophe-attachments/lib/api.js:

self.url = function(attachment, options) { 
    options = options || {}; 

    // THROWS ERROR AT `attachment._id` 
    var path = '/attachments/' + attachment._id + '-' + attachment.name; 
    if (!options.uploadfsPath) { 
    path = self.uploadfs.getUrl() + path; 
    } 
// other code 
} 

Я не слишком уверен, где даже посмотреть, как найти решение ... Что-нибудь еще, что я могу предоставить, сообщите мне.

Я не заменяете index.js из apostrophe-images-widgets или apostrophe-images

точная ошибка, я получаю долго, но вот начало StackTrace

TypeError: Cannot read property '_id' of undefined

Не очень полезно, но это все ,

Спасибо за чтение и любую помощь!

ответ

1

Я ведущий архитектор Апостроф на Пунк-авеню.

Если вы посмотрите на widgetBase.html в модуле apostrophe-images-widgets, вы обнаружите, что image не передается непосредственно в шаблон. Вместо этого Apostrophe всегда передает данные в шаблон как свойства объекта data. А в случае с виджетами данные, связанные с виджетами, передаются как data.widget.

Виджет изображений, в частности, расширяет виджет частей, который может отображать более одного элемента. Итак, есть соединение в его схеме, и вы можете найти фактические части (изображения) в свойстве массива data.widget._pieces.

Одна из последних морщин: иногда эти соединения имеют собственные свойства отношения, в этом случае координаты обрезки (если есть), которые отделены от фактического изображения. Таким образом, каждая запись в массиве представляет собой объект с свойством item (изображение) и другими свойствами, относящимися к урожаю. Поэтому для получения фактического элемента из каждой записи в массиве требуется одна дополнительная строка кода.

Вот рабочая версия кода:

{%- for entry in data.widget._pieces -%} 
    {# Works whether there's a relationship in the join or not. Normally there always #} 
    {# is for slideshows, but just in case someone really hates cropping... -Tom #} 
    {%- set image = entry.item or entry -%} 
    <a href="/"><img class="logo" src="{{ apos.attachments.url(image.attachment, { size: 'full'}) }}" /></a> 
{%- endfor -%} 

Надежда это полезно!

P.S. Еще одна вещь: не используйте дефисы в названиях ваших областей. Вы заметите, что Apostrophe отображает предупреждение об этом. Вы можете использовать CamelCase, если хотите.