Sitecore: Как получить подпункт ITEM из кода подслоя? - PullRequest
1 голос
/ 11 мая 2011

Я пытаюсь получить элемент подслоя (или идентификатор элемента) в коде. Возможно ли это?

Обновление:

Я не имею в виду элемент источника данных или текущий элемент, я говорю об элементе определения визуализации Sublayout. Это имеет отношение 1 к 1 с файлом подслоя.

Код за файлом:

public partial class Product_Sublayout : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Sublayout subLayout = this.Parent as Sublayout;
        Item subLayoutItem = null; //How to get sublayout rendering definition item here?
    }
}

Ответы [ 4 ]

5 голосов
/ 11 мая 2011

Эта страница объяснит детали, но вот код, который вам нужен:

Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);

ОБНОВЛЕНИЕ:

Возможно, вы можетеполучить элемент рендеринга, используя базу данных, чтобы получить его по идентификатору:

Sitecore.Context.Database.GetItem(((Sublayout)Parent).RenderingID);
3 голосов
/ 26 августа 2011

Не требуется проходить по элементам управления или проверять подуровни по имени элемента управления.

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

  1. Получить определение LayoutDefinition для текущего элемента.
  2. Используя LayoutDefinition, получите RenderingDefinition интересующего вас подслоя.
  3. Получить индекс подслоя к полному списку
  4. Использование индекса для получения RenderingReference для подуровня
  5. Используйте RenderingReference, чтобы получить ссылку на элемент управления .NET.

Ниже приведен код для достижения вашей цели:

LayoutDefinition layoutDef = LayoutDefinition.Parse(Sitecore.Context.Item.Fields["__renderings"].Value);
string deviceId = Sitecore.Context.Device.ID.ToString();
DeviceDefinition curDeviceDef = layoutDef.GetDevice(deviceId);
RenderingDefinition renderingDef = curDeviceDef.GetRendering(Sitecore.Context.Database.Items["/sitecore/Layout/SubLayouts/MySublayout"].ID.ToString());
int controlIndex = curDeviceDef.GetIndex(renderingDef.UniqueId);
Control MyDotNetControl = Sitecore.Context.Page.Renderings[controlIndex].GetControl();

Теперь у вас есть ссылка на ваш элемент управления точечной сетью. Просто введите приведение к соответствующему элементу управления, чтобы получить полный доступ к объекту.

2 голосов
/ 11 мая 2011

Чтобы получить Предмет, который используется для размещения определенного элемента управления на странице, вы можете использовать модуль общего источника, называемый Sublayout Parameter Helper.Модуль можно найти здесь

Если вы хотите получить Предмет, вы можете использовать следующую настройку:

Реквизиты:

public partial class Afbeeldingen : System.Web.UI.UserControl
{
    /// <summary>
    /// Datasource item of the current rendering
    /// </summary>
    private Sitecore.Data.Items.Item dataSource = null;

    /// <summary>
    /// Helper object to get the rendering params, datasource and rendering
    /// </summary>
    private SublayoutParamHelper paramHelper = null;

    /// <summary>
    /// Gets the data source item.
    /// </summary>
    /// <value>The data source item.</value>
    public Sitecore.Data.Items.Item DataSourceItem
    {
        get
        {
            if (this.dataSource == null)
            {
                if (this.paramHelper.DataSourceItem != null)
                {
                    this.dataSource = this.paramHelper.DataSourceItem;
                }
                else
                {
                    this.dataSource = Sitecore.Context.Item;
                }
            }

            return this.dataSource;
        }
    }

    /// <summary>
    /// Sets the data source.
    /// </summary>
    /// <value>The data source.</value>
    public string DataSource
    {
        set
        {
            this.dataSource = Sitecore.Context.Database.Items[value];
        }
    }

Page_Load:

/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/></param>
protected void Page_Load(object sender, EventArgs e)
{
if (this.Parent is Sitecore.Web.UI.WebControls.Sublayout)
{
    this.paramHelper = new SublayoutParamHelper(this, true);
}

if (this.paramHelper != null)
{
    correctItem = paramHelper.DataSourceItem;
}

Оттуда у вас есть Sub, загруженный в ваш правильный элемент.Надеюсь это поможет.Надеюсь, я понял ваш вопрос достаточно хорошо.

0 голосов
/ 29 марта 2013

Вот одна строка, которая возвращает вам элемент подслоя:

Sitecore.Context.Page.Renderings.Select(r => Sitecore.Context.Database.Items[r.RenderingID])
    .Where(item => item["Path"] == ((Sublayout)this.Parent).Path).Single();

Имейте в виду, что это не удастся, если по какой-то причине у вас есть несколько подуровней с одним и тем же путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...