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

Centralize the Indexing process, Remove Media files for a removed tenant when using Azure Blob Storage - This week in Orchard (20/06/2025)

This time, you can see a demo about centralizing the Indexing process and having a unified UI for managing Indexes and the Search Settings! But first, let's look at our other topics, like removing Media files for a removed tenant when using Azure Blob Storage, and adding RouteEndpoint cache. Don't forget that you can still fill out our Orchard Core Admin UI experience renewal survey to help shape the future of Orchard Core!

Latest tutorials

Featured tags

IIS
API
SMS
SEO
MCP
All tags >

This week in Orchard - 12/27/2019

New deployment step for Open ID Server, a new multi-tenant platform built with Orchard Core and a very interesting demo about a custom admin tree module with taxonomy terms menu are waiting for you among other exciting news in this year's last This week in Orchard post! On Orchard Core Allow replacing a Liquid filter Orchard Core has several built-in Liquid filters. You can make your own Liquid filter if you implement the ILiquidFilter interface. However, it could be a valid use case if you would like to change the behavior of one of the predefined built-in filters and replace it with your own one. When registering a Liquid Filter to the service container, you have to do it in the ConfigureServices method of your Startup.cs file: public override void ConfigureServices(IServiceCollection services){ services.AddLiquidFilter<BuildDisplayFilter>("shape_build_display"); services.AddLiquidFilter<ContentItemFilter>("content_item_id");} Here you can see how to register the shape_build_display and content_item_id filters. But let's have a closer look at that AddLiquidFilter extension method! public static IServiceCollection AddLiquidFilter<T>(this IServiceCollection services, string name) where T : class, ILiquidFilter{ services.Configure<LiquidOptions>(options => options.FilterRegistrations.Add(name, typeof(T))); services.AddScoped<T>(); return services;} You could see that every time when you call AddLiquidFilter it adds your filter to the FilterRegistrations Dictionary. To be able to override an existing Liquid filter with your own, Jean-Thierry Kéchichian had to change this extension method a little bit and instead of adding the new filter to this Dictionary, just overwrite an existing one. public static IServiceCollection AddLiquidFilter<T>(this IServiceCollection services, string name) where T : class, ILiquidFilter{ services.Configure<LiquidOptions>(options => options.FilterRegistrations[name] = typeof(T)); services.AddScoped<T>(); return services;} Delete role should warn the user if the role has associated users Let's create a custom role and let's name it Blogger. Now let's create a new user and add the Blogger role to it. Now go back to the Roles page and delete the Blogger role. If you hit the Delete button you will see a warning message, that says this role is associated to existing user(s). Prefix resource manager definitions for sample themes When you would like to register your resource using the ResourceManifest, you have to do something similar: manifest .DefineScript("vendor-bootstrap") .SetDependencies("vendor-jQuery") .SetUrl("~/TheBlogTheme/vendor/bootstrap/js/bootstrap.min.js", "~/TheBlogTheme/vendor/bootstrap/js/bootstrap.js") .SetCdn("https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js", "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.js") .SetCdnIntegrity("sha384-JjSmVgy...", "sha384-rkSXwmdF/9eRLkw/gNZG+1...") .SetVersion("4.3.1"); But what if you want to register Bootstrap again in your custom theme? You can do that of course, but when there are multiple resources with the same name, the resource manager takes the one with the highest version. // Use the highest version of all matchesif (resource == null || (resourceDefinition.Version != null && new Version(resource.Version) < version)){ resource = resourceDefinition;} To make things easier every predefined resource in the themes available in Orchard Core now has prefixes, which is the name of the theme. As you can see in the following code snippet, we registered the script for Bootstrap in the Blog theme with the name: TheBlogTheme-vendor-bootstrap. manifest .DefineScript("TheBlogTheme-vendor-bootstrap") .SetDependencies("TheBlogTheme-vendor-jQuery") .SetUrl("~/TheBlogTheme/vendor/bootstrap/js/bootstrap.min.js", "~/TheBlogTheme/vendor/bootstrap/js/bootstrap.js") .SetCdn("https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js", "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.js") .SetCdnIntegrity("sha384-JjSmV6OrQ6VrjIEaF...", "sha384-rkSGcqMuXXwmdF/9eRLkw/gNZG+1zYut...") .SetVersion("4.3.1"); Deployment step for Open ID Server Head to Configuration -> Features and enable the OpenID Authorization Server module. Then you will get a new OpenID Connect option under the Security menu, where you can set up the authorization server, application, and scopes. If you set up the server in a way (the way how it's not important right now) you can import the settings of your server if you create a new deployment plan under Configuration -> Import/Export -> Deployment Plans. If you select the OpenID Server step, that will export all the Open ID Server settings. Just execute the deployment plan locally. After if you open the Recipe.json file in the zip you will find a section called OpenIdServer in the steps section. "steps": [ { "name": "OpenIdServer", "OpenIdServer": { "AccessTokenFormat": 0, "Authority": null, "CertificateStoreLocation": null, "CertificateStoreName": null, "CertificateThumbprint": null, "AuthorizationEndpointPath": "/connect/authorize", "LogoutEndpointPath": "/connect/logout", "TokenEndpointPath": "/connect/token", "UserinfoEndpointPath": "/connect/userinfo", "GrantTypes": [ "authorization_code", "refresh_token" ], "UseRollingTokens": false } }] In the specific content type list only allow the creation of the new content item of the selected type In the admin page, you have a Content Types submenu under the Content menu, where you can list all of the content items. If you click on one of those (for example the Article) there was a green New button where you can create any type of content item that is creatable. Now with a new improvement, the UI responds to the type of the selected content type and (if the Content Type is marked as creatable) you can create only a new content item of the selected type. Here you could see the green button has a text: New Article. New multi-tenant Orchard Core platform GovBuilt has over 30 years of government software experience. They worked with government employees, contractors, and citizens to build a best-in-class online solution that streamlines the permitting and licensing process. They offer a GovBuilt Platform built for Government. And they are using Orchard Core to build their solution! They have several tenants, and https://pottcounty.govbuilt.com/ is one of that! Demos Custom Admin Tree module with taxonomy terms menu You can find a new module in this repository called ThisNetWorks.OrchardCore.AdminTree and a new theme here, called ThisNetWorks.OrchardCore.Themes. If you clone these repositories and add them to your Orchard Core solution you will see a new module under Configuration -> Fetaures called ThisNetWorks Admin Tree Menus. ThisNetWorks Admin Tree module displays content items based on a URL tree or taxonomy structure. This module presents a taxonomy and it's associated terms in a tree menu. The primary purpose of this menu is intended to provide a way to manage complex taxonomies, in combination with a navigation system that makes manages those terms, and content items easier. Let's enable this feature! Now go Design -> Themes and make the ThisNetWorks Admin Theme as the current theme. This adapts the default admin theme to support the menu's on the left sidebar to include clickable entries on tree nodes (i.e. nodes that contain child items can also contain a link to an entry). To be able to test the current capabilities of this solution quickly, you can use a recipe (Configuration -> Recipes) called Categories, that contains sample content items and taxonomy for a taxonomy menu tree. After you run this recipe you should see the following admin menu structure. Here you can see a Categories option with several sub-items. Categories is a taxonomy with the Category term content type and this admin menu shows you the structure of the Categories taxonomy in a clickable way. For example, if you select Motorbike, the site lists you all the content items that have this taxonomy and the category of that is Motorbike. If you click on the blue Create Leaf Article button you can create a content item that has a permalink and the Categories taxonomy will be set to Motorbike by default. Let's see what will happen if you click on the View button near the Articles content item, that is the root term content item of the Categories taxonomy. As you can see, users in the front-end can navigate between the different levels of terms and when navigating between the different content items, you can use different kinds of badges to show the terms and of course, the URL reflects this change as well. This feature is under development and we hope that this will be part of Orchard Core soon! If you are interested in this demo don't forget to check this video on YouTube! On Lombiq Orchard Dojo Newsletter Now we have 108 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!

This week in Orchard - 12/20/2019

Custom parameters support in recipes, new Retrieve Content task, improved Roles UI, a new post about Orchard Core, demos about the Open Tags and the headless recipe for Orchard Core! Should I continue? Many news is waiting for you in our current post and for closing, we would like to show you some nice pics about our Christmas event! On Orchard Core Custom parameters support in recipes From now you can set custom parameters in the appsettings.json file that can be passed and used in a recipe. As you can see in the documentation, you can access a parameter value like [js: configuration('CustomParameterKey')]. For this, there is a new ConfigurationMethodProvider that receives the ShellSettings and retrieve the value to replace by ShellSettings.ShellConfiguration["CustomPropertyKey"]. Add version and target framework variables in .props Hisham Bin Ateya refactored the Dependencies.AspNetCore.props file and created a new variable named AspNetCoreTargetFramework, which contains netcoreapp3.0. Now when there will be updates on ASP.NET Core we just only need to pick this up more easily. This will simplify the process when we need to update the AspNetCore version. Here is a snippet from the Dependencies.AspNetCore.props file: <Project> <PropertyGroup> <AspNetCoreVersion>3.0.0</AspNetCoreVersion> <AspNetCoreTargetFramework>netcoreapp3.0</AspNetCoreTargetFramework> </PropertyGroup> <ItemGroup> <PackageManagement Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="$(AspNetCoreVersion)" /> <PackageManagement Include="Microsoft.AspNetCore.Authentication.Facebook" Version="$(AspNetCoreVersion)" /> <PackageManagement Include="Microsoft.AspNetCore.Authentication.Google" Version="$(AspNetCoreVersion)" /> ... </ItemGroup></Project> And here is a snippet from one of the modules where we use the AspNetCoreTargetFramework variable: <Project Sdk="Microsoft.NET.Sdk.Razor"> <PropertyGroup> <TargetFramework>$(AspNetCoreTargetFramework)</TargetFramework> <AddRazorSupportForMvc>true</AddRazorSupportForMvc> </PropertyGroup> ...</Project> New Retrieve Content workflow task There is a new task called Retrieve Content that tries and evaluates a content item ID from a JavaScript expression if provided. Let's see a sample workflow that has this new task in it. Here we have an HTTP Request Event as a start activity that creates a blog post that has a DisplayText: My blog post using the Create Content Task when someone invokes the URL with a GET method. The Create Content Task sets the WorkflowExecutionContext.CorrelationId (the correlation ID can be used to resume workflows that are associated with specific objects, such as content items) with the newly created content item's ID. As we mentioned, the Retrieve Content Task accepts a JavaScript expression, so here we used the correlationId() method to get the ID. The Retrieve Content Task returns the content item by it's ID and sets the WorkflowExecutionContext.LastResult with the retrieved content item. Now by adding a Notify Task, we can use a Liquid expression to display the DisplayText property of the newly created blog post content item. Finally, make a redirect to the admin page using an HTTP Redirect Task to see the displayed notification. Using custom admin URLs There is a new AdminOptions defined in the OrchardCore.Admin.Abstractions module. It tries to configure the prefix of the admin URL from the configuration and then it's creating a property called AdminUrlPrefix that is by default admin. You can change the prefix for all the admin pages. All you need to do is to add the following section to appsettings.json inside the section called OrchardCore: "OrchardCore.Admin": { "AdminUrlPrefix": "dashboard"} When you are creating a route to your AdminController, don't forget to change the route template of your controller to use this prefix like in the following snippet, which code can be found in the OrchardCore.AdminMenu module. public override void Configure(IApplicationBuilder builder, IEndpointRouteBuilder routes, IServiceProvider serviceProvider){ // Menu var menuControllerName = typeof(MenuController).ControllerName(); routes.MapAreaControllerRoute( name: "AdminMenuList", areaName: "OrchardCore.AdminMenu", pattern: _adminOptions.AdminUrlPrefix + "/AdminMenu/List", defaults: new { controller = menuControllerName, action = nameof(MenuController.List) } ); ...} Roles UI and default description We have role descriptions, but the default roles don't have any descriptions. This opens a great opportunity to improve the UI of the index and the edit pages of the Roles. In the index page, you can find the description of every role under its name and the Search box with a new UI. When you add a new role you can set its name and description. And when you edit an existing one, you can also edit its description. Here you can also find some hints about what is the difference between the Allow and Effective permissions. New post: Lucene, GraphQL and Orchard Core Sipke Schoorstra has published a nice article again in medium.com to guide people on how to implement Search using Orchard Core, Lucene and GraphQL. Read his interesting and easy to follow article about how to enable Lucene, set up a Lucene Query and consume the available APIs from Postman using Lucene and GraphQL, allowing us to use a consistent API from our applications. Demos Orchard Core headless recipe The idea of the headless recipe is to provide a recipe that sets up GraphQL, queries, and everything that has an API interface and restrict the interface down a little bit. The recipe has no home page, so when you set up your site using the recipe, you will see the login page first. And in the admin page, you will see only those options in the menu, that are related to the API interfaces. You can also watch a great detailed demo on YouTube about what will you get if you install your site using the headless recipe! Orchard Core Open Tags Last month you could see a great demo about how to work with tags using taxonomies in Orchard Core. Here we mentioned that when you add a taxonomy field to a content type with a Tags editor type and you type something in the field, you can't create a new tag that should be added to the list of tags, because that feature was under development that time. Now thanks to Dean Marcussen this is not an issue anymore. Let's see how he solved this problem! We have a site with the Blog recipe installed. Add a taxonomy field called Tags to the Blog Post content type using a Tags taxonomy with a Tag content type that has just a simple Title Part. Here use the Tags editor type with the Tags display mode. And here you could notice a new checkbox, called Open. As the hint says, if you put a tick here, you can create tags inline when editing or creating blog posts. Put a tick here and let's edit the predefined blog post! When typing something in the Tags editor and hit enter (or just click on it), you can add new tags to the Tags taxonomy and to this blog post as well. If you edit the Tags taxonomy using the dashboard you will see that the new tag has been created and the title of that tag is the value that we have just entered when editing the given blog post. If you checked the editor of the blog post well you could see that there is a section called Category with two radio buttons. But what are these for? The Category is also a taxonomy field added to the blog post with the standard editor and display mode. It uses the Categories taxonomy with the Category content type as the term. But this time the content type that is used as a term is not just about having a Title Part, but it also has a Text Field with an Icon picker editor. This means when you add Category term content types to the Categories taxonomy you can also set an icon for this term. And if you override this shape using a Liquid template or a Razor view, you can display the Font Awesome icon near the name of the term! You can also watch a nice demo on YouTube about the Open Tags for Orchard Core! On Lombiq Orchard Nuggets: How to use the same version of Orchard Core NuGet packages in every project across my solution? You have your own ASP.NET Core project that using Orchard Core NuGet packages, but every time when you update them you have to do it one-by-one across the whole solution? In our second Orchard Nuggets post, we show you a way how to update the packages easily! Check out the other posts for more such bite-sized Orchard tips and let us know if you'd have another question! Christmas in Lombiq Sometimes we do stuff. Together. Not (just) in front of computer screens. These are some usual events in Lombiq that are all announced and arranged in advance. We periodically have an event called RnDay: this is a few hours long event where we share with each other what we recently worked on and what we plan to do. E.g. if we recently finished a project then the project's team members demo what they've done. Last week we had our last RnDay for this year in the Loffice Budapest, which is a coworking office with an event space where we held this event. And at the end of the day, we visited a nearby restaurant to have dinner together. We would like to thank you all for reading our posts and making the Orchard community stronger together with us! We hope that we could give you valuable news and demos about the happenings around Orchard and Orchard Core from time to time by reading our posts and of course the This week in Orchard newsletter. We would like to wish everyone a Merry Christmas with some photos of our latest event! Orchard Dojo Newsletter Now we have 109 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 - 12/13/2019

Improving user management by having a way to log in users without password during external login and be able to disable users in Orchard Core. Brand new look for the Flow editor UI and fix the accessibility issues in your Orchard Core site using Accessibility Insights for Web! Oh, and our improved Avatars Orchard module is waiting for you in our post! On Orchard Core External Login registration without password Navigate to Login Settings page by heading to Security -> Settings -> Login from the admin UI. Here you will see a brand new page with several options. Let's see what are these for! Use external provider for login: if only one external provider is defined and this option is checked, the external provider is automatically challenged. Disable local password login: prevents users from logging in with their local credentials. Only external providers are displayed in the login screen unless the above option is set. Use a script to set user roles based on external provider claims: if checked, the above handlers are not invoked and instead the script executes. Here we have to mention the IExternalLoginEventHandler interface, with the UpdateRoles and GenerateUserName methods. Any module can define logic to perform the mapping and generate usernames. And take a look at the UserLoggedInEvent workflow event too! The event is triggered after the above logic and provides the username, the roles, the login provider and the external claims as Input. If the login was for the local users, the login provider and the external claims are null. If you enable the Users Registration module you can find a Registration Settings page under Security -> Settings -> Registration. Let's see what you can set on this page! Configure users registration: define if new users are allowed to register. Use a script to generate userName based on external provider claims: if not selected, when a new user is registering, the registered IExternalLoginEventHandlers are invoked in order to provide a username. If more than one handlers are defined, the first one wins. If you use a script to generate the userName, the above handlers are not triggered. Do not ask username: if checked, no user name is requested in the registration form. Do not ask email address: if checked, no email address is requested in the registration form. Do not create local password: if checked, no password is requested in the registration form. If all of the above is true, no registration form is displayed to the user. Disable a user account Now you have the ability to disable a user account. When you navigate to Security -> Users and hit Edit near one of the users, you will see a new Is enabled? switch that you can uncheck to disable the given account. Now when you list the users you will see a little red badge with a Disabled text near the user that is disabled. But what that really mean? With a disabled account, users can' log in to the site. If they want to log in they will face the following error message. New blog post: Orchard Core, Open ID, and GraphQL Sipke Schoorstra published a new blog post about how to invoke Orchard Core’s GraphQL API endpoint using Postman. His objectives are to: Expose a GraphQL endpoint from Orchard to allow content querying. Invoke the GraphQL endpoint from a client application. This could be plain vanilla JS, Angular, React, Blazor, and so on. He's just gonna use Postman to try out the GraphQL endpoint. Once that works, he can do it from any other client application. Read his post for a long and interesting journey to learn about these features! New Orchard Core site Borne out of a passion for travel, and a belief that bridging cultures can only happen with global mobility, flyEgypt started operations in 2015 as a small but ambitious charter airline. Their website is now live, including a comprehensive help center and online booking and payment functionality. And they are using Orchard Core! 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. Demos Flow editor UI improvements Set up your site using the Blog recipe. This recipe contains a Page content type with an attached Flow Part. Let's create a new page using the admin UI. Here you will see a brand new UI when editing the Flow Part of the page. You will see a blue line with a plus sign and an arrow of the center of it. Clicking on these you can add new widgets to your Flow Part by choosing them from the context menu. If you hover over your newly added widget you can set the alignment and the percentage of the item just like you can do it before. If you add a new widget that can contain other items (for example a Container) you can hover over the body of the widget and use the blue line inside it to populate it with other new content! You can also watch a great detailed demo on YouTube about the Flow editor UI improvements. Find and fix the accessibility issues in your Orchard Core site using Accessibility Insights for Web Accessibility Insights for Web is an extension for Chrome and Microsoft Edge Insider that helps developers find and fix accessibility issues in web apps and sites. The tool supports two primary scenarios: FastPass is a lightweight, two-step process that helps developers identify common, high-impact accessibility issues in less than five minutes. Automated checks: the tool automatically checks for compliance with approximately 50 accessibility requirements. Tab stops: the tool provides clear instructions and a visual helper that makes it easy to identify critical accessibility issues related to keyboard access, such as missing tab stops, keyboard traps, and incorrect tab order. Assessment allows anyone with HTML skills to verify that a web app or web site is compliant with Web Content Accessibility Guidelines (WCAG) 2.1 Level AA. Automated checks: the tool automatically checks for compliance with approximately 50 accessibility requirements. Manual tests: the tool provides step-by-step instructions, examples, and how-to-fix guidance for approximately 20 tests; many tests are "assisted", which means that the tool identifies the test instances or provides a visual helper. If you add this extension to Google Chrome, you will see a new dark blue heart icon with a magnifying glass at the right top corner of your browser. If you click on it and select the FastPass option, you can check for common issues of accessibility. If you try it on the admin page, you will see some red exclamation marks that show you some common accessibility problems such as missing or invalid properties. For example, you could see a message that Buttons must have a discernible text. If you click on one of those red exclamation marks you will get a longer explanation of what is the issue with the given item. It says fix one of the following from the list and there are many ways to fix the issue. The issue is that we have a little expand here, which is a button without a text. If there is a button without a text, people with disabilities would not be able to see what the button does, so we need to fix that. Let's use the aria-label attribute to fix the issue. <button class="btn-nostyle" aria-label="expand"> <span class="collapse-icon"> ... </span></button> By going through these failures you can detect and fix the accessibility problems on your site. You can also watch a great detailed demo on YouTube about how to use the Accessibility Insight for Web in your Orchard Core application. On Lombiq The first Orchard Nuggets post Instead of lengthy tutorials short question-based blog posts on Orchard Dojo about solving specific Orchard problems can be very useful for community members as a learning resource. An Orchard Nuggets blogpost's topic is a single question on how to achieve something in Orchard (be it 1.x or Core) and it focuses solely on an answer to this question. The topic can be not just about development questions but user-facing features too. In our first post, we wrote about how to register your content part in the service container. We have many topics to write about but we are happy if you'd have questions about Orchard and Orchard Core that we can write about! Improving our Avatars Orchard module The aim of our Avatars Orchard module is to bring avatars to the platform. This week we have added two new features to this module: Piedone.Avatars.Blogs: adds Avatars to Blog Posts in Detail view. Piedone.Avatars.Comments: adds Avatars to comments from logged in users. If you enable both of them, the Avatar Part will automatically be attached to the Blog Post and Comment content types to present the avatar of the author user if any. We updated this module in Orchard Dojo too, if you check the screen of the first Orchard Nuggets post you will now see the name of the author and the avatar of the author under the title of the blog post. Thanks for the great contribution to Gábor Pór from Lombiq Technologies! Orchard Dojo Newsletter Now we have 108 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 - 12/06/2019

New domain for the home page and the documentation of Orchard Core! New list query helpers, updated documentation, designing the admin UI of Orchard Core and many more are waiting for you in our upcoming post! On Orchard Core Potential fix for disabling core modules There were some modules in Orchard Core that if you disable you break your site. For example, if you disable the OrchardCore.Recipes module, you will face with a message:InvalidOperationException: Unable to resolve service for type 'OrchardCore.Recipes.Services.IRecipeMigrator' while attempting to activate 'OrchardCore.Menu.Migrations'. But you will see errors if you disable the OrchardCore.Settings, OrchardCore.Features or OrchardCore.Scripting modules too. From now you can set the IsAlwaysRunning property to true in your FeatureAttribute or ModuleAttribute to make sure your feature can't be disabled. Let's see the content of the Manifest.cs file of the OrchardCore.Features module, where you will see the new IsAlwaysEnabled boolean. [assembly: Feature( Id = "OrchardCore.Features", Name = "Features", Description = "The Features module enables the administrator of the site to manage the installed modules as well as activate and de-activate features.", Dependencies = new [] { "OrchardCore.Resources" }, Category = "Infrastructure", IsAlwaysEnabled = true)] Now if you head to Configuration -> Features and search for a module that is not allowed to disable, you will see that the red Disable button is missing near that module. New list query helpers There are two new helpers and filters to list the items of a List Part. The two news Orchard helpers are: QueryListItemsAsync: returns the enumerable of list items satisfying given predicate. QueryListItemsCountAsync: returns the number of list items satisfying given predicate. These helpers have their corresponding Liquid Tags as well, which are the following: list_items: the list_items filter loads published list content items for given ContentItem object or explicit ContentItem ID given as a string. list_count: the list_count filter counts published list content items for given ContentItem object or explicit ContentItem ID given as a string. Including Azure Active Directory recipe step and updating the documentation When you are using the Azure Active Directory, you have to set up several things, like the Application ID or the Callback Path. Now you can set those with several other ones during recipes using the settings step. In the documentation, you will find a sample of how you can do that. New UI for queries, admin templates, and templates The work continues on unifying the admin UIs of the admin pages of Orchard Core. This week Antoine Griffard designed the queries, templates, and admin templates pages to have a consistent look. The queries page has no select all option because there are no bulk actions on that one yet. Naming convention on NuGet.org When you create your own third party package for Orchard Core you can publish it to NuGet.org anytime you want. When uploading your package you have to give it a speakable name. Users probably will type the Orchard Core keywords to find packages that contain modules or themes that can be used with Orchard Core, so that could be a good way to include the OrchardCore word in the title of your package. But if you name your package OrchardCore.MyAwesomeFeature how would the users know that which packages are the official ones for Orchard Core and which are the modules that are provided by other developers? To solve this problem Sébastien Ros reserved the OrchardCore ID prefix. So when you navigate to NuGet.org and search for OrchardCore, you will find a blue tick near some packages. These packages are the official ones with the hover text: "The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.". The recommendation is to suffix your package with OrchardCore. For example, the name of the Disqus module in NuGet is Disqus.OrchardCore. You can also have a tag containing Orchard Core to add to your package. There could be documentation about how to create and publish your own module to NuGet.org. This documentation could contain the naming convention too, therefore the packages in the future could have the convention mentioned above and be consistent across NuGet.org and can be easily identified as a third-party module. New orchardcore.net domain You can reach the Orchard Core Documentation under the https://orchardcore.readthedocs.io URL and the official website of Orchard Core under the https://orchardproject.net address. The goal is to have a more unified experience for the users when they are meeting with Orchard Core browsing the online space. Therefore the community has bought a new domain for every content related to Orchard Core. First of all, the official website of Orchard Core is now accessible under the http://www.orchardcore.net address. But that's not everything! This site was a simple static site, but from now this site is powered by Orchard Core! This comes with a whole lot of new opportunities, for example, to fill the site with additional content like blog posts and other news around Orchard Core. And if there is a new domain let's use it for other purposes too! Now you can also reach the documentation of Orchard Core by visiting the http://docs.orchardcore.net URL. This site has the same content as https://orchardcore.readthedocs.io, but it's easier to remember and placed under the orchardcore.net domain. On Lombiq Extended title for This week in Orchard One of the main goals of This week in Orchard posts to give you updates and news about the different kinds of features and improvements of Orchard 1.x and Orchard Core. For now, we have more than 60 posts containing useful information that could be helpful (we hope so) for the developers and any others who are interested in working and using Orchard in the future. To find the information you need you to have to search for different keywords. That's why we are thinking about changing the titles of our This week in Orchard series by adding some keywords about highlights in the title of the posts and newsletter subjects. What do you think about that? Could it be helpful for you in the future? Please help us and tell your opinion on this Twitter poll! Orchard Dojo Newsletter Now we have 106 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 - 11/30/2019

Fixing and improving Orchard Core for the upcoming 1.0 release. One of the main focuses is on every admin page that has a list with filters and/or bulk actions, use the same UI. With that, the users will get a better user experience by the unified UI. And don't forget to check out the Swagger demo! On Orchard 1.x Cannot insert duplicate key in object dbo.Settings_ShellFeatureStateRecord The feature names are compared without ignoring the case in EnableFeatures (with 's') and DisabledFeatures (with 's'). It causes Violation of UNIQUE KEY constraint 'UC_SFSR_SSRId_Name'. Cannot insert duplicate key in object 'dbo.Settings_ShellFeatureStateRecord' error when there is a module that has the same name but lower case in Settings_ShellFeatureStateRecord table and/or Settings_ShellFeatureRecord. featureState.Key.Id.Equals(fId, StringComparison.OrdinalIgnoreCase) has been used in the EnableFeature (without 's') so the fix is to use the same code for EnableFeatures and DisabledFeatures. On Orchard Core Register content definition models for Liquid When using Liquid, you could do something like this: class="tags {{ Model.PartFieldDefinition.Name | html_class }}" But this returns nothing because the ContentPartFieldDefinition and other associated models haven't been registered for use with Liquid. The fix is to just register the missing models in the Startup.cs file of the OrchardCore.Liquid module. Discarding the draft of a content item removes the published one from the indexes We had a weird error in Orchard Core. Let's say you add and publish a blog post. Now edit and save it to have a published and a draft version too. Then do a DiscardDraft on it, so we only have the published version left. Now if you run the BlogPostsQuery (that comes from the Blog recipe) we can see that it is no more indexed. To fix this try to rebuild the index, but the blog post is still not indexed. The reason is that because when discarding a draft we trigger a removed event then if there is a published version we set it to be the latest and we set the context.NoActiveVersionLeft to false. Now it has been fixed. Register missing Steps in Startup You have to implement the IRecipeStepHandler interface if you want your recipe step to be processed. Each implementation is responsible for processing only the steps that it targets. After you can use the AddRecipeExecutionStep extension method to register your implementation to the DI. We have recipe steps for the GitHub authentication settings, Facebook, Twitter and Microsoft Account settings too. These interfaces haven't registered to DI, so now, if you check one of the startup files, you will see the new lines in each file. New Indices UI If you have the OrchardCore.Lucene feature enabled, you can head to Search -> Indexing -> Lucene Indices page, where you will meet with a brand new UI for indices. New Users UI Now the Users page also supports bulk actions. Here you can see that you can select multiple users at a time and approve or delete them in a bulk. Workflows UI and Bulk Actions As you can see, the goal is to unify the admin pages in Orchard Core. In the Workflows page you can now also have the ability to do bulk actions: select two or more workflows then delete them in just one click using the Actions dropdown! Elsa Workflows 1.1.3 released Elsa Core is a workflows library that enables workflow execution in any .NET Core application. Workflows can be defined not only using code but also as JSON, YAML or XML. Last week Elsa Core 1.1.3 released including the classical MassTransit ShoppingCart example, implemented as an Elsa Workflow (with MT activities). Both Orchard and Orchard Core ship with a powerful workflow module and both are awesome. In fact, Elsa Workflows is taken & adapted from Orchard Core's Workflows module. Elsa uses a similar model, but there are some differences: Elsa Workflows is completely decoupled from the web, whereas Orchard Core Workflows is coupled to not only the web but also the Orchard Core Framework itself. Elsa Workflows can execute in any .NET Core application without taking a dependency on any Orchard Core packages. Demos Swagger module for Orchard Core When you navigate to Configuration -> Features you will see two new modules: OrchardCore OpenApi documentation generation: enables OpenApi documentation generation of the OrchardCore APIs. Swagger OpenApi documentation: enables the Swagger endpoint for displaying OpenApi documentation. When you enable the first one you will have the OpenApi documentation generation for the APIs of Orchard Core. Swagger is a set of open-source tools built around the OpenAPI Specification that can help you design, build, document and consume REST APIs. If you enable the second module too, you could Swagger by just simply using the /swagger URL in your Orchard Core site. If you want to see the full demo about how to use Swagger with Orchard Core check out the video too! This feature is under development and you can see the current state of the module if you check out on this branch. On Lombiq Orchard Dojo Newsletter Now we have 106 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 - 11/22/2019

This week the community behind Orchard Core was soo productive again, that means we can ship you a lot of news around the CMS. You could read about the new UI for tenants, an updated Trumbowyg editor, updated script and style tag helpers and a nice demo about how to add tags using taxonomies! On Orchard Core Insert image in HTML instead of Liquid in the WYSIWYG editor In the past, when you insert an image using the HTML editor, it adds Liquid code. It can be a bit weird for some users that they would expect to be able to see the image in the WYSIWYG editor. The only advantage seems to be that it will resize the image to the expected size, but we are losing something important for "standard" users. A relatively low-risk option would be to render the media URL with the prefix only. The only case it would break the site is if the production instance uses a different prefix. The best solution would be to add a setting in the editor to either render media as img tags or Liquid tags. This way the end-user won't have to make the decision, and the admin knows how the site is published. To show you how this setting works, let's set up a site with the Blog recipe and edit the Blog Post content type. Add two new HTML Fields to it with the Trumbowyg editor type. For the second one, put a tick in the Insert Media with URL checkbox. Now upload an image to the Media Library then create a new Blog Post. Insert the same media item to both HTML fields and view the HTML of the fields. You could see that by default the Liquid tag is used to insert the image. In the case of the second HTML Field, you could see the img tag is used and when editing the content of the field, you could see the rendered image. Add view button to media app grid and field container The media app always appends ? to the query string, when building resized thumbnail URLs. With a custom secured blob media file store, in a project, this causes the query string to be built badly. This means the attached media field thinks the file doesn't exist, so tries to delete it every time. Dean Marcussen removed the cache busting support, but kept the check for an existing query string in the media app, this check fixes an issue using a custom secure Azure Blob implementation that appends a blob secure access key to the media URL. And there is a new View button to the media grid to each media library item in order to preview the file and easily copy the URL. Tenants new UI The Tenants page has a new UI based on the content items UI. You have quick filters to show only the running tenants, only the disabled tenants or only the uninitialized tenants. You can filter the tenants by the state or sort them by name or state. You can also disable or enable multiple tenants in a row. Prevent ConnectionResetException on SelectedContentType change Sometimes there was a ConnectionResetException when changing the content type selection under the content items index page. It doesn't stop the app but errors are logged. Microsoft.AspNetCore.Connections.ConnectionResetException: 'The client has disconnected'0x800704CD "An operation was attempted on a nonexistent network connection." It was first failing in FormValueRequiredMatcherPolicy and Jean-Thierry Kéchichian could fix it by checking httpContext.IsRequestAborted but then it was failing elsewhere in Asp.NET Core. We need to commit the following changes to fix the issue: Removed an event that seems to be never triggered. Then, when changing the content type selection, he kept the update of the action attribute but he removed the form submission that seems to be done in the following event. So he thinks the form was submitted twice and we were processing the second one while the page was refreshing on the client-side. Allow script/style tag helpers to add dependencies Now you have the ability for the script and style tag helpers to add to the dependencies defined on a ResourceManifest. A lot of the script tags uses depends-on="admin" for no good reason. However, that doesn't work when the resource is registered with a ResourceManifest. A ResourceManifest can set its own dependencies, but until now a script tag helper cannot add to them. It makes sense that a resource manifest entry should define its own dependencies, however not being able to add to them is confusing (and has led to some 30-40 entries using depends-on="admin" in the Orchard Core Razor code, that are useless currently). The best actual use case for wanting to add to dependencies on the fly is for the bootstrap-select. It's manifest depends on jQuery which is good, but it also needs Bootstrap. But Bootstrap is compiled into the admin.js. So the manifest can't refer to that, or it will fail when used elsewhere without the admin. So it makes sense to define the admin dependency on the fly. Noting that it currently works, in the correct order, because the jQuery dependency also exists in the admin, and it gets lucky. Demos Tags using taxonomies We don't have a tags module in Orchard Core that is using taxonomies. The decision has been made that the community wants to have a tags module that will use taxonomies. The idea is to use taxonomies in a way to create a custom editor for the taxonomy that would just reflect something like a tags editor and store the taxonomy terms as any other taxonomy fields. There are pros and cons for both solutions using taxonomies for tags and not using taxonomies for tags. Pro: Reusing what we already have. Con: Might be the performance, because we store term IDs, instead of storing the data, but there are ways to optimize that by also storing the data we want as a tag. Let's set up a site using the Blog recipe. Head to Configuration -> Features and enable the Taxonomies module. Then create a new content type and call it Site Tags. For now, only add the Title Part for this content type. Go ahead and create a new Taxonomy called Site tags and select the previously created content type as the term content type. Finally, add some sample term content types to this taxonomy. Now edit the definition of the Blog Post content type and add a Taxonomy Field to it. Edit that field and see that here you can select the Tags editor type to use. Now create a new blog post or edit an existing one. Here you can see that we added two taxonomy fields to the blog post, one with the standard editor (called Taxonomy) and one with the tags editor (called Tags). When adding tags, the green background shows that the selected tag hasn't been selected yet and the red background shows that the tag has been already added to the list. If you type something you can create a new tag that will be added to the list of tags (under development, but will be available soon). This feature is still under development, but you can check the progress in this branch. And if you checkout to the latest commit of this branch and set up your site using the Blog recipe you will find that the blog posts have a taxonomy field attached with the tags editor using some sample tags. Furthermore, the styling of the tags has been added too! It's a great sample for you to show how to add styling to your tags! If you want to see the full demo of using tags check out the video too! On Lombiq Poll to upload recordings of demos in separate videos as well Last week we created a poll on Twitter about uploading the recordings of demos from the weekly meeting in separate videos as well, so they can be found easier. We had 24 votes and everyone said that you want us to upload these demos separately. :) So from now, if you check the playlists of the YouTube channel of Lombiq you will find a new one, called Orchard Core Demos. Every new demo will be added to this playlist and the name of the video will be {name of the demo} - Orchard Core Demo. And (as you could see) from now we embed the recordings of the demos in our This week in Orchard posts too. Searching for performance-intensive codes 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! Orchard Dojo Newsletter Now we have 103 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 - 11/15/2019

This week we would like to show you two demos about the newest features of Orchard Core. First, you can take a look at the brand new content items UI, then we will dive a bit deeper and try out the new Trumbowyg editor for the Text Field and the HtmlBody Part. And of course, the discussion continues about the next Harvest! On Orchard Core Filter Features dependencies When you navigate to Configuration -> Features you have the ability to enable or disable the different features. To find the feature you want easier you can use a filter here and can type the name of the module. This filter only sort by the name of the feature. From now this filter checks for the different dependencies too! For example, if you type localization, you could see the Content Culture Picker in the list, because this module has dependencies with names like Content Localization or Localization. Harvest Core 2020 Sipke Schoorstra has connections in Nice and Miami, so that would be easier to organize the next Harvest one of these cities. Nice is in Europe, but Miami is warmer and easier to travel there from Europe because it's on the East Coast. The two possible dates are February and April, but the weather is not the same in these cities. If we do it in April, Nice would be the better option because of the weather. Miami is warmer in both months, so that wouldn't be an issue. Stay tuned for more information about the next Harvest! Demos New content items UI Now when you enter the admin site and go to Content -> Content Items, you will see a brand new UI. Under the Content Type dropdown, you can filter the items based on the selected or the typed type. You can filter the items by their status using the Show dropdown. And lastly the Sort dropdown is responsible to order the items by title, recently created, recently modified or published. If you select more than 1 item, you will see a new dropdown, called Actions, instead of the dropdowns we mentioned above. By using the Actions, you can publish, unpublish or delete the selected items. Lastly, we would like to mention the Filters dropdown near the textbox that has the Search all content items placeholder text. By using this you can filter the list by showing only the draft items, only the published items or the items owned by the logged-in user. Adding Trumbowyg editor for TextField and HtmlBody Let's set up a site using the Blog recipe. This recipe contains an Article content type. If you edit the definition of the Article under Content -> Content Definition -> Content Types you will see the attached HtmlBody Part. Hit Edit near it and select that you would like to use the Trumbowyg editor type. Under the editor options you can explicitly set the config you want to use, for example, which button you want to add to the toolbar. If you navigate to the OrchardCore.Resources module and check the content of the Assets folder, you will see the files that needed for the Trumbowyg plugins to work. Therefore you can use every existing plugin that is described on this page. Trumbowyg has a lot of plugins that you can use to customize your editor. Now let's add some new buttons to the editor! We will use the emoji, the giphy, and the font family plugin. All you need to do is to extend the btns section of the editor options like this: btns: [ ["viewHTML"], ['emoji', 'giphy', 'fontfamily'], ["undo", "redo"], ["formatting"], ["strong", "em", "del"], ["foreColor", "backColor"], ["superscript", "subscript"], ["link"], ["image"], ["align"], ["unorderedList", "orderedList"], ["horizontalRule"], ["removeformat"], ["fullscreen"]], plugins : { giphy: { apiKey: 'N5OwBrzBjP8nXXaFdv1TvVwZ82DWNUSz' }} Here you can see that the three new buttons will be placed after the View HTML button and will be near each other without a separator. The buttons you define in the same square brackets will be in one group. You could also see that we added a new section here, called plugins. Here you can define the options that needed for the different plugins. For example, to use giphy, you need to have an API key that will communicate with GIPHY. If you navigate to the Dashboard on the GIPHY Developers page you can create a new one by clicking on the Create an App button. Now you have successfully set up the editor options. It's time to create a new Article! Notice the three new dropdown buttons near the View HTML button and use them to create your awesome article! Another nice stuff is the template plugin, that manages a set of HTML templates to insert fast. In these options we only define the templates plugin with two options: { btns: [ ["template"] ], plugins: { templates: [ { name: 'Lorem ipsum', html: '<p>I am a Lorem ipsum template</p>' }, { name: 'Lorem ipsum 2', html: '<p>Another Lorem ipsum template</p>' } ] }} In this case, the editor will look like the following, where if we select the Lorem ipsum 2 option, the following HTML content will be injected to the editor. The same works for HTML Field too. If you add a new HTML Field to your content type and set the editor to Trumbowyg editor, you can define the editor options and you will get a customized Trumbowyg editor. On Lombiq Upload recordings of demos from the weekly meeting in separate videos We have an idea to upload recordings of demos from the weekly meeting in separate videos as well, so they can be found easier. To help us decide please visit our Tweet and choose from the following options: Good, I look for demos! Good, but don't need it. Bad, why more videos? Another idea, see reply! Searching for performance-intensive codes 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! Orchard Dojo Newsletter Now we have 102 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 - 11/08/2019

Orchard Core has a brand new redesigned admin menu to help you find the settings you want easier. The CMS gets a lot of new improvements and fixes from time to time and it's time to start a discussion about releasing version 1.0. And now it's time to organize the next Orchard Harvest! Would like to know more? Then don't hesitate, check out our latest post with this week's news! On Orchard Core Add UI for PageSize You can edit the setting named PageSize that exists for a time ago, but there was no UI for it. This setting should be used when using pagers so that users can define how many items they want to see on the page. Rename Default into Current in Themes It could be quite confusing that the currently active theme is called Default on the admin UI. It's not something that would be enabled by default (since setup recipes decide this) and it's not a fallback in case of no other theme either since that's the Safe Mode Theme. So from now the new name of the Default theme is Current theme. Just head to Design -> Themes to see the changed interface. Adding token expiry for GlobalMethod and documenting scripts There was an issue with the lifetime of the workflow token. Now when you don't specify the lifetime of the workflow token you will get the value of the NoExpiryTokenLifespan variable in days, which is 100 years. Here you can see the updated code using the mentioned NoExpiryTokenLifespan variable. public class TokenMethodProvider : IGlobalMethodProvider{ private readonly GlobalMethod _createWorkflowToken; public TokenMethodProvider() { createWorkflowToken = new GlobalMethod { Name = "createWorkflowToken", Method = serviceProvider => (Func<string, string, int, string>)((workflowTypeId, activityId, days) => { var securityTokenService = serviceProvider.GetRequiredService<ISecurityTokenService>(); var payload = new WorkflowPayload(workflowTypeId, activityId); if (days == 0) { days = HttpWorkflowController.NoExpiryTokenLifespan; } return securityTokenService.CreateToken(payload, TimeSpan.FromDays(days)); }) }; } public IEnumerable<GlobalMethod> GetMethods() { return new[] { _createWorkflowToken }; }} And now you can find documentation for the javascript methods that are available in workflows for instance. When to ship Orchard Core 1.0? If you check the .NET Core Roadmap, you could see that the release of .NET Core 3.1 is scheduled for December 2019. The suggestion is to ship Orchard Core 1.0 with this version of .NET Core because there won't be any update until the .NET 5.0 and this way the community could align the same way as did when released Orchard Core RC. It gives the community one month to polish and merge missing PRs. This way there will be no need to reupdate when 3.1 is released. Starting the discussion about the next Orchard Harvest We will have a 1.0 soon and we already have the RC of Orchard Core. The community decided to organize the next Harvest if Orchard Core reaches a state that we can show at the conference. Now it's time to show the new framework by workshops too to learn the features of the new version. The suggestion is to make it happen in February or April of 2020. Let's do it probably in Europe because the last time it was in the United States. There are some options like Hungary, Italy, Greece, Spain or England. So, let's come back to this topic later and keep up the discussion! Building Workflow Driven .NET Core Applications with Elsa Sipke Schoorstra decided it was about time to take Orchard Core’s workflow engine and philosophies and turn it into a reusable, .NET Standard library, enabling any .NET application to enjoy the power of workflow. In this huge and informative post, he introduces Elsa, an open source suite of .NET Standard libraries and tools that enable developers to implement long-running workflows. The core philosophy of Elsa is to be able to connect small executable units with one another, allowing you to orchestrate real business processes such as document approval, customer on-boarding and order fulfillment processes. Following the guide "Creating a new decoupled CMS Website" live on Twitch Davin Davies a.k.a. copperbeardy decided to follow the guide called Creating a new decoupled CMS Website and broadcasting it using a live stream in Twitch. He tried to follow it once at the end of October, that session was very useful to fix and update the documentation and in some cases the code to be able to follow that with the latest changes of Orchard Core. Check out his second stream about following that guide again to create a decoupled site! Demos New Admin menu Here you can see the admin menu of Orchard Core if you enable every feature. Some of them don't have many sub-items, for example, the Content has only two (Content Items and Assets), and some of them have quite a lot. If you check the Configuration option, there are 13 sub-items. And at the bottom of the screen, you could see that every authentication provider has its own entry instead of grouping them in a section something like Authentication. There was a suggestion to reorganize the admin menu to make it cleaner that could make it easier to find the options you want. That could be a good point for the new structure to use the same setup as we used when updating the documentation. If you open the docs and click on the Key Topics, you could see a menu in the left with the following points: Manage your Content Customize the Display Localize your site Handle the Media Navigate between pages Query and Search data Secure your application Workflows When you update to the dev branch of Orchard Core you will face with the new, redesigned admin menu. Let's see what will you see if you enable every feature that is available right now. As you can see, the Content menu has everything you need to define your content types and manage your content items dynamically. Under Design, you could see everything related to the look and feel of your site. Here you can define templates, change the themes, etc. Widgets is a new option where you can edit the widgets and layers. That option was called Layers in the previous structure. Under Security, you will find the settings of the third-party authentication providers, can manage the users and the roles, and of course the OpenID settings. But that's enough talk for now, check out to the dev branch of Orchard Core and try the new admin menu now! On Lombiq Searching for performance-intensive codes 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! 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 - 11/01/2019

Do you remember the Nwazet Commerce module for Orchard 1.x? Orchard Core Commerce will be the Orchard Core port of that module and this week we will see the current state of this module! But first, take a look at the new structure for the documentation and the other improvements of Orchard Core! On Orchard Core The new structure for documentation When you navigate to the Read The Docs site to check the documentation of Orchard Core, you will meet with a brand new structure. All the previous docs are under the Reference menu on the top. Here you can see all the modules and their reference documentation. The Key Topics are just explaining core concepts. Explore the new documentation now! Add culture argument to localization_set filter This adds an argument for culture in the localization_set filter and defaults to current culture if there are no arguments. {{ Model.ContentItem.Content.LocalizationPart.LocalizationSet | localization_set: "en" }} New ContentCard Shape to make Flow Editor extensible Now the ContentCard shapes have been merged to the dev branch of Orchard Core, so you can use this awesome feature! But why ContentCard Shape Needed? Every widget within FlowPart, BagPart, and WidgetsListPart has Bootstrap card with similar UI which can be dragged or deleted. Unfortunately, these parts add hard-coded alternate for widget editor Widget_Edit__Flow, Widget_Edit__Bag, and Widget_Edit__List just before DisplayAsync hence - none of the custom alternate defined in admin theme for the widget is applied i.e. Widget-WeatherWidget.Edit.liquid (Widget_Edit__WeatherWidget). Due to hard-coded alternates, none of the placement customizations on Content_Edit applies to Flow editor. i.e. having AdminTab in Flow editor. All widgets are framed with a <div> tag, with no ability to customize. This limits the usability of the Form module and makes very cumbersome to create complex forms. FlowPart, BagPart, WidgetsListPart has the advantage of the free flow page but did not come even close to the usability of Layout in Orchard 1.x and Layout Template. Orchard DisplayMangement is powerful but FlowPart, BagPart, WidgetsListPart not utilizing it to make it extensible. These parts render cards using a hard-coded widget template in javascript, which doesn't honor shape alternates. How ContentCard Shape Helps? Doesn't add any alternates to Content Editor, hence any edit alternates defined for a widget will be displayed in Flow editor. Because it's using Orchard DisplayMangement, that means all placement details are applied including Admin Tabs within Flow editor. Defines ContentCard_Frame shape and list of alternates that module developers can override in Module or Admin Theme. Ability to disable, move or delete the Widgets to create Orchard 1.x like Layout Template. Ability to control, expand or collapse by a developer in Module/Admin Theme. Rendered 100% from a shape, not using an HTML template inside Javascript. Uses ShapeTableProvider to define alternates. Orchard 1.x layout like UI created with ContentCard shape, using some ContentTypes in BagPart and creating alternates only for ContentCard_Frame shape. Just check out to the dev branch to try out the new editing experience right now! Add configuration section to setup docs You can set up your site by providing the configuration parameters via the appsettings.json file. The documentation has been improved with the correct way you can do that. Default pattern for autoroute and alias When we add an Alias Part or an Autoroute Part, we don't have to go to the Settings, it will now use a standard pattern. public class AliasPartSettings{ [DefaultValue("{{ ContentItem.DisplayText | slugify }}")] public string Pattern { get; set; } = "{{ ContentItem.DisplayText | slugify }}";} Demos Orchard Core Commerce module Orchard Core Commerce will be an Orchard Core port and partial rewrite of the open source Nwazet Commerce module that was built for Orchard 1.x. Nwazet Commerce was initially built in 2012 by Bertrand Le Roy, loosely based on a commerce sample by Sipke Shoorstra. Now let's see the current state of this module because there are features that you can already try out! First, set up your dev environment: Download/clone the module from GitHub. Place it under the src/OrchardCore.Modules folder. Add the existing project to the solution under src/OrchardCore.Modules in the solution explorer if you're using Visual Studio. Add a reference to the module from the OrchardCore.Cms.Web project. If you are ready, build and run the solution. We set up the site using the Agency recipe for this demo. Now head to Configuration/Features in the admin, where you have to see the following modules. Enable both of them! Orchard Core Commerce: Registers the core components used by the Commerce features. Orchard Core Commerce Session Cart Storage: Registers session-based shopping cart persistence. In OrchardCore.Commerce any content type can be a product. It's just the manner of having the Product Part attached to your content type. This part identifies any content item as a product, by its mere presence. It has only an SKU, that describes the most basic product attribute, which can also be used as an alias for the item. You will also find a new Price Part, that just a simple product price that stores the price of the product. There is also the notion of Product Attribute Field, which adds the ability for a product to be modified with a set of attributes, in particular when added to a shopping cart. Examples of attributes can be shirt sizes (S, M, L, XL), dimensions, etc. Now let's try these out! Let's say we would like to sell T-shirts in our shop. Create a new content type called T-shirt and add the Title, Common, HtmlBody, Product and Price parts to it. Every product could have different fields, in our case, we will need a size, a message printed on the T-shirt and the color of the T-shirt. Let's add these fields to our content type using the Text Product Attribute Field type. You can add some predefined values to size and to colors and restrict them. Now let's create a new T-shirt, give it a name and some description and hit Preview. Here you can see that the users can customize their product using our fields. They can set the size, the quantity, the message, and the color. And at the bottom of the screen, you could see an Add to cart button. Let's fill out these fields and click on this button! We selected one black T-shirt with a size L and with a custom message. You can update the quantity here that will update the price if you click on the Update button or remove the product from the cart with the Remove button. So, for now, the following features are done: Product, price, and inventory parts and/or fields (those were a single part in Nwazet) Note: not all products have a price Shopping cart To do: Checkout (probably redesigned around Orchard Workflows) Base infrastructure for payment, plus one implementation (Stripe) Order content type and management screens (including a redesign and refactoring of the order part) Workflow activities On Lombiq Searching for performance-intensive codes 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! Orchard in Open Academy There will be the free Open Academy in Budapest on 22 November for all life long learning developers with no-BS tech talks, where Zoltán Lehóczky, the Co-founder and managing director of Lombiq Technologies Ltd. will talk about Orchard. Come and join the conference if you will be nearby! This week in Orchard in LinkedIn From now you could find our This week in Orchard series on LinkedIn, under the Lombiq Technologies Ltd. company account! Share and like these posts there too if you are learning something new reading our weekly recaps! Orchard Dojo Newsletter Now we have 101 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/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!