Umbraco 8 setting backoffice property in homepage doctype to readonly
Hi all,
Bit stuck with this one.
I want to hide/show a panel dependent on user in a content view in CMS.
I can do this with success but when I try and get the property to be readonly using: .Readonly, the property stays the same.
It looks like the classes are trying to be added but they are taking no effect.
Has anyone figured out If this is a bug or is there a workaround?
Class below:
using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Composing;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Persistence.FaultHandling;
using Umbraco.Web;
using Umbraco.Web.Editors;
using Umbraco.Web.Security;
namespace PlayGroundU8.App_Code.Backoffice
{
[RuntimeLevel(MinLevel = RuntimeLevel.Run)]
public class SubscribeToEditorModelEventsComposer : ComponentComposer
public class SubscribeToEditorModelEvents : IComponent
{
private readonly IUmbracoContextFactory _umbracoContextFactory;
public SubscribeToEditorModelEvents(IUmbracoContextFactory umbracoContextFactory)
{
_umbracoContextFactory = umbracoContextFactory;
}
// Initialize: runs once when Umbraco starts
public void Initialize()
{
EditorModelEventManager.SendingContentModel += EditorModelEventManager_SendingContentModel;
}
// Terminate: runs once when Umbraco stops
public void Terminate()
{
// Unsubscribe during shutdown
EditorModelEventManager.SendingContentModel -= EditorModelEventManager_SendingContentModel;
}
private void EditorModelEventManager_SendingContentModel(
System.Web.Http.Filters.HttpActionExecutedContext sender,
EditorModelEventArgs<Umbraco.Web.Models.ContentEditing.ContentItemDisplay> e)
{
IUser currentUser = null;
// use the umbraco context factory to ensure the umbraco context which we need to get the auth ticket of the user
using (UmbracoContextReference umbracoContextReference = _umbracoContextFactory.EnsureUmbracoContext())
{
var userTicket = umbracoContextReference.UmbracoContext.HttpContext.GetUmbracoAuthTicket();
if (userTicket != null)
{
//Get current user from user service
currentUser = Current.Services.UserService.GetByUsername(userTicket.Identity.Name);
//Get all usergroups
var userGroups = currentUser.Groups;
bool userIsAdmin = false;
//Loop through user groups and check against a switch case to trigger true false statement
foreach (var group in userGroups)
{
switch (group.Alias)
{
case "admin":
// code block
userIsAdmin = true;
break;
default:
// code block
break;
}
}
//Check if page alias is "home" then do stuff (locks it down to specific pages)
if (e.Model.ContentTypeAlias == "home")
{
//access the property you want to pre-populate
//in V8 each content item can have 'variations' - each variation is represented by the `ContentVariantDisplay` class.
//if your site uses variants, then you need to decide whether to set the default value for all variants or a specific variant
// eg. set by variant name:
// var variant = e.Model.Variants.FirstOrDefault(f => f.Name == "specificVariantName");
// OR loop through all the variants:
foreach (var variant in e.Model.Variants)
{
//try get the property you're wanting to change
var trueFalseTest = variant.Tabs.SelectMany(f => f.Properties)
.FirstOrDefault(f => f.Alias.InvariantEquals("trueFalseTest"));
//If page has property to set in doctype do stuff
if (trueFalseTest != null)
{
int trueFalseTestValue = 0;
//preset value if admin true or false
if (userIsAdmin)
{
trueFalseTestValue = 1;
}
//set the property to the value dictated by user sign in
//any user other than admin should get a false check box
trueFalseTest.Value = trueFalseTestValue;
trueFalseTest.Readonly = true;
trueFalseTest.IsSensitive = true;
//TODO - NOTE THE READONLY PROPERTY DOESNT WORK, FORUM SUGGESTS CREATING OWN TRUE/FALSE TO GET AROUND IT WITH REQUIRED LOGIC.
//https://our.umbraco.com/forum/using-umbraco-and-getting-started/100009-make-property-read-only#comment-314249
//Also used this to test: https://our.umbraco.com/packages/backoffice-extensions/conditional-displayers/
}
//TESTING GROUND
var hideTheTrueFalsy = variant.Tabs.SelectMany(f => f.Properties)
.FirstOrDefault(f => f.Alias.InvariantEquals("hideTheTrueFalsy"));
if (hideTheTrueFalsy != null)
{
hideTheTrueFalsy.Value = 0;
hideTheTrueFalsy.Readonly = true;
hideTheTrueFalsy.IsSensitive = true;
}
}
}
}
}
}
}
The readonly property just stops the value being saved, but doesn't update the UI :-(
but the hack I found was to set the culture to be different to the current culture the editor is editing in, then magically the UI becomes readonly for that property!
Yes (sorry about the long blog post, the trick is about 3/4 of way down if you search for 'read only')
But essentially it's a coincidence we want to make the property ReadOnly and we see a property on the model called ReadOnly, but the UI is oblivious to it, it's only there for the database to tell it not to be updated...
I had some success replacing the property editors view with a 'ReadOnlyView', that was ok for textboxes, but not so cool for editors that store JSON.
The trick of switching the culture gave me the exact UI I wanted... a bit mad I know.
Umbraco 8 setting backoffice property in homepage doctype to readonly
Hi all,
Bit stuck with this one.
I want to hide/show a panel dependent on user in a content view in CMS.
I can do this with success but when I try and get the property to be readonly using: .Readonly, the property stays the same.
It looks like the classes are trying to be added but they are taking no effect.
Has anyone figured out If this is a bug or is there a workaround?
Class below:
using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.FaultHandling; using Umbraco.Web; using Umbraco.Web.Editors; using Umbraco.Web.Security;
namespace PlayGroundU8.App_Code.Backoffice { [RuntimeLevel(MinLevel = RuntimeLevel.Run)] public class SubscribeToEditorModelEventsComposer : ComponentComposer
}
Many thanks, Sam
Hi Sam
I had a bit of an adventure with setting properties readonly with a site using variants, I wrote about it here:
http://tooorangey.co.uk/posts/umbraco-v8-variants-and-limiting-editor-access-by-language-an-adventure-story/
The readonly property just stops the value being saved, but doesn't update the UI :-(
but the hack I found was to set the culture to be different to the current culture the editor is editing in, then magically the UI becomes readonly for that property!
Not sure if it will help in your scenario...
regards
Marc
Thanks Marc, I shall have a read through but seems mad it doesn't work :(
What I may look to do is see if I can change the data type itself dependent on User.
Hi Sam
Yes (sorry about the long blog post, the trick is about 3/4 of way down if you search for 'read only')
But essentially it's a coincidence we want to make the property ReadOnly and we see a property on the model called ReadOnly, but the UI is oblivious to it, it's only there for the database to tell it not to be updated...
I had some success replacing the property editors view with a 'ReadOnlyView', that was ok for textboxes, but not so cool for editors that store JSON.
The trick of switching the culture gave me the exact UI I wanted... a bit mad I know.
regards
Marc
is working on a reply...