3.9.4.2. 查看实体日志

实体日志内容可以在 Administration > Entity Log 上的专用界面上查看。

除此之外,也能在其它应用程序界面访问实体更改日志,只要加载 EntityLogItem 集合及其关联的 EntityLogAttr 实例到数据容器,再创建连接到这些数据容器的可视化组件。

下面的例子展示了 Customer 实体界面的 XML 描述片段,这里有一个带有实体日志内容的标签页。

customer-edit.xml 代码片段

  1. <data>
  2. <instance id="customerDc"
  3. class="com.company.sample.entity.Customer"
  4. view="customer-view">
  5. <loader id="customerDl"/>
  6. </instance>
  7. <collection id="entitylogsDc"
  8. class="com.haulmont.cuba.security.entity.EntityLogItem"
  9. view="logView" >
  10. <loader id="entityLogItemsDl">
  11. <query><![CDATA[select i from sec$EntityLog i where i.entityRef.entityId = :customer
  12. order by i.eventTs]]>
  13. </query>
  14. </loader>
  15. <collection id="logAttrDc"
  16. property="attributes"/>
  17. </collection>
  18. </data>
  19. <layout>
  20. <tabSheet id="tabSheet">
  21. <tab id="propertyTab">
  22. <!--...-->
  23. </tab>
  24. <tab id="logTab">
  25. <table id="logTable"
  26. dataContainer="entitylogsDc"
  27. width="100%"
  28. height="100%">
  29. <columns>
  30. <column id="eventTs"/>
  31. <column id="user.login"/>
  32. <column id="type"/>
  33. </columns>
  34. </table>
  35. <table id="attrTable"
  36. height="100%"
  37. width="100%"
  38. dataContainer="logAttrDc">
  39. <columns>
  40. <column id="name"/>
  41. <column id="oldValue"/>
  42. <column id="value"/>
  43. </columns>
  44. </table>
  45. </tab>
  46. </tabSheet>
  47. </layout>

看看 Customer 界面控制器:

Customer 界面控制器代码片段

  1. @UiController("sample_Customer.edit")
  2. @UiDescriptor("customer-edit.xml")
  3. @EditedEntityContainer("customerDc")
  4. public class CustomerEdit extends StandardEditor<Customer> {
  5. @Inject
  6. private InstanceLoader<Customer> customerDl;
  7. @Inject
  8. private CollectionLoader<EntityLogItem> entityLogItemsDl;
  9. @Subscribe
  10. private void onBeforeShow(BeforeShowEvent event) { (1)
  11. customerDl.load();
  12. }
  13. @Subscribe(id = "customerDc", target = Target.DATA_CONTAINER)
  14. private void onCustomerDcItemChange(InstanceContainer.ItemChangeEvent<Customer> event) { (2)
  15. entityLogItemsDl.setParameter("customer", event.getItem().getId());
  16. entityLogItemsDl.load();
  17. }
  18. }

注意该界面并没有 @LoadDataBeforeShow 注解,因为加载数据是显式触发的。

1onBeforeShow 方法在界面展示前加载数据。
2− 在 customerDc 容器的 ItemChangeEvent 处理器中,为依赖的加载器设置了参数并触发加载。

要显示本地化的值,启用日志记录的属性应包含@LocalizedValue注解。有此注解时,日志记录机制将填写 EntityLogAttr.messagesPack 字段,从而上面示例中的表格可以使用 locValue 列代替 value 列来显示本地化值:

  1. <table id="attrTable" width="100%" height="200px" dataContainer="logAttrDc">
  2. <columns>
  3. <column id="name"/>
  4. <column id="locValue"/>
  5. </columns>
  6. </table>