diff --git a/CoreLibrary/DevelopmentGuidelines/BestPractices/Index.md b/CoreLibrary/DevelopmentGuidelines/BestPractices/Index.md index fd6a14d0..30f217d4 100644 --- a/CoreLibrary/DevelopmentGuidelines/BestPractices/Index.md +++ b/CoreLibrary/DevelopmentGuidelines/BestPractices/Index.md @@ -9,8 +9,8 @@ ## Topics -- [C# best practices](CSharp) -- [Orchard Core best practices](OrchardCore) -- [JavaScript best practices](JavaScript) -- [CSS best practices](Css) -- [Source control best practices](SourceControl) +- [C# best practices](CSharp.md) +- [Orchard Core best practices](OrchardCore.md) +- [JavaScript best practices](JavaScript.md) +- [CSS best practices](Css.md) +- [Source control best practices](SourceControl.md) diff --git a/CoreLibrary/DevelopmentGuidelines/DevelopmentEnvironment.md b/CoreLibrary/DevelopmentGuidelines/DevelopmentEnvironment.md index 559cb139..62fd17ef 100644 --- a/CoreLibrary/DevelopmentGuidelines/DevelopmentEnvironment.md +++ b/CoreLibrary/DevelopmentGuidelines/DevelopmentEnvironment.md @@ -26,7 +26,7 @@ Below you can find pieces of software that you should install for the best Orcha ## Visual Studio tips -- Use [code snippets](https://docs.microsoft.com/en-us/visualstudio/ide/code-snippets); try out [the ones in this package](../Utilities/VisualStudioSnippets/) too that specifically aid Orchard Core development. +- Use [code snippets](https://docs.microsoft.com/en-us/visualstudio/ide/code-snippets); try out [the ones in this package](../Utilities/VisualStudioSnippets/Index.md) too that specifically aid Orchard Core development. - Use keyboard shortcuts. The most useful ones are: - F5: start with debugging - Ctrl+F5: start without debugging diff --git a/CoreLibrary/DevelopmentGuidelines/Index.md b/CoreLibrary/DevelopmentGuidelines/Index.md index 8e101a24..14ada30c 100644 --- a/CoreLibrary/DevelopmentGuidelines/Index.md +++ b/CoreLibrary/DevelopmentGuidelines/Index.md @@ -2,11 +2,11 @@ If something’s not specified, general C# guidelines apply: [C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx) and [General Naming Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ms229045%28v=vs.100%29.aspx). The talk [How To Design A Good API And Why It Matters](http://www.youtube.com/watch?v=aAb7hSCtvGw) is an evergreen as well as the [.NET Framework Design Guidelines Digest](https://github.com/dotnet/runtime/blob/master/docs/coding-guidelines/framework-design-guidelines-digest.md). -- [Best practices](BestPractices/) -- [Code styling](CodeStyling) -- [Naming conventions](NamingConventions) -- [Rules of thumb for refactoring](Refactoring) -- [Inline documentation guidelines](InlineDocumentationGuidelines) -- [Code review guidelines](CodeReview) -- [Development environment advice](DevelopmentEnvironment) -- [Orchard performance optimization guidelines](OrchardPerformanceOptimization) +- [Best practices](BestPractices/Index.md) +- [Code styling](CodeStyling.md) +- [Naming conventions](NamingConventions.md) +- [Rules of thumb for refactoring](Refactoring.md) +- [Inline documentation guidelines](InlineDocumentationGuidelines.md) +- [Code review guidelines](CodeReview.md) +- [Development environment advice](DevelopmentEnvironment.md) +- [Orchard performance optimization guidelines](OrchardPerformanceOptimization.md) diff --git a/CoreLibrary/DevelopmentGuidelines/Refactoring.md b/CoreLibrary/DevelopmentGuidelines/Refactoring.md index ff13e4c8..ff56bb84 100644 --- a/CoreLibrary/DevelopmentGuidelines/Refactoring.md +++ b/CoreLibrary/DevelopmentGuidelines/Refactoring.md @@ -10,7 +10,7 @@ Consider [refactoring](http://en.wikipedia.org/wiki/Refactoring) in these cases: ## Renaming a project -You should do the following steps to rename an existing .NET project (including an Orchard Core [module](../Wiki/Module) or [theme](../Wiki/Theme)). +You should do the following steps to rename an existing .NET project (including an Orchard Core module or theme). 1. Make a backup or commit to source control before attempting the rename. 2. Rename the project from inside Visual Studio. This will change the project's name in a lot of manifest files. diff --git a/CoreLibrary/Index.md b/CoreLibrary/Index.md index 0d319fa7..487cc405 100644 --- a/CoreLibrary/Index.md +++ b/CoreLibrary/Index.md @@ -3,11 +3,11 @@ The Orchard Dojo Library is a portable package of Orchard Core goodies. It supplements Orchard Dojo's trainings and tutorials. These are also part of the best practices and guidelines we use at [Lombiq](https://lombiq.com/). - Topics: - - [Orchard Core Link Collection](LinkCollection): useful Orchard Core-related links - - [Software Development Guidelines](DevelopmentGuidelines/): various development guidelines we find useful - - [Orchard Core Training Guidelines](Training/): used for [Orchard trainings](http://orcharddojo.net/orchard-training) - - [Development Utilities](Utilities/): utilities that make Orchard Core development faster and easier -- [Contribution Guidelines](ContributionGuideLines) -- [License](License) + - [Orchard Core Link Collection](LinkCollection.md): useful Orchard Core-related links + - [Software Development Guidelines](DevelopmentGuidelines/Index.md): various development guidelines we find useful + - Orchard Core Training Guidelines: used for [Orchard trainings](http://orcharddojo.net/training) (it has been moved to the [Orchard Dojo website](http://orcharddojo.net/training)) + - [Development Utilities](Utilities/Index.md): utilities that make Orchard Core development faster and easier +- [Contribution Guidelines](ContributionGuideLines.md) +- [License](License.md) -You can download the whole Library, file issues or fork it from its [repository](https://github.com/Lombiq/Orchard-Dojo-Library). Also you can download the Library's textual content as one big concatenated document in [HTML](https://orcharddojo.net/Lombiq.DownloadAs/Download/DownloadAs/20474?Extension=html). +You can download the whole Library, file issues or fork it from its [repository](https://github.com/Lombiq/Orchard-Dojo-Library). diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/AdvancedContentManagement.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/AdvancedContentManagement.md deleted file mode 100644 index aa39a9a8..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/AdvancedContentManagement.md +++ /dev/null @@ -1,21 +0,0 @@ -# Advanced content management - -- Search and indexing (see [the official docs](https://docs.orchardcore.net/en/dev/docs/guides/implement-fulltext-search/) for a guide on this) - - Enabling Lucene; what is an indexing service (eg. Lucene) - - Enabling a content type for full-text (content type editor) - - Creating and configuring an index -- Forms, Liquid and Workflows - - An overview of Workflows features - - Overview of Liquid - - Creating a new Liquid Template by displaying the attached media of a Media Field ( `ContentType__MediaField` ) - - Using Forms, using ReCaptcha to prevent spam - - Demo: creating a workflow that displays a greeting for users upon logon, displaying their name with Liquid ( `Hello {{User.Identity.Name}}!` ) - - Demo: creating a workflow that displays the site name for users upon logon with Liquid ( `Welcome to {{Site.SiteName}}!` ) - - Demo: creating a contact form and handling form posts with a workflow. See [the official docs](https://docs.orchardcore.net/en/dev/docs/topics/workflows/) on this. -- Auditing content with Audit Trail - -Time requirement: 2h 30m - -Dependencies: [Intermediate content management](IntermediateContentManagement) - -Parent topic: [Core concepts and basic usage](./) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/cold-cat.jpg b/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/cold-cat.jpg deleted file mode 100644 index 2f995889..00000000 Binary files a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/cold-cat.jpg and /dev/null differ diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/comfortable-cat.jpg b/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/comfortable-cat.jpg deleted file mode 100644 index 17fbd806..00000000 Binary files a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/comfortable-cat.jpg and /dev/null differ diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/domestic-cat.jpg b/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/domestic-cat.jpg deleted file mode 100644 index f94bdc0e..00000000 Binary files a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/domestic-cat.jpg and /dev/null differ diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/orchard-log-2020-06-04.log b/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/orchard-log-2020-06-04.log deleted file mode 100644 index ea78d7e5..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/orchard-log-2020-06-04.log +++ /dev/null @@ -1,131 +0,0 @@ -2020-06-04 02:45:05.9330|Default||a6af9180-4ecc291e291cd153.||OrchardCore.Layers.Services.LayerFilter|ERROR|This is an error. -2020-06-04 02:45:05.9546|Default||a6af9180-4ecc291e291cd153.||OrchardCore.Layers.Services.LayerFilter|WARN|This is a warning. -2020-06-04 02:46:01.3769|Test1||a6af9182-4ecc291e291cd153.||Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware|ERROR|An unhandled exception has occurred while executing the request. Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - No such host is known.) - ---> System.ComponentModel.Win32Exception (11001): No such host is known. - at Microsoft.Data.ProviderBase.DbConnectionPool.CheckPoolBlockingPeriod(Exception e) - at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) - at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) - at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) - at Microsoft.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen() ---- End of stack trace from previous location where exception was thrown --- - at YesSql.Store.InitializeAsync() - at YesSql.StoreFactory.CreateAsync(IConfiguration configuration) - at Microsoft.Extensions.DependencyInjection.OrchardCoreBuilderExtensions.<>c.b__0_1(IServiceProvider sp) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Data\OrchardCoreBuilderExtensions.cs:line 93 - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) - at Microsoft.Extensions.DependencyInjection.OrchardCoreBuilderExtensions.<>c.b__0_2(IServiceProvider sp) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Data\OrchardCoreBuilderExtensions.cs:line 103 - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) - at OrchardCore.Data.Migration.AutomaticDataMigrations.ActivatingAsync() in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Data\Migration\AutomaticDataMigrations.cs:line 42 - at OrchardCore.Environment.Shell.Scope.ShellScope.ActivateShellAsync() in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Abstractions\Shell\Scope\ShellScope.cs:line 252 - at OrchardCore.Environment.Shell.Scope.ShellScope.UsingAsync(Func`2 execute) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Abstractions\Shell\Scope\ShellScope.cs:line 202 - at OrchardCore.Setup.Services.SetupService.SetupInternalAsync(SetupContext context) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Setup.Core\SetupService.cs:line 150 - at OrchardCore.Setup.Services.SetupService.SetupAsync(SetupContext context) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Setup.Core\SetupService.cs:line 85 - at OrchardCore.Setup.Controllers.SetupController.IndexPOST(SetupViewModel model) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore.Modules\OrchardCore.Setup\Controllers\SetupController.cs:line 170 - at lambda_method(Closure , Object ) - at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() - at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() ---- End of stack trace from previous location where exception was thrown --- - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context) - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() ---- End of stack trace from previous location where exception was thrown --- - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) - at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) - at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context) - at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) - at OrchardCore.Modules.ModularTenantRouterMiddleware.Invoke(HttpContext httpContext) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore\Modules\ModularTenantRouterMiddleware.cs:line 63 - at OrchardCore.Environment.Shell.Scope.ShellScope.UsingAsync(Func`2 execute) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Abstractions\Shell\Scope\ShellScope.cs:line 204 - at OrchardCore.Modules.ModularTenantContainerMiddleware.Invoke(HttpContext httpContext) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore\Modules\ModularTenantContainerMiddleware.cs:line 59 - at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context) -ClientConnectionId:00000000-0000-0000-0000-000000000000 -Error Number:11001,State:0,Class:20 at Microsoft.Data.ProviderBase.DbConnectionPool.CheckPoolBlockingPeriod(Exception e) - at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) - at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) - at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) - at Microsoft.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen() ---- End of stack trace from previous location where exception was thrown --- - at YesSql.Store.InitializeAsync() - at YesSql.StoreFactory.CreateAsync(IConfiguration configuration) - at Microsoft.Extensions.DependencyInjection.OrchardCoreBuilderExtensions.<>c.b__0_1(IServiceProvider sp) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Data\OrchardCoreBuilderExtensions.cs:line 93 - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) - at Microsoft.Extensions.DependencyInjection.OrchardCoreBuilderExtensions.<>c.b__0_2(IServiceProvider sp) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Data\OrchardCoreBuilderExtensions.cs:line 103 - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope scope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) - at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) - at OrchardCore.Data.Migration.AutomaticDataMigrations.ActivatingAsync() in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Data\Migration\AutomaticDataMigrations.cs:line 42 - at OrchardCore.Environment.Shell.Scope.ShellScope.ActivateShellAsync() in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Abstractions\Shell\Scope\ShellScope.cs:line 252 - at OrchardCore.Environment.Shell.Scope.ShellScope.UsingAsync(Func`2 execute) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Abstractions\Shell\Scope\ShellScope.cs:line 202 - at OrchardCore.Setup.Services.SetupService.SetupInternalAsync(SetupContext context) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Setup.Core\SetupService.cs:line 150 - at OrchardCore.Setup.Services.SetupService.SetupAsync(SetupContext context) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Setup.Core\SetupService.cs:line 85 - at OrchardCore.Setup.Controllers.SetupController.IndexPOST(SetupViewModel model) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore.Modules\OrchardCore.Setup\Controllers\SetupController.cs:line 170 - at lambda_method(Closure , Object ) - at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() - at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() ---- End of stack trace from previous location where exception was thrown --- - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context) - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() ---- End of stack trace from previous location where exception was thrown --- - at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) - at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) - at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context) - at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) - at OrchardCore.Modules.ModularTenantRouterMiddleware.Invoke(HttpContext httpContext) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore\Modules\ModularTenantRouterMiddleware.cs:line 63 - at OrchardCore.Environment.Shell.Scope.ShellScope.UsingAsync(Func`2 execute) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore.Abstractions\Shell\Scope\ShellScope.cs:line 204 - at OrchardCore.Modules.ModularTenantContainerMiddleware.Invoke(HttpContext httpContext) in E:\Projects\Munka\Lombiq\OrchardForks\OrchardCore\src\OrchardCore\OrchardCore\Modules\ModularTenantContainerMiddleware.cs:line 59 - at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/serious-cat.jpg b/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/serious-cat.jpg deleted file mode 100644 index be00d344..00000000 Binary files a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Attachments/serious-cat.jpg and /dev/null differ diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/BasicMaintenance.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/BasicMaintenance.md deleted file mode 100644 index ada7db33..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/BasicMaintenance.md +++ /dev/null @@ -1,12 +0,0 @@ -# Basic maintenance - -- Troubleshooting - - Enabling the display of all thrown exception - - Understanding log files (see sample in attachments) - - Contacting module authors and filing reproducible, meaningful bug reports - -Time requirement: 0h 30m - -Dependencies: [Basic site management](BasicSiteManagement) - -Parent topic: [Core concepts and basic usage](./) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/BasicSiteManagement.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/BasicSiteManagement.md deleted file mode 100644 index 58c10852..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/BasicSiteManagement.md +++ /dev/null @@ -1,29 +0,0 @@ -# Basic site management - -- Content model and content management - - Content types, parts and fields - - Creating and editing content items and content types, Content Preview - - Versioning: drafts (and Draftable metadata) and published versions - - Other metadata (apart from Securable and indexing-related) - - Demo: basic content types of The Blog recipe (Page, widgets, Blog Post, listing content items like Blog does) - - Demo: basic content types of The Agency recipe (Landing Page, widgets, change the content of the Landing Page content item) - - Demo: creating a content type - - Demo: editing and versioning a content item - - Exercise: creating a content type with fields and parts and creating items based on instructions -- Modules and themes - - Enabling/disabling module features and themes - - Dependencies - - Always enabled features -- User management and roles, permissions - - Users: user management features, enabling Users Registration, listing users, settings - - Roles: editing existing roles, creating new roles, permissions (general ones and for content types) - - Securable metadata and dynamic content type permissions - - Demo: users and roles admin pages - - Demo: register with a new user, verify the email address (configure SMTP), and see the details of the user in the admin UI - - Exercise: creating a role with selected permissions; enabling registration, registering a new user and assigning it to the newly created role - -Time requirement: 2h 0m - -Dependencies: none - -Parent topic: [Core concepts and basic usage](./) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/CustomizationFeatures.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/CustomizationFeatures.md deleted file mode 100644 index e804b943..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/CustomizationFeatures.md +++ /dev/null @@ -1,16 +0,0 @@ -# Customization features - -- Multi-tenancy -- Writing recipes - - Installing and enabling themes/features - - Commands - - Adding exported content types and content items -- Optional: localization - - Installing a .po package - - Setting up locales and [creating localized content items](https://orcharddojo.net/blog/how-to-localize-content-items-orchard-nuggets) - -Time requirement: 1h 0m - -Dependencies: [Intermediate content management](IntermediateContentManagement) - -Parent topic: [Core concepts and basic usage](./) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/ExpertContentManagement.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/ExpertContentManagement.md deleted file mode 100644 index 4946ae91..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/ExpertContentManagement.md +++ /dev/null @@ -1,21 +0,0 @@ -# Expert content management - -- Deployment and recipes - - Exporting/importing content - - Remote deployment -- Queries and Templates - - SQL queries (see [the official docs](https://docs.orchardcore.net/en/dev/docs/reference/modules/Queries/#executing-sql-queries) for sample queries) - - Displaying query results from a Liquid template (e.g. with Liquid Page) - - Lucene queries -- OpenID - - Set up the Authorization Server - - Allow Client Credentials Flow - - Add a new Application - - Mention the `ViewContentApi` permission - - Demo: using Postman to get a new access token and manipulate content items using the built-in APIs in Orchard Core - -Time requirement: 1h 30m - -Dependencies: [Advanced content management](AdvancedContentManagement) - -Parent topic: [Core concepts and basic usage](./) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Index.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/Index.md deleted file mode 100644 index 3d8c4cde..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Index.md +++ /dev/null @@ -1,9 +0,0 @@ -# Core concepts and basic usage (training topic) - -- [Introduction](Introduction) -- [Basic site management](BasicSiteManagement) -- [Intermediate content management](IntermediateContentManagement) -- [Advanced content management](AdvancedContentManagement) -- [Expert content management](ExpertContentManagement) -- [Customization features](CustomizationFeatures) -- [Basic maintenance](BasicMaintenance) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/IntermediateContentManagement.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/IntermediateContentManagement.md deleted file mode 100644 index 1c4a3a72..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/IntermediateContentManagement.md +++ /dev/null @@ -1,26 +0,0 @@ -# Intermediate content management - -- Taxonomies -- Widgets in Layers - - Layers and layer rules, zones (theme anatomy) - - Adding new supported zones - - When to add widgets to content items (differences between Bag Part, Flow Part, Widgets List Part) and when to layers - - Demo: creating a new layer and an Html Widget - - Demo: creating a new content type with the Widget stereotype, add that to a Zone - - Exercise: creating NotTheHomepage layer and an Html Widget in the Footer zone in that layer -- Navigation - - Creating and editing a menu - - Adding and editing Link Menu Items and Content Menu Items - - Editing link hierarchy - - Comparison with Admin Menus - - Exercise: creating a menu with all kinds of items -- Media management - - Managing media with Media Library - - Inserting images into text fields - - For this, prepare suitable files. Pictures from the [Wikipedia Cat article](https://en.wikipedia.org/wiki/Cat) are included in the Attachments folder. - -Time requirement: 1h 0m - -Dependencies: [Basic site management](BasicSiteManagement) - -Parent topic: [Core concepts and basic usage](./) diff --git a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Introduction.md b/CoreLibrary/Training/CoreConceptsAndBasicUsage/Introduction.md deleted file mode 100644 index 88ea118c..00000000 --- a/CoreLibrary/Training/CoreConceptsAndBasicUsage/Introduction.md +++ /dev/null @@ -1,22 +0,0 @@ -# Introduction - -- Orchard ecosystem as under the [Orchard link collection](../../LinkCollection) -- Showcasing complex/notable Orchard apps from [Show Orchard](http://showorchard.com). -- Architectural overview - - .NET -> ASP.NET Core -> ASP.NET Core MVC -> Orchard Core - - Uses a lot of other open-source projects and common web frameworks/library (e.g. Json.NET, Lucene, xUnit, YesSQL, jQuery, Bootstrap) - - Modularized architecture (modules, themes) -- How to get my own Orchard instance? - - [Official Orchard releases](https://github.com/OrchardCMS/OrchardCore/releases) as source or from NuGet - - Using the [preview package feed](https://docs.orchardcore.net/en/dev/docs/getting-started/preview-package-source/) -- Using Orchard as a full, decoupled, and headless CMS -- Installing Orchard (running the setup): choosing a database engine (and its implications), recipes -- Basic site settings -- Demo: fire up Visual Studio and create a new ASP.NET Core Web Application. Follow the [Getting started with Orchard Core as a NuGet package](https://docs.orchardcore.net/en/dev/docs/getting-started/) page to create an Orchard Core CMS application. -- Demo: installing and basic settings. You can install with the Agency theme at this stage if you want to show differences between recipes or install with the Blog recipe right away to showcase its content types later. - -Time requirement: 1h 0m - -Dependencies: none - -Parent topic: [Core concepts and basic usage](./) diff --git a/CoreLibrary/Training/DeploymentAndOptimization/AutomatedDeployment.md b/CoreLibrary/Training/DeploymentAndOptimization/AutomatedDeployment.md deleted file mode 100644 index 05b7de47..00000000 --- a/CoreLibrary/Training/DeploymentAndOptimization/AutomatedDeployment.md +++ /dev/null @@ -1,11 +0,0 @@ -# Continuous integration/deployment and Azure hosting - -- CI builds and test execution with [Lombiq GitHub Actions](https://github.com/Lombiq/GitHub-Actions). -- Creating an Orchard Core-optimized Azure hosting environment. -- Automated deployments to Azure with [Lombiq GitHub Actions](https://github.com/Lombiq/GitHub-Actions). - -Time requirement: 1h 30m - -Dependencies: [Getting started in module development](../ModuleDevelopmentAndApis/GettingStartedInModuleDevelopment) - -Parent topic: [Deployment and optimization](./) diff --git a/CoreLibrary/Training/DeploymentAndOptimization/Index.md b/CoreLibrary/Training/DeploymentAndOptimization/Index.md deleted file mode 100644 index 096d2b4d..00000000 --- a/CoreLibrary/Training/DeploymentAndOptimization/Index.md +++ /dev/null @@ -1,5 +0,0 @@ -# Deployment and optimization (training topic) - -- [Optimization](Optimization) -- [Manual deployment](ManualDeployment) -- [Continuous integration/deployment and Azure hosting](AutomatedDeployment) diff --git a/CoreLibrary/Training/DeploymentAndOptimization/ManualDeployment.md b/CoreLibrary/Training/DeploymentAndOptimization/ManualDeployment.md deleted file mode 100644 index fcee7128..00000000 --- a/CoreLibrary/Training/DeploymentAndOptimization/ManualDeployment.md +++ /dev/null @@ -1,16 +0,0 @@ -# Manual deployment - -- Deploying to Azure App Services - - Creating a web app in Azure - - Deploying from Visual Studio using a publish profile - - Configuring Azure Media Storage -- Deploying to an Azure Virtual Machine - - Creating an VM - - Setting up IIS on the VM - - Deploying Orchard Core from Visual Studio - -Time requirement: 1h 45m - -Dependencies: [Getting started in module development](../ModuleDevelopmentAndApis/GettingStartedInModuleDevelopment) - -Parent topic: [Deployment and optimization](./) diff --git a/CoreLibrary/Training/DeploymentAndOptimization/Optimization.md b/CoreLibrary/Training/DeploymentAndOptimization/Optimization.md deleted file mode 100644 index 58641839..00000000 --- a/CoreLibrary/Training/DeploymentAndOptimization/Optimization.md +++ /dev/null @@ -1,13 +0,0 @@ -# Optimization - -- Understanding the implications of basic built-in performance-related features - - SQL indices defined in migrations - - Cache attributes of the `menu` and `shape` tag helpers -- General guidelines under ["Orchard performance optimization guidelines"](../../DevelopmentGuidelines/OrchardPerformanceOptimization) -- Profiling with the Mini Profiler module - -Time requirement: 0h 30m - -Dependencies: [Basic techniques in module development](../ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment) - -Parent topic: [Deployment and optimization](./) diff --git a/CoreLibrary/Training/ExtendedApis/ExtendedApis1.md b/CoreLibrary/Training/ExtendedApis/ExtendedApis1.md deleted file mode 100644 index 054b0f5f..00000000 --- a/CoreLibrary/Training/ExtendedApis/ExtendedApis1.md +++ /dev/null @@ -1,10 +0,0 @@ -# Extended Orchard Core APIs I - -- Common Orchard Core provider model -- Extending Queries with `IQuerySource` - -Time requirement: 1h - -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) - -Parent topic: [Extended APIs](./) diff --git a/CoreLibrary/Training/ExtendedApis/ExtendedApis2.md b/CoreLibrary/Training/ExtendedApis/ExtendedApis2.md deleted file mode 100644 index 2aedff6f..00000000 --- a/CoreLibrary/Training/ExtendedApis/ExtendedApis2.md +++ /dev/null @@ -1,13 +0,0 @@ -# Extended Orchard Core APIs II - -- Liquid filters -- Tag helpers -- Workflows (`IActivity`) providers: - - Events - - Tasks - -Time requirement: 2h 30m - -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) - -Parent topic: [Extended APIs](./) diff --git a/CoreLibrary/Training/ExtendedApis/ExtendedApis3.md b/CoreLibrary/Training/ExtendedApis/ExtendedApis3.md deleted file mode 100644 index 36c5dd73..00000000 --- a/CoreLibrary/Training/ExtendedApis/ExtendedApis3.md +++ /dev/null @@ -1,13 +0,0 @@ -# Extended Orchard Core APIs III - -- Creating an admin theme -- Advanced shapes: - - `IShapeDisplayEvents` - - `IShapeTableProvider` implementation to add alternates (see e.g. `OrchardCore.Contents.Shapes`), wrappers (see e.g. `MediaShapes`), classes, hook into events - - Shape methods with the `Shape` attribute (see `DemoShapeProvider`) - -Time requirement: 1h 30m - -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) - -Parent topic: [Extended APIs](./) diff --git a/CoreLibrary/Training/ExtendedApis/Index.md b/CoreLibrary/Training/ExtendedApis/Index.md deleted file mode 100644 index 525c8dad..00000000 --- a/CoreLibrary/Training/ExtendedApis/Index.md +++ /dev/null @@ -1,9 +0,0 @@ -# Extended Orchard Core APIs (training topic) - -The knowledge of the below APIs is not necessary for all developers as these are needed only for more special tasks. - -- [Extended Orchard Core APIs I.](ExtendedApis1) -- [Extended Orchard Core APIs II.](ExtendedApis2) -- [Extended Orchard Core APIs III.](ExtendedApis3) - -There is no need to go into details about all providers, evaluating a few provider types used in Projector and a Token provider is enough. diff --git a/CoreLibrary/Training/Index.md b/CoreLibrary/Training/Index.md deleted file mode 100644 index 49d8a70d..00000000 --- a/CoreLibrary/Training/Index.md +++ /dev/null @@ -1,46 +0,0 @@ -# Orchard Core training guidelines - -The following guidelines serve as a base for [Orchard Core trainings](https://orcharddojo.net/orchard-training) and you're welcome to hold your own Orchard Core training using these guidelines. - -## Training methodologies - -For methodologies for various forms of Orchard training see [training methodologies](TrainingMethodologies). - -## Prerequisite knowledge of participants - -During courses we routinely touch on various technologies and paradigms used by Orchard. The knowledge of these is thus an advantage though not a necessity, and participants will also have a chance to learn about them in practice. Here are some keywords of some technologies and paradigms used in Orchard Core: - -- Fundamentals: Advanced C#, [ASP.NET Core MVC](https://docs.microsoft.com/en-us/aspnet/core/mvc/overview). -- Patterns and paradigms: [Dependency injection](http://en.wikipedia.org/wiki/Dependency_injection), [loose coupling](http://en.wikipedia.org/wiki/Loose_coupling), [document database](https://en.wikipedia.org/wiki/Document-oriented_database) and SQL, [composition over inheritance](http://en.wikipedia.org/wiki/Composition_over_inheritance), [single responsibility principle](http://en.wikipedia.org/wiki/Single_responsibility_principle), [separation of concerns](http://en.wikipedia.org/wiki/Separation_of_concerns), [modular programming](https://en.wikipedia.org/wiki/Modular_programming), [multi-tenancy](https://en.wikipedia.org/wiki/Multitenancy). -- Server-side technologies: [Json.NET](https://www.newtonsoft.com/json), [Razor syntax](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor) and [Liquid templates](https://shopify.github.io/liquid/), [NuGet packages](https://nuget.org/), [GraphQL](https://graphql.org/) and [RESTful](https://restfulapi.net/) APIs. -- Client-side technologies: [Bootstrap](https://getbootstrap.com/), [jQuery](https://jquery.com/), [Sass](https://sass-lang.com/), [NPM packages](https://www.npmjs.com/), [HTML 5](https://en.wikipedia.org/wiki/HTML5). - -Overall what we think is roughly what participants should already know about: - -- Mandatory: basic usage of Visual Studio, basic knowledge of C#, basic knowledge of client-side web development (HTML, CSS, JS), previous experience in building .NET (web) apps. -- Strongly advised: basic understanding of Git or some other source control system, ASP.NET Core MVC, and strong knowledge of C#. -- Advised: understanding inversion of control containers and dependency injection, usage of the Razor syntax for HTML templates. - -## Technical requirements - -The following tools are needed for an Orchard training: - -- Lab computers or participants' computers: - - Software listed under "Software to install" in "[Development environment advice](../DevelopmentGuidelines/DevelopmentEnvironment)". - - Administrative account to install other components if necessary and to avoid permission issues when running Orchard -- Trainer's PC having all of the above and connected to a projector for demonstrations -- A whiteboard or something similar - -## Topics - -The topics are each divided into individual modules. These modules can, but don't necessarily have dependency on each other. - -When conducting a training even before these start with an introduction of yourself, then of the participants to get a general feeling of where everybody is coming from, and what would be interesting for them. Note that the indicated time requirements are more like guidelines on the minimal recommended time. Allocate sufficient time above this for discussions, and in the case of multi-day trainings, for recaps at the beginning of each day. - -- [Core concepts and basic usage](CoreConceptsAndBasicUsage/) -- [Theme development](ThemeDevelopment/) -- [Module development and Orchard APIs](ModuleDevelopmentAndApis/) -- [Extended APIs](ExtendedApis/) -- [Web API](WebApi/) -- [Deployment and optimization](DeploymentAndOptimization/) -- [Team training](TeamTraining/) (for development teams) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/AdvancedTechniquesInModuleDevelopment.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/AdvancedTechniquesInModuleDevelopment.md deleted file mode 100644 index 0d8e3e87..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/AdvancedTechniquesInModuleDevelopment.md +++ /dev/null @@ -1,16 +0,0 @@ -# Advanced techniques in module development - -- Ways of storing settings - - Site settings and implementing an admin menu - - Content type settings (e.g. Indexing) - - Content part settings: part-level and type-level settings -- Caching - - `IMemoryCache` for instance-level caching - - `IDynamicCacheService` or `IDistributedCache` for farm-wide caching -- Recipes inside modules - -Time requirement: 2h 30m - -Dependencies: [Intermediate techniques in module development](IntermediateTechniquesInModuleDevelopment) - -Parent topic: [Module development and APIs](./) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/AutomatedTesting.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/AutomatedTesting.md deleted file mode 100644 index 40995d6f..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/AutomatedTesting.md +++ /dev/null @@ -1,10 +0,0 @@ -# Automated testing in Orchard Core - -- Writing unit tests with help of the [Lombiq Testing Toolbox](https://github.com/Lombiq/Testing-Toolbox). -- Writing UI tests with the help of [Lombiq UI Testing Toolbox](https://github.com/Lombiq/UI-Testing-Toolbox). - -Time requirement: 2h 0m - -Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment) - -Parent topic: [Module development and APIs](./) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md deleted file mode 100644 index 9ea499ab..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md +++ /dev/null @@ -1,13 +0,0 @@ -# Basic techniques in module development - -- Displaying entities with display management -- Basic document storage - - Storing documents in the database for entities with `ISession` - - Indices, migrations, and querying -- Abstracted file storage with `IMediaFileStore` - -Time requirement: 2h 30m - -Dependencies: [Getting started with module development](GettingStartedWithModuleDevelopment) - -Parent topic: [Module development and APIs](./) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/ComplementaryTopicsInModuleDevelopment.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/ComplementaryTopicsInModuleDevelopment.md deleted file mode 100644 index 842f6dc4..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/ComplementaryTopicsInModuleDevelopment.md +++ /dev/null @@ -1,10 +0,0 @@ -# Complementary topics in module development - -- Middlewares -- Integrating with client-side build pipelines using [Lombiq NPM MSBuild Targets](https://github.com/Lombiq/NPM-Targets) and [Lombiq Node.js Extensions](https://github.com/Lombiq/NodeJs-Extensions). - -Time requirement: 2h 0m - -Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment) - -Parent topic: [Module development and APIs](./) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/DevelopingCustomContent.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/DevelopingCustomContent.md deleted file mode 100644 index bf4d490e..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/DevelopingCustomContent.md +++ /dev/null @@ -1,25 +0,0 @@ -# Developing custom content - -- Content part development - - Parts and their comparison to entities, part data storage - - Content type and content part migrations, code generation with [Helpful Extensions](https://github.com/Lombiq/Helpful-Extensions#code-generation-helpful-extensions) - - Drivers: Display and edit methods - - Editor and display shapes - - Handlers - - Placement -- Exercise - - Module code generation - - SpaceShip content type - - Title part for name - - `AutoroutePart` for url - - `SpaceShipPart` content part - - Captain - - Class - - Number of crew - - `MediaPickerField` (needs the Fields feature) for an image: for this also a shape template override with a stylesheet include (e.g. the image should be displayed with rounded corners) - -Time requirement: 2h 30m - -Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment) - -Parent topic: [Module development and APIs](./) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md deleted file mode 100644 index 0c1bdb73..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md +++ /dev/null @@ -1,23 +0,0 @@ -# Getting started with module development - -- Structural overview of the Orchard source - - Contents of the Orchard folder (docs, _App\_Data_ in _OrchardCore.Cms.Web_, module/theme folders...) - - Solution overview, a look at how Orchard structures projects (packages) -- The structure of a module (OrchardCore.Media is a good complete example) - - Manifest: features and dependencies - - Views, wwwroot folders - - Other conventional folders -- The structure of a theme -- Code generation templates -- Integrating with the current theme -- Dependency injection and basic services on the example of a simple controller - - Notifier - - Localizers - - Logger - - T-strings in templates - -Time requirement: 1h - -Dependencies: none - -Parent topic: [Module development and APIs](./) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/Index.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/Index.md deleted file mode 100644 index 23626985..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/Index.md +++ /dev/null @@ -1,11 +0,0 @@ -# Module development and Orchard Core APIs (training topic) - -The below topics are the core of what an Orchard developer should know. Other, less important items are listed under [Extended Orchard Core APIs](../ExtendedApis/). - -- [Getting started with module development](GettingStartedWithModuleDevelopment) -- [Basic techniques in module development](BasicTechniquesInModuleDevelopment) -- [Developing custom content](DevelopingCustomContent) -- [Intermediate techniques in module development](IntermediateTechniquesInModuleDevelopment) -- [Advanced techniques in module development](AdvancedTechniquesInModuleDevelopment) -- [Automated testing](AutomatedTesting) -- [Complementary topics of module development](ComplementaryTopicsInModuleDevelopment) diff --git a/CoreLibrary/Training/ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md b/CoreLibrary/Training/ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md deleted file mode 100644 index 393909bb..00000000 --- a/CoreLibrary/Training/ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md +++ /dev/null @@ -1,15 +0,0 @@ -# Intermediate techniques in module development - -- Custom routes with attribute routing and route maps -- Filters - - Injecting shapes into the layout - - Registering resources from filters (alternatively easier with [Helpful Libraries](https://github.com/Lombiq/Helpful-Libraries/blob/dev/Lombiq.HelpfulLibraries/Docs/ResourceManagementLibraries.md)) -- Events and hooking into events like `ILoginFormEvent` -- Permissions and authorization -- Background tasks - -Time requirement: 3h 0m - -Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment) - -Parent topic: [Module development and APIs](./) diff --git a/CoreLibrary/Training/TeamTraining/Index.md b/CoreLibrary/Training/TeamTraining/Index.md deleted file mode 100644 index 78474d33..00000000 --- a/CoreLibrary/Training/TeamTraining/Index.md +++ /dev/null @@ -1,21 +0,0 @@ -# Team training (training topic) - -- How to write code - - Agree on and follow [common guidelines](../../DevelopmentGuidelines/) and conventions - - Writing documentation inline, in Markdown files, and in a private wiki. - - Utilizing [static code analysis](https://github.com/Lombiq/.NET-Analyzers) to enforce common coding rules and pinpoint potential issues. -- How to share code and other application data - - Version control best practices - - Branching strategy - - 3rd party modules and themes in submodules or as packages - - Main repo - - Proper exclusion filters - - Share dev database snapshot or dev recipe (with [Auto Setup](https://docs.orchardcore.net/en/latest/docs/reference/modules/AutoSetup/)) - - Share differential recipes for code changes -- How to communicate - - Issue tracking best practices - - Knowledge management best practices - -Time requirement: 1h - -Dependencies: none diff --git a/CoreLibrary/Training/ThemeDevelopment/AdvancedThemeDevelopment.md b/CoreLibrary/Training/ThemeDevelopment/AdvancedThemeDevelopment.md deleted file mode 100644 index 99b36c42..00000000 --- a/CoreLibrary/Training/ThemeDevelopment/AdvancedThemeDevelopment.md +++ /dev/null @@ -1,16 +0,0 @@ -# Advanced theme development - -- Placement.json - - Placement: shape name, zone, weight - - Matching (DisplayType, ContentType, Path) - - Reordering content part parts and fields from the admin - - See the [official docs](https://docs.orchardcore.net/en/dev/docs/reference/core/Placement/) -- Approaches to building a new theme - - Top-down: how to convert an existing template/site build to an Orchard theme - - Bottom-up: building on top of an existing theme, using it as the base theme, how to create a new theme from a given design suite - -Time requirement: 30m - -Dependencies: [Getting started with theme development](GettingStartedWithThemeDevelopment) - -Parent topic: [Theme development](./) diff --git a/CoreLibrary/Training/ThemeDevelopment/GettingStartedWithThemeDevelopment.md b/CoreLibrary/Training/ThemeDevelopment/GettingStartedWithThemeDevelopment.md deleted file mode 100644 index a4fca26c..00000000 --- a/CoreLibrary/Training/ThemeDevelopment/GettingStartedWithThemeDevelopment.md +++ /dev/null @@ -1,21 +0,0 @@ -# Getting started with theme development - -- Structure - - Explaining the Manifest (BaseTheme), Startup class - - Usual folders - - Razor vs Liquid, tag helpers -- Code generation templates -- Shapes - - Notion of shapes, hierarchical rendering of shapes (demonstrate it with the call stack using the debugger, e.g. with `MenuItem.cshml`, also explaining shape caching) - - The notion and use of the Layout shape, checking it out with the debugger - - Alternates and overrides (the [basic ones](https://docs.orchardcore.net/en/dev/docs/reference/modules/Templates/#available-templates) and examples of others like [for the menu](https://docs.orchardcore.net/en/dev/docs/reference/modules/Menu/#menu-alternates)). You can ovverride TitlePart.cshtml as an example. - - Shape templates and important view variables (e.g. `Context`, `Title`, `Model`, `User`), T-strings - - Writing editor and display shape templates, explaining Model object usage - - Ad-hoc shapes -- Static resources: styles/scripts (how to include/require them) and resource manifests - -Time requirement: 2h 30m - -Dependencies: none - -Parent topic: [Theme development](./) diff --git a/CoreLibrary/Training/ThemeDevelopment/Index.md b/CoreLibrary/Training/ThemeDevelopment/Index.md deleted file mode 100644 index a70a6747..00000000 --- a/CoreLibrary/Training/ThemeDevelopment/Index.md +++ /dev/null @@ -1,4 +0,0 @@ -# Theme development (training topic) - -- [Getting started with theme development](GettingStartedWithThemeDevelopment) -- [Advanced theme development](AdvancedThemeDevelopment) diff --git a/CoreLibrary/Training/TrainingMethodologies.md b/CoreLibrary/Training/TrainingMethodologies.md deleted file mode 100644 index bdb5703d..00000000 --- a/CoreLibrary/Training/TrainingMethodologies.md +++ /dev/null @@ -1,61 +0,0 @@ -# Training methodologies - -Following are methodologies for various forms of Orchard Core trainings. - -- Remember that it's a good thing to have regular breaks within every hour. -- Keep the time between explaining something new and demonstrating it short; i.e. if you explain something, show it. -- After a session (lesson, tutorial video...) do a quick recap of what was covered: click through what was explained and briefly mention again if there is something to emphasize. -- Utilize the [Visual Studio snippets](../../CoreLibrary/Utilities/VisualStudioSnippets/) to write code quickly instead of typing out everything. Use the [Utility Scripts](https://github.com/Lombiq/Utility-Scripts) to speed up common tasks like creating an Orchard Visual Studio solution. -- We've created a demo module for the purpose of teaching all the topics here with well explained examples, the [Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module). The training topics loosely follow the Training Demo. If you want to use the Training Demo as a reference when giving a training, even copy-pasting from it then the [Comment Remover](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.CommentRemover) Visual Studio extension can come handy: You can remove the Training Demo's comments so they're not clutter while you explain the same thing. -- Suggest further resources and reading materials for attendees, e.g.: - - [Official docs](https://docs.orchardcore.net/) - - [Orchard Dojo Library](https://orcharddojo.net/orchard-resources/CoreLibrary/), especially [Software development guidelines](https://orcharddojo.net/orchard-resources/CoreLibrary/DevelopmentGuidelines/) and [Development utilities](https://orcharddojo.net/orchard-resources/CoreLibrary/Utilities/) (including Visual Studio code snippets and the Utility Scripts project) - - [Lombiq Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module) - -## University course - -### Class work and examination - -#### Lesson structure - -Every lesson begins with a short warm-up task incorporating the topics of the previous lesson. - -Lessons generally have repeated cycles of the following form: - -1. Presentation: the course leader explains the current topic (10-15 minutes), if the content is practical (like doing some dashboard work) students follow individually -2. Group work - - After hearing the presentation about how to solve a certain problem students are encouraged to try out the new techniques for given tasks in form of a group work. The task either - - consists of the topic demonstrated before - - or is something slightly new that can be derived from the demonstration or learned by reading a short documentation. - The former one is a good choice if there is enough time, the latter one is efficient if there's only limited time available. - - Groups of 2-3-4 try to solve a problem while the course leader is helping their work and is available for questions -3. Evaluation of the group work: discussing common questions and issues - -#### Examination - -The course has no special examination, instead students should create and finish and Orchard-based web application project. - -- Students form teams of arbitrary size (it’s also possible to work alone) -- Every team’s task is to create a real-world Orchard-based web application -- There are no limitations or obligations to that, although the groups are encouraged to develop one custom module that uses existing Orchard features in a creative way but doesn’t replicate any built-in functionality -- One student gives a presentation of the project after completing it with a maximal length of 5 minutes. The presentation should be a live demonstration of the web application. After the presentations the course leader has very brief code review sections with all of the other students were the students present a section of their software, demonstrating their understanding. - -### Schedule - -Additional is the time needed for student presentations (depends on the number of attendees) since the course’s final lesson consists of student presentations and code reviews. - -## Intensive course - -Since intensive courses should be tailored to the participants' needs the following points are just outlines and tips. Time constraint is also a factor that determines how in-depth the training can be, how many demonstrations can be carried out and how big is the part of the API that's only shown. - -- Live demonstration of the usage of Orchard APIs. -- Live demonstration of some inner workings with t.he debugger (e.g. demonstrating how the tree of shapes is built up) -- Showing aspects of the Orchard API without running them just so participants can get to know what piece of API to look for when they want to achieve something (e.g. `IMediaFileStore` is a good candidate: it's easy to use but one needs to know about it). -- Few hour-long hackathon with a certain aim (e.g. to develop a module that's needed by the participants) -- Code review: participants write some code on their own, then the trainer checks them and comments on them line by line with code review tools. Common mistakes can be discussed with the whole group. - -If the course is online: - -- Record the sessions if the client would like it. -- Break days can be added too, with no training taking place: That way participants can catch up with their daily activities, have a chance to digest what was learned, are encouraged to try out everything themselves, and come back with questions for the next occasion. -- It's easier to keep the meeting running for short breaks. When participants come back they can signal that they're present with the "raise hand" feature many webmeeting tools have. diff --git a/CoreLibrary/Training/WebApi/Index.md b/CoreLibrary/Training/WebApi/Index.md deleted file mode 100644 index bdb2d361..00000000 --- a/CoreLibrary/Training/WebApi/Index.md +++ /dev/null @@ -1,8 +0,0 @@ -# Web API (training topic) - -- Creating RESTful API controllers -- Building GraphQL queries, using the GraphiQL browser - -Time requirement: 1h 0m - -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) diff --git a/CoreLibrary/Utilities/Index.md b/CoreLibrary/Utilities/Index.md index eea3512e..096b1e51 100644 --- a/CoreLibrary/Utilities/Index.md +++ b/CoreLibrary/Utilities/Index.md @@ -2,7 +2,7 @@ Contained here are various utilities aiding daily development. -- [Visual Studio Code Snippets](VisualStudioSnippets/) +- [Visual Studio Code Snippets](VisualStudioSnippets/Index.md) - [Lombiq Utility Scripts](https://github.com/Lombiq/Utility-Scripts) with scripts that come handy during Orchard Core development work. -- [Lombiq Orchard Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=LombiqVisualStudioExtension.LombiqOrchardVisualStudioExtension) and [other suggestions on the development environment](../DevelopmentGuidelines/DevelopmentEnvironment) +- [Lombiq Orchard Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=LombiqVisualStudioExtension.LombiqOrchardVisualStudioExtension) and [other suggestions on the development environment](../DevelopmentGuidelines/DevelopmentEnvironment.md) - [Lombiq .NET Analyzers](https://github.com/Lombiq/.NET-Analyzers): .NET code analyzers and code convention settings so you can see Orchard-style conventions and and best practices enforced in your IDE, as well as during build. diff --git a/CoreLibrary/Utilities/VisualStudioSnippets/Index.md b/CoreLibrary/Utilities/VisualStudioSnippets/Index.md index c90efea5..94ae03c6 100644 --- a/CoreLibrary/Utilities/VisualStudioSnippets/Index.md +++ b/CoreLibrary/Utilities/VisualStudioSnippets/Index.md @@ -1,6 +1,6 @@ # Visual Studio code snippets -You can use these [code snippets](https://docs.microsoft.com/en-us/visualstudio/ide/code-snippets) to quickly generate code in some common scenarios during Orchard Core module and theme development. The snippets follow [Orchard naming conventions](../../DevelopmentGuidelines/NamingConventions). Check out [this demo video](https://www.youtube.com/watch?v=5L95C0qxrA0) for a quick overview of our snippets. +You can use these [code snippets](https://docs.microsoft.com/en-us/visualstudio/ide/code-snippets) to quickly generate code in some common scenarios during Orchard Core module and theme development. The snippets follow [Orchard naming conventions](../../DevelopmentGuidelines/NamingConventions.md). Check out [this demo video](https://www.youtube.com/watch?v=5L95C0qxrA0) for a quick overview of our snippets. To effectively use this collection of VS snippets just point the Snippets Manager to where you cloned or downloaded this repository (). To do this go under Tools → Code Snippets Manager → select the C# language → Add and Add the whole folder. For Razor snippets to also work select the HTML Language and do the same. Do note that Razor snippets will only be suggested when you hit Ctrl + space first. diff --git a/Library/DevelopmentGuidelines/BestPractices/Index.md b/Library/DevelopmentGuidelines/BestPractices/Index.md index 4dff1464..da4cae5a 100644 --- a/Library/DevelopmentGuidelines/BestPractices/Index.md +++ b/Library/DevelopmentGuidelines/BestPractices/Index.md @@ -9,8 +9,8 @@ ## Topics -- [C# best practices](CSharp) -- [Orchard best practices](Orchard) -- [JavaScript best practices](JavaScript) -- [CSS best practices](Css) -- [Source control best practices](SourceControl) +- [C# best practices](CSharp.md) +- [Orchard best practices](Orchard.md) +- [JavaScript best practices](JavaScript.md) +- [CSS best practices](Css.md) +- [Source control best practices](SourceControl.md) diff --git a/Library/DevelopmentGuidelines/BestPractices/Orchard.md b/Library/DevelopmentGuidelines/BestPractices/Orchard.md index aba8f6b9..f670fe97 100644 --- a/Library/DevelopmentGuidelines/BestPractices/Orchard.md +++ b/Library/DevelopmentGuidelines/BestPractices/Orchard.md @@ -77,7 +77,7 @@ When doing I/O-bound work, always use async APIs if available (e.g. web requests When you add a client-side plugin to your module or theme (like a jQuery plugin that uses various JS and CSS files, has a readme, etc.) then it's best to keep the folder structure of the plugin intact and copy it to the extension's Content folder (a folder simply serving static files with the same Web.config as Styles and Scripts folders) under its own subfolder. This way maintaining and upgrading the plugin will be easier, not to mention that developers will be able to see all of its files at once. -You'll be able to still include static resources from such a folder through the ResourceManager, you'll just have to use relative paths, e.g. like this in a [resource manifest](../../Wiki/ResourceManifest): +You'll be able to still include static resources from such a folder through the ResourceManager, you'll just have to use relative paths, e.g. like this in a [resource manifest](../../Wiki/ResourceManifest.md): manifest.DefineScript("MyScript").SetUrl("~/Themes/MyTheme/Content/Plugin/script.js"... diff --git a/Library/DevelopmentGuidelines/CodeStyling.md b/Library/DevelopmentGuidelines/CodeStyling.md index 521e081c..4999d544 100644 --- a/Library/DevelopmentGuidelines/CodeStyling.md +++ b/Library/DevelopmentGuidelines/CodeStyling.md @@ -1,3 +1,3 @@ # Code styling -See [this page](../../CoreLibrary/DevelopmentGuidelines/CodeStyling). +See [this page](../../CoreLibrary/DevelopmentGuidelines/CodeStyling.md). diff --git a/Library/DevelopmentGuidelines/CreatingNewOrchardRepository.md b/Library/DevelopmentGuidelines/CreatingNewOrchardRepository.md index 9d7b7c1e..ff7072ef 100644 --- a/Library/DevelopmentGuidelines/CreatingNewOrchardRepository.md +++ b/Library/DevelopmentGuidelines/CreatingNewOrchardRepository.md @@ -8,4 +8,4 @@ If from [the possible ways of source controlling an Orchard solution](http://eng 4. If you're using IIS Express to run the app then it's best to change the default Project Url: right click Orchard.Web/Properties/Web. Using a different app path instead of the default "OrchardLocal" is enough to differentiate between different solutions. 5. Depending on your preference for text file line endings (CRLF - Windows style or LF - Linux style) and the source control system to use (Git or Mercurial; if you use something else then no need to do anything) need you to remove some config files: if you want to store files with the LF line ending in your repo then nothing to do. Otherwise if you use Mercurial remove the .hgeol file, if you use Git remove the .gitattributes file. -For doing upgrades see [this other article](UpdatingOrchard). +For doing upgrades see [this other article](UpdatingOrchard.md). diff --git a/Library/DevelopmentGuidelines/DevelopmentEnvironment.md b/Library/DevelopmentGuidelines/DevelopmentEnvironment.md index 3248cc6c..dacdb9b5 100644 --- a/Library/DevelopmentGuidelines/DevelopmentEnvironment.md +++ b/Library/DevelopmentGuidelines/DevelopmentEnvironment.md @@ -1,3 +1,3 @@ # Development environment advice -See [this page](../../CoreLibrary/DevelopmentGuidelines/DevelopmentEnvironment). +See [this page](../../CoreLibrary/DevelopmentGuidelines/DevelopmentEnvironment.md). diff --git a/Library/DevelopmentGuidelines/Index.md b/Library/DevelopmentGuidelines/Index.md index a1fc4c8c..30dc2c9d 100644 --- a/Library/DevelopmentGuidelines/Index.md +++ b/Library/DevelopmentGuidelines/Index.md @@ -2,13 +2,13 @@ If something’s not specified, general C# guidelines apply: [C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx) and [General Naming Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ms229045%28v=vs.100%29.aspx). Also see [Orchard Code Conventions](https://docs.orchardproject.net/en/latest/Documentation/Code-conventions/). The talk [How To Design A Good API And Why It Matters](http://www.youtube.com/watch?v=aAb7hSCtvGw) is an evergreen as well as the [.NET Framework Design Guidelines Digest](https://github.com/dotnet/corefx/wiki/Framework-Design-Guidelines-Digest). -- [Best practices](BestPractices/) -- [Code styling](CodeStyling) -- [Naming conventions](NamingConventions) -- [Rules of thumb for refactoring](Refactoring) -- [Inline documentation guidelines](InlineDocumentationGuidelines) -- [Code review guidelines](CodeReview) -- [Development environment advice](DevelopmentEnvironment) -- [Orchard performance optimization guidelines](OrchardPerformanceOptimization) -- [Updating your Orchard source](UpdatingOrchard) -- [Creating a new repository of the full Orchard source for your project](CreatingNewOrchardRepository) +- [Best practices](BestPractices/Index.md) +- [Code styling](CodeStyling.md) +- [Naming conventions](NamingConventions.md) +- [Rules of thumb for refactoring](Refactoring.md) +- [Inline documentation guidelines](InlineDocumentationGuidelines.md) +- [Code review guidelines](CodeReview.md) +- [Development environment advice](DevelopmentEnvironment.md) +- [Orchard performance optimization guidelines](OrchardPerformanceOptimization.md) +- [Updating your Orchard source](UpdatingOrchard.md) +- [Creating a new repository of the full Orchard source for your project](CreatingNewOrchardRepository.md) diff --git a/Library/DevelopmentGuidelines/InlineDocumentationGuidelines.md b/Library/DevelopmentGuidelines/InlineDocumentationGuidelines.md index 0dd39bc6..df85d40b 100644 --- a/Library/DevelopmentGuidelines/InlineDocumentationGuidelines.md +++ b/Library/DevelopmentGuidelines/InlineDocumentationGuidelines.md @@ -1,3 +1,3 @@ # Inline documentation guidelines -See [this page](../../CoreLibrary/DevelopmentGuidelines/InlineDocumentationGuidelines). +See [this page](../../CoreLibrary/DevelopmentGuidelines/InlineDocumentationGuidelines.md). diff --git a/Library/DevelopmentGuidelines/NamingConventions.md b/Library/DevelopmentGuidelines/NamingConventions.md index 4fc709d8..a14c3f89 100644 --- a/Library/DevelopmentGuidelines/NamingConventions.md +++ b/Library/DevelopmentGuidelines/NamingConventions.md @@ -1,6 +1,6 @@ # Naming conventions - Use the suffix “Base” for abstract classes. -- Suffix [part classes](../Wiki/ContentPart) with "Part", [records](../Wiki/Record) with "Record" and [records of parts](../Wiki/ContentPartRecord) with "PartRecord". +- Suffix [part classes](../Wiki/ContentPart.md) with "Part", [records](../Wiki/Record.md) with "Record" and [records of parts](../Wiki/ContentPartRecord.md) with "PartRecord". - Name js and css files with the segments of their names delimited by dashes, e.g. my-style.css. It's also advised to prefix names of such resources with the module name, since these names are global, e.g. my-module-my-style.css. -- Resource names declared in [resource manifests](../Wiki/ResourceManifest) are also global so prefix them with the module's name e.g. "MyModule.MyStyle". +- Resource names declared in [resource manifests](../Wiki/ResourceManifest.md) are also global so prefix them with the module's name e.g. "MyModule.MyStyle". diff --git a/Library/DevelopmentGuidelines/Refactoring.md b/Library/DevelopmentGuidelines/Refactoring.md index 24b7d182..a1f5c98c 100644 --- a/Library/DevelopmentGuidelines/Refactoring.md +++ b/Library/DevelopmentGuidelines/Refactoring.md @@ -10,7 +10,7 @@ Consider [refactoring](http://en.wikipedia.org/wiki/Refactoring) in these cases: ## Renaming a project -You should do the following steps to rename an existing .NET project (including an Orchard [module](../Wiki/Module) or [theme](../Wiki/Theme)). +You should do the following steps to rename an existing .NET project (including an Orchard [module](../Wiki/Module.md) or [theme](../Wiki/Theme.md)). 1. Make a backup or commit to source control before attempting the rename. 2. Rename the project from inside Visual Studio. This will change the project's name in a lot of manifest files. diff --git a/Library/Examples/Index.md b/Library/Examples/Index.md index 59f7c6dd..18f5ea3f 100644 --- a/Library/Examples/Index.md +++ b/Library/Examples/Index.md @@ -19,7 +19,7 @@ Project links are only included if the module/theme is not bundled with the Orch - Static: Orchard.Comments, Training Demo - Dynamic: Orchard.Core.Contents (DynamicPermissions) - Projector providers: - - Filter: Orchard.Projections, [Helpful Extensions]([https://github.com/Lombiq/Helpful-Extensions/tree/master/Extensions/Projections](https://github.com/Lombiq/Helpful-Extensions/tree/master/Extensions/Projections)) + - Filter: Orchard.Projections, [Helpful Extensions]([https://github.com/Lombiq/Helpful-Extensions/tree/master/Extensions/Projections](https://github.com/Lombiq/Helpful-Extensions/tree/master/Extensions/Projections.md)) - Layout: Orchard.Projections - Sort criteria: Orchard.Projections - Records (low-level database access): Training Demo diff --git a/Library/Faq/Index.md b/Library/Faq/Index.md index 52485989..1d2b9439 100644 --- a/Library/Faq/Index.md +++ b/Library/Faq/Index.md @@ -15,7 +15,7 @@ The easiest way to run Orchard is through Visual Studio's built-in Cassini devse After the site is started you can attach the debugger to the devserver: Debug/Attach to Process/select WebDev. It's useful to enable breaking when an exception is thrown, even if it's swallowed somewhere: Debug/Exceptions/tick Thrown at CLR Exceptions. -See more tips on setting up your dev environment under the [Development Guidelines](../DevelopmentGuidelines/DevelopmentEnvironment). +See more tips on setting up your dev environment under the [Development Guidelines](../DevelopmentGuidelines/DevelopmentEnvironment.md). ## Where are the log files? diff --git a/Library/Index.md b/Library/Index.md index 9b1f0f2d..3142a242 100644 --- a/Library/Index.md +++ b/Library/Index.md @@ -3,14 +3,14 @@ The Orchard Dojo Library is a portable package of Orchard 1.x. goodies. It supplements Orchard Dojo's trainings and tutorials. These are also part of the best practices and guidelines we use at [Lombiq](https://lombiq.com/). - Topics: - - [Orchard Link Collection](LinkCollection): useful Orchard-related links - - [Software Development Guidelines](DevelopmentGuidelines/): various development guidelines we find useful - - [Orchard FAQ](Faq/): some frequently asked questions about Orchard usage and development - - [Orchard Training Guidelines](Training/Guidelines/): used for [Orchard trainings](http://orcharddojo.net/orchard-training) - - [Development Utilities](Utilities/): utilities that make Orchard development faster and easier - - [Orchard Wiki](Wiki/): pieces of Orchard-related knowledge, organized into articles, wiki-style - - [Examples](Examples/): examples of how to do something in Orchard -- [Contribution Guidelines](ContributionGuideLines) -- [License](License) + - [Orchard Link Collection](LinkCollection.md): useful Orchard-related links + - [Software Development Guidelines](DevelopmentGuidelines/Index.md): various development guidelines we find useful + - [Orchard FAQ](Faq/Index.md): some frequently asked questions about Orchard usage and development + - [Orchard Training Guidelines](Training/Guidelines/Index.md): used for Orchard trainings (the (Orchard Dojo website)[http://orcharddojo.net/training] is only for Orchard Core trainings) + - [Development Utilities](Utilities/Index.md): utilities that make Orchard development faster and easier + - [Orchard Wiki](Wiki/Index.md): pieces of Orchard-related knowledge, organized into articles, wiki-style + - [Examples](Examples/Index.md): examples of how to do something in Orchard +- [Contribution Guidelines](ContributionGuideLines.md) +- [License](License.md) -You can download the whole Library, file issues or fork it from its [repository](https://github.com/Lombiq/Orchard-Dojo-Library). Also you can download the Library's textual content as one big concatenated document in [HTML](https://orcharddojo.net/Lombiq.DownloadAs/Download/DownloadAs/172?Extension=html). +You can download the whole Library, file issues or fork it from its [repository](https://github.com/Lombiq/Orchard-Dojo-Library). diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/AdvancedContentManagement.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/AdvancedContentManagement.md index 805d9a20..5a49c66b 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/AdvancedContentManagement.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/AdvancedContentManagement.md @@ -16,6 +16,6 @@ Time requirement: 2h 30m -Dependencies: [Intermediate content management](IntermediateContentManagement) +Dependencies: [Intermediate content management](IntermediateContentManagement.md) -Parent topic: [Core concepts and basic usage](./) +Parent topic: [Core concepts and basic usage](./Index.md) diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicMaintenance.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicMaintenance.md index 7baca8e8..16970ed5 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicMaintenance.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicMaintenance.md @@ -14,6 +14,6 @@ Time requirement: 0h 30m -Dependencies: [Basic site management](BasicSiteManagement) +Dependencies: [Basic site management](BasicSiteManagement.md) -Parent topic: [Core concepts and basic usage](./) +Parent topic: [Core concepts and basic usage](./Index.md) diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicSiteManagement.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicSiteManagement.md index 7189c245..79b84c3a 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicSiteManagement.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/BasicSiteManagement.md @@ -23,4 +23,4 @@ Time requirement: 2h 15m Dependencies: none -Parent topic: [Core concepts and basic usage](./) +Parent topic: [Core concepts and basic usage](./Index.md) diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/CustomizationFeatures.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/CustomizationFeatures.md index 44337a6b..daf17611 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/CustomizationFeatures.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/CustomizationFeatures.md @@ -19,6 +19,6 @@ Time requirement: 2h 0m -Dependencies: [Intermediate content management](IntermediateContentManagement) +Dependencies: [Intermediate content management](IntermediateContentManagement.md) -Parent topic: [Core concepts and basic usage](./) +Parent topic: [Core concepts and basic usage](./Index.md) diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/ExpertContentManagement.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/ExpertContentManagement.md index 86c7d1e3..794929fe 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/ExpertContentManagement.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/ExpertContentManagement.md @@ -11,6 +11,6 @@ Time requirement: 1h 45m -Dependencies: [Advanced content management](AdvancedContentManagement) +Dependencies: [Advanced content management](AdvancedContentManagement.md) -Parent topic: [Core concepts and basic usage](./) +Parent topic: [Core concepts and basic usage](./Index.md) diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Index.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Index.md index 26a5a3aa..557e3512 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Index.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Index.md @@ -1,9 +1,9 @@ # Core concepts and basic usage (training topic) -- [Introduction](Introduction) -- [Basic site management](BasicSiteManagement) -- [Intermediate content management](IntermediateContentManagement) -- [Advanced content management](AdvancedContentManagement) -- [Expert content management](ExpertContentManagement) -- [Customization features](CustomizationFeatures) -- [Basic maintenance](BasicMaintenance) +- [Introduction](Introduction.md) +- [Basic site management](BasicSiteManagement.md) +- [Intermediate content management](IntermediateContentManagement.md) +- [Advanced content management](AdvancedContentManagement.md) +- [Expert content management](ExpertContentManagement.md) +- [Customization features](CustomizationFeatures.md) +- [Basic maintenance](BasicMaintenance.md) diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/IntermediateContentManagement.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/IntermediateContentManagement.md index 8c32a3e5..4946d291 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/IntermediateContentManagement.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/IntermediateContentManagement.md @@ -23,6 +23,6 @@ Time requirement: 2h 0m -Dependencies: [Basic site management](BasicSiteManagement) +Dependencies: [Basic site management](BasicSiteManagement.md) -Parent topic: [Core concepts and basic usage](./) +Parent topic: [Core concepts and basic usage](./Index.md) diff --git a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Introduction.md b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Introduction.md index a5fa63fc..a7557d70 100644 --- a/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Introduction.md +++ b/Library/Training/Guidelines/CoreConceptsAndBasicUsage/Introduction.md @@ -1,6 +1,6 @@ # Introduction -- Orchard ecosystem as under the [Orchard link collection](../../../LinkCollection) +- Orchard ecosystem as under the [Orchard link collection](../../../LinkCollection.md) - Showcasing complex/notable Orchard apps: - The websites on [Show Orchard](http://showorchard.com) - [DotNest](https://dotnest.com/) for creating hosted Orchard sites @@ -21,4 +21,4 @@ Time requirement: 1h 0m Dependencies: none -Parent topic: [Core concepts and basic usage](./) +Parent topic: [Core concepts and basic usage](./Index.md) diff --git a/Library/Training/Guidelines/DeploymentAndOptimization/AutomatedDeployment.md b/Library/Training/Guidelines/DeploymentAndOptimization/AutomatedDeployment.md index 3adb1b44..9e041485 100644 --- a/Library/Training/Guidelines/DeploymentAndOptimization/AutomatedDeployment.md +++ b/Library/Training/Guidelines/DeploymentAndOptimization/AutomatedDeployment.md @@ -11,6 +11,6 @@ Time requirement: 2h 0m -Dependencies: [Manual deployment](ManualDeployment) +Dependencies: [Manual deployment](ManualDeployment.md) -Parent topic: [Deployment and optimization](./) +Parent topic: [Deployment and optimization](./Index.md) diff --git a/Library/Training/Guidelines/DeploymentAndOptimization/Index.md b/Library/Training/Guidelines/DeploymentAndOptimization/Index.md index a372f773..39aa0195 100644 --- a/Library/Training/Guidelines/DeploymentAndOptimization/Index.md +++ b/Library/Training/Guidelines/DeploymentAndOptimization/Index.md @@ -1,5 +1,5 @@ # Deployment and optimization (training topic) -- [Optimization](Optimization) -- [Manual deployment](ManualDeployment) -- [Automated deployment](AutomatedDeployment) +- [Optimization](Optimization.md) +- [Manual deployment](ManualDeployment.md) +- [Automated deployment](AutomatedDeployment.md) diff --git a/Library/Training/Guidelines/DeploymentAndOptimization/ManualDeployment.md b/Library/Training/Guidelines/DeploymentAndOptimization/ManualDeployment.md index 95f8805f..4e1738e1 100644 --- a/Library/Training/Guidelines/DeploymentAndOptimization/ManualDeployment.md +++ b/Library/Training/Guidelines/DeploymentAndOptimization/ManualDeployment.md @@ -13,6 +13,6 @@ Time requirement: 1h 45m -Dependencies: [Getting started in module development](../ModuleDevelopmentAndApis/GettingStartedInModuleDevelopment) +Dependencies: [Getting started with module development](../ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md) -Parent topic: [Deployment and optimization](./) +Parent topic: [Deployment and optimization](./Index.md) diff --git a/Library/Training/Guidelines/DeploymentAndOptimization/Optimization.md b/Library/Training/Guidelines/DeploymentAndOptimization/Optimization.md index 578563f0..7b87e7d8 100644 --- a/Library/Training/Guidelines/DeploymentAndOptimization/Optimization.md +++ b/Library/Training/Guidelines/DeploymentAndOptimization/Optimization.md @@ -9,6 +9,6 @@ Time requirement: 0h 45m -Dependencies: [Basic techniques in module development](../ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment) +Dependencies: [Basic techniques in module development](../ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md) -Parent topic: [Deployment and optimization](./) +Parent topic: [Deployment and optimization](./Index.md) diff --git a/Library/Training/Guidelines/ExtendedApis/ExtendedApis1.md b/Library/Training/Guidelines/ExtendedApis/ExtendedApis1.md index 3ce05df5..6368e0a8 100644 --- a/Library/Training/Guidelines/ExtendedApis/ExtendedApis1.md +++ b/Library/Training/Guidelines/ExtendedApis/ExtendedApis1.md @@ -9,6 +9,6 @@ Time requirement: 1h 30m -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) +Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md) -Parent topic: [Extended APIs](./) +Parent topic: [Extended APIs](./Index.md) diff --git a/Library/Training/Guidelines/ExtendedApis/ExtendedApis2.md b/Library/Training/Guidelines/ExtendedApis/ExtendedApis2.md index f428ef11..ffb0d26b 100644 --- a/Library/Training/Guidelines/ExtendedApis/ExtendedApis2.md +++ b/Library/Training/Guidelines/ExtendedApis/ExtendedApis2.md @@ -9,6 +9,6 @@ Time requirement: 3h -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) +Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md) -Parent topic: [Extended APIs](./) +Parent topic: [Extended APIs](./Index.md) diff --git a/Library/Training/Guidelines/ExtendedApis/ExtendedApis3.md b/Library/Training/Guidelines/ExtendedApis/ExtendedApis3.md index d576e978..60ad4710 100644 --- a/Library/Training/Guidelines/ExtendedApis/ExtendedApis3.md +++ b/Library/Training/Guidelines/ExtendedApis/ExtendedApis3.md @@ -8,6 +8,6 @@ Time requirement: 1h 30m -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) +Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md) -Parent topic: [Extended APIs](./) +Parent topic: [Extended APIs](./Index.md) diff --git a/Library/Training/Guidelines/ExtendedApis/Index.md b/Library/Training/Guidelines/ExtendedApis/Index.md index a4bd78fa..6843ee40 100644 --- a/Library/Training/Guidelines/ExtendedApis/Index.md +++ b/Library/Training/Guidelines/ExtendedApis/Index.md @@ -2,8 +2,8 @@ The knowledge of the below APIs is not necessary for all developers as these are needed only for more special tasks. -- [Extended APIs I.](ExtendedApis1) -- [Extended APIs II.](ExtendedApis2) -- [Extended APIs III.](ExtendedApis3) +- [Extended APIs I.](ExtendedApis1.md) +- [Extended APIs II.](ExtendedApis2.md) +- [Extended APIs III.](ExtendedApis3.md) There is no need to go into details about all providers, evaluating a few provider types used in Projector and a Token provider is enough. diff --git a/Library/Training/Guidelines/Index.md b/Library/Training/Guidelines/Index.md index beeb9eeb..5c607e8d 100644 --- a/Library/Training/Guidelines/Index.md +++ b/Library/Training/Guidelines/Index.md @@ -1,10 +1,10 @@ # Orchard training guidelines -The following guidelines serve as a base for [Orchard trainings](http://orcharddojo.net/orchard-training) and you're welcome to hold your own Orchard training using these guidelines. +The following guidelines serve as a base for Orchard 1.x trainings (the [Orchard Dojo website](http://orcharddojo.net/training) is for Orchard Core only) and you're welcome to hold your own Orchard training using these guidelines. ## Training methodologies -For methodologies for various forms of Orchard training see [training methodologies](TrainingMethodologies). +For methodologies for various forms of Orchard training see [training methodologies](TrainingMethodologies.md). ## Prerequisites for the participants @@ -19,7 +19,7 @@ Enumeration of technologies and paradigms used in Orchard: C#, [MVC](http://en.w The following tools are needed for an Orchard training: - Lab computers or participants' computers: - - Software listed under "Software to install" in "[Development environment advice](../../DevelopmentGuidelines/DevelopmentEnvironment)". + - Software listed under "Software to install" in "[Development environment advice](../../DevelopmentGuidelines/DevelopmentEnvironment.md)". - Administrative account to install other components if necessary and to avoid permission issues when running Orchard - Trainer's PC having all of the above and connected to a projector for demonstrations - A whiteboard or something similar @@ -28,10 +28,10 @@ The following tools are needed for an Orchard training: The topics are each divided into individual modules. These modules can, but don't necessarily have dependency on each other. -- [Core concepts and basic usage](CoreConceptsAndBasicUsage/) -- [Theme development](ThemeDevelopment/) -- [Module development and Orchard APIs](ModuleDevelopmentAndApis/) -- [Extended APIs](ExtendedApis/) -- [Web API](WebApi/) -- [Deployment and optimization](DeploymentAndOptimization/) -- [Team training](TeamTraining/) (for development teams) +- [Core concepts and basic usage](CoreConceptsAndBasicUsage/Index.md) +- [Theme development](ThemeDevelopment/Index.md) +- [Module development and Orchard APIs](ModuleDevelopmentAndApis/Index.md) +- [Extended APIs](ExtendedApis/Index.md) +- [Web API](WebApi/Index.md) +- [Deployment and optimization](DeploymentAndOptimization/Index.md) +- [Team training](TeamTraining/Index.md) (for development teams) diff --git a/Library/Training/Guidelines/ModuleDevelopmentAndApis/AdvancedTechniquesInModuleDevelopment.md b/Library/Training/Guidelines/ModuleDevelopmentAndApis/AdvancedTechniquesInModuleDevelopment.md index fb14df71..8360c1d5 100644 --- a/Library/Training/Guidelines/ModuleDevelopmentAndApis/AdvancedTechniquesInModuleDevelopment.md +++ b/Library/Training/Guidelines/ModuleDevelopmentAndApis/AdvancedTechniquesInModuleDevelopment.md @@ -11,6 +11,6 @@ Time requirement: 1h 30m -Dependencies: [Intermediate techniques in module development](IntermediateTechniquesInModuleDevelopment) +Dependencies: [Intermediate techniques in module development](IntermediateTechniquesInModuleDevelopment.md) -Parent topic: [Module development and APIs](./) +Parent topic: [Module development and APIs](./Index.md) diff --git a/Library/Training/Guidelines/ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md b/Library/Training/Guidelines/ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md index 8778933f..378760a2 100644 --- a/Library/Training/Guidelines/ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md +++ b/Library/Training/Guidelines/ModuleDevelopmentAndApis/BasicTechniquesInModuleDevelopment.md @@ -14,6 +14,6 @@ Time requirement: 3h 0m -Dependencies: [Getting started with module development](GettingStartedWithModuleDevelopment) +Dependencies: [Getting started with module development](GettingStartedWithModuleDevelopment.md) -Parent topic: [Module development and APIs](./) +Parent topic: [Module development and APIs](./Index.md) diff --git a/Library/Training/Guidelines/ModuleDevelopmentAndApis/ComplementaryTopicsInModuleDevelopment.md b/Library/Training/Guidelines/ModuleDevelopmentAndApis/ComplementaryTopicsInModuleDevelopment.md index bef546da..07e11e5c 100644 --- a/Library/Training/Guidelines/ModuleDevelopmentAndApis/ComplementaryTopicsInModuleDevelopment.md +++ b/Library/Training/Guidelines/ModuleDevelopmentAndApis/ComplementaryTopicsInModuleDevelopment.md @@ -8,6 +8,6 @@ Time requirement: 1h 0m -Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment) +Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment.md) -Parent topic: [Module development and APIs](./) +Parent topic: [Module development and APIs](./Index.md) diff --git a/Library/Training/Guidelines/ModuleDevelopmentAndApis/DevelopingCustomContent.md b/Library/Training/Guidelines/ModuleDevelopmentAndApis/DevelopingCustomContent.md index 64dc3ef9..c30d60e0 100644 --- a/Library/Training/Guidelines/ModuleDevelopmentAndApis/DevelopingCustomContent.md +++ b/Library/Training/Guidelines/ModuleDevelopmentAndApis/DevelopingCustomContent.md @@ -21,6 +21,6 @@ Time requirement: 3h 0m -Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment) +Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment.md) -Parent topic: [Module development and APIs](./) +Parent topic: [Module development and APIs](./Index.md) diff --git a/Library/Training/Guidelines/ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md b/Library/Training/Guidelines/ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md index b71af98c..880bf307 100644 --- a/Library/Training/Guidelines/ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md +++ b/Library/Training/Guidelines/ModuleDevelopmentAndApis/GettingStartedWithModuleDevelopment.md @@ -24,4 +24,4 @@ Time requirement: 1h 30m Dependencies: none -Parent topic: [Module development and APIs](./) +Parent topic: [Module development and APIs](./Index.md) diff --git a/Library/Training/Guidelines/ModuleDevelopmentAndApis/Index.md b/Library/Training/Guidelines/ModuleDevelopmentAndApis/Index.md index acf7099f..0ca44ea0 100644 --- a/Library/Training/Guidelines/ModuleDevelopmentAndApis/Index.md +++ b/Library/Training/Guidelines/ModuleDevelopmentAndApis/Index.md @@ -1,13 +1,13 @@ # Module development and Orchard APIs (training topic) -The below topics are the core of what an Orchard developer should know. Other, less important items are listed under [Extended APIs](../ExtendedApis/). +The below topics are the core of what an Orchard developer should know. Other, less important items are listed under [Extended APIs](../ExtendedApis/Index.md). -- [Getting started with module development](GettingStartedWithModuleDevelopment) -- [Basic techniques in module development](BasicTechniquesInModuleDevelopment) -- [Developing custom content](DevelopingCustomContent) -- [Intermediate techniques in module development](IntermediateTechniquesInModuleDevelopment) -- [Advanced techniques in module development](AdvancedTechniquesInModuleDevelopment) -- [Complementary topics of module development](ComplementaryTopicsInModuleDevelopment) +- [Getting started with module development](GettingStartedWithModuleDevelopment.md) +- [Basic techniques in module development](BasicTechniquesInModuleDevelopment.md) +- [Developing custom content](DevelopingCustomContent.md) +- [Intermediate techniques in module development](IntermediateTechniquesInModuleDevelopment.md) +- [Advanced techniques in module development](AdvancedTechniquesInModuleDevelopment.md) +- [Complementary topics of module development](ComplementaryTopicsInModuleDevelopment.md) ## Addendum diff --git a/Library/Training/Guidelines/ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md b/Library/Training/Guidelines/ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md index 91a2a93a..792a55dc 100644 --- a/Library/Training/Guidelines/ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md +++ b/Library/Training/Guidelines/ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md @@ -10,6 +10,6 @@ Time requirement: 3h 0m -Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment) +Dependencies: [Basic techniques in module development](BasicTechniquesInModuleDevelopment.md) -Parent topic: [Module development and APIs](./) +Parent topic: [Module development and APIs](./Index.md) diff --git a/Library/Training/Guidelines/TeamTraining/Index.md b/Library/Training/Guidelines/TeamTraining/Index.md index cf94fa6a..0c6cbc18 100644 --- a/Library/Training/Guidelines/TeamTraining/Index.md +++ b/Library/Training/Guidelines/TeamTraining/Index.md @@ -1,7 +1,7 @@ # Team training (training topic) - How to write code? - - Agree on and follow [common guidelines](../../../DevelopmentGuidelines/) and conventions + - Agree on and follow [common guidelines](../../../DevelopmentGuidelines/Index.md) and conventions - Importance of documentation - How to share code and other application data? - Version control best practices: diff --git a/Library/Training/Guidelines/ThemeDevelopment/AdvancedThemeDevelopment.md b/Library/Training/Guidelines/ThemeDevelopment/AdvancedThemeDevelopment.md index 0afe537d..93b85644 100644 --- a/Library/Training/Guidelines/ThemeDevelopment/AdvancedThemeDevelopment.md +++ b/Library/Training/Guidelines/ThemeDevelopment/AdvancedThemeDevelopment.md @@ -11,6 +11,6 @@ Time requirement: 1h 0m -Dependencies: [Getting started in theme development](GettingStartedInThemeDevelopment) +Dependencies: [Getting started with theme development](GettingStartedWithThemeDevelopment.md) -Parent topic: [Theme development](./) +Parent topic: [Theme development](./Index.md) diff --git a/Library/Training/Guidelines/ThemeDevelopment/GettingStartedWithThemeDevelopment.md b/Library/Training/Guidelines/ThemeDevelopment/GettingStartedWithThemeDevelopment.md index e50a9422..2a035ef4 100644 --- a/Library/Training/Guidelines/ThemeDevelopment/GettingStartedWithThemeDevelopment.md +++ b/Library/Training/Guidelines/ThemeDevelopment/GettingStartedWithThemeDevelopment.md @@ -18,4 +18,4 @@ Time requirement: 2h 0m Dependencies: none -Parent topic: [Theme development](./) +Parent topic: [Theme development](./Index.md) diff --git a/Library/Training/Guidelines/ThemeDevelopment/Index.md b/Library/Training/Guidelines/ThemeDevelopment/Index.md index a8289f28..676d827d 100644 --- a/Library/Training/Guidelines/ThemeDevelopment/Index.md +++ b/Library/Training/Guidelines/ThemeDevelopment/Index.md @@ -1,4 +1,4 @@ # Theme development (training topic) -- [Getting started with theme development](GettingStartedWithThemeDevelopment) -- [Advanced theme development](AdvancedThemeDevelopment) +- [Getting started with theme development](GettingStartedWithThemeDevelopment.md) +- [Advanced theme development](AdvancedThemeDevelopment.md) diff --git a/Library/Training/Guidelines/WebApi/Index.md b/Library/Training/Guidelines/WebApi/Index.md index 77098969..ac2d6868 100644 --- a/Library/Training/Guidelines/WebApi/Index.md +++ b/Library/Training/Guidelines/WebApi/Index.md @@ -5,4 +5,4 @@ Time requirement: 1h 0m -Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment) +Dependencies: [Intermediate techniques in module development](../ModuleDevelopmentAndApis/IntermediateTechniquesInModuleDevelopment.md) diff --git a/Library/Utilities/Index.md b/Library/Utilities/Index.md index f395e953..97fd668f 100644 --- a/Library/Utilities/Index.md +++ b/Library/Utilities/Index.md @@ -2,5 +2,5 @@ Contained here are various utilities aiding daily development. -- [Visual Studio Code Snippets](VisualStudioSnippets/) -- [Orchard Test Contents](TestContent/) +- [Visual Studio Code Snippets](VisualStudioSnippets/Index.md) +- [Orchard Test Contents](TestContent/Index.md) diff --git a/Library/Utilities/TestContent/Index.md b/Library/Utilities/TestContent/Index.md index 69b1bde4..8f7b8232 100644 --- a/Library/Utilities/TestContent/Index.md +++ b/Library/Utilities/TestContent/Index.md @@ -1,5 +1,5 @@ # Orchard test contents -The Orchard export file contain some contents that you can use to test your theme and site layout with. You can download the export file [here](Export.xml). +The Orchard export file contain some contents that you can use to test your theme and site layout with. You can download the export file [here](testcontent.recipe.xml). These export files include a varied main menu and a foot menu, items of the most used content types and widgets and typography tests. You can log in with the credentials admin/password. diff --git a/Library/Utilities/VisualStudioSnippets/Index.md b/Library/Utilities/VisualStudioSnippets/Index.md index 47eb26ee..17df3b35 100644 --- a/Library/Utilities/VisualStudioSnippets/Index.md +++ b/Library/Utilities/VisualStudioSnippets/Index.md @@ -4,7 +4,7 @@ To effectively use this collection of VS snippets just point the Snippets Manage Note that since C# snippets (unlike VB ones) don't support adding namespaces no matter how we wanted this otherwise you'll need to always add namespaces yourself. -Snippets follow [Orchard naming conventions](../../DevelopmentGuidelines/NamingConventions). +Snippets follow [Orchard naming conventions](../../DevelopmentGuidelines/NamingConventions.md). We've taken care to place the $end$ terminating symbol to a place where one most possibly wants to follow up with coding. Thus if you escape snippets by hitting enter the cursor will be placed where you most likely want to write next. @@ -21,35 +21,35 @@ These snippets are constantly used at [Lombiq](http://lombiq.com) and updated ac Orchard snippets are prefixed with an "o" for distinction. -- oadminmenu: [admin menu](../../Wiki/AdminMenu) (INavigationProvider) skeleton +- oadminmenu: [admin menu](../../Wiki/AdminMenu.md) (INavigationProvider) skeleton - oalterpartdefinition: ContentDefinitionManager.AlterPartDefinition() skeleton - oaltertypedefinition: ContentDefinitionManager.AlterTypeDefinition() skeleton -- obackgroundtask: [background task](../../Wiki/BackgroundTask) (IBackgroundTask) skeleton +- obackgroundtask: [background task](../../Wiki/BackgroundTask.md) (IBackgroundTask) skeleton - ocontrollerfull: Controller class with common Orchard services (IOrchardServices, Localizer, ILogger) -- ocreatecontentpartrecordtable: a SchemaBuilder.CreateTable() shortcut for [part records](../../Wiki/ContentPartRecord), to be used in [migrations](../../Wiki/Migrations) -- ocreatetable: a simple SchemaBuilder.CreateTable() skeleton for [migrations](../../Wiki/Migrations) -- odriver: empty [ContentPartDriver](../../Wiki/Driver) skeleton -- odriverfull: a full [driver](../../Wiki/Driver), complete with Display, Editor and Exporting/Importing methods +- ocreatecontentpartrecordtable: a SchemaBuilder.CreateTable() shortcut for [part records](../../Wiki/ContentPartRecord.md), to be used in [migrations](../../Wiki/Migrations.md) +- ocreatetable: a simple SchemaBuilder.CreateTable() skeleton for [migrations](../../Wiki/Migrations.md) +- odriver: empty [ContentPartDriver](../../Wiki/Driver.md) skeleton +- odriverfull: a full [driver](../../Wiki/Driver.md), complete with Display, Editor and Exporting/Importing methods - ofeature: OrchardFeature attribute -- ofielddriver: empty [ContentFieldDriver](../../Wiki/ContentField) skeleton -- ohandler: empty [ContentHandler](../../Wiki/Handler) skeleton -- ohandlerstorage: [ContentHandler](../../Wiki/Handler) with StorageFilter +- ofielddriver: empty [ContentFieldDriver](../../Wiki/ContentField.md) skeleton +- ohandler: empty [ContentHandler](../../Wiki/Handler.md) skeleton +- ohandlerstorage: [ContentHandler](../../Wiki/Handler.md) with StorageFilter - ojqueryblock: usable in Razor templates, this snippet adds a Scipt.Foot/Head() javascript block, with a jQuery anonymous function inside it - olazyfield: LazyField skeleton - olazyfieldloader: skeleton for having setting the loader of a LazyField in a handler -- omigrations: basic [migration](../../Wiki/Migrations) class +- omigrations: basic [migration](../../Wiki/Migrations.md) class - omigrationsusings: common namespace using declarations for migrations; wouldn't be needed if C# snippets could import namespaces -- opart: [content part](../../Wiki/ContentPart) without a record -- opartandrecord: [content part](../../Wiki/ContentPart) with a corresponding part record +- opart: [content part](../../Wiki/ContentPart.md) without a record +- opartandrecord: [content part](../../Wiki/ContentPart.md) with a corresponding part record - opermissions: permission provider skeleton -- oproppart: property for a [content part](../../Wiki/ContentPart) for proxying a property from the underlying record -- opropstoreretrieve: property for a content part without a record for storing and retrieving data from the [InfosetPart](../../Wiki/InfosetPart) +- oproppart: property for a [content part](../../Wiki/ContentPart.md) for proxying a property from the underlying record +- opropstoreretrieve: property for a content part without a record for storing and retrieving data from the [InfosetPart](../../Wiki/InfosetPart.md) - oproprecordstoreretrieve: property for a content part with a corresponding record for storing and retrieving data from the InfosetPart while also storing it in the record simultaneously -- oresourcemanifest: [resource manifest](../../Wiki/ResourceManifest) skeleton +- oresourcemanifest: [resource manifest](../../Wiki/ResourceManifest.md) skeleton - oroutes: route provider skeleton - oroutesfull: route provider pre-filled with a route descriptor -- oscheduledtask: [scheduled task](../../Wiki/ScheduledTask) (IScheduledTaskHandler) skeleton -- oscheduledtaskrenewing: renewing [scheduled task](../../Wiki/ScheduledTask) (IScheduledTaskHandler) skeleton (requires the module Piedone.HelpfulLibraries) +- oscheduledtask: [scheduled task](../../Wiki/ScheduledTask.md) (IScheduledTaskHandler) skeleton +- oscheduledtaskrenewing: renewing [scheduled task](../../Wiki/ScheduledTask.md) (IScheduledTaskHandler) skeleton (requires the module Piedone.HelpfulLibraries) - otests: unit test class skeleton - otestsusings: common namespace using declarations for unit tests diff --git a/Library/Wiki/AdminMenu.md b/Library/Wiki/AdminMenu.md index 0e17d620..cfcf5a51 100644 --- a/Library/Wiki/AdminMenu.md +++ b/Library/Wiki/AdminMenu.md @@ -10,4 +10,4 @@ The structure of an Admin menu can be the following: For more customization, you can define whether an item should point to the same action as its first child item with the LinkToFirstChild function. -For more information please see the [Visual Studio code snippet](../Utilities/VisualStudioSnippets/) related to AdminMenu and a definite guide on how to create one in the [Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module), which also describes how to add icons to your navigation items. +For more information please see the [Visual Studio code snippet](../Utilities/VisualStudioSnippets/Index.md) related to AdminMenu and a definite guide on how to create one in the [Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module), which also describes how to add icons to your navigation items. diff --git a/Library/Wiki/BackgroundTask.md b/Library/Wiki/BackgroundTask.md index 0b437fb6..a4996bc1 100644 --- a/Library/Wiki/BackgroundTask.md +++ b/Library/Wiki/BackgroundTask.md @@ -2,4 +2,4 @@ The `IBackgroundTask` interface is one of the most simple interfaces you can find in Orchard (aside from the empty marker ones). The only method contained in this interface you need to implement in your class is the Sweep method (without input parameters). Orchard will execute the Sweep method of every IBackgroundTask implementation every 1 minute, so it enables you to simply define some logic that will run periodically. It is useful for recurring tasks and running huge tasks in smaller batches (just like the Orchard.Indexing module does with updating the indices). -For more information please see the [Visual Studio code snippet](../Utilities/VisualStudioSnippets/) related to background tasks and a definite guide on how to create one in the [Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module). +For more information please see the [Visual Studio code snippet](../Utilities/VisualStudioSnippets/Index.md) related to background tasks and a definite guide on how to create one in the [Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module). diff --git a/Library/Wiki/ContentField.md b/Library/Wiki/ContentField.md index 69ead11d..cb6ce8a7 100644 --- a/Library/Wiki/ContentField.md +++ b/Library/Wiki/ContentField.md @@ -2,9 +2,9 @@ Content fields are bits of information that can store basic data, like the common .NET classes, e.g. strings, integers and dates. -Content fields can be attached to a [content part](ContentPart) in any quantity you like (either by code - in a migration or on the Admin UI), just make sure every field has a unique name. That means that unlike with parts, you can have a specific type of field attached multiple times. +Content fields can be attached to a [content part](ContentPart.md) in any quantity you like (either by code - in a migration or on the Admin UI), just make sure every field has a unique name. That means that unlike with parts, you can have a specific type of field attached multiple times. -In case you are attaching a content field to a content type on the Admin UI, the fields are attached to a ghost-content part with the same as the [content type](ContentType) (if the content type doesn't already have a content part with the same name). +In case you are attaching a content field to a content type on the Admin UI, the fields are attached to a ghost-content part with the same as the [content type](ContentType.md) (if the content type doesn't already have a content part with the same name). Differences between content parts and content fields: diff --git a/Library/Wiki/ContentItem.md b/Library/Wiki/ContentItem.md index a7c1bec9..da964d58 100644 --- a/Library/Wiki/ContentItem.md +++ b/Library/Wiki/ContentItem.md @@ -1,5 +1,5 @@ # Content item -Content items are instances of [content types](ContentType), just like objects are instances of classes. Content items are the heart and soul of Orchard: they store all the data you need to handle and display. +Content items are instances of [content types](ContentType.md), just like objects are instances of classes. Content items are the heart and soul of Orchard: they store all the data you need to handle and display. -Content items are always [versioned](Versioning) every time you modify any data on them and are never hard-deleted to keep the integrity of your database. From code they can be interacted with through the [Content Manager service](ContentManager). +Content items are always [versioned](Versioning.md) every time you modify any data on them and are never hard-deleted to keep the integrity of your database. From code they can be interacted with through the [Content Manager service](ContentManager.md). diff --git a/Library/Wiki/ContentManager.md b/Library/Wiki/ContentManager.md index 71be0789..8bbfe8f3 100644 --- a/Library/Wiki/ContentManager.md +++ b/Library/Wiki/ContentManager.md @@ -1,5 +1,5 @@ # Content Manager service -The Content Manager is the important service in Orchard that you can use to interact with [content items](ContentItem) from code. +The Content Manager is the important service in Orchard that you can use to interact with [content items](ContentItem.md) from code. -When developing a module you can use the Content Manager to create, update, retrieve and remove ([soft delete](Versioning)) content items, fetch different [versions](Versioning) of the same content item as well as import/export items, fetch items' metadata or build display and editor shapes. You can find a detailed example of how to use the Content Manager in the [Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module/blob/dev-orchard-1/Controllers/ContentsAdminController.cs). +When developing a module you can use the Content Manager to create, update, retrieve and remove ([soft delete](Versioning.md)) content items, fetch different [versions](Versioning.md) of the same content item as well as import/export items, fetch items' metadata or build display and editor shapes. You can find a detailed example of how to use the Content Manager in the [Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module/blob/dev-orchard-1/Controllers/ContentsAdminController.cs). diff --git a/Library/Wiki/ContentPart.md b/Library/Wiki/ContentPart.md index d2897b55..3ada81e6 100644 --- a/Library/Wiki/ContentPart.md +++ b/Library/Wiki/ContentPart.md @@ -1,5 +1,5 @@ # Content part -A content part is a set of separate functionalities and data that can be applied to a [content type](ContentType) by attaching the content part to a content type. Content parts may not store any corresponding data (in this case, they only add functionality by using existing data) in the database or they can even load data from an external data source (like a webservice). [Content fields](ContentField) can be attached to content parts (for the differences between parts and fields, see the fields article). +A content part is a set of separate functionalities and data that can be applied to a [content type](ContentType.md) by attaching the content part to a content type. Content parts may not store any corresponding data (in this case, they only add functionality by using existing data) in the database or they can even load data from an external data source (like a webservice). [Content fields](ContentField.md) can be attached to content parts (for the differences between parts and fields, see the fields article). -If your content part stores data in the database, usually it's mapped to a [record class](Record) (the corresponding [content part record](ContentPartRecord)), which is an actual representation of the data you are storing in the database. In most cases, content parts derive from `ContentPart` (where the type parameter is your content part record class), but if the part isn't storing anything in a corresponding record then it can just derive from `ContentPart`. +If your content part stores data in the database, usually it's mapped to a [record class](Record.md) (the corresponding [content part record](ContentPartRecord.md)), which is an actual representation of the data you are storing in the database. In most cases, content parts derive from `ContentPart` (where the type parameter is your content part record class), but if the part isn't storing anything in a corresponding record then it can just derive from `ContentPart`. diff --git a/Library/Wiki/ContentPartRecord.md b/Library/Wiki/ContentPartRecord.md index 2048c639..c0595450 100644 --- a/Library/Wiki/ContentPartRecord.md +++ b/Library/Wiki/ContentPartRecord.md @@ -1,5 +1,5 @@ # Content part record -Content part records are [record classes](Record) that store [content part](ContentPart) data in the database. +Content part records are [record classes](Record.md) that store [content part](ContentPart.md) data in the database. Unversioned content part records should derive from the ContentPartRecord class, versioned ones from ContentPartVersionRecord. The latter means that if the content part's data will be saved in the form of a new version (new database row) when the corresponding content item is published. A `ContentPartRecord` can be migrated to `ContentPartVersionRecord` as described [here](http://stackoverflow.com/questions/16611692/how-to-change-inheritance-from-contentpartrecord-to-contentpartversionrecord). diff --git a/Library/Wiki/ContentType.md b/Library/Wiki/ContentType.md index 50553124..10df07ad 100644 --- a/Library/Wiki/ContentType.md +++ b/Library/Wiki/ContentType.md @@ -1,7 +1,7 @@ # Content type -A content type is a blueprint of how [content items](ContentItem) of that type look like: it defines the set of [content parts](ContentPart) that make up the content types. +A content type is a blueprint of how [content items](ContentItem.md) of that type look like: it defines the set of [content parts](ContentPart.md) that make up the content types. -A content type only consists of content parts, even if it seems that you can directly attach [content fields](ContentField) to a type from the admin UI. When you attach fields from the admin UI in reality an invisible part is created that has the same name as the content type (e.g. a Page part is created for the Page content type) and the fields get attached to that. +A content type only consists of content parts, even if it seems that you can directly attach [content fields](ContentField.md) to a type from the admin UI. When you attach fields from the admin UI in reality an invisible part is created that has the same name as the content type (e.g. a Page part is created for the Page content type) and the fields get attached to that. Examples of some basic content types: Page or Blog Post (both containing e.g. Title Part and Body Part). diff --git a/Library/Wiki/Core.md b/Library/Wiki/Core.md index fbecbdf2..dbd33d72 100644 --- a/Library/Wiki/Core.md +++ b/Library/Wiki/Core.md @@ -2,6 +2,6 @@ We mean several things as "core" so initially this may be confusing: -- [Core modules](https://docs.orchardproject.net/en/latest/Documentation/Builtin-Features/#core-modules): these are the [modules](Module) that reside in Orchard's Core project (Orchard.Core). They are always installed and always enabled, so your modules can safely depend on them. Examples include Content (basic content management features like admin content lists) and Navigation. +- [Core modules](https://docs.orchardproject.net/en/latest/Documentation/Builtin-Features/#core-modules): these are the [modules](Module.md) that reside in Orchard's Core project (Orchard.Core). They are always installed and always enabled, so your modules can safely depend on them. Examples include Content (basic content management features like admin content lists) and Navigation. - [The Orchard Framework](https://docs.orchardproject.net/en/latest/Documentation/Source-code-organization/#orchardframework-project): Orchard is a powerful web development framework. This framework is contained in the Orchard.Framework class library. Being in the center of Orchard it's also often called "core". - [Non-core modules](https://docs.orchardproject.net/en/latest/Documentation/Builtin-Features/#non-core-modules) that are developed by The Orchard Team and maintained in the [Orchard repository](https://github.com/OrchardCMS/Orchard) are also often dubbed "core modules" but technically they aren't. These modules are sometimes also called the "built-in modules". Furthermore there are such modules that have their category (in their [module manifest](https://docs.orchardproject.net/en/latest/Documentation/Manifest-files/)) declared as "Core": such modules behave exactly like true Core modules (like they are always enabled) but they are not part of the Orchard.Core project. diff --git a/Library/Wiki/Driver.md b/Library/Wiki/Driver.md index 72b38f98..ca2b1d4c 100644 --- a/Library/Wiki/Driver.md +++ b/Library/Wiki/Driver.md @@ -1,5 +1,5 @@ # Content part driver -[Drivers](https://docs.orchardproject.net/en/latest/Documentation/Basic-Orchard-Concepts/#driver) (more precisely: content part drivers) are pieces of code used in conjunction with [content parts](ContentPart). They are responsible for building the editor and display as well as handling importing and exporting of a content part. +[Drivers](https://docs.orchardproject.net/en/latest/Documentation/Basic-Orchard-Concepts/#driver) (more precisely: content part drivers) are pieces of code used in conjunction with [content parts](ContentPart.md). They are responsible for building the editor and display as well as handling importing and exporting of a content part. Note that the same part can have multiple drivers. diff --git a/Library/Wiki/Extension.md b/Library/Wiki/Extension.md index f9058820..db3b68f3 100644 --- a/Library/Wiki/Extension.md +++ b/Library/Wiki/Extension.md @@ -1,3 +1,3 @@ # Extension -[Modules](Module) and [themes](Theme) are collectively called as extensions. The expression is used in the Orchard documentation and also in the source code extensively when a service has to do with modules and themes as well. +[Modules](Module.md) and [themes](Theme.md) are collectively called as extensions. The expression is used in the Orchard documentation and also in the source code extensively when a service has to do with modules and themes as well. diff --git a/Library/Wiki/Index.md b/Library/Wiki/Index.md index c53808c9..0db2b2a6 100644 --- a/Library/Wiki/Index.md +++ b/Library/Wiki/Index.md @@ -2,29 +2,29 @@ This Wiki aims to complete the [documentation](http://docs.orchardproject.net/) by organizing Orchard-related technical terms into articles. It aims to mainly provide short explanations and links for further exploring each topic. -- [Admin menu](AdminMenu) -- [Background task](BackgroundTask) -- [Content item](ContentItem) -- [Content field](ContentField) -- [Content Manager service](ContentManager) -- [Content part](ContentPart) -- [Content type](ContentType) -- [Core](Core) -- [Driver (content part driver)](Driver) -- [Event handler](EventHandler) -- [Extension](Extension) -- [Handler (content part handler)](Handler) -- [InfosetPart](InfosetPart) -- [Migrations](Migrations) -- [Module](Module) -- [Processing Engine](ProcessingEngine) -- [Record](Record) -- [Resource manifest](ResourceManifest) -- [Scheduled task](ScheduledTask) -- [Shape](Shape) -- [Theme](Theme) -- [Tokens](Tokens) -- [Versioning](Versioning) -- [Work Context](WorkContext) +- [Admin menu](AdminMenu.md) +- [Background task](BackgroundTask.md) +- [Content item](ContentItem.md) +- [Content field](ContentField.md) +- [Content Manager service](ContentManager.md) +- [Content part](ContentPart.md) +- [Content type](ContentType.md) +- [Core](Core.md) +- [Driver (content part driver)](Driver.md) +- [Event handler](EventHandler.md) +- [Extension](Extension.md) +- [Handler (content part handler)](Handler.md) +- [InfosetPart](InfosetPart.md) +- [Migrations](Migrations.md) +- [Module](Module.md) +- [Processing Engine](ProcessingEngine.md) +- [Record](Record.md) +- [Resource manifest](ResourceManifest.md) +- [Scheduled task](ScheduledTask.md) +- [Shape](Shape.md) +- [Theme](Theme.md) +- [Tokens](Tokens.md) +- [Versioning](Versioning.md) +- [Work Context](WorkContext.md) -Please note that there are corresponding [Visual Studio code snippets](../Utilities/VisualStudioSnippets/) and detailed development guides ([Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module)) in the Orchard Dojo Library related to these topics. +Please note that there are corresponding [Visual Studio code snippets](../Utilities/VisualStudioSnippets/Index.md) and detailed development guides ([Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module)) in the Orchard Dojo Library related to these topics. diff --git a/Library/Wiki/InfosetPart.md b/Library/Wiki/InfosetPart.md index f738f030..e52b5490 100644 --- a/Library/Wiki/InfosetPart.md +++ b/Library/Wiki/InfosetPart.md @@ -1,12 +1,12 @@ # The InfosetPart content part -`InfosetPart` is one of Orchard's built-in [content part](ContentPart)s. It's always automatically attached to every content item of every content type. It represents (and provides access to) the so called infoset of the content item. +`InfosetPart` is one of Orchard's built-in [content part](ContentPart.md)s. It's always automatically attached to every content item of every content type. It represents (and provides access to) the so called infoset of the content item. -The infoset is a simple XML document that is stored along the content item in its `ContentItemRecord` or if [versioned](Versioning), in the `ContentItemVersionRecord`. It can store arbitrary data and is commonly used to save [content fields'](ContentField) data or data for content parts that needn't be queried. Since the `ContentItemRecord` and/or `ContentItemVersionRecord` is always loaded for a content item the infoset is also loaded at all times. Thus anything stored in the infoset can be retrieved quickly, without any subsequent database calls. +The infoset is a simple XML document that is stored along the content item in its `ContentItemRecord` or if [versioned](Versioning.md), in the `ContentItemVersionRecord`. It can store arbitrary data and is commonly used to save [content fields'](ContentField.md) data or data for content parts that needn't be queried. Since the `ContentItemRecord` and/or `ContentItemVersionRecord` is always loaded for a content item the infoset is also loaded at all times. Thus anything stored in the infoset can be retrieved quickly, without any subsequent database calls. ## Importance for content parts -If a content part needs to store data in the database one of the solutions would be to use a [content part record](ContentPartRecord). However such records, if not specifically set for eager-loading, are lazily loaded one by one when using the content item. To overcome this performance issue `InfosetPart` can be used to store the part's data, eliminating the need for further database queries. +If a content part needs to store data in the database one of the solutions would be to use a [content part record](ContentPartRecord.md). However such records, if not specifically set for eager-loading, are lazily loaded one by one when using the content item. To overcome this performance issue `InfosetPart` can be used to store the part's data, eliminating the need for further database queries. However data stored in the `InfosetPart` can't be simply queried (i.e. filtered or ordered) using the database engine. By storing data both in the infoset and in the record, however, one can have the best of both worlds: querying is possible using the records but for any other database interaction the records are not loaded. diff --git a/Library/Wiki/Migrations.md b/Library/Wiki/Migrations.md index a4494836..19defcb9 100644 --- a/Library/Wiki/Migrations.md +++ b/Library/Wiki/Migrations.md @@ -1,3 +1,3 @@ # Migrations -A migration is special class usually derived from DataMigrationImpl through which you can tell Orchard what kind [content parts](ContentPart) and [content types](ContentType) you wish to create and store in the database, including their fields and settings. In most cases you want to place a file called Migrations to your project root, but if you have more than one of them (e.g. because you have multiple features with separate migrations) you may want to place them in a subfolder called Migrations to keep your project root clean. +A migration is special class usually derived from DataMigrationImpl through which you can tell Orchard what kind [content parts](ContentPart.md) and [content types](ContentType.md) you wish to create and store in the database, including their fields and settings. In most cases you want to place a file called Migrations to your project root, but if you have more than one of them (e.g. because you have multiple features with separate migrations) you may want to place them in a subfolder called Migrations to keep your project root clean. diff --git a/Library/Wiki/Module.md b/Library/Wiki/Module.md index ceb3a35a..edcd35d3 100644 --- a/Library/Wiki/Module.md +++ b/Library/Wiki/Module.md @@ -1,6 +1,6 @@ # Module -Orchard modules are types of [extensions](Extension). They are designed to extend Orchard's functionality in any way you can imagine. +Orchard modules are types of [extensions](Extension.md). They are designed to extend Orchard's functionality in any way you can imagine. Modules can have multiple features: features can be independently switched on or off (you have to decorate classes corresponding to a specific feature with the `OrchardFeature` attribute). Actually what you can enable or disable from the admin UI are features, not modules. However, each module has at least one feature, what has the same ID as the module itself (i.e. the .csproj file's name). diff --git a/Library/Wiki/ProcessingEngine.md b/Library/Wiki/ProcessingEngine.md index 671655e2..2b02989d 100644 --- a/Library/Wiki/ProcessingEngine.md +++ b/Library/Wiki/ProcessingEngine.md @@ -6,4 +6,4 @@ Tasks queued in the Processing Engine are synchronously executed after the ambie Note that since Processing Engine tasks are run after a request naturally they need a request to get executed, on an idle site such tasks won't be processed. Also such tasks are only retained for the scope of the request: if something fatal happens and the request completely fails before tasks can be executed than those tasks will be lost; and tasks queued from background tasks won't be processed at all (since there is no corresponding request). -An example of how the Processing Engine is used is in the built-in Orchard.Comments [module](Module) in `CommentService`: calculating the number of comments under a given content item is being done from a Processing Engine task. +An example of how the Processing Engine is used is in the built-in Orchard.Comments [module](Module.md) in `CommentService`: calculating the number of comments under a given content item is being done from a Processing Engine task. diff --git a/Library/Wiki/Record.md b/Library/Wiki/Record.md index bdd486cb..0de1c506 100644 --- a/Library/Wiki/Record.md +++ b/Library/Wiki/Record.md @@ -2,6 +2,6 @@ Records are simple classes that represent a piece of data that is stored in the database as a row in a table. The only special thing about record classes is that their public properties (that correspond to columns in the said table) should be public. -The tables corresponding to records are created and also modified if necessary by [migrations](Migrations). +The tables corresponding to records are created and also modified if necessary by [migrations](Migrations.md). Orchard uses the [NHibernate](http://nhforge.org/) ORM library as the database abstraction layer. diff --git a/Library/Wiki/ResourceManifest.md b/Library/Wiki/ResourceManifest.md index 0ec6abdd..c26f612b 100644 --- a/Library/Wiki/ResourceManifest.md +++ b/Library/Wiki/ResourceManifest.md @@ -1,3 +1,3 @@ # Resource manifest -A resource manifest is a class implementing the `IResourceManifestProvider` interface though which you can declare your static resources (e.g. stylesheets and scripts) towards Orchard and give them a unique name to be able to easily use them in your templates. Choosing a unique name for each of resources is quite important to avoid name collisions, since static resources are rendered as shapes and thus can be overridden (see [naming conventions](../DevelopmentGuidelines/NamingConventions)). +A resource manifest is a class implementing the `IResourceManifestProvider` interface though which you can declare your static resources (e.g. stylesheets and scripts) towards Orchard and give them a unique name to be able to easily use them in your templates. Choosing a unique name for each of resources is quite important to avoid name collisions, since static resources are rendered as shapes and thus can be overridden (see [naming conventions](../DevelopmentGuidelines/NamingConventions.md)). diff --git a/Library/Wiki/ScheduledTask.md b/Library/Wiki/ScheduledTask.md index ac2f82ea..a8c4bbde 100644 --- a/Library/Wiki/ScheduledTask.md +++ b/Library/Wiki/ScheduledTask.md @@ -1,7 +1,7 @@ # Scheduled task Scheduled tasks, which are classes that implement the quite simple `IScheduledTaskHandler` interface allow you to run some code at a specific time (Orchard will respect it with a 1-minute precision). -The way of creating a scheduled task is to first create an `IScheduledTaskHandler` implementation and put your code inside the only method in this interface called Process. Using the IScheduledTaskManager service, you can create, list and delete scheduled tasks, so in order to register your scheduled task in Orchard, you need to create it first using the CreateTask method. Orchard uses a [background task](BackgroundTask) to check for scheduled tasks that should be executed: each scheduled task is stored in the database as a separate record which is deleted when the execution of the given task starts to make sure that they only run once. +The way of creating a scheduled task is to first create an `IScheduledTaskHandler` implementation and put your code inside the only method in this interface called Process. Using the IScheduledTaskManager service, you can create, list and delete scheduled tasks, so in order to register your scheduled task in Orchard, you need to create it first using the CreateTask method. Orchard uses a [background task](BackgroundTask.md) to check for scheduled tasks that should be executed: each scheduled task is stored in the database as a separate record which is deleted when the execution of the given task starts to make sure that they only run once. Please also note that scheduled tasks must have a unique name: according to the Orchard naming best practices, it is advised to prefix it with the name of your module. -For more information please see the [Visual Studio code snippet](../Utilities/VisualStudioSnippets/) related to scheduled tasks (a simple and a renewing one, the latter depends on the Piedone.HelpfulLibraries module) and a definite guide on how to create one in the [Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module). +For more information please see the [Visual Studio code snippet](../Utilities/VisualStudioSnippets/Index.md) related to scheduled tasks (a simple and a renewing one, the latter depends on the Piedone.HelpfulLibraries module) and a definite guide on how to create one in the [Orchard Training Demo module](https://github.com/Lombiq/Orchard-Training-Demo-Module). diff --git a/Library/Wiki/Theme.md b/Library/Wiki/Theme.md index ef9a2b25..e5d1c8dc 100644 --- a/Library/Wiki/Theme.md +++ b/Library/Wiki/Theme.md @@ -1,5 +1,5 @@ # Theme -Orchard themes are types of [extensions](Extension). They are designed to be able to change the look and feel of your Orchard website. +Orchard themes are types of [extensions](Extension.md). They are designed to be able to change the look and feel of your Orchard website. -Themes contain CSS, JS files and graphics as well as [shape](Shape) templates. Most of the time themes don't contain any C# code apart from [resource manifests](ResourceManifest). +Themes contain CSS, JS files and graphics as well as [shape](Shape.md) templates. Most of the time themes don't contain any C# code apart from [resource manifests](ResourceManifest.md). diff --git a/Library/Wiki/Versioning.md b/Library/Wiki/Versioning.md index 00af101b..2a01d0da 100644 --- a/Library/Wiki/Versioning.md +++ b/Library/Wiki/Versioning.md @@ -1,13 +1,13 @@ # Versioning -[Content items](ContentItem) in Orchard are versioned by default: this means that if you edit a content item and publish the modifications you don't overwrite what was previously published but you create a new version - that will be the published version. +[Content items](ContentItem.md) in Orchard are versioned by default: this means that if you edit a content item and publish the modifications you don't overwrite what was previously published but you create a new version - that will be the published version. ## Versioning illustrated Let's take a look at Page content items, because Page is a content type that's included in Orchard by default. - Pages are "draftable". This means that you can create draft, i.e. not published (and thus not visible) versions of it. You can also set this option from the admin UI from the content type editor of Page. -- Pages - among others - include the Title and Body [content part](ContentPart). These parts have the capability of being versioned. Not every content part is versionable, it's the developer's decision. +- Pages - among others - include the Title and Body [content part](ContentPart.md). These parts have the capability of being versioned. Not every content part is versionable, it's the developer's decision. That said let's see what happens: @@ -22,4 +22,4 @@ That said let's see what happens: Beware that when you remove content items no record is really deleted as Orchard operates with soft deletes: content items are only marked deleted but remain in the database. Actually what happens is that all version of the content item get unpublished and simultaneously loose their flag of being latest; i.e. in the end no version will be marked as published nor latest, thus the item won't be found when fetching the published version. -However, since the versions are still there, they can be retrieved through the [Content Manager](ContentManager). +However, since the versions are still there, they can be retrieved through the [Content Manager](ContentManager.md). diff --git a/Readme.md b/Readme.md index 81468922..811689ce 100644 --- a/Readme.md +++ b/Readme.md @@ -2,7 +2,7 @@ ## About -The Orchard Dojo Library is a portable package of Orchard Core and Orchard 1.x goodies. It supplements [Orchard Dojo](https://orcharddojo.net)'s trainings and tutorials. For accessing the Library from the web, go to [orcharddojo.net/orchard-resources/CoreLibrary](http://orcharddojo.net/orchard-resources/CoreLibrary/) for the Orchard Core version and [orcharddojo.net/orchard-resources/Library](http://orcharddojo.net/orchard-resources/Library/) for the Orchard 1.x. version (you can also download the Library's textual content as a single document form there). The Library's project page is on [GitHub](https://github.com/Lombiq/Orchard-Dojo-Library). +The Orchard Dojo Library is a portable package of Orchard Core and Orchard 1.x goodies. It supplements [Orchard Dojo](https://orcharddojo.net)'s trainings and tutorials. For accessing the Library, go to [Orchard Core Dojo Library](./CoreLibrary/Index.md) or [orcharddojo.net/resources](http://orcharddojo.net/resources) for the Orchard Core version and [Orchard 1.x Dojo Library](./Library/Index.md) for the Orchard 1.x. version. The Library's project page is on [GitHub](https://github.com/Lombiq/Orchard-Dojo-Library). ## Contributing and support