acumatica
Механизмы настройки
Поиск…
Использование CacheAttached для переопределения атрибутов DAC на графике
Иногда вам необходимо переопределить один или несколько атрибутов определенного поля Data Access Class (DAC) только для определенного экрана, не изменяя существующее поведение для других экранов.
Замена всех атрибутов
Предположим, что исходные атрибуты поля ЦАП объявлены как показано ниже:
public class ARInvoice : IBqlTable
{
[PXDBDecimal(4)]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Commission Amount")]
public virtual Decimal? CommnAmt
{
get;
set;
}
}
Основной способ переопределить атрибуты поля в графе - объявить CacheAttached
события CacheAttached
в графе, который следует за стандартным соглашением для присвоения имен графическим событиям (обратите внимание на отсутствие аргумента EventArgs). Тело обработчика события не будет выполнено, но любые атрибуты, которые вы помещаете в обработчик, заменит атрибуты соответствующего поля ЦАП:
[PXDBDecimal(4)]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Commission Amount")]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }
Добавление нового атрибута в поле ЦАП
Набор атрибутов, помещенных в обработчик CacheAttached, переопределит весь набор атрибутов, помещенных в поле в ЦАП. Это почти всегда избыточно; обратите внимание, как в предыдущем примере, чтобы добавить только один атрибут в поле, вам пришлось скопировать все другие объявления атрибутов из ЦАП. Это приводит к нежелательному дублированию кода, а также к возможности синхронизации ЦАП и графика. Очень легко представить себе ситуацию, когда кто-то изменяет логику дефолта, например, PXDefaultAttribute
в ЦАП, но забывает обновлять все соответствующие атрибуты, размещенные в обработчиках CacheAttached
на разных графиках.
Чтобы исправить эту проблему, Acumatica Framework предоставляет специальный атрибут PXMergeAttributesAttribute
. Когда этот атрибут помещается в обработчик CacheAttached
, вы можете повторно использовать существующие атрибуты, определенные в ЦАП.
Добавление атрибута с использованием атрибута PXMergeAttributesAttribute
:
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }
В приведенном выше примере весь набор атрибутов из исходного ЦАП будет использоваться повторно, добавленный любыми атрибутами, которые вы CacheAttached
обработчике событий CacheAttached
.
PXMergeAttributesAttribute
имеет другое поведение слияния в соответствии со следующими возможными значениями свойства Method:
-
MergeMethod.Replace
заменяет атрибуты ЦАП (что эквивалентно отсутствиюPXMergeAttributesAttribute
). -
MergeMethod.Append
добавляет атрибуты из обработчикаCacheAttached
к исходным атрибутам DAC. -
MergeMethod.Merge
похож наAppend
; однако он также проверяет наличие конфликтующих атрибутов между атрибутами обработчика и атрибутами поля ЦАП. Если есть конфликт, атрибутCacheAttached
имеет приоритет, и соответствующий атрибут DAC отбрасывается.
Переопределение одного свойства атрибута
Очень распространенный сценарий разработки приложений возникает, когда вам нужно переопределить только одно свойство атрибута ЦАП для определенного экрана; рассмотрите ситуацию, когда вам нужно определить свойство DisplayName
для PXUIFieldAttribute.
Для этой цели вы можете использовать еще один специальный атрибут, предоставляемый Acumatica Framework: PXCustomizeBaseAttributeAttribute
. Его конструктор принимает три значения:
- Тип атрибута DAC, свойство которого необходимо переопределить
- Имя свойства атрибута для переопределения (используйте оператор
nameof
в C # 6.0 дляnameof
обслуживания кода) - Новое значение для указанного свойства.
Предположим, что существует требование изменить отображаемое имя пользовательского интерфейса из суммы комиссии в базовую валютную комиссию только для одного экрана. Следующий пример кода демонстрирует, как реализовать желаемое поведение.
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXCustomizeBaseAttribute(typeof(PXUIFieldAttribute), nameof(PXUIFieldAttribute.DisplayName), "Base Currency Commission")]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }
В этом примере PXMergeAttributes
обеспечивает сохранение исходных атрибутов DAC, а PXCustomizeBaseAttribute
позволяет разработчику программного обеспечения переопределять отображаемое имя поля интерфейса для рассматриваемого графика.
Замена атрибута другим атрибутом
Предположим, что существует требование заменить PXDefaultAttribute
поля DAC на PXDefaultAttribute
PXDBDefaultAttribute
для одного экрана.
Это может быть достигнуто следующим образом:
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXDefaultAttribute))]
[PXDBDefault(typeof(SOShipment.siteID), PersistingCheck = PXPersistingCheck.Nothing)]
protected void SOOrderShipment_SiteID_CacheAttached(PXCache sender) { }
Заказ приложения атрибутов пользовательской настройки
-
PXCustomizeBaseAttribute
-
PXRemoveBaseAttribute
-
PXMergeAttributes