Sitecore MVC Убедитесь, что в редакторе опыта можно выбрать пустой заполнитель
Есть ли какая-то хитрость с заполнителями в Sitecore MVC, чтобы гарантировать, что они всегда выбираются в редакторе опыта редактора страниц, даже если они не содержат никаких визуализаций? Мой контроллер рендеринга объявляет заполнитель в представлении cshtml следующим образом:
<div>
<!-- some html markup and fields rendered here -->
@Html.Sitecore().Placeholder("my-component-placeholder")
</div>
3 ответа
Чтобы обеспечить видимость и возможность выбора заполнителя, необходимо обеспечить следующее:
- В Sitecore существует элемент настроек заполнителя с правильным
Placeholder Key
совпадает с заявленным в рендеринге cshtml - Элемент настроек заполнителя имеет
Editable
настройка проверена. - 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);
}
}
}