orchardcmsorchardcms-1.10

Alternate shape for EditorTemplate of Field is not being recognized


I need an alternate for the EditorTemplate of an Enumerator Field that's used when the Field has a particular name (PublishingMethod).

Based on the docs, I created a view with the pattern [ShapeType__FieldName] in the same folder as the original shape:

Alternate Template

This is not working and still uses the original. I've thought of changing the Editor method in the Driver, but I think that defeats the purpose of alternates, which is that Orchard automatically detects the correct shape as I understand from the docs:

The Orchard framework automatically creates many alternates that you can use in your application. However, you can create templates for these alternate shapes.

Note: I can't use the Shape Tracing module, it never worked even with a clean Orchard install.


Solution

  • The editors in Orchard work different to how Display works. I guess it is so you get a MVC-style experience. Basically, the actual shape returned is of type EditorTemplate, which then binds your model and prefix then renders a partial view with the template name you gave it. What this means is alternates wont work as expected, or as the docs state. The alternates for your field name are actually added to the EditorTemplate shape. So what you can do is add a view called EditorTemplate-PublishingMethod.cshtml with contents like:

    @{ 
        var m = (Orchard.Fields.Fields.EnumerationField)Model.Model;
    }
    
    @Html.Partial("PublishingMethodEditor", m, new ViewDataDictionary {
        TemplateInfo = new TemplateInfo { HtmlFieldPrefix = Model.Prefix }
    })
    

    Then add another view called PublishingMethodEditor.cshtml with the overrides you want for your editor. All these views should go in the root of your Views folder.

    Another approach would be to implement the IShapeTableProvider interface and adjust the TemplateName property on a certain condition but, meh, that requires code...

    Edit 1 If you have that field name on other content types that you don't want to override you can use the override EditorTemplate-ContentTypeName-PublishingMethod.cshtml