In general, this looks like a pretty good idea.

The visibility tag  would be nice if the widgets took advantage of that.
then i would be easy to let a field disappear in the whole system when a
if a simple 'true/false' would be possible.

More complicated ones like the ones mentioned below could also be
interesting but the integration in the widgets is a must. ftl's will me
more difficult (macros), jsp, not sure if we should support that.

trigger and validation will be more complex but sure we could look at
that.

In general a good idea

Regards,
Hans


On Fri, 2009-10-16 at 05:16 +0800, Michael Xu (xudong) wrote:
> hi all,
> 
> We can define entities in XML files. However, only database specific
> semantics could be defined there. For those application level semantics
> (like trigger, visiblity, validation) has to be defined in different places.
> The lack of a single place to define such metadata makes ofbiz hard to
> maintain. (Correct me if I am wrong)
> 
> Let's take OrderHeader as an example. I copy the latest entity definition as
> below:
> 
>     <entity entity-name="OrderHeader"
>             package-name="org.ofbiz.order.order"
>             never-cache="true"
>             title="Order Header Entity">
>       <field name="orderId" type="id-ne"></field>
>       <field name="orderTypeId" type="id"></field>
>       <field name="orderName" type="name"></field>
>       <field name="externalId" type="id"></field>
>       <field name="salesChannelEnumId" type="id"></field>
>       <field name="orderDate" type="date-time"></field>
>       <field name="entryDate" type="date-time"></field>
>       <field name="visitId" type="id"></field>
>       <field name="statusId" type="id"></field>
>       <field name="createdBy" type="id-vlong"></field>
>       <field name="firstAttemptOrderId" type="id"></field>
>       <field name="currencyUom" type="id"></field>
>       <field name="syncStatusId" type="id"></field>
>       <field name="billingAccountId" type="id"></field>
>       <field name="originFacilityId" type="id"></field>
>       <field name="webSiteId" type="id"></field>
>       <field name="productStoreId" type="id"></field>
>       <field name="terminalId" type="id-long"></field>
>       <field name="transactionId" type="id-long"></field>
>       <field name="autoOrderShoppingListId" type="id"></field>
>       <field name="needsInventoryIssuance" type="indicator"></field>
>       <field name="isRushOrder" type="indicator"></field>
>       <field name="internalCode" type="id-long"></field>
>       <field name="remainingSubTotal" type="currency-amount"></field>
>       <field name="grandTotal" type="currency-amount"></field>
>       <prim-key field="orderId"/>
>       <relation type="one" fk-name="ORDER_HDR_TYPE"
> rel-entity-name="OrderType">
>         <key-map field-name="orderTypeId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_SCENUM" title="SalesChannel"
> rel-entity-name="Enumeration">
>         <key-map field-name="salesChannelEnumId" rel-field-name="enumId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_OFAC" title="Origin"
> rel-entity-name="Facility">
>         <key-map field-name="originFacilityId" rel-field-name="facilityId"/>
>       </relation>
>       <relation type="many" rel-entity-name="OrderTypeAttr">
>         <key-map field-name="orderTypeId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_BACCT"
> rel-entity-name="BillingAccount">
>         <key-map field-name="billingAccountId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_PDSTR"
> rel-entity-name="ProductStore">
>         <key-map field-name="productStoreId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_AOSHLST" title="AutoOrder"
> rel-entity-name="ShoppingList">
>         <key-map field-name="autoOrderShoppingListId"
> rel-field-name="shoppingListId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_CBUL" title="CreatedBy"
> rel-entity-name="UserLogin">
>         <key-map field-name="createdBy" rel-field-name="userLoginId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_STTS"
> rel-entity-name="StatusItem">
>         <key-map field-name="statusId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_SYST" title="Sync"
> rel-entity-name="StatusItem">
>         <key-map field-name="syncStatusId" rel-field-name="statusId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_CUOM" rel-entity-name="Uom">
>         <key-map field-name="currencyUom" rel-field-name="uomId"/>
>       </relation>
>       <relation type="many" rel-entity-name="OrderHeaderNoteView">
>         <key-map field-name="orderId"/>
>       </relation>
>       <relation type="many" rel-entity-name="OrderItemAndShipGroupAssoc">
>         <key-map field-name="orderId"/>
>       </relation>
>       <index name="ORDEREXT_ID_IDX">
>         <index-field name="externalId"/>
>       </index>
>     </entity>
> 
> In order to enrich the definition (metadata) with more information, I am
> considering to put more tags (please find elements surrounded with
> !!!!!!!!!!!!!!!!!!!!!), like:
> 
>     <entity entity-name="OrderHeader"
>             package-name="org.ofbiz.order.order"
>             never-cache="true"
>             title="Order Header Entity">
>       <field name="orderId" type="id-ne"></field>
>       <field name="orderTypeId" type="id"></field>
>       <field name="orderName" type="name"></field>
> 
> 
>       <!- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>       <field name="externalId" type="id">
>            <!-
>                 We can use "visiblity" tag to tell system when to show this
> field in UI layer.
>             ->
>            <visbility>
>                 <condition
> implementation="org.ofbiz.core.condition.NonEmptyField"/>
>            </visbility>
>            <validity type="clientSide">
>                 <condition notEqual="111"/>
>            </validity>
>       </field>
>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ->
> 
> 
> 
>       <field name="salesChannelEnumId" type="id"></field>
>       <field name="orderDate" type="date-time"></field>
>       <field name="entryDate" type="date-time"></field>
>       <field name="visitId" type="id"></field>
>       <field name="statusId" type="id"></field>
>       <field name="createdBy" type="id-vlong"></field>
>       <field name="firstAttemptOrderId" type="id"></field>
>       <field name="currencyUom" type="id"></field>
>       <field name="syncStatusId" type="id"></field>
>       <field name="billingAccountId" type="id"></field>
>       <field name="originFacilityId" type="id"></field>
>       <field name="webSiteId" type="id"></field>
>       <field name="productStoreId" type="id"></field>
>       <field name="terminalId" type="id-long"></field>
>       <field name="transactionId" type="id-long"></field>
>       <field name="autoOrderShoppingListId" type="id"></field>
>       <field name="needsInventoryIssuance" type="indicator"></field>
>       <field name="isRushOrder" type="indicator"></field>
>       <field name="internalCode" type="id-long"></field>
>       <field name="remainingSubTotal" type="currency-amount"></field>
>       <field name="grandTotal" type="currency-amount"></field>
>       <prim-key field="orderId"/>
>       <relation type="one" fk-name="ORDER_HDR_TYPE"
> rel-entity-name="OrderType">
>         <key-map field-name="orderTypeId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_SCENUM" title="SalesChannel"
> rel-entity-name="Enumeration">
>         <key-map field-name="salesChannelEnumId" rel-field-name="enumId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_OFAC" title="Origin"
> rel-entity-name="Facility">
>         <key-map field-name="originFacilityId" rel-field-name="facilityId"/>
>       </relation>
>       <relation type="many" rel-entity-name="OrderTypeAttr">
>         <key-map field-name="orderTypeId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_BACCT"
> rel-entity-name="BillingAccount">
>         <key-map field-name="billingAccountId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_PDSTR"
> rel-entity-name="ProductStore">
>         <key-map field-name="productStoreId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_AOSHLST" title="AutoOrder"
> rel-entity-name="ShoppingList">
>         <key-map field-name="autoOrderShoppingListId"
> rel-field-name="shoppingListId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_CBUL" title="CreatedBy"
> rel-entity-name="UserLogin">
>         <key-map field-name="createdBy" rel-field-name="userLoginId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_STTS"
> rel-entity-name="StatusItem">
>         <key-map field-name="statusId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_SYST" title="Sync"
> rel-entity-name="StatusItem">
>         <key-map field-name="syncStatusId" rel-field-name="statusId"/>
>       </relation>
>       <relation type="one" fk-name="ORDER_HDR_CUOM" rel-entity-name="Uom">
>         <key-map field-name="currencyUom" rel-field-name="uomId"/>
>       </relation>
>       <relation type="many" rel-entity-name="OrderHeaderNoteView">
>         <key-map field-name="orderId"/>
>       </relation>
>       <relation type="many" rel-entity-name="OrderItemAndShipGroupAssoc">
>         <key-map field-name="orderId"/>
>       </relation>
>       <index name="ORDEREXT_ID_IDX">
>         <index-field name="externalId"/>
>       </index>
> 
> 
>       <!- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>       <!-
>          In different context, maybe different set of fields need to show.
> So my idea
>          here is to use "group" to group fields for different scenario. And
> then in UI
>          level, we can define a jsp tag or something to only show fields
> within this group.
>        ->
>       <group name="summary">
>            <field name="orderId" rank="1"/>
>           <field name="orderTypeId" rank="10"/>
>           <field name="orderName" rank="11"/>
>       </group>
> 
>       <group name="details">
>          <field name="orderId" rank="1"/>
>           <field name="orderTypeId" rank="10"/>
>           <field name="orderName" rank="11"/>
>           <field name="externalId" rank="20">
>              <!-
>                  !!!!Note: Though visibility is definded above with another
> condition. However, in this group
>                               (Scenario), externalID will always be visible.
>              ->
>              <visbility value="true"/>
>           <field>
>       </group>
>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!->
>     </entity>
> 
> Such an idea to make entity definition as a single point of
> configuration/customization might make system easier to maintain/customize.
> Am I right? If yes, anybody could suggest me how to implement it.
> 
> (BTW: we are going to use ofbiz entity engine for our products just like
> what JIRA did. It would be great if such enhancement could be done direct
> under apache. Otherwise, we might have to maintain a customized ofbiz entity
> engine by ourselves.)
> 
> --
> Regards,
> Michael Xu (xudong)
> www.wizitsoft.com | Office: (8610) 6267 0615 ext 806 | Mobile: (86) 135 0135
> 9807 | Fax: (8610) 62670096
-- 
Antwebsystems.com: Quality OFBiz services for competitive rates

Reply via email to