Добавить элементы программно к повторяемым элементам - PullRequest
0 голосов
/ 09 декабря 2011

Как можно программно добавить элемент в повторяемое свойство в c #:

Допустим, у меня есть узел (идентификатор узла 1234) и в нем свойство списка компаний, в котором у каждого элемента есть имя и изображение компании (средство выбора медиа).

как добавить элемент программно?

Вот что у меня есть:

        XPathNodeIterator xpathIterator = umbraco.library.GetXmlNodeById(NodeId.ToString());
        XElement node = XElement.Parse(xpathIterator.Current.OuterXml);

        var list = node.Descendants(propertyAlias).FirstOrDefault();

        // how do I add items here ? something like:
        list.Descendants().Add(...)

спасибо.

Пакет, на который я ссылаюсь: Повторяемый пользовательский контент

обновление: Я думаю, что решение заключается в обновлении XML в umbraco.config. У меня есть следующий xml в umbraco.config:

<Companies id="1176" parentID="1447" ...>
    <umbracoNaviHide>0</umbracoNaviHide>
    <companyList>
        <item>
          <data alias="title">Company1</data>
          <data alias="image" />
          <data alias="text" />
          <data alias="date" />
        </item>
        <item>
          <data alias="title">Company2</data>
          <data alias="image">1943</data>
          <data alias="text" />
          <data alias="date" />
        </item>
      </items>
    </companyList>
  </Companies>

Я могу обновлять umbraco.config программным способом, но результаты не обновляются в бэкэнде, поэтому, когда я снова публикую узел компаний, изменения будут удалены. Как я могу обновить umbraco.config и опубликовать узел? Может, мне стоит вместо этого обновить базу данных напрямую?

Мой код:

Document companiesDoc = new Document(COMPANIESNODEID);

        XmlDocument document = content.Instance.XmlContent;

        XmlNode n = document.SelectSingleNode("//Companies[@id=" + COMPANIESNODEID.ToString() + "]").SelectSingleNode("//items");


        XmlNode newItem = document.CreateNode(XmlNodeType.Element, "item", null);


        XmlNode dName = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xn = document.CreateAttribute("alias");
        xn.Value = "title";
        dName.Attributes.Append(xn);
        dName.InnerText = companyName;

        XmlNode dImage = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xi = document.CreateAttribute("alias");
        xi.Value = "image";
        dImage.Attributes.Append(xi);
        dImage.InnerText = companyImage;

        XmlNode dText = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xt = document.CreateAttribute("alias");
        xt.Value = "text";
        dText.Attributes.Append(xt);

        XmlNode dDate = document.CreateNode(XmlNodeType.Element, "data", null);
        XmlAttribute xd = document.CreateAttribute("alias");
        xd.Value = "date";
        dDate.Attributes.Append(xd);

        newItem.AppendChild(dName);
        newItem.AppendChild(dImage);
        newItem.AppendChild(dText);
        newItem.AppendChild(dDate);

        n.AppendChild(newItem);

Ответы [ 2 ]

0 голосов
/ 10 декабря 2011

Мне удалось решить проблему с помощью этого кода:

var doc = new Document(COMPANIESNODEID);


        XDocument xdoc = XDocument.Parse(doc.getProperty("companyList").Value.ToString());

        xdoc.Element("items").Add(new XElement("item",
            new XElement("data", new XAttribute("alias", "title"), companyName),
            new XElement("data", new XAttribute("alias", "image"), companyImage)));

        doc.getProperty("companyList").Value = xdoc.ToString();


        doc.Save();

        doc.Publish(new User(0));
        umbraco.library.UpdateDocumentCache(doc.Id);
0 голосов
/ 10 декабря 2011

Я могу обновлять umbraco.config программно, но результаты не обновляются в бэкэнде, поэтому, когда я публикую компании узел снова, изменения удаляются. Как я могу обновить Umbraco.config и опубликовать узел?

Вы делаете это неправильно. Файл umbraco.config представляет собой XML-представление базы данных Umbraco, доступное только для чтения * XML, которое генерируется Umbraco и затем кэшируется. Он не предназначен для записи или прямого доступа. Каждый раз, когда вы публикуете страницу в Umbraco, этот файл восстанавливается, поэтому причины ваших обновлений не сохраняются.

Вы также не хотите пытаться писать напрямую в базу данных Umbraco. Это очень сложно и требует много отношений. Опять же, он не предназначен для записи.

Для непосредственного обновления узлов вам нужно использовать API документов Umbraco . Это дает вам прямой доступ на запись к узлам, которые вы можете программно опубликовать Простой пример:

Document doc = new Document(1234);
doc.getProperty("bodyText").Value = "<p>Your body text</p>";
doc.getProperty("articleDate").Value = DateTime.Now;
User author = User.GetUser(0); 
doc.Publish(author);
umbraco.library.UpdateDocumentCache(doc.Id);

Я бы предложил разместить на http://our.umbraco.org/forum, если вам нужна дополнительная помощь.

...