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 - 01/11/2019

We had no meeting since the 18th of December so, now we have a lot of improvements to talk about regarding Orchard Core. Let's see them one by one! On Orchard Core Fixing configuration issues The idea is to fix the configuration issues of Orchard Core. The first one is about to provide a per-tenant configuration. When you have multiple tenants, you might want them to behave differently in terms of connection strings, Azure Blob Storage connection strings, SMTP settings, whatever that can be set in configuration. Before this PR, there were no way to define configuration to each tenant. Now we have a way to define configuration per tenant. The next issue is about to reimplement FileShellSettingsConfigurationProvider. If you are not using the CMS, the default provider for the tenant names is in the tenants.json file. It was using the configuration API to load it, which is not the way it should be done. The Orchard environmental settings discussion is about when you have different environments (production, test, development) and you want to able to define different settings, even site settings or configuration settings. This PR is fixing it. Here we want to be able to define configuration by environment, like production, test and so on. Also, to define configuration per environment variables. So, when you switch to different environments, they will take that into account. Finally, the use JSON for site settings is about to use JSON instead of YAML for site settings. This PR also removes the usage of YAML. How do these works? Let's see that in a demo! Demos Fixing configuration issues Set up a site using the Software as a Service recipe, because we will create tenants. Now head to the App_Data folder! Before this every site had a folder and a site settings file inside (Settings.txt). The first thing you will see here is the tenants.json file, that lists all the tenants. The content of the tenants.json file could be the following. This JSON document contains the name of the tenants and its properties. The properties you can have inside this file are State, UrlPrefix, RequestHost and Features. If you go to the Default folder inside Sites, you will find an appsettings.json file instead of Settings.txt. The only configuration it has so far is the DatabaseProvider, which in this case is Sqlite. So, the tenants.json now is common to every Orchard Core instance, the appsettings.json will contain only the things that are specific to a tenant. Now let's create a new tenant based on a different recipe, for example the Blog. Just create it, do not set up it yet. Then open the tenants.json again. You can see that here we have the new tenant created. Now, let's set up this tenant and see the content of the appsettings.json inside the Sites/Blog folder. Furthermore, you can also have an appsettings.json file under the App_Data folder that will apply configuration properties for all the tenants. You can also define configuration properties under the OrchardCore.Cms.Web folder as well, but this one will never be updated by the application, because it's not accessible. If you want to define custom settings here for all the modules, you can create a section called OrchardCore and inside that you can add custom settings under the name of the module. Now open the Startup.cs file of the OrchardCore.Media.Azure module. You can see that it will resolve an IShellConfiguration. It's a new interface, which is implementing IConfiguration, but only gets the configuration for this tenant. If you need to get the configuration for the app itself, you need to resolve IConfiguration. In the current example we configure the MediaBlobStorageOptions, using the configuration in the section called OrchardCore.Media.Azure. If you want to define some custom value for a specific tenant (don't forget that the appsettings.json file in the OrchardCore.Cms.Web folder provides app-level settings) you have two options. First, you can create a new section in this file with the name of the tenant and can repeat the modified settings that you would like to add to the current tenant. Here you could see, that the configuration for the email module in app-level is different than in the tenant-level. The other way is to define this in the appsettings.json file of the tenant (under App_Data/Sites/Default) in the same format. You can also have appsettings.json files per environment. You can create appsettings.production.json and appsettings.staging.json files. We also support environment variables. You can create an environment variable that looks like ORCHARDCORE__STAGING__Orchard.Media.Azure__ConnectionString. There are some bugs to fix before merge these changes to the dev branch. Until that you can find the code in the sebros/configuration branch. New Text Field editors In the following PR Antoine Griffard added new Text Field editors to Orchard Core: Email editor Color editor Tel editor URL editor We created a new content type, called TextFieldEditorDemo and added four Text Fields to it to show the four different kind of editors. New admin menu The new admin menu for Orchard Core now works perfectly on mobile as well. Response Compression module By enabling the Response Compression module, it will compress the response from the server using GZIP or BR (if your client supports it) and set the max-age value of the Cache-Control in the header. The media files will be cached for 7 days in the client. Also cache static files for a year as they are coming from embedded resources and should not vary. Let's look the response headers when loading the clean-blog.css file. Here you can see the max-age property was set for the Cache-Control, that is important for the performance. Try Orchard Core Thanks to Antoine Griffard, the Beta version of Try Orchard Core is available, where you can create an Orchard Core application choosing between the Agency, Blog and Coming Soon recipes. To set up a new site you have to provide your e-mail address and the name of the site. After that you will receive an email that contains the URL of your tenant, the username and the password of the admin user. Note that the sites will be reset every Monday at 00:00 GMT. If you are interested in more news around Orchard, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 01/04/2019

Happy New Year everyone! The first Tuesday of this year was the 1st of January, therefore we had no meeting this time. So, now we have a great opportunity to summarize the latest posts of 2018 around Orchard Core! On Orchard Core Orchard Core CMS GraphQL using GraphiQL One of the biggest features of Orchard Core that was developed in 2018 is the GraphQL. By following David Hayden's post, you can get a great tutorial about how to use this feature with the The Agency Theme to query all the Landing Page Content Items and display their titles (displayText), or to query the PortFolio BagPart, which is a collection of Project Content Items. If you haven't deal with GraphQL yet, it's a great opportunity to try it out! Custom Color Picker TextField Editor Orchard Core has a number of built-in TextField editors: Standard, Multi-line, Icon Picker, and Predefined List. In this post, you could read about how to develop a custom text editor: a color picker. The custom editor uses the Spectrum jQuery Color Picker to choose and display colors. Recipe Migrations How to develop a custom module that creates a Bootstrap 4 Card Widget using Recipe Migrations? If you want to use Recipe Migrations, you will need to create a class that inherits from the DataMigration class (similar to using IContentDefinitionManager) and uses the new IRecipeMigrator interface to execute your recipe migration files. Don't forget to put your migration file in a folder called Migrations. Want to see some code and the details of the development? Then you should read the whole post! Working with Taxonomies One of the biggest features of the upcoming Beta 3 release of Orchard Core is the Taxonomies module. By following David Hayden's latest post, you can have a great knowledge about the phrases introduced by this module, like Taxonomy Term Type, Taxonomy Field, Term Content Type and so on. After summarizing the definitions, you could read about how to add a Taxonomy Field to a custom content type and displaying the Taxonomy Terms. At the end of the post you could see how the GraphQL displays the Term Content Items. Adding Google Analytics to Orchard Core In this quick and easy blog post Chris Hammond shows you how to add Google Analytics to Orchard Core by using a widget and inserting the JavaScript code there. Test your new desktop build by building Orchard Core! You might remember that last summer Scott Hanselman built the Ultimate Developer PC 3.0 and test its capabilities by compiling Orchard Core both "cold" and "warm". Jan de Vries did the same a few days ago when testing his "Ultimate Developer PC". Want to know the results? Head to his blog for more details! If you would like to read more exciting blog posts about Orchard and Orchard Core, don't forget to check out Orchard Blogs: the heartbeat of the Orchard CMS community: blog posts from Orchard-related blogs, scraped automatically. Created by Lombiq. On Lombiq Orchard Dojo Newsletter We have started this newsletter to inform the community around Orchard with the latest news about the platform. We want to preserve this tradition in 2019 as well. 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 enthusiast who you think would like to read our weekly articles? Tell them to subscribe here!

This week in Orchard - 12/21/2018

The last This week in Orchard for this year is here. Let's see the latest news around Orchard Core and Lombiq! On Orchard Core Fix modules that don't correctly use PathBase-relative root paths Many modules - like the setup module - reference CSS and JS files using root-relative paths. E.g.: <link type="text/css" rel="stylesheet" href="/OrchardCore.Setup/Styles/setup.min.css" /> Sadly, this doesn't work (at all) when hosting your application under a virtual path (for instance, http://localhost/orchard). To fix that, all the assets should be referenced using the PathBase-relative syntax (~/). E.g.: <link type="text/css" rel="stylesheet" href="~/OrchardCore.Setup/Styles/setup.min.css" /> In this case, MVC will correctly compute the asset URL based on the PathBase defined by the IIS integration middleware. Mobile friendliness issues There are issues with mobile view. First of all, the list actions are not responsive. Here you can see the list of the blog. Here we should move the icons to have more space for the title. The asset management if wider than the view. The landscape mode of the Media is overflowing on the right without a scrollbar. The navigation doesn't provide scrolling. The menu here is going far below, but there is no way to tap to the items. By using the Device Mode in Chrome DevTools to simulate mobile devices, you can choose to render your site with low-end devices. It was taking 10 seconds to load the css, 10 seconds to load jQuery, that means the site on those devices are quite unusable. What can we do? We don't have any compression middleware active. To solve this issue, we need to set the cache headers on the static assets in the future. Antoine Griffard's new site Antoine Griffard started to develop his personal site by using Orchard Core! Check out the site! On Lombiq Introducing our HipChat to Microsoft Teams Migration Utility If you're a user of Atlassian's chat service, HipChat, just like us, then you've surely heard that it'll be retired in February 2019. While Atlassian recommends and officially supports migrating to Slack what if you wanted to try Microsoft Teams instead? While there is no offical support from Microsoft to migrate to Teams you can try our free and open source tool that we're releasing just now! Let us know how it works for you and if you can contribute with bug reports, feature requests or code that would be awesome! Grab the HipChat to Microsoft Teams Migration Utility from GitHub! Orchard Dojo Newsletter Now we have 32 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 enthusiast who you think would like to read our weekly articles? Tell them to subscribe here! And don't forget to watch the recording of the last Orchard Podcast of 2018 on YouTube! Lombiq Technologies wishes a Merry Christmas and a Happy New Year to the readers of This week in Orchard! See you on the 4th of January!

This week in Orchard - 12/14/2018

Interested in the new admin menu and the new Gulp pipeline of Orchard Core? Or the current status of the Beta 3 release? Then let's have a quick recap about the current news around Orchard! On Orchard Core Status of Beta 3 If you would like to help with Beta 3 (or just curious about the issues left), you could navigate to the issues on GitHub and filter by the milestone beta3. Here you will only see the issues that are needed to done to ship Beta 3. Demos New admin menu When you checkout to branch skrypt/#2767 and setup your site using the Blog recipe, you could find a predefined Admin Tree, under Configuration -> Admin Trees, called Admin tree from blog recipe. When you edit a node, you can set the selection priority, that is the priority of this link to be displayed as active instead of another one when both are pointing to the same URL. The link with the highest value has the active status in the navigation. So, if you go on a URL and two menu items match this URL (that is possible, because we have admin nodes and we might go to the same page from two different nodes in the menu), the priority would define which one is selected. The position order of the link in the admin menu. When we want to have a priority over another module, we just need to set the position and if the menu has no priority we wouldn't head to a position. If you navigate to the AdminMenu.cs of the OrchardCore.Features module, you could see that the Configuration menu has a predefined priority here with the value 1. This feature is under development and will change and improve in the future. New Gulp pipeline We have a Package.json file in the root of the repository, which contains all the packages and node modules that we need. If you want to build the script, you do npm install and it will install all the modules from Packages.json. That's the standard npm behavior. You can do gulp build, which will look for all the Assets.json file and build all the assets for each module that they require. You have to do that only if you change or add some js/scss/etc. files. The gulp rebuild will rebuild everything, not just the changed files. The gulp watch will run a background task and as soon as you change a js/scss/etc. file, it will rebuild automatically the dependent assets. It's very useful when you are developing. Now with the new change, the Package.json contains all the module specific dependencies that we know of Orchard Core. Let's see for example the package.json file in the OrchardCore.Apis.GraphQL module (the first dependency). You could see that this one depends on 4 node modules, for example react and react-dom. Now head to the Assets.json of this module. This file builds some output resources from the Assets folder. But now (because we use the package.json in each module) we can point to the node modules at the root level (because we know that the package.json in our module will resolve these) to build output resources. They will be copied in the wwwroot folder as well. On Lombiq Migrating a standalone Orchard site to DotNest - Show Orchard case study 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. Our first task was to migrate it to DotNest, so here we are, see how we did it using basic Orchard features and Media Theme. Here's a case study with code on how we did it with. New sites added to Show Orchard Added a couple of Orchard and Orchard Core sites to the collection in Show Orchard! Check them out at the top showorchard.com. Send in your exemplary Orchard sites to [email protected] and we'll publish them too! For the full demos don't forget to watch the recording of the current podcast!

This week in Orchard - 12/07/2018

Let's have a recap about the demos of the new editor for the Media Field and the working of how to authenticate users with Microsoft Account. Don't forget to check the issues left for the Beta 3 release! On Orchard Core Render property in GraphQL to render content items We can use GraphQL to render a content item. The way it works is the following: blogPost { displayText, render(layout: false, displayType: summary), displayUrl, autoroute { path }} Now you can call render, and the result of render will be the HTML of rendering this blog post including the layout. The community intend to add features like passing false value for the layout, in this case we do not have layout. Or displayType to render as a summary. We can get the display URL of the blog post by using displayUrl. By having that we can do some static site generation even with or without a full CMS, because from the client script (that could be a mobile application as well) you will be able to ask all the blog post and render it. It will need more things and more processors, but that the start to have this kind of support. You can find this feature in the render branch. Issues left for the Beta 3 release The community wants to schedule Beta 3 with .NET Core 2.2, that has now shipped. Now the community should focus on fixing the P0 and P1 issues and the ones that are marked with the beta3 milestone. After they have been closed, Beta 3 will be shippable. Feel free to pick one and help the community to release Beta 3 sooner! Demos New editor for the Media Field The idea is to add a new editor for the Media Field to solve a special use case to manage your media/content item. The assets will isolated in the navigation, so you don't see them in there, they are only editable from the content item. If you add a new Media Field to your content type, you can choose to have a Limited: No media browser (will have a new name) editor type. Normally when you create a new content item from a type that has a Media Field attached, you can browse media items from the Media Library. In the limited one, you can just upload one from your file system and Orchard takes care of the handling the files that you upload. It means these files have a path (that consist of the segments of the content item ID) like in the image below to do not hit the limit the number of the files in a specific folder, and only users who have the right permission can manage these files through the Assets. This feature is still under development, so will might change and improve in the future. Authenticate with Microsoft Account Head to the Microsoft Registration Portal and register a new application. We must add a new platform here, let's choose Web option and enter the URL that the middleware will listen to. It could be the default Orchard Core HTTPS URL with the default callback path: https://localhost:44300/t1/signin-microsoft. We also need to generate password by clicking on the Generate New Password button. Go back to our admin portal and enable the Users Registration (if you want to add a new user) and Microsoft Account Authentication modules. Then head to the Microsoft Authentication -> Microsoft Account menu to add the AppId and the Secret Key from the Microsoft Registration Portal. Now in the login screen you will see a new option to Use another service to log in. If you click on the Microsoft Account button, you can enter the credentials of your Microsoft Account. After you need to let this app to access your info. If you click on the Yes button, you will see the Create a new account screen, where the Username and Email boxes are filled with the credentials of your Microsoft Account. Here you need to register, because there is no name in the claims that we could retrieve the proposed username. Now if you log off with this user and go to the admin panel you will see that the user has been created and it's on the list. You can also authenticate users with their Azure Active Directory Account by enabling the Microsoft Azure Active Directory Authentication module. You can fill the form based on the parameters of your Azure AD App registration under the Microsoft Authentication -> Azure Active Directory option. Now you can log in using the External Logins option from Orchard the same as we did before. You can read more about how the Microsoft Authentication works in Read The Docs! For the full demos don't forget to watch the recording of the current podcast!

This week in Orchard - 11/30/2018

Interested in the updated roadmap of Orchard Core or the beta 3 release? Or every other new features of Orchard Core? Then don't forget to read our current post! On Orchard Core Liquid rendering issue on Hungarian computers In Liquid, we have a tag helper called zone to get the inner content of the tag, until we find a tag that starts with "end" and finishes with "zone", something like that: tag.Name.StartsWith("end" + tag.Name); The tag.name in this case would be "zone". When you are running on a Hungarian computer if you type: "endt".StartsWith("end"); the result will be true of course. But if you type "endz".StartsWith("end"); the result will be false, which means it never found the end of the zone, so it was never rendering anything, because the script was invalid: "endz" doesn't starts with "end". The issue is that the "dz" is taken in Unicode as one char, which is not "d" or "z" it's a "dz" char, but in .NET it's only one. The solution is to pass the comparison, so it will be culture-insensitive: "endz".StartsWith("end", StringComparison.Ordinal); Updated Roadmap The community can ship beta 3 as the .NET Core 2.2. will be done. Let's see the fully or partially implemented features of beta 3: Background tasks management GraphQL Decoupled CMS Taxonomies Custom navigation Facebook authentication ReCaptcha Mini Profiler Recipe migrations File based Content Definition The Coming Soon theme Edit and Display modes The backlog of the RC is also updated and the features are ordered by priority: Content Localization RTL admin theme Localization packages (Chinese, Spanish, Arabic, French are the most requested) Distributed hosting Jobs queue Output caching Entities API CDN support The ContentLocalization is the most important feature for RC. You can check the updated roadmap by clicking here. Demos Content Picker editor improvements If you add a Content Picker Field with a standard editor to your content, you can type to search the referenced content when you editing the content item. If you allow to select multiple elements of the content types, you can move them around, reorder them by a simple drag and drop. Resource Management configuration If you view the source code of the home page, for example the Blog theme, you can see that it's using the min files. <!-- Custom styles for this template --><link rel="stylesheet" href="/TheBlogTheme/css/bootstrap-grid-ext.min.css"><link rel="stylesheet" href="/TheBlogTheme/css/clean-blog.min.css"> If you go to admin and head to Configuration -> Settings -> General, you will find two new things: Use CDN (Content Delivery Network) — Whether the defined CDN value is used for scripts and stylesheets, or their local version Resource Debug Mode Let's see a style tag helper in a liquid file: {% style name:"bootstrap", use_cdn:"true", version:"4" %} The value of the use_cdn is true. So, the bootstrap is forced to use CDN and you will see the following when you inspect the code: <link crossorigin="anonymous" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.css" integrity="sha384-2QMA5oZ3MEXJddkHyZE/e/C1bd30ZUPdzqHrsaHMP3aGDbPA9yh77XDHXC9Imxw&#x2B;" rel="stylesheet" type="text/css"></link> If we set the use_cdn value to false, it will take this source from the local resource we have. If we do not set the use_cdn in the tag helper it still used the local, but now if we check the Use CDN checkbox in the admin, it will use the CDN. So, with this new setting, you can decide which assets should use CDN if you do not specify that value using the tag helper. On top of the CDN, you can decide if you want to use the minified or the non-minified version of your scripts and stylesheets. By default, it will use the environment. For instance, if you are in development, it will use the debug version. If you are in production, it will use the minified version. But you can force it to use debugable version to select Enabled. Then your code will be like: <script crossorigin="anonymous" integrity="sha384-DWBJ4L0qV7ffH95jHsoooM04DWR2qtntWspYadu41Wx5kw6d0Cs7W&#x2B;7C2v2bh7vX" src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.bundle.js" type="text/javascript"></script> If we say we want to disable the resource debug mode by setting the value to Disabled, our code will be like the following: <script crossorigin="anonymous" integrity="sha384-pjaaA8dDz/5BgdFUPX6M/9SUZv4d12SUPF0axWc&#x2B;VRZkx5xU3daN&#x2B;lYb49&#x2B;Ax&#x2B;Tl" src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.bundle.min.js" type="text/javascript"></script> Taxonomies module The Taxonomies module now merged to the dev branch. To use it, you need to enable the module. After that, you can create a new Taxonomy under the New -> Taxonomy option. We have previously created a new Color content type, that has a TitlePart attached. Let it be the Term Content Type. After creating the Taxonomy, you can create new term content types here by clicking the Add Color button (because Color is our term content type here). You can simply reorder the Colors using drag and drop. Taxonomy is one content item and all of the Colors (sub-content items) are composed in the Taxonomy content item. So, if you load a Taxonomy content item, you have access to all its terms directly, so they are parts of the taxonomy document for performance reasons. Let's say that we want to categorize the Blog posts using this taxonomy. To do that, add a new Taxonomy Field to the BlogPost content type. Now when you create or edit a new Blog post, you can select the terms. To how to display terms in the front end and many more head to the Orchard Core Documentation about taxonomies! Headless CMS with Orchard Core Sebastien gave a nice demo about how to use Orchard Core as a Headless CMS on the ASP.NET Community Standup this week. You can watch the recording of the demo in YouTube! If you are interested in more news around Orchard, don't forget to check out the recording of this week's Orchard meeting!

This week in Orchard - 11/23/2018

Read our post to know the new The Coming Soon Theme, the new Reverse Proxy and CORS module for Orchard Core! On Orchard Core Interface for prevent the roundtrip to cast the dynamic JObject to a part and back When we have a content item, the item has a Content property. This property is a dynamic. We can get the value of the TitlePart's Title by saying: dynamic content = ContentItem.Content;content.TitlePart.Title; This is a dynamic object. What we return from .Content is actually a JObject, a Json.NET type that contains the JSON representation of the data. To lose the dynamicity and be strongly typed, we do .As. With that will instantiate a new TitlePart object, which will be the deserialization of the JObject property. So, we deserialized the JObject into an instance of TitlePart: content.As<TitlePart>().Title; What happens if we want to change the Title of the TitlePart? We could say something like: content.As<TitlePart>().Title = "Foo"; But what we are doing is we have a new object (TitlePart) and change the property Title, but we didn't change the JObject property that is attached to the content item. So, we changed a clone of the TitlePart. It's a new object we change. In Orchard Core what we need to do is something like: var titlePart = content.As<TitlePart>().Title;titlePart.Title = "Foo";content.Apply(typeof(TitlePart), titlePart); The Apply will bind back the TitlePart instance we have to the property named TitlePart of the content item we have. So, we extract the JObject into a TitlePart instance. We change the instance and we map back the TitlePart instance into the JObject structure of the content item. This is what every driver, every part driver, every field driver is doing when we want to update some data. You don't see the Apply, because what we do in the driver, we get a part. This part is something that the coordinator (the drivers) will give you from the part definitions. So, it says let me extract the JObject property named for example MenuPart. Let me give you an instance of this class and this is what you have to update. What the coordinator does, it will reapply back the change you did to the JObject. This is the roundtrip between a JObject and a class. It would be nice if we could just say the following without needing the Apply. var titlePart = content.As<TitlePart>().Title;titlePart.Title = "Foo"; It would be great if we can just simply assing the Title to the JString represented in our content here. And it would be technically doable. When we do .As, we return a class inheriting from TitlePart, with all its properties that are proxies to the actual JTokens that are represented in the content item. So, this is doable by using dynamic proxies. The only issue is that you can only create a dynamic proxy on an interface. Because TitlePart is a class, we can't do that. One of the biggest advantages of this approach is the performance, because we don't have to convert back and forth the items. We don't have to create new strings and everything. If we want to do that we will need to change the parts (that are classes) into interfaces which should be fine, because all the parts we have only contains properties, without any logic inside. All of them are mostly just data. The logic is extracted into handlers and drivers. So, if we had all the parts being interfaces then we could have this logic automated using dynamic proxy. When we do .As, we actually have a proxy that modifies the inner JObjects or JTokens that correspond to the content item directly without passing an actual instance of the TitlePart that we have to bind back. That would be a breaking change, but that could be good on a long run. It will change the way we write content parts like we did it in the following example: Demos Reverse Proxy module Reverse Proxy is about when you host your Orchard Core web app or CMS behind a proxy. There will be a new module to Orchard Core called Reverse Proxy Configuration module. To set up Reverse Proxy, navigate to Configuration -> Settings -> ReverseProxy. The Coming Soon recipe and The Coming Soon Theme The new theme, called The Coming Soon Theme is built for SPA sites that are under construction, but the site owner would like to show something instead of a 404 or a static HTML page. Here users can enter their email address and when the site is ready, we can send them an email about the launch of our new site. In the admin, we could see the only content item is called Coming Soon. It is a Form and also has the FlowPart to contain widgets. The goal of this form on this homepage is that if the user types an email (and have the ReCaptcha validation) then they will receive a mail to verify their address. After they will be registered to the site. We have one workflow here, called User Registration. This workflow is responsible to validate ReCaptcha, register the user and send an email to them. The comingsoon.recipe.json is the recipe that contains the User Registration workflow and it's activities. The form also comes from the recipe which will trigger the workflow. So, this recipe is a great example of how to set up a form to call an action using the recipe. Cross-Origin Requests (CORS) with Cors Configuration module The standard behavior of a standard ASP.NET Core website is that to allow single-origin request and reject things that come out from the origin. It could be a problem when you for example host a solution for an OpenID in a different server. To solve issues like that, a new module will be available for Orchard Core called Cors Configuration. After enabling the module, navigate to Configuration -> Settings -> Cors, where you can add new policies. Don't forget to watch the whole recording of this week's Orchard meeting!

This week in Orchard - 11/16/2018

The Admin Trees module is merged to dev and we give you a status about the Orchard Core Beta 3! Check out our post for the latest news around Orchard Core! On Orchard Core Making a dismissible Alert Widget Few weeks ago David Hayden developed a custom Alert Widget that allows one to easily create a Bootstrap Alert Component in an Orchard Core CMS Website with no knowledge of HTML In his newest post he shows how to make this widget dismissible without any need for Visual Studio or any other IDE or editor. GraphQL documentation In the last weeks we had several posts about GraphQL and we tried to present you the newest improvements of this module. Search for the word graphql for the relevant posts. If you visit the Orchard Core Documentation provided by Read the Docs, you could see the official documentation about how to work with the GraphQL under the Contents -> GraphQL section. This other documentation is about how the provided HTTP endpoints work to send client queries. Admin Trees module merged to dev The Admin Trees module from Matias Molleja has been merged to dev and a documentation is available here. Orchard CLI We have an issue about we should have a dotnet global tool as the CLI that should work only using REST APIs. In Orchard 1 we load every tenant to memory. The new CLI will use only REST APIs so that we can talk to an existing running instance and affect that. James Restall looked at it and he wants to use only GraphQL. He did a simple test with a working CLI using node for that. The reason for that is there are so many nodes available to manipulate GraphQL. Each module provides some description in a GraphQL for mutations and this tool is able to invoke the schema of GraphQL and map all the mutations into command lines. This will show up based on the GraphQL endpoint, so it's completely dynamic. When you connect to the machine, it will tell you what you have access to and what you can do with the CLI. Recipe Migrations This pull request will allow for running a recipe as part of migration called Recipe Migrations. Take the example of the Menu module which is creating a content type from the migration using C#. Now the idea is that is just to run a recipe file from the migration as part of the standard migration step. It might be easier to maintain the content type definitions or contents from data migration. Status of Orchard Core Beta 3 The community would love to ship by the end of the month or the beginning of December. We have everything that has been booking for Beta 3 and taxonomies is almost ready, just need to create a PR and merge it. We have the GraphQL and other brand-new features like the Admin Trees module. The community will fix the issues marked with P1 or P0 labels. We will wait the ASP.NET Core 2.2 release to ship Beta 3 and can upgrade directly to that. Don't forget to watch the whole recording of this week's Orchard meeting!

This week in Orchard - 11/09/2018

The GraphQL for Orchard Core is merged to dev and a new reCaptcha module will come to prevent abuse! Check out our post for the latest news around Orchard Core! On Orchard Core Added deployment plan and recipe support for media Let's introduce a new deployment step called Media where you can export all or specified media items. You can select folders or media items and they will be added automatically to the deployment plan. If you add new media items later on, they would be also included in the next deployments. In the recipes there was a Base64 property before, that loads a file in memory converted to Base64 and put it in the JSON document. Now the new SourcePath property actually streaming the file to the destination. So, we are not copying the file to the memory anymore. When we have a media step, you say which media you need from the file system(SourcePath) and where to put it in the media provider(TargetPath). Demos Media Layout improvements The look of the media layout improved a lot for a better usability. To check the new layout, navigate to the Content -> Assets menu.There is a new plus icon to create a folder near the Media Library.You can move the images between folders using drag and drop.You can switch between list view and grid view. In the grid view you can have large thumbs or small thumbs as well. You can filter by file names and have a breadcrumb to navigate between folders. GraphQL improvements The GraphQL module is merged to dev now! In the latest post we mentioned the improvements of the GraphQL module, let's have a quick look about what new features have been added to it since last week. Now status accepts ALL, that lists both published and draft content items. Logical expressions: you can combine more than one predicates inside the where, that will work like an AND. In this case you don't need to type the AND keyword. But you could say you want an OR, that you can also do of course. You can also mix the logical expressions like we did in the last query called mixedLogicalExpressions. ReCaptcha module You will have three new different modules for reCaptcha: ReCaptcha ReCaptcha User Login ReCaptcha Register New Account The ReCaptcha module provides the base functionality for ReCaptcha. The ReCaptcha User Login will put a captcha to the Login screen after the user tried to login six times in a row with invalid login attempts. If you enable the ReCaptcha Register New Account module, you will get a Captcha on the registration page as you can see here. To work with reCaptcha you need to provide the Site Key and the Secret Key (that you can get from here) under the Settings -> ReCaptcha menu. The ReCaptcha support for Orchard Core is in still under development thanks to Matthijs Krempel. The next feature from him is to include reCaptcha on the Forgot password page too. For the full demos and other topics around Orchard don't forget to check out the recording of this week's Orchard Podcast!

This week in Orchard - 11/05/2018

Interested in the new features of the GraphQL Explorer or the GraphQL API? Or the announcement of the Orchard Core Commerce: The commerce module for Orchard Core? On Orchard Core First let us to mention you some of the newest posts from David Hayden's blog! Overriding Theme Shapes with Templates in Orchard Core CMS The Blog Theme in Orchard Core has a Content-Article.liquid file. This is the shape responsible for displaying an article. In this post he shows how to change the hardcoded background image of the article by adding a Media Field to the Article content type to be able the users to select any image. Adding a New Zone to The Blog Theme Layout in Orchard Core CMS In this tutorial, he shows how to add a new Zone, called Messages to the Blog Theme. Now can add any widgets to the Zone in the Orchard Core CMS website. Develop a Custom Widget In Orchard Core CMS In this tutorial you can read about how to create a new widget, called Alert Widget, that will allow one to easily display a Bootstrap alert on the website using the previously crated Messages Zone. If you would like to read more exciting blog posts about Orchard and Orchard Core, don't forget to check out Orchard Blogs: the heartbeat of the Orchard CMS community: blog posts from Orchard-related blogs, scraped automatically. Created by Lombiq. Orchard Core Commerce: The commerce module for Orchard Core Orchard Core Commerce will be an Orchard port and partial rewrite of the open source Nwazet Commerce module that was built for Orchard CMS 1.x. Nwazet Commerce was initially built in 2012 by Bertrand Le Roy, loosely based on a commerce sample by Sipke Shoorstra. The initial goal of Nwazet Commerce was to power the web site of the hardware startup Nwazet. While Nwazet is no longer operating, the Nwazet Commerce project went on, and was further developed by a group of passionate contributors who are using the platform for their own, and their customer's web sites. Like Orchard, Nwazet Commerce was built with extensibility in mind, and as such it has its own extensions (typical examples include local tax and shipping modules). It's also pure, idiomatic Orchard. Orchard Core represents a major evolution of the Orchard design principles, and is sufficiently different that running Nwazet Commerce on it will necessitate significant work. As such, the team decided that starting from a blank slate was the best way to go, so they will port Nwazet Commerce piece by piece, being careful to accurately apply Orchard Core's new design principles. They also decided to adopt a new name, that gets rid of the now obsolete origins, and establishes their ambition for the module to become the go-to commerce module for Orchard Core. This work is in its initial design phases. There's a lot of work to do, and yes, the team do welcome participation in any shape or form. If you would like to help to improve the Orchard Core Commerce module head to GitHub and check the available Issues! Demos GraphQL Explorer and GraphQL API We mentioned the GraphQL feature earlier in this post and last week we saw how to Test the new tenant APIs using GraphQL. Now let's see the newest improvements of the GraphQL and the GraphQL API! For the following demo we set up the site using the Blog recipe. We added several fields to the Article content type to demonstrate the capabilities of the GraphQL Explorer: a Link Field called Link, a Markdown Field called Description, a Media Field called Images, and a Content Picker Field called Posts. When you enable the GraphQL module, you can go to admin/graphql, where you can find the GraphQL Explorer. You can use CTRL+Space to have an intellisense. You don't need to click the play button every time you want to run your query, you can hit CTRL+Enter to do the same. In the Explorer you also have access to fields not just the parts. The Subtitle is a Text Field, that you can reach by simply type the name of the field. The Link Field called Link has two properties: text and url. You can get the HTML content of the HtmlBodyPart as well. The field called Description is a Markdown Field. By accessing the html property of that field you can get the value of the markdown transformed to HTML. The Images here is a Media Field. It's provide the URLs of the images that stored in the database and represents the media in the assets. But if you want to render these elements you need the public URL to point to this media. So instead of paths you can call urls. When accessing a Content Picker Field (Posts in this case) you can get the contentItemIds or the content item itself. But let's say you have many related content items and you just need the first one. By typing contentitems(first: 1) you will get only the wanted item. You can skip the first one by typing contentItems(skip: 1). You can also do that with the collection of urls of the Media Field. You have the ability to write if statements here. If the content item is a BlogPost, then give me the MarkdownBodyPart, but the HTML of the markdown. To do that on a collection of content items, you need to type ... on BlogPost {} and in the bracket you can define what would you like to query on. You can write more complex queries like give me the blog posts and order them by their displayText or by the createdUtc. So you can order by properties. You can also combine this query by using the first or skip keyword here. You can use the where keyword with several filters. For example, by using the displayText_contains, you can filter for a post that display text starts with a given query. Hit CTLR+SPACE to see what options are available. With parameterized queries you can say that list me that blog posts where the display text starts with the value of the parameter. Now this query is parameterized by something, so you can reuse it or separate the query from the values. In the previous post we mentioned how to use Orchard Core's authentication server to authenticate yourself when making a call to Orchard Core APIs. Now you can use the GraphQL API to make those requests. On Lombiq Mega Millions on Show Orchard Show Orchard is an Orchard CMS showcase, displaying only the best Orchard CMS powered sites from around the web. The Mega Millions Jackpot website runs on Orchard too! So, added it to Show Orchard! We just scratched the surface of the topics that the community had this week. If you are interested in the whole conversation, don't forget to head to YouTube for the recording of the current podcast!