Sitecore MVC Убедитесь, что в редакторе опыта можно выбрать пустой заполнитель

Есть ли какая-то хитрость с заполнителями в Sitecore MVC, чтобы гарантировать, что они всегда выбираются в редакторе опыта редактора страниц, даже если они не содержат никаких визуализаций? Мой контроллер рендеринга объявляет заполнитель в представлении cshtml следующим образом:

<div>
  <!-- some html markup and fields rendered here --> 
  @Html.Sitecore().Placeholder("my-component-placeholder")
</div>

3 ответа

Решение

Чтобы обеспечить видимость и возможность выбора заполнителя, необходимо обеспечить следующее:

  1. В Sitecore существует элемент настроек заполнителя с правильным Placeholder Key совпадает с заявленным в рендеринге cshtml
  2. Элемент настроек заполнителя имеет Editable настройка проверена.
  3. CSS на странице не мешает отображению заполнителя.

Если вы используете какие-то динамические ключи-заполнители, есть параметр, который контролирует возможность редактирования пустых заполнителей без параметров. Он находится в Sitecore.ExperienceEditor.config.

WebEdit.PlaceholdersEditableWithoutSettings

Значение по умолчанию неверно. Если установлено значение true, пустые заполнители можно редактировать:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <settings>
            <setting name="WebEdit.PlaceholdersEditableWithoutSettings">
                <patch:attribute name="value">true</patch:attribute>
            </setting>
        </settings>
    </sitecore>
</configuration>

Решается установкой Query.MaxItems:

<setting name="Query.MaxItems">
  <patch:attribute name="value">1000</patch:attribute>
</setting>

Объяснение:
В больших проектах у вас может быть много местозаполнителей (более 260, что является количеством по умолчанию элементов, которые Sitecore Query API читает за один раз).

Команда Sitecore установила ограничение, но кеш-заполнитель не был исправлен и по-прежнему считывает элементы только один раз, в результате чего пропуски, которые не были добавлены в кеш из-за ограничения, пропускаются.

Это код менеджера кеша, взятый из рефлектора:

public virtual void Reload()
{
  lock (FieldRelatedItemCache.Lock)
  {
    this.itemIDs = new SafeDictionary<string, ID>();
    Item[] local_1 = this.Database.SelectItems(string.Format("{0}//*[@@templateid = '{1}']", (object) this.ItemRoot.Paths.FullPath, (object) this.ItemTemplate));
    if (local_1 == null)
      return;
    foreach (Item item_0 in local_1)
    {
      string local_3 = item_0[this.FieldKey];
      if (!string.IsNullOrEmpty(local_3) && !this.itemIDs.ContainsKey(this.GetCacheKey(local_3)))
        this.Add(local_3, item_0);
    }
  }
}
Другие вопросы по тегам