Невозможно понять набор кода VBScript - PullRequest
0 голосов
/ 31 октября 2011

Мне нужно преобразовать некоторый код VBScript в C # 2.0, ниже приведен код VBScript, который необходимо преобразовать в c #.

' Component Template titles handled by the summary templates
FeaturedCT = "Featured Summary"
SummaryCT = "Summary"

' Set the looping variables on the first component presentation
If IsFirstComponent = 0 Then
    IsFirstComponent = 1

    ' Start out left handed by default
    IsLeftHand = True

    matchCount = 0
    Dim components()
    ReDim components(Page.ComponentPresentations.Count)

    ' Build a list of all the matching component presentations to be rendered out as summaries
    For Each objCP In Page.ComponentPresentations
        ' Is this a Summary component template?
        If objCP.ComponentTemplateTitle = SummaryCT Or objCP.ComponentTemplateTitle = FeaturedCT Then
            ' Check if this object should be included based on its approval status
            If staging Or getFieldValue(objCP.Component.MetadataFields("ApprovalStatus"), "") = "" Then
                If getFieldValue(objCP.Component.MetadataFields("EndDate"), "") <> "" Then
                    If getDateSerial(objCP.Component.MetadataFields("EndDate").Value(1), False) > getDateSerial(Now, False) Then
                        Set components(matchCount) = objCP
                        matchCount = matchCount + 1
                    End If
                Else
                    Set components(matchCount) = objCP
                    matchCount = matchCount + 1
                End If
            End If
        End If
    Next

    ' Resize the array to the amount of matches
    ReDim Preserve components(matchCount)
End If

For i = 0 to UBound(components) - 1
    ' Determine which component to render from the pre-selected array
    If components(i).ComponentID = Component.ID And components(i).OrdinalPosition = ComponentPresentation.OrdinalPosition Then
        ' Featured summary is always left aligned and causes all other items to be right-aligned
        If ComponentPresentation.ComponentTemplateTitle = FeaturedCT Then
            HasFeaturedSummary = 1
            IsLeftHand = True           
        End If

        Call RenderEntry(components, i)

        ' If a featured summary was previously present all following items are right-aligned
        If HasFeaturedSummary = 1 Then
            IsLeftHand = False
        Else
            ' Update the left-handed status
            UpdatePositioning
        End If

        If i = UBound(Components) - 1 Then
            WriteOut "<div class=""clearBoth""></div>"
        End If
    End If
Next

И ниже приведен код, который я пробовал в c #.

  public string RenderSummaryCT()
    {
        string FeaturedCT = "Featured Summary CT";
        string SummaryCT = "Summary CT";
        int IsFirstComponent = 0;
        string result = string.Empty;
        int hasFeaturedSummary = 0;
        Component comp = null;
        bool IsLeftHand = false;
        StringBuilder sbOutput = new StringBuilder();

        List<tc.ComponentPresentation> cmp = new List<tc.ComponentPresentation>();

        if (IsFirstComponent == 0)
        {
            IsFirstComponent = 1;
            IsLeftHand = true;

            //m_Logger.Info("CMP Array-" + cmp.Count);
            foreach (tc.ComponentPresentation objCMP in m_Page.ComponentPresentations)
            {
                if ((objCMP.ComponentTemplate.Title == SummaryCT) || (objCMP.ComponentTemplate.Title == FeaturedCT))
                {
                    comp = objCMP.Component;
                    string approvalStatus = string.Empty;
                    string endDate = string.Empty;

                    if (comp.Metadata != null)
                    {
                        ItemFields compItemfields = new ItemFields(comp.Metadata, comp.MetadataSchema);
                        approvalStatus = th.GetSingleStringValue("ApprovalStatus", compItemfields);
                        endDate = th.GetSingleStringValue("EndDate", compItemfields);
                    }
                    if ((baseutility.GetStagingConstantValue(m_Engine, m_Package)) || (string.IsNullOrEmpty(approvalStatus)))
                    {
                        if (!string.IsNullOrEmpty(endDate))
                        {
                            DateTime eDate = Convert.ToDateTime(baseutility.GetDateSerial(Convert.ToDateTime(endDate), false));
                            DateTime currentDate = Convert.ToDateTime(baseutility.GetDateSerial(DateTime.Now, false));
                            if ((eDate) > (currentDate))
                            {
                                cmp.Add(objCMP);
                            }
                        }
                        else
                        {
                            cmp.Add(objCMP);
                            //m_Logger.Info("2. Adding cmp: " + maxCount.ToString() + "-- " + cmp[maxCount].Component.Title);                              
                        }
                    }
                }
            }
        }
        bool lastFlag = false;
        int cnt = 0;
        int totalLength = cmp.Count;

        foreach (tc.ComponentPresentation cm in cmp)
        {
            m_Logger.Info(cm.Component.Id + "--" + m_Component.Id);

            m_Logger.Info(cnt + "--" + totalLength);

            if (cm.Component.Id == m_Component.Id)
            {
                if (cm.ComponentTemplate.Title == FeaturedCT)
                {
                    m_Logger.Info("inside featured CT");
                    hasFeaturedSummary = 1;
                    IsLeftHand = true;
                }
                sbOutput.Append("" + SummaryBase.SummaryHelper.RenderEntry(cmp, cnt, IsLeftHand, lastFlag));

                m_Logger.Info("IsLeftHand -: " + IsLeftHand.ToString());

                if (hasFeaturedSummary == 1)
                {
                    IsLeftHand = false;
                }
                else
                {
                    //sbOutput.Append("" + SummaryBase.SummaryHelper.UpdatePositioning(IsLeftHand));
                    if (IsLeftHand)
                    {
                        IsLeftHand = false;
                    }
                    else
                    {
                        //m_Logger.Info("UpdatePositioning");
                        sbOutput.Append("<div class=\"clearBoth\"></div>");
                        IsLeftHand = true;
                    }
                }

                m_Logger.Info("CMP Title -: " + cm.Component.Title);

                cnt = cnt + 1;
                if (totalLength == cnt)
                {
                    m_Logger.Info("cnt-" + cnt);
                    lastFlag = true;
                }
                if (lastFlag)
                {
                    sbOutput.Append(" <div class=\"clearBoth\"></div>");
                }
            }
        }

        return sbOutput.ToString();
    }

Я уверен, что что-то не так, можете ли вы предложить подходящую логику, используя вышеупомянутую логику VBScript.

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

Это больше, чем просто «Преобразование VBScript в .NET», вы также переходите от объектной модели Tridion на основе COM к .NET TOM - что работает совсем по-другому.

Моя рекомендация здесьбыло бы очень аналитически взглянуть на это:

  1. Разбейте свой код и сначала напишите логику на бумаге
  2. Попытайтесь понять , почему это необходимослучиться, и если это все еще будет иметь место

Это должно упростить вам переписывание кода позже.

Я бы, конечно, воспользовался этой возможностью, чтобы переписать частитак что это имеет больше смысла - как преобразование переменной IsFirstComponent в логическое значение вместо int и удаление всего HTML из вашего кода на C # (не то чтобы у вас там было много, но следующий человек, работающий над этим кодом, вероятно, хотел бызнаю, что HTML не создается какой-то сборкой, "скрытой" где-то на вашем сервере).

Я постараюсь взглянуть на этот VBScript позже, но яПонимание того, что на самом деле делает код, может быть более важным на данном этапе.

1 голос
/ 13 ноября 2011

Если честно, я не вижу, что делается с помощью ordinalPosition.Я предполагаю, что когда вы вызываете render для каждой презентации компонента, текущие значения Component и ComponentPresentation обновляются.(В шаблонах старого стиля компоненты и страницы используют один и тот же стек рендеринга.) Но я догадываюсь здесь, и я все еще не уверен, какова предполагаемая логика.@Nuno - коллекция Компонентов обычно не будет обновляться после ее заполнения из Page.ComponentPresentations в «Извлечение компонентов со страницы», поэтому я сомневаюсь, что черная магия будет переноситься так легко.

Итак, Ману - вам нужнопроверьте, какова функциональная спецификация для этой функции.Возможно, идея состоит в том, чтобы просто проверить, присутствует ли где-либо в списке презентация компонента Featured Summary, и, если это так, поставить это слева, а остальные справа.(Если это так, то это довольно сложная логика.) На практике вам, возможно, придется просмотреть существующие страницы, использующие этот шаблон, посмотреть, как они функционируют, и взять на себя обязательство поддерживать только эти страницы в вашем порту.

(Возможно, вы также захотите просмотреть, для чего предназначен этот код рабочего процесса. Возможно, настройка минимального статуса утверждения для вашей действующей цели позволит вам удалить этот код.)

Я полностью поддерживаю первоначальное предложение Nunoвоспользоваться возможностью переписать некоторые вещи.Даже с учетом ваших временных ограничений вы никогда не добьетесь правильной логики, если не поймете проблему и не реализуете код.Серьезно - наличие такого неуправляемого кода будет более вредным, только если вы столкнетесь с жестким крайним сроком.

Обработка различных видов презентаций компонентов является распространенным требованием в шаблонах страниц Tridion.Шаблонная идиома очень отличается в составных шаблонах, но если все сделано правильно, ее гораздо легче понять, чем подход, показанный здесь.Существует базовый класс , доступный в учебном проекте Tridion , который может оказаться полезным, когда у вас есть возможность написать код идиоматически, а не делать построчный порт.

...