Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • André Lange 108 posts 410 karma points
    Jan 31, 2019 @ 09:58
    André Lange
    0

    Getting content for newsletter from multiple pages.

    Using Umbraco v. 7.12

    Hi, i am trying to create some functionality for a newsletter, which is supposed to be sent out once a week, which would contain everything that has been created in the last week on the site.

    So every news article, event etc. I have a headline, teaser and image on every single document type, which i will use for the content in the newsletter, and ofcourse a url for the page.

    My question is this.

    I have created a surface controller, where i have found my root page, and from there i can look at my content. But if i go .children on the root, i would only be going down 1 level.

    How do i look on my ENTIRE site, and look for everything created in the last x amount of days ?

    i so far have this as far as code goes:

    Other than just saying .children on each and looping through them, is there not a better way ?

      public void InitiateNewsLetter()
        {//http://localhost:50797/Umbraco/Surface/NewsLetterSurface/InitiateNewsLetter
            // this is the point that should be called...
    
            var content = GetContent(-14);
            if (content != null)
            {// there is content, go ahead and create the newsletter.
                var emailList = GetEmailOfMembers();
                if (emailList.Count() > 0)
                {   // there is emails present
                    // create the newsletter... somehow...
    
                }
            }
            else
            {
                //no content to show.. well.... huh..
            }
            // meant as this is new, this is what has happened last week in case you missed it...
            // Very important, if there is no new content, it should not send out anything...!
        }
        public ActionResult GetContent(int days)
        {
            var root = Umbraco.TypedContentAtRoot().First(); // gets the main root of the site.
            var memberRoot = root.DescendantsOrSelf<MemberPage>().FirstOrDefault(); // get the memberpage "root".
    
            //memberRoot.Descendants
    
            var children = memberRoot.Children;
            var date = DateTime.Now.AddDays(days);
    
            var content = children.Where(x => x.CreateDate >= date); // gets content that is older than the set date.
            if (content != null)
            {
                if (content.Count() > 0)
                {
                    // map the content....
    
                    return null;
                }
                else
                {   //No content present, return null.
                    return null;
                }
            }
            else
            {
                return null;
            }
            // get content from site, that has been created in the last 14 days. 
            // It will run once a week
        }
        public IEnumerable<string> GetEmailOfMembers()
        {
            var memberHelper = new UmbracoHelper(UmbracoContext.Current);
            int totalRecords;
    
            var members = Services.MemberService.GetAll(0, 200, out totalRecords).ToList();
    
            var mappedMembers = UserContainerMapper.Map<UserModel>(members, Umbraco);
            // get the email of ALL members, as an ienumerable string, and return that.
            var emailList = mappedMembers.Select(x => x.Email); // should contain all emails needed.
    
            return emailList;
        }
        public void SendMail()
        {
            // send the email to all members
        }
    
  • Koen van Ras-Neve 56 posts 361 karma points c-trib
    Jan 31, 2019 @ 12:32
    Koen van Ras-Neve
    101

    Isn't .Descendants what you're looking for?

    You should be able to get all the descendants by xpath with the following line of code:

    Umbraco.UmbracoContext.ContentCache.GetByXPath(string.Format("id({0})[@isDoc]/descendant::*[@isDoc]", memberRoot.Id))
    
  • André Lange 108 posts 410 karma points
    Feb 01, 2019 @ 06:59
    André Lange
    0

    It is probably descendants yes.. Hmm. I have never used Xpath before, can you explain it in relation to your example ?

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies