Our blog contains the activity stream of Orchard Dojo: general news, new resources or tutorials are announced here.

Orchard Harvest 2026 program, Your website should integrate with your business systems - This week in Orchard (26/06/2026)

The full Orchard Harvest 2026 conference program is live, with the event taking place in Vancouver on September 10-11. Grab your early-bird ticket for just $280 and join the community for two days of sessions and networking!

Form submissions shouldn't end up in manual copy-paste routines. Orchard Core connects directly with Zapier, Make, and n8n to automatically trigger CRM updates, notifications, and more. DotNest's managed hosting makes the whole setup hassle-free!

The Health Checks module by Hisham Bin Ateya lets you restrict access by IP, apply rate limiting, and DoS protection for your health check endpoints, all configurable via JSON.

Managing multiple tenants on the same database just got easier. New RequireTablePrefix and TablePrefixPattern options, introduced by Mike Alhayek, let you enforce or auto-generate table prefixes (e.g., using the tenant name), so your setup is consistent and error-free out of the box.

No more guessing which properties to use for the Settings recipe step. Every module with configurable settings now includes a dedicated Recipe Configuration section with examples!

Ready to explore? Let's dive in!

Latest tutorials

Featured tags

AI
IIS
SMS
MCP
API
SEO
All tags >

This week in Orchard - 10/25/2019

This week we are coming with a cool demo of presenting the newest improvements of an upcoming Orchard Core module that will add sitemaps to your site! But first, don't forget to check the documentation of Orchard Core, we have a lot of additional lines here! On Orchard Core Updating OpenId docs about how to use the certificate on Azure When you would like to enable authentication of external applications using the OpenID Connect/OAuth 2.0 standards, you have to configure the certificates too. You can generate and store your certificate on Windows and/or IIS, but you can also upload the certificate on an Azure hosted site. This little addition to the docs will help you with that. CommitTransactionTask workflow activity When you have two concurrent updates that depend on each other, you need to commit the previous transaction, that you can follow up with the next one and the first one can continue and get another one. So, when you have two nested transactions to each other, you could create a deadlock, that is very specific to SQLite. Now there is a new Task available when you are creating workflows. The CommitTransaction activity is about committing the current transaction by calling the CommitAsync method of the ISession implementation. Add OrchardCore.Email docs We have the OrchardCore.Email module, that allows you to send emails using SMTP. You can configure the settings for this module by using the appsettings.json file. Now you will find documentation about how you need to fill this JSON file and also with some description about the meaning of the values. Add role description Now you can provide a description of a role when you are creating a new one or editing an existing one. It will make your life easier in the future if you have more roles and want to stores what are the current roles used for. Now we have documentation about what are the predefined roles used for and how to configure the roles through a recipe step. Four Orchard Core samples for Orchard Core Dody Gunawinata maintains a repository in GitHub that contains 305 samples for ASP.NET Core with projects about how to use Blazor, foundational ASP.NET Core samples and so on. This repository also contains 4 samples that show the different capabilities of Orchard Core. These are: Routing - MVC: This sample shows how routing works in an Orchard Core Framework app. Routing - Razor Pages: This sample shows how routing works in an Orchard Core Framework app when you are using Razor Pages. Static files: This sample shows how to use static files in the module. Multi tenant: This sample shows how Orchard Core Framework handles multi tenancy and how each tenant has its own configuration file. If you are interested in these samples or other ASP.NET Core samples you should definitely check this great and huge collection to learn something new! Scanning the code of Orchard Core for bugs PVS-Studio performs static code analysis and generates a report that helps a programmer find and fix bugs. PVS-Studio performs a wide range of code checks, and it is also useful in finding misprints and Copy-Paste errors. The authors of this project published an article about reviewing the results of a second check of the Orchard Core with this static analyzer. The current version of Orchard Core is made up of 2,767 .cs files, i.e. it's about one thousand files smaller. The downsizing and renaming of the repository suggest that the developers have isolated the project's core (commit 966), which is 108,287 LOC long. The analyzer issued 153 warnings: 33 first-level and 70 second-level ones. You should definitely check this article, you can learn a lot and write better code! Do you write a performance-intensive code? Then help us build the nerdiest .NET thing! Drop us a line to [email protected] and we'll ask a few questions about the challenges you encounter, and in exchange, we'll show you how to make a chip out of your programs. Demos Sitemaps module A few weeks ago we wrote about an upcoming module for Orchard Core: the Sitemaps module. Since then this feature improved a lot and will be released soon. Let's recap the latest changes of the module! First of all, when you navigate to the Configuration/Features on the admin site, you will see that there are three different Sitemaps modules: Sitemaps: Provides dynamic sitemap generation services. Sitemaps for Decoupled Razor Pages: Provides decoupled razor pages support for dynamic sitemap generation. Localized Content Item Sitemaps: Provides support for localized content item sitemaps. Let's check them one by one with a site that we set up using the Blog recipe. When you enable the Sitemaps module you can head to Configuration/Sitemaps and click on the Add Sitemap button. Here you will see two notions: the Sitemap Content Types, that add sitemap entries for each one of the selected content types and the Sitemap Index, which adds a sitemap index that acts as a container for other sitemaps. You can create a new Sitemap Content Type, that will lead you to a familiar page where you can select which content type you want to include in the index, among with the change frequency, priority and the number of content items to include. The other is called Sitemap Index. In the editor of the Sitemap Index, you can select which sitemap will this index contains. Because for now we have only one (called My Blog Posts) select this one. Hit Save and View this Sitemap Index. You can see that this index contains our only one sitemap with the last modified date of it and the location. By using sitemap indexes, you can provide a collection of sitemaps to search engines. For example, when using Google, all formats limit a single sitemap to 50MB (uncompressed) and 50,000 URLs. If you have more than 50,000 blog posts, you have to create two Sitemap Content Types. The first one will take the first 50,000 one and the second one is the rest. And your Sitemap Index will include these two Sitemap Content Types. Now let's move on and enable the Localized Content Item Sitemaps. To test this, first, attach the Localization Part to our Blog Post content type and create two blog posts, one in Hungarian and one in English. Now head back to the admin of the Sitemaps module and View our My Blog Posts Sitemap Content Type. You see that our sitemap provides more information to search engines. First of all, you can see that both the English and Hungarian versions of our blog post have been included in the sitemap. These come with the hreflang attribute. If you have multiple versions of a page for different languages or regions, tell Google about these different variations using the hreflang attribute. The loc is still used and that points to the version of the content item that was created using the default culture. Finally, enable the Sitemaps for Decoupled Razor Pages feature. For this, we will add a new content type, called DecoupledBlogPost. This content type will not have any parts or fields attached. To be able to provide a sitemap for decoupled Razor pages, first, configure the SitemapsRazorPagesOptions for our content type in the Startup.cs file of our module. services.Configure<SitemapsRazorPagesOptions>(options =>{ options.ConfigureContentType("DecoupledBlogPost", typeOptions => { typeOptions.PageName = "DBlogPost"; typeOptions.RouteValues = (contentItem) => { return new { area = "OrchardCore.Sitemaps", slug = contentItem.ContentItemId }; }; });}); Here you can see that a DBlogPost.cshtml file sits in the Pages folder and we just simply put this into the OrchardCore.Sitemaps module. We will pass the ContentItemId as a slug for our page. Now let's see the content of the Razor page: @page "/blogpost/{slug}"<h1>This is the blog post.</h1><h2>Slug: @Slug</h2>@functions{ [FromRoute] public string Slug { get; set; }} Now head back to the admin and create two new Decoupled Blog Post. After let's create a new Sitemap Content Type, called Decoupled Blog Posts, that will (surprisingly) index the Decoupled Blog Post content types. After you saved this sitemap, hit View! Here we are with the two Decoupled Blog Posts that have the ContentItemId in the URL. We haven't attached the Localization Part to this one, so the hreflang attribute will not be used here. Now open one of those blog posts! And here comes our decoupled blog post that is using The Blog Theme for rendering the content of this item. This feature is still under development and can be found in this branch. Big thanks again to Dean Marcussen for this great contribution! On Lombiq Lombiq Orchard Visual Studio Extension updated The Lombiq Orchard Visual Studion Extension just got some VS 2019 compatibility updates. There was a warning message that said One or more extensions were loaded using deprecated APIs. Check it out if you aren't using it already, you're missing out on quite some productivity boost! Orchard Dojo Newsletter Now we have 100 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 10/18/2019

This week we are coming with a cool demo of using Statiq with custom GraphQL and Liquid modules to render static content for Orchard Core as a headless CMS! But before jumping to that don't forget to check out the other news around Orchard Core and another demo about adding the ability to generate DisplayText with a pattern! On Orchard Core Avoid slash in the role name The slash will add another segment that prevents to use from editing or deleting the role. Now we are checking that if the name of the role is containing a slash or not. If yes, you will see an error message. Decoupled CMS guide When you navigate to the Orchard Core Documentation page and hit the Index under the Guides in the left, you will see that we have a new tutorial here, called Building a decoupled website with Razor Pages. By following this step-by-step tutorial you can easily develop your own decoupled CMS site from the scratch. In this tutorial we learn how to: Start a new Orchard Core CMS project Create custom content types Edit content items Create Razor Pages with custom routes to render the content Load content items with different identifiers Render WYSIWYG preview screens while editing the content Add Breadcrumbs zone There is a new zone called Breadcrumbs in the layout of the admin. With that zone, we can inject breadcrumbs. Anywhere, where the breadcrumbs were used they are now using this zone, for example on the workflows page. There is a zone tag, so everything that is inside this zone tag will be injected inside the Breadcrumbs section. And here you can see the RenderSectionAsync call in the Layout.cshtml of TheAdmin theme. Updating themes All the themes that are using Bootstrap now have been updated to use the latest version. The main change is that all the static assets now are included in the themes, which means they can now be served by the Orchard instance and not just the CDN. And now each theme has a ResourceManifest, that defines all the assets that each theme is using, like jQuery, Bootstrap, Bootstrap bundle and so on. The local version and the CDN is also defined here, that allows these themes to reuse the settings that we set in the admin to select which version of the resources we want to use either local or CDN or based on the environment (meaning development will use local, production will use CDN). You can see a vendor- prefix in the names, it is to prevent conflicts with the resource names that we have defined in the OrchardCore.Resources module. Orchard Core Docs new structure The structure of the Orchard Core docs will be reorganizing and come with a new MkDocs theme. Here you can see just the material and here you can see the new structure that coming soon. Demos Add ability to generate DisplayText with a Pattern Let's set up a site using the Blog recipe. Now head to the admin site and edit one of the content types, for example, the Article. Add a new Text Field to it, let's use the Name for the Technical Name. Now edit the Title of the Article. Here you will see an Options drop-down list with the following options: Title is editable: you can edit the title when editing the content item. Title is generated and input is disabled: you can't edit the title and the textbox for the title is disabled. Title is generated and input is hidden: you can't edit the title and the textbox for the title is hidden. And under that, there is the pattern used to render the title of this content type. The pattern gets injected and this gets called when the content item is updated. Now let's edit the existing Article, called About and fill the Name Text Field with some value, for example Name. And change the value of the Subtitle Text Field to Subtitle. After hit Publish. Now if you navigate to Manage Content page you will see that the title of this Article has been generated using the values of the Name and the Subtitle Text Fields. Because at the content definition of the Title we select that the Title is generated and input is disabled, when you try to edit an existing article, you will see the disabled textbox for Title. Generating static sites using Statiq(Wyam) and Orchard Core If you haven't heard about Wyam(Statiq) yet, let's recap the underlying concepts first: Wyam is a simple to use, highly modular, and extremely configurable static content generator that can be used to generate web sites, produce documentation, create ebooks, and much more. Since everything is configured by chaining together flexible modules (that you can even write yourself), the only limits to what it can create are your imagination. Common static sites are using tools like Jekyll/Hugo which are based on content in markdown files, stored in GitHub. Some arguments: This might work for small and technical teams, but when users are more than a handful or don't have technical knowledge it's not possible anymore. When assets management is required, with organizing images or adding metadata. Rights management, such that sections of the site can only be modified by some users. Editing workflow, when content needs to be reviewed and pass different levels of validation. Allow more complex editing scenarios, like editing maps, choosing a color. Managing more than a dozen content items, like e-commerce sites that could span thousands of products. When online B2B communications are required, like export processes, tax data updates, or webhooks. Now let's see how to generate static sites! First, let's set up a site using the Blog recipe. Now head to the Configuration and enable the following OpenID modules: OpenID Authorization Server and OpenID Token Validation. We also need the GraphQL, so enable that module too. The goal is to implement the authentication from a service to the Orchard Core by using Bearer tokens and OpenID. With that, you can use the APIs from another service. After go to the Authorization server settings under OpenID Connect/Settings and allow the Client Credentials Flow. The OpenId Connect Client Credentials grant can be used for machine to machine authentication. In this grant a specific user is not authorized but rather the credentials are verified and a generic access_token is returned. Now create a new application under OpenID Connect/Management. This will be our service that will connect to the Orchard Core instance. Don't forget to allow the Client Credentials Flow here and of course, provide a Client Id and a Client Secret. We will need these soon. Now we have a configured Orchard Core instance to serve content to our application using GraphQL and the Client Credentials flow. For the sake of simplicity, we will create a Console Application. This application has to use the Client Credentials Grant Flow for authentication. curl -XPOST "https://<region>.onelogin.com/oidc/token" \-H "Authorization: Basic <base64 encoded client_id:client_secret>" \-H "Content-Type: application/x-www-form-urlencoded" \-d "grant_type=client_credentials" First, create a request on the /connect/token on the Orchard Core instance. Then create a Basic authentication header with the Client Id and the Client Secret. Remember you provided these data when setting up the OpenID application in Orchard Core. After we send the request and the response will be a JSON document with an access_token property. This property stores the value of the access token that we can use to send any request to the server as a Bearer token. Check this code snippet to receive this token. using (var httpClientHandler = new HttpClientHandler()){ httpClientHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; httpClientHandler.AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate; using (var httpClient = new HttpClient(httpClientHandler)) { string accessToken; using (var request = new HttpRequestMessage(HttpMethod.Post, new Uri("https://localhost:44300/connect/token"))) { request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("theclientid:theclientsecret"))); request.Content = new StringContent("grant_type=client_credentials"); request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); using (var response = await httpClient.SendAsync(request)) { var data = await response.Content.ReadAsStringAsync(); var doc = JsonDocument.Parse(data); accessToken = doc.RootElement.GetProperty("access_token").GetString(); } } }} And the value of the doc JsonDocument will be the following, where you can see the access token. {"token_type":"Bearer","access_token":"CfDJ8IFF_p0sw0lLjSdTpd..........cDRRiQXfpVZsHo","expires_in":3600} In the next step, we are creating a new Bearer token with the access token and we are pointing to the GraphQL endpoint with a query listing all the blog posts. With that, we can get all the blog posts. using (var request = new HttpRequestMessage(HttpMethod.Get, new Uri("https://localhost:44300/api/graphql?query=query%20MyQuery%20%7B%20blogPost%20%7B%20displayText%20markdownBody%20%7B%20html%20%7D%20%7D%20%7D"))){ request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); using (var response = await httpClient.SendAsync(request)) { var data = await response.Content.ReadAsStringAsync(); Console.WriteLine(data); }} You can see that we pass the GraphQL query in the query string in an URL encoded format. Here is the query in a readable way: MyQuery { blogPost { displayText markdownBody { html } }} We use Console.WriteLine to see the data coming from Orchard Core. Because we set up our site using the Blog recipe and haven't added any additional blog posts, our response will be the following: So, this is how you do Client Credentials Flow to authenticate your application against Orchard Core. This is the first step needed to generate a static site. Now let's just refactor our code a little bit. Create a ClientCredentialsAuthenticate method to get the access token. With the ClientCredendialsAuthenticate method, we can do as many calls as we want. You can see the BlogPosts query that we will pass to a custom Statiq module called GraphQLQuery. This module will just take the GraphQL endpoint, the query, and the access token. We will also need to develop another custom module extension using Statiq, called Liquid module to be able to use Liquid. const string BlogPosts = @" MyQuery { blogPost { displayText markdownBody { html } } }";static async Task Main(string[] args){ var token = await GraphQlQuery.ClientCredendialsAuthenticate(new Uri("https://localhost:44300/connect/token"), "theclientid", "theclientsecret"); await Bootstrapper .CreateDefault(args) .BuildPipeline("Posts", builder => builder .WithInputModules(new GraphQLQuery("https://localhost:5001/api/graphql", BlogPosts, token)) .WithProcessModules( new SetDestination(Config.FromDocument(doc => new FilePath(doc.GetString("displayText") + ".html"))), new Liquid("templates/blogpost.liquid")) .WithOutputWriteFiles() ) .RunAsync();} For every blog post, it will apply the transformation, by getting the displayText property of the JSON document and create an HTML file based on that. After apply the Liquid filter based on the blogpost.liquid template, that has the following content: <h1>test</h1><p>{{ displayText }}</p>{{ markdownBody.html | raw }} If you run that application you will get one HTML file in the bin/Debug/netcoreapp3.0/output folder of your application called Man must explore, and this is exploration at its greatest.html. If you open the file you will see the following result. With that, you can go further and generate all the static sites you want based on GraphQL and use Razor or Liquid. On Lombiq Orchard Dojo Newsletter Now we have 98 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 10/04/2019

The first release of Orchard Core RC shipped last week, but the community has already added several new great features and improvements to the CMS! In our post, we show you two demos about the flow improvements and the new Sitemaps module! On Orchard Core Add helper and block Liquid tags to the Readme The documentation has been updated about how to use the helper and the block Liquid tags. Update asset cache to check Azure Media Storage is enabled Now you will get a warning message if you don't have the correct settings for the cache of Azure Media Storage. It means an updated media cache controller to check if the Azure Media Store is enabled or configured correctly, and shows an error, rather than an exception. Etch.OrchardCore.SEO module This is a module for Orchard Core that provides useful features for SEO. For example: Hostname redirects: define main hostname to redirect all domain variations and force SSL. Redirects: create redirect content items that'll redirect a relative URL to another URL. Robots.txt: manage contents of /robots.txt. If you are building a website and you would like to do the SEO to optimize your website for success, don't hesitate and get this module from NuGet! And if you are in GitHub, don't forget to check out the other modules from Etch, they created several features for Orchard Core. For instance the Etch.OrchardCore.Fields module with a collection of useful content fields and many more! Add WithPosition extension to set Field position There is a new WithPosition extension method on ContentPartFieldDefinitionBuilder, that you can now use instead of needing to use the MergeSettings. You can find this method in the ContentPartFieldSettingsExtensions static class. Document Azure Blob Storage We have updated the documentation about how to configure the Azure Media Storage feature and how to use the Media Cache feature. Demos Flow improvements Let's set up a new site using the Blog recipe. The Page content type here has the FlowPart attached, so let's create a new page. Let's add three new paragraphs to this page with some content. After that set the percentage of every widget to 33%. You can see a different UI at the bottom of every widget. Check out the dropdowns instead of radio buttons when setting the alignment or the percentage of the given widget. When setting the percentage, the editor is now updating with the new value, and in the case of 33%, you will see the three paragraphs next to each other in one row. You can also drag and drop the widgets to easily change the position of them! Now let's add a Container, that is just a container of other widgets. You can also define the width and the alignment of the container too. But here comes the trick! Before that, you cannot move elements outside or inside a container. If you would like to move a widget inside a container, you had to create that widget again in that container, which could be quite frustrating if you decide to move a dozen widgets to a container. Now with a simple drag and drop, you should able to take any widget and put it inside a container! Do you know editors from your company who'd love this feature? Show them these gifs! Sitemaps A sitemap is a file where you provide information about the pages, videos, and other files on your site, and the relationships between them. Search engines like Google read this file to more intelligently crawl your site. A sitemap tells the crawler which files you think are important in your site, and also provides valuable information about these files: for example, for pages, when the page was last updated, how often the page is changed, and any alternate language versions of a page. Let's see how it works in Orchard Core! Set up a new site using the Blog recipe. After go to the admin page and navigate to Configuration -> Features. Here search for the Sitemaps feature and enable it. This module will add a new option under Configuration, called Sitemaps. Here you can add a new Sitemap set by clicking on the Add Sitemap Set button. Give it a likable name and then hit the Edit Nodes button. Here you can choose between two different types of sitemap nodes: Sitemap Content Types: adds a sitemap entry for each one of the selected content types. Sitemap Index Node: adds a sitemap index that acts as a container for other sitemaps. Let's create a Sitemap Content Types node to have a sitemap that contains the Article Content Types of our site! As you can see on the screen we should add a description for the sitemap node first, then the path of our sitemap. And here comes a huge table that contains every available content types of your site. Put a tick near the Article and leave the other settings as-is. Note that when you uncheck the Include all checkbox, you can adjust the number of content items in the sitemap by setting the skip and take values. For now, just put a tick here. Now if you create this node, you will have a green View button next to it. This will show the content of your sitemap. In the URL you can see that path we have set up earlier and the relevant fields of the Article content types. As you can see we previously created one additional article with the my-second-article alias. The module has a great Readme.md file where you can read a lot more about the feature and the different node types. This feature is still under development and can be found in this branch. Big thanks to Dean Marcussen for this great contribution! On Lombiq Orchard Dojo Newsletter Now we have 96 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 09/13/2019

Lots of PRs merged to Orchard Core this week again coming with new fixes, and features. You could also read about the new way how you could use the localization packages in Orchard Core soon. Check out our current post for more! On Orchard Core Editor direction should respect the Localization Part culture Everything that is editable (like TextField, TitlePart, etc.) will now be configured whatever the content item's culture is. There is a new helper method, called GetContentCultureAsync that gets the CultureAspect of a content item, that will provide the CultureInfo of the content item. If you have the Localization module enabled, it will set it using the LocalizationPart of the content item (otherwise it will use the default culture of the site). Add Properties Dictionary to IShape interface We decided to provide a Properties bag on the IShape interface where you can put anything on a shape. You can do it in Orchard 1.x and in Orchard Core too, but only if the shape is a dynamic object. The readme file is updated about how can you do that using Liquid. Clean double encoding Use the tag helper instead of the ActionLink when working with localized strings. Every time when you have an ActionLink with a localized string it will be double encoded because the ActionLink only accepts a string. OrchardCore.Translations Repository In this repository, you can see a Localization folder that contains the localization for each culture for each module. Crowdin sends pull request to this repository whenever is a new translation is available. It creates new commits with every change and then AppVeyor will build the changes and this will build NuGet packages for every language. Each NuGet package will only contain the localization files for the given language. We publish the NuGet packages to MyGet prefixed with beta3. Once the dev will be merged to master it will move to nuget.org. There is also a meta-package called OrchardCore.Translations.All, that contains all the other languages. If you just point this package, you can translate your admin in any language automatically. Of course, you need to add the given language as a supported one. .NET Conf 2019 There will be the .NET Conf soon, which is a 3-day virtual developer event co-organized by the .NET community and Microsoft. Sébastien submitted a talk about Orchard Core modularity and multitenancy and he is able to speak! At September 24 at 00:00 (UTC) he will be speaking about building modular, multi-tenant ASP.NET Core apps with Orchard Core framework. Don't forget to join! Starting a new project with Orchard Core Garry Woodfine, an experienced full-stack developer has just started to work with Orchard Core. In this blog post, he writes about how you can build new Web Applications with Orchard Core, install Orchard CLI and start your CMS Website. On Lombiq Orchard Dojo Newsletter Now we have 90 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 09/06/2019

Lots of PRs merged to Orchard Core this week that adds new improvements, fixes, and features. You could also read a demo about the Content Fields Indexing, that is a very useful feature for the developers: they can now query content items based on the value of the fields! Oh, and we will have a meetup soon in Budapest, where Lombiq will giving a talk on Orchard. Get ready for a longer post about these amazing features! We promise: you won't regret reading it! On Orchard Core Add ORCHARD_APP_DATA Environment Variable section If you want to change where the App_Data folder is, you can define an environment variable called ORCHARD_APP_DATA. Paths can be relative to the application path (./App_Data), absolute (/path/from/root), or fully qualified (D:\Path\To\App_Data). If the folder does not exist the application will attempt to create it. Localization files publishing When we deploy the app it will also publish the Localization folder, which is where the localization files go. Instead of the App_Data/Localization, they go into the Localization folder of the content root. Content Culture Picker improvements There is a new Liquid helper called switch_culture_url, that is responsible to return the URL of the Action that switches cultures. The ContentCulturePickerContainer is the template of the culture picker, that you can add in your front end themes to display a customized drop-down or a list of options to change the culture of the website. There was no example about how to override this using Liquid, now the documentation has an example using the new switch_culture_url helper. Workflows Internationalization Now every Task and Event have a LocalizedString property called DisplayText. With this change, you can localize the title of every activity. Make setting the page title format accessible to site administrators When you navigate to the general settings page you can find a new option called Page title format. Here you can now provide a Liquid expression to customize the way how you would like to render the title of your page. In the screen, you can see that we set the Page title format to {% page_title Site.SiteName, position: "before", separator: " -.-.-.- " %} By providing before as the position, we will show the name of the site first, then the title of the page with a custom separator. Check the second tab in the screenshot above to see the result of the expression. Handle UnauthorizedResult When trying to access an unauthorized ContentItem in the front end, the ItemController returns an UnauthorizedResult. Until there, it's correct. However, UnauthorizedResult is treated like any other error and an error message is returned: "An error occurred while executing this request." leaving us thinking there is a bug. The solution is we need to return the Forbid or Challange results, not just Unauthorized. If you are authenticated, we can just return Forbid to say you don't have access to this page. If you are not authenticated, we return a challenge, that will be redirecting you to the login page to give you a chance to authenticate yourself. In the future in most of the controllers, we should use this logic. Add documentation to health check The HealthChecks module is just enabling the middleware and the new documentation now mentions that the default endpoint is 'health/live'. Add support for typed shape tag helper properties There is a shape tag helper with the following syntax: <shape type="Foo" /> This will render the shape typed Foo. The Razor syntax to do the same is: @await DisplayAsync(await New.Foo()); You can pass parameters inside your page: @await DisplayAsync(await New.Foo(Age: 18, Color: "Green")); You can do the same using the shape tag helper: <shape type="Foo" age="18" color="Green" /> Let's say you create a file Foo.cshtm, that is the default template for the Foo shape. Inside that you can do the following: @Model.Age. What happens here is that you don't have IntelliSense for Age, because it's not typed. When you write the following in your template, what you get for the @age is the string 18. @{ var age = 18;}<shape type="Foo" age="@age" color="Green" /> In Razor, if the property doesn't exist on the type (which is the case here, because it's dynamic) it will be assigned as a string. It will evaluate that doing a .ToHtmlString(). If you really want to get integers, you have a new option in Razor tag helpers to bind a custom property with a prefix. <shape type="Foo" prop-age="@age" prop-color="Green" /> Using the prop- prefix the value will be converted to a property on the shape with the type of the variable that is passed. The @age will be the variable itself, in this case, it will keep the type of that we passed here directly to the property age, which is assigned to the shape. So the shape will keep the properties with the variable type instead of converting them to IHtmlContent. With this new improvement, you can pass complex objects to your shape types. For example, you can pass your object directly to a shape without needing a ViewModel. Demos Content fields indexing Now we have a new module which is Content Fields Indexing (SQL), that adds database indexing for content fields. You can also find documentation about the available tables for the database indexing and the usage of these index tables from a class, from a Razor template and from Liquid too. First, enable the Content Fields Indexing (SQL) module from the admin. If you are using the Blog recipe, you will have a Blog Post content type, thas has a Subtitle Text Field. Let's create some new Blog Posts. Let's create two published and one draft posts. Now head to the database, where you will see the new tables, like DateFieldIndex, BooleanFieldIndex, TextFieldIndex, etc. Because the Subtitle is a Text Field, let's check the content of that table. You can see the three blog posts here, where you can also notice that one of them hasn't published yet. If you enable the SQL Queries module, you can add a new SQL query to list the Blog Posts from the TextFieldIndex table. Hit Save and then Run the query. At the bottom of the screen, you will get the result of the query: the three BlogPost content types. Do you know developers from your company who'd love this feature? Show them that now they can query content items based on the value of the content fields! On Lombiq Talentera.Net meetup This one is for our friends in Budapest: we've partnered with the agile carrier building agency Talentera to bring you .Net meetups! The first one will be in three weeks, us giving a talk on Orchard. Join if you're in the city! Orchard Dojo Newsletter Now we have 91 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 08/30/2019

Let's start our post with a new contribution from Lombiq about back-porting Orchard Core's Live Preview feature to Orchard 1.x. Then read about two demos of Orchard Core's upcoming huge features: the Azure Blob Storage as CDN and about supporting custom Lucene analyzers! We also have other updates around our house as well. Check out our current post for more! On Orchard 1.x Demos Live preview feature A new Orchard module is available in Orchard 1.x, called Content Preview. This is the back-port of the Live Content Preview feature that you can meet within Orchard Core. To use the Content Preview feature, head to the Modules menu from the admin and enable the module. The main concept is the user wants to see the changes of a content item immediately somehow without needing to save the changes. Here you can see a Page content type with several parts attached. Here you can update the TitlePart, the BodyPart, and the LayoutPart too with a TextField and a NumericField. You can also have more than one TinyMCE editor in the editor of the content item, it will work without issues. If you edit a content item with invalid data (for example typing some text in the editor of a NumericField), you will see the error notification immediately in the preview window. In the live preview window, you can find a warning message: "The Content Preview feature doesn't support properties where there are relationships to ContentPartRecord (e.g. Taxonomies, Tags). These won't update in the preview windows but otherwise, keep working." You can see this message because this feature hasn't been implemented yet, but feel free to have a contribution and add this feature to the Content Preview in Orchard 1.x! Thank you for the contribution to Milán Keszthelyi from Lombiq Technologies! On Orchard Core Add more detail step on README.md of OpenId In the documentation, there are more steps about how to add the relevant identity of OpenId when using MMC.exe. New Orchard Core collaborators & teams in GitHub There is a new OrchardCore Devs team in the GitHub repository of Orchard Core. The members of this team now have wright access to the repository, they can merge PRs, create and delete branches, but can't merge to master. They contributed enough and with good quality that we can trust them now. They learned how to contribute to Orchard. :) Demos Azure Blob Storage as CDN We don't want to serve the Azure Blobs directly by rendering their own URLs that points to their Blobs. So, the clients load the Azure Blob directly and not us. We want Orchard to load the Blob, save it locally on the server and we serve the file directly. This file, which is copied locally from the Blob Storage is what we call the Media Cache. We do that because if we want an actual cache, that the clients don't ask us to serve a file, we will use a CDN which Azure Blob Storage is not and by doing that we can process the files to resize them if they are to be resized by ImageSharp. So, there are two things to solve here. For example, if you would like to show an image on your page with three different sizes, there are three requests coming for the same image with different sizes. But there is only one Blob on Azure. You just send one request to Azure to get the file, store it locally and then resize it to the three different pipelines and serve the three different files, which are cached by ImageSharp also. There is a cache of the Blob file in the Media Cache, and there is three cached, resized images from ImageSharp. This Purge Media Cache button under the Configuration -> Media Cache section is responsible for delete the Media Cache, not the ImageSharp cache. This feature is still under development. Supporting custom Lucene analyzers and additional Lucene indexes settings In the Lucene Indices settings page, you can now have an Edit button for each index. If you click on Edit, you can set the content types and also have an option to index a draft version of the content item. Before - by default - it was indexing everything, not just the ones we want. And - by default -, it was only indexing the published versions, without an option to index draft. If it's checked, it will still index one content item, but the latest version. When we index and tokenize the text, we need to tokenize based on the language. Using the Analyzer Name select list you can provide different language analyzers for each index. If the text of these items will be French, then you can use a French analyzer. This feature is still under development. On Lombiq Improving your employment security with Orchard Did you know that the Employment Security Department of Washington State also uses Orchard? Well, they do and thanks to them we've back-ported the Orchard Core live content preview feature to 1.x! See our post about it: https://lombiq.com/blog/improving-your-employment-security-with-orchard Migrate from Bitbucket Mercurial repositories to Git - we can help! Do you need help after Bitbucket dropping Mercurial support? If you want to move to Git, check out this page in our website about what are your options now. We've been doing hg-git conversion for six years! Orchard Dojo Newsletter Now we have 92 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 08/16/2019

More Razor helpers, advanced Liquid support in GraphQL, a new OrchardCore.Application.Cms.Targets meta package, Full-Text-Indexing and updated milestones for Orchard Core. Want more? Then check out our current post! On Orchard Core Added Liquid support to Markdown GraphQL query We have a property in GraphQL for instance called Html on Markdown and HTML body. The new thing is that this Html property on the Markdown body was evaluating the Markdown of the content item. On the client you can directly have the Markdown evaluated, but not the source Markdown. But what was missing is that this Markdown in this body could also have Liquid. It would not interpret the Liquid syntax. Now the method first evaluates the Liquid and then convert the Markdown. Added Liquid Razor Extension Method & Markdown Helper parses Liquid Two extensions, one just to render Liquid as IHtmlContent and the other to render Liquid as a raw string that can be passed to another extension method like the markdown helper. LiquidToHtmlAsync: parses a Liquid string to HTML as IHtmlContent. MarkdownToHtmlAsync: converts Markdown string to HTML. See the updated documentation about the LiquidToHtmlAsync, and MarkdownToHtmlAsync helpers. Documentation to explain how to generate PO files Documentation to explain how to generate PO files has been merged with the tool called PoExtractor. That tool will analyze all the source code and extract all the strings that are used in the localizer. A new OrchardCore.Application.Cms.Core.Targets core CMS meta package There is an OrchardCore.Application.Cms.Targets already that you can point to. If you reference this NuGet package in your project, the CMS will just run and all the dependent Nuget packages will be downloaded. It's also linking all the themes that we have in Orchard Core and there is no way to remove them. Let us introduce a new package, called OrchardCore.Application.Cms.Core.Targets, that just contains the modules and only the TheAdmin theme. In this way you can just reference your own themes and not the other ones, that will make your deployment smaller. So, OrchardCore.Application.Cms.Targets contains every theme that we have in the solution and OrchardCore.Application.Cms.Core.Targets is just the TheAdmin theme. Full-Text-Indexing in Orchard Core This is the settings page of a Content Picker field. Here you can see the following settings: include this field in the index: be able to include the value of this element in the index. stored: when you want the value of the field to stored with the Lucene index. analyzed: when you want the content of the field to split into different words. It means you can search by word and not as a whole. Also, simplify every word, so you can find the root of the word like depends, depending will be converted to depend. sanitized: when you want to remove any HTML from a field. So HTML tags will be not available when you search. tokenized: when you want to convert the value of the field with some custom Liquid logic. Here you can take the content of the field and you can convert it using a Liquid filter and do some computation and so on. If you go to a created content item, you can see there is an option for Full-Text-Indexing in Liquid, that determines if this content type can use a customizable full-text index field by using Liquid. The Liquid template here is accessible in queries with Content.ContentItem.FullText. You can use the Model helper to reference the current element. This feature is still under development and hasn't available in the dev branch yet. Orchard Core updated milestones and Roadmap The milestones have been updated in GitHub of Orchard Core. There are more of them now: rc: we still have the rc for September 23. 1.0: now we have a 1.0 milestone for late October. 1.1: which means the next major release. 1.0.x: some bugs we need to fix that not blocking 1.0, but have to be fixed before a major release. backlog: good idea, will see when we can do that. Let's have a look at our Roadmap! On Lombiq Orchard Dojo Newsletter Now we have 91 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting! There will be no 'This week in Orchard' post next week because of vacation, so see you in two weeks!

This week in Orchard - 08/09/2019

Getting closer and closer to the release of .NET Core 3.0 and Orchard Core RC! What do we need to ship the new version and what are the newest features of Orchard Core? Find out now! On Orchard Core Updating YesSql In SQL server it was not working correctly if you pass the parameter as the limit value. You can do SELECT * FROM FOO @limit, where the @limit is the parameter. That will be converted to SELECT TOP @limit FROM FOO in SQL server, but that doesn't work. When you use a variable like this it needs parenthesis. Now every time when we render it in YesSQL, it's in parenthesis: SELECT TOP (@limit) FROM FOO.You can also find a xUnit test in the SqlParserTests.cs file, where the parameters of the InlineData attributes are also using parenthesis. Ability to extend/clear ContainedContentTypes Now if you want to update the ContainedContentTypes of the Container Part then you can do that. Before that, if you add a type it removes the old one. Now you can choose to merge it with the existing one. And by using the ClearContainedContentTypes extension method, you can also clear the ContainedContentTypes. Remove JSON specifier from GraphQL MD code blocks The documentation used the JSON highlighting for the GraphQL queries, which is the closest to a GraphQL query, but it's wrong. It could show some wrong colors, so now it's just doing nothing. A GraphQL query is not a JSON payload, just the result of the query. .NET Conf 2019 There will be the .NET Conf next month, which is a 3-day virtual developer event co-organized by the .NET community and Microsoft. Sébastien is submitting a talk about Orchard Core modularity and multitenancy. We hope that he will able to get a talk! On these days they launch .NET Core 3.0, which is the 23rd of September. A plan is to ship Orchard Core RC on the day after the .NET Core 3.0 and the builds are available. Upgrading an Orchard Core site that using .NET Core 2.2: it's non-breaking in terms of database or recipes and everything. We are just upgrading the APIs from 2.2 to 3.0. So, in theory, if we take a site that has been built with 2.2 and we just upgrade to the branch that using 3.0, then it should not change anything. The only thing it should change hopefully is the performance of the site because .NET Core 3.0 is much faster and use less memory than 2.2. The image of .NET 3.0 will also be available on Docker. To ship Orchard Core RC, we only need to have finalized all the things for localization. We have most everything we need, instead of the field syncing. Let's have a look at our Roadmap! You can see that everything is implemented from the backlog. Adding more localization packages will not be that hard, the repositories are already done for these packages. And we have PRs for almost every bonus features that listed in the roadmap. We also need to focus on every issue in GitHub that marked for RC and has a priority tag on it. A new website using Orchard Core Patient Access connects you to healthcare services when you need them most. Book GP appointments, order repeat prescriptions and explore your local pharmacy services. This site is running on Docker for Linux on Azure as an Azure Docker Service on Linux. It's based on GraphQL. For example, when you navigate to Pharmacy services and searching for healthcare services, then it's GraphQL. If you search for Hay fever treatments and using S66 as the postcode, the results that you got is returned by GraphQL. If you are interested in more websites using Orchard and Orchard Core, don't forget to visit Show Orchard. Show Orchard is a website for showing representative Orchard CMS (and now Orchard Core) websites all around the internet. It was started by Ryan Drew Burnett, but since he doesn't work with Orchard anymore, as announced earlier it is now maintained by our team at Lombiq Technologies. On Lombiq Orchard Dojo Newsletter Now we have 88 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 07/26/2019

The .NET Core 3.0 Preview 7 is here! So from now, the community can start working on to update Orchard Core to .NET Core 3.0 Preview 7. That will be a huge change, but it is one of the most important updates of Orchard Core RC. Read our post for more! On Orchard Core Vue.js use proper CDN Now the Vue.js using the proper CDN, which is jsDelivr. jsDelivr provides mirrors for npm, GitHub, WordPress plugins, and custom endpoints for several other projects with special requirements. We think it is the fastest CDN and it works in China also. Note that most of the CDNs don't work in China. <script asp-src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js" debug-src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js" asp-name="vuejs" at="Foot"></script> .NET Core 3.0 Preview 7 .NET Core 3.0 Preview 7 released this week. You can think about this release as the RC (Release Candidate) version of .NET Core because this was the latest version where the developers added new features to the framework. From now only bug fixes and minor changes will come until the GA (General Availability) of .NET Core 3.0, that is scheduled for September 2019. Now, let's check out the newest release of .Net Core 3.0 here! You can see that the new version support Visual Studio 2019 and .NET Core 3.0 should be used with the latest previews of Visual Studio. So, don't forget: if you try out .NET Core 3.0, use the latest preview of Visual Studio 2019. Other versions of Visual Studio 2019 are not recommended, but you can enable .NET Core SDK previews in Visual Studio. This article explains how can you do that. If you may not have heard: the community might ship the RC version of Orchard Core when the .NET Core 3.0 is shipped because it will be faster and will contain more features. So from now, the community can start working on to update Orchard Core to .NET Core 3.0 preview. That will be a huge change, but it is one of the most important updates of Orchard Core RC. ByTutorial mentioned Orchard Core ByTutorial is a place where you can read great articles mainly about tips & trick about web development both about back end and front end. A few days ago they wrote an article, where they published a list about 7 available popular open source .NET CMS's you can choose from and Orchard Core is one of them. You can read the post here! Adding IShellConfiguration documentation Orchard Core extends ASP.NET Core IConfiguration with IShellConfiguration. Understanding IShellConfiguration maybe not so trivial for the first time, so it's very helpful to make a documentation about it. Thanks to Dean Marcussen for the docs! On Lombiq Orchard Core demo in Singapore There was a meetup at March 15, hosted by .NET Developers Community Singapore, about Hastlayer, Posits, and Orchard Core, where three members of Lombiq gave sessions about the mentioned topics. In Benedek Farkas's presentation, you heard the summarized history of the Orchard project and got an introduction to Orchard Core both from a user's and a developer's perspective. In this presentation, you'll hear the summarized history of the Orchard project and get an introduction to Orchard Core both from a user's and a developer's perspective. And now the recording is available on YouTube! Check it out now! Orchard Dojo Newsletter Now we have 84 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 07/19/2019

New Media Library web search providers for Orchard 1.x, improved documentation, and demo about the ability to set localization cookie when using the Content Culture Picker in Orchard Core. Read our post for the latest news around Orchard! On Orchard 1.x Demos New Media Library web search providers If you navigate to the modules, you will see some new ones in the Media category: now you can have Bing, Google, and Pixabay web search providers! Let's enable them and see how you can use it. For any web search provider that you would like to use you need to have an API key and provide them to Orchard under Settings -> Media. Now head to the Media Library and hit Import. Then select Web Search from the list to get the Search text box and a select list near that. Here you can use those web search providers, that you have provided an API key for. For example, let's choose Pixabay. If you select one or multiple files and hit the Import button, the selected files will be downloaded and Orchard puts them in the folder you have previously selected. Thank you for the contribution to Milán Keszthelyi from Lombiq Technologies! On Orchard Core Role-based permissions to display admin menus In the following GIF, you can see two admin menus (admins only and contributors only). Their visibility is configured from the roles page. If you logged in as an administrator, you can see both, but if you are a contributor you can only see one of them. Being able to see an admin menu doesn't mean you can see everything inside it, of course, normal permissions still apply. For example, a contributor can see the link menu, but can't see the content types links if they don't have the right permissions for them. Consuming Content Parts and Fields using C# For a while now it's possible to get strongly typed versions of Content Parts and Fields using Orchard Core. Thank's to John Rom, he wrote great documentation about how you can do that! Demos Content Culture Picker - Add ability to set Localization Cookie Last week we wrote about the Content Culture Picker feature of Orchard Core. The Content Culture Picker module helps you to manage cultures for the frontend and now comes with two now options you can set. If you enable the Content Culture Picker module, you can head to Configuration -> Settings, where you will see a new option, called ContentCulturePicker. Here you can decide to set the localization cookie when switching between cultures (this is enabled by default) and to redirects to the homepage of the target culture if the ContentItem of the target culture does not exist. The documentation is also updated about how to set the cookie from the admin site of Orchard Core or by using a recipe step. On Lombiq Orchard Dojo Newsletter Now we have 80 subscribers of the Lombiq's Orchard Dojo Newsletter! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail every time when a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here!