/// <summary> /// Adds or Updates a <see cref="Rock.Model.Attribute" /> item for the attribute. /// </summary> /// <param name="property">The property.</param> /// <param name="entityTypeId">The entity type id.</param> /// <param name="entityQualifierColumn">The entity qualifier column.</param> /// <param name="entityQualifierValue">The entity qualifier value.</param> /// <param name="rockContext">The rock context.</param> /// <returns></returns> /// <remarks> /// If a rockContext value is included, this method will save any previous changes made to the context /// </remarks> private static bool UpdateAttribute( FieldAttribute property, int? entityTypeId, string entityQualifierColumn, string entityQualifierValue, RockContext rockContext = null ) { bool updated = false; rockContext = rockContext ?? new RockContext(); var attributeService = new AttributeService( rockContext ); var attributeQualifierService = new AttributeQualifierService( rockContext ); var fieldTypeService = new FieldTypeService(rockContext); var categoryService = new CategoryService( rockContext ); var propertyCategories = property.Category.SplitDelimitedValues( false ).ToList(); // Look for an existing attribute record based on the entity, entityQualifierColumn and entityQualifierValue Model.Attribute attribute = attributeService.Get( entityTypeId, entityQualifierColumn, entityQualifierValue, property.Key ); if ( attribute == null ) { // If an existing attribute record doesn't exist, create a new one updated = true; attribute = new Model.Attribute(); attribute.EntityTypeId = entityTypeId; attribute.EntityTypeQualifierColumn = entityQualifierColumn; attribute.EntityTypeQualifierValue = entityQualifierValue; attribute.Key = property.Key; attribute.IconCssClass = string.Empty; attribute.IsGridColumn = false; } else { // Check to see if the existing attribute record needs to be updated if ( attribute.Name != property.Name || attribute.DefaultValue != property.DefaultValue || attribute.Description != property.Description || attribute.Order != property.Order || attribute.FieldType.Assembly != property.FieldTypeAssembly || attribute.FieldType.Class != property.FieldTypeClass || attribute.IsRequired != property.IsRequired ) { updated = true; } // Check category else if ( attribute.Categories.Select( c => c.Name ).Except( propertyCategories ).Any() || propertyCategories.Except( attribute.Categories.Select( c => c.Name ) ).Any() ) { updated = true; } // Check the qualifier values else if ( attribute.AttributeQualifiers.Select( q => q.Key ).Except( property.FieldConfigurationValues.Select( c => c.Key ) ).Any() || property.FieldConfigurationValues.Select( c => c.Key ).Except( attribute.AttributeQualifiers.Select( q => q.Key ) ).Any() ) { updated = true; } else { foreach ( var attributeQualifier in attribute.AttributeQualifiers ) { if ( !property.FieldConfigurationValues.ContainsKey( attributeQualifier.Key ) || property.FieldConfigurationValues[attributeQualifier.Key].Value != attributeQualifier.Value ) { updated = true; break; } } } } if ( updated ) { // Update the attribute attribute.Name = property.Name; attribute.Description = property.Description; attribute.DefaultValue = property.DefaultValue; attribute.Order = property.Order; attribute.IsRequired = property.IsRequired; attribute.Categories.Clear(); if ( propertyCategories.Any() ) { foreach ( string propertyCategory in propertyCategories ) { int attributeEntityTypeId = EntityTypeCache.Read( typeof( Rock.Model.Attribute ) ).Id; var category = categoryService.Get( propertyCategory, attributeEntityTypeId, "EntityTypeId", entityTypeId.ToString() ).FirstOrDefault(); if ( category == null ) { category = new Category(); category.Name = propertyCategory; category.EntityTypeId = attributeEntityTypeId; category.EntityTypeQualifierColumn = "EntityTypeId"; category.EntityTypeQualifierValue = entityTypeId.ToString(); category.Order = 0; } attribute.Categories.Add( category ); } } foreach ( var qualifier in attribute.AttributeQualifiers.ToList() ) { attributeQualifierService.Delete( qualifier ); } attribute.AttributeQualifiers.Clear(); foreach ( var configValue in property.FieldConfigurationValues ) { var qualifier = new Model.AttributeQualifier(); qualifier.Key = configValue.Key; qualifier.Value = configValue.Value.Value; attribute.AttributeQualifiers.Add( qualifier ); } // Try to set the field type by searching for an existing field type with the same assembly and class name if ( attribute.FieldType == null || attribute.FieldType.Assembly != property.FieldTypeAssembly || attribute.FieldType.Class != property.FieldTypeClass ) { attribute.FieldType = fieldTypeService.Queryable().FirstOrDefault( f => f.Assembly == property.FieldTypeAssembly && f.Class == property.FieldTypeClass ); } // If this is a new attribute, add it, otherwise remove the exiting one from the cache if ( attribute.Id == 0 ) { attributeService.Add( attribute ); } else { AttributeCache.Flush( attribute.Id ); } rockContext.SaveChanges(); return true; } else { return false; } }
/// <summary> /// Saves any attribute edits made to an attribute /// </summary> /// <param name="newAttribute">The new attribute.</param> /// <param name="entityTypeId">The entity type identifier.</param> /// <param name="entityTypeQualifierColumn">The entity type qualifier column.</param> /// <param name="entityTypeQualifierValue">The entity type qualifier value.</param> /// <param name="rockContext">The rock context.</param> /// <returns></returns> /// <remarks> /// If a rockContext value is included, this method will save any previous changes made to the context /// </remarks> public static Rock.Model.Attribute SaveAttributeEdits( Rock.Model.Attribute newAttribute, int? entityTypeId, string entityTypeQualifierColumn, string entityTypeQualifierValue, RockContext rockContext = null ) { rockContext = rockContext ?? new RockContext(); var internalAttributeService = new AttributeService( rockContext ); var attributeQualifierService = new AttributeQualifierService( rockContext ); var categoryService = new CategoryService( rockContext ); // If attribute is not valid, return null if (!newAttribute.IsValid) { return null; } // Create a attribute model that will be saved Rock.Model.Attribute attribute = null; // Check to see if this was an existing or new attribute if (newAttribute.Id > 0) { // If editing an existing attribute, remove all the old qualifiers in case they were changed foreach ( var oldQualifier in attributeQualifierService.GetByAttributeId( newAttribute.Id ).ToList() ) { attributeQualifierService.Delete( oldQualifier ); } rockContext.SaveChanges(); // Then re-load the existing attribute attribute = internalAttributeService.Get( newAttribute.Id ); } if ( attribute == null ) { // If the attribute didn't exist, create it attribute = new Rock.Model.Attribute(); internalAttributeService.Add( attribute ); } else { // If it did exist, set the new attribute ID and GUID since we're copying all properties in the next step newAttribute.Id = attribute.Id; newAttribute.Guid = attribute.Guid; } // Copy all the properties from the new attribute to the attribute model attribute.CopyPropertiesFrom( newAttribute ); // Add any qualifiers foreach ( var qualifier in newAttribute.AttributeQualifiers ) { attribute.AttributeQualifiers.Add( new AttributeQualifier { Key = qualifier.Key, Value = qualifier.Value, IsSystem = qualifier.IsSystem } ); } // Add any categories attribute.Categories.Clear(); foreach ( var category in newAttribute.Categories ) { attribute.Categories.Add( categoryService.Get( category.Id ) ); } attribute.EntityTypeId = entityTypeId; attribute.EntityTypeQualifierColumn = entityTypeQualifierColumn; attribute.EntityTypeQualifierValue = entityTypeQualifierValue; rockContext.SaveChanges(); if ( attribute != null ) { Rock.Web.Cache.AttributeCache.Flush( attribute.Id ); // If this is a global attribute, flush all global attributes if ( !entityTypeId.HasValue && entityTypeQualifierColumn == string.Empty && entityTypeQualifierValue == string.Empty ) { Rock.Web.Cache.GlobalAttributesCache.Flush(); } } return attribute; }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { using ( new UnitOfWorkScope() ) { var attributeService = new AttributeService(); var attributeQualifierService = new AttributeQualifierService(); Rock.Model.Attribute attribute; int attributeId = 0; if ( hfId.Value != string.Empty && !int.TryParse( hfId.Value, out attributeId ) ) { attributeId = 0; } if ( attributeId == 0 ) { attribute = new Rock.Model.Attribute(); attribute.IsSystem = false; attribute.EntityTypeId = _entityTypeId; attribute.EntityTypeQualifierColumn = _entityQualifierColumn; attribute.EntityTypeQualifierValue = _entityQualifierValue; attributeService.Add( attribute, CurrentPersonId ); } else { AttributeCache.Flush( attributeId ); attribute = attributeService.Get( attributeId ); } attribute.Key = tbKey.Text; attribute.Name = tbName.Text; attribute.Category = tbCategory.Text; attribute.Description = tbDescription.Text; attribute.FieldTypeId = int.Parse( ddlFieldType.SelectedValue ); var fieldType = FieldTypeCache.Read( attribute.FieldTypeId ); foreach ( var oldQualifier in attribute.AttributeQualifiers.ToList() ) { attributeQualifierService.Delete( oldQualifier, CurrentPersonId ); } attribute.AttributeQualifiers.Clear(); List<Control> configControls = new List<Control>(); foreach ( var key in fieldType.Field.ConfigurationKeys() ) { configControls.Add( phFieldTypeQualifiers.FindControl( "configControl_" + key ) ); } foreach ( var configValue in fieldType.Field.ConfigurationValues( configControls ) ) { AttributeQualifier qualifier = new AttributeQualifier(); qualifier.IsSystem = false; qualifier.Key = configValue.Key; qualifier.Value = configValue.Value.Value ?? string.Empty; attribute.AttributeQualifiers.Add( qualifier ); } attribute.DefaultValue = tbDefaultValue.Text; attribute.IsMultiValue = cbMultiValue.Checked; attribute.IsRequired = cbRequired.Checked; attributeService.Save( attribute, CurrentPersonId ); } BindGrid(); pnlDetails.Visible = false; pnlList.Visible = true; }