This page is intended to be the root of Cookbook, FAQ, Tips, Tricks, HowTo, etc.
You may find supplementary useful informations at Old OFBiz wiki and Opentaps's OFBiz cookbooks part but note that this information may be outdated...
|
Tables of content
Magnolia CMS Integration Guide (note though that the recommended way in OFBiz is still to use the content component...)
OFBiz's Data File Tools Some tips from Jacopo
Tune your PostgreSQL installation a tip from Mike <mz4wheeler@gmail.com>
What is the best practice to modify an existing component or create a new one?
Setup Intellij IDEA IDE for OFBiz Framework - Guide applicable for OFBiz 16.11.x and above, and for Linux-based or Mac working environment.
This RMI error on client side?, click to see the tip
Caused by: java.util.MissingResourceException: Can't find bundle for base name cache, locale en_US |
Another approach deprecated since r892712
For those who are familiar with Spring, you may be interested by Apache CXF instead of AXIS2. You will find a quick comparaison between AXIS2 and CXF here deprecated since r89271
To unsubscribe You certainly forgot how you subscribed, it's easy to forgot if you use a Nabble forum to subscribe.
A tuto (screencast) for a ZK view handler
From Milind Parikh
A Chris Howe's comment taken from user ML
Just a quick comment on how you have the view-handler defined. Since you're wanting to have this distributed as a plugin, instead of placing the <handler name="zk" ... in the common-controller, simply put that line in your controller.xml file after the <include... statement. You'll probably also want to change the class name to however you're going to distrubte it (ie com.milindparikh.widget.screen.ZkViewHandler) and move the file into
the src directory of your component...and make sure the build routine is working properly.
There is also this tuto but from comments in user ML we recommend rather the way above
You need to use a 2.2+ version of HTTPD. I used 2.2.6.
Uncomment (or compile with at least these modules using --enable on Debian/Ubuntu use a2enmod)
#LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so #LoadModule ssl_module modules/mod_ssl.so |
Set ServerAdmin, ServerName
Add something like
ProxyRequests Off <Proxy *> AddDefaultCharset off Order deny,allow Allow from all </Proxy> # Enable/disable the handling of HTTP/1.1 "Via:" headers. # ("Full" adds the server version; "Block" removes all outgoing Via: headers) # Set to one of: Off \| On \| Full \| Block ProxyVia On NameVirtualHost *:80 <VirtualHost *:80> # General setup for the virtual host. ServerName www.example.com:443 ServerAdmin you@example.com ProxyRequests Off ProxyPreserveHost On proxyPass / ajp://localhost:8009/ RewriteEngine On RewriteRule ^/(images/.+);jsessionid=\w+$ /$1 </VirtualHost> include conf/httpd-ssl.conf (or include ../apache2/httpd-ssl.conf if using a file in sites-available on Debian/Ubuntu using a2ensite) |
replace (according to your setup, ie. keeping the right paths)
<VirtualHost _default_:443> # General setup for the virtual host ServerName www.example.com:443 ServerAdmin you@example.com |
by
<VirtualHost *:443> ServerName www.example.com:443 ServerAdmin you@example.com ProxyRequests Off ProxyPreserveHost On proxyPass / ajp://localhost:8009/ RewriteEngine On RewriteRule ^/(images/.+);jsessionid=\w+$ /$1 |
for apache 3.2.2 servers youu need to add
SSLEngine on SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateKeyFile /etc/pki/tls/private/localhost.key ofcourse if you have a certificate for your domain you should replace the crt and key files of your domain files. |
It should work. On Windows the configuration is the same.
Don't forget to edit ofbiz-containers.xml and url.properties file (change 8080 to 80 and 8443 to 443).
Sometime it is useful to let Apache Web Server to serve the static resources such as images, css, js etc for performance or other reasons.
In that scenario, you will need to mount the individual OFBiz application. For example:
Mounting OFBiz application as show below will forward every request to OFBiz including request for static resources such as images.
proxyPass / ajp://localhost:8009/ |
To mound individual application, use the below mentioned method. You will need to do this for all your application accept the one you want to be served by Apache Web Server e.g. /images
<Location /accounting/> ProxyPass ajp://localhost:9009/accounting/ </Location> |
Configure the Images folder in the Apache as shown below:
<Directory /var/www/xxxx/images/> Options Indexes FollowSymLinks AllowOverride None Order allow,deny allow from all </Directory> |
/var/www/xxxx/images directory is where Apache will look for your images.
Thanks to Raj Saini for these tips
Session clearing on each click of ofbiz application
It's actually not related to the Apache web server, it depends on Catalina embedded OFBiz. Note that no changes should be needed in recent versions where the line <property name="enable-cross-subdomain-sessions" value="false"/> uses value="false" in ofbiz-containers.xml.
I you need to use an svn repository on the same server the tip is to add
proxyPass /svn ! |
just before
proxyPass / ajp://localhost:8009/ |
in the 443 VirtualHost. This will give acces to your svn repsoitory (supposed to be declared as <Location /svn>) only through https. If you need also access through https, do the same in the 80 VirtualHost.
Advice from Adrian Crum.
http://db.apache.org/derby/integrate/SQuirreL_Derby.html#N101C7
For the URL use something like jdbc:derby:c:/ofbiz/runtime/data/derby/ofbiz (of course using your right path)
Link from Sundeep Ray. There is an alternative to this solution : Browsing Derby Database in Eclipse
As of rev. 585172 (date 2008-10-16) the changes mentioned below have been officially included in the OFBiz trunk.
https://issues.apache.org/jira/browse/OFBIZ-767#action_12476855
Steps to use GC with OFBiz demo data:
After you create GC for a party(e.g for DemoCustCompany) with
Card Number: 12345 and Pin Number:123, then:
After that Fin Account available balance will be 1000. You can check this here:
http://demo-trunk-ofbiz.apache.org/accounting/control/EditFinAccount?finAccountId=10000 - field "Available Balance".
Then you are ready to create order and to specify the GC as a payment method.
A tip from Rashko Rejmer
I let you find the tools with google :Eclipse/Subclipse, Tortoise, Subversion client, patch.exe, todos.exe, etc.
Note that below no longer works (or hardly) since Windows 7. I suggest rather to use Cygwin if you use a version below WIndows 10. I have personnaly installed with Git Bash. Bash comes embedded with WIndows 10. |
To patch on Windows you have to download patch.exe. But you may encouter EOL problems with patch.exe. That's why I prefer to use Eclipse's "Apply Patch" option wich is great to use with clipboard. If you get issue with Subclipse and work on Windows you may try Tortoise's "Apply Patch" option. If I get problems with Tortoise I then use the patch command. Something to understand is that Tortoise actually use "SVN merge" so in certains cases problems arise. To avoid EOL problems with the patch command, I use a bat file patchdos.bat :
todos %1 patch -N -p0 < %1 |
where todos is and exe to download (search with Google). Of course you will have to deal with path. But at this stage I guess it's easy...
I just learned from https://sourceforge.net/project/shownotes.php?release_id=508633 that the "--binary" option may be used in that case, did no try yet...
I tried --binary today on a Windows XP system with patches created on the same system: it does not work :/
Where should the expanded files be located?
Set up and run your script with the appropriate path. Ex:
javaservice -install OFBiz %java_home%\jre\bin\server\jvm.dll -Xms256M -Xmx512M -Djava.class.path=%java_home%\lib\tools.jar;%ofbiz_home%\ofbiz.jar -start org.ofbiz.base.start.Start -out %ofbiz_home%\logs\serviceLog.txt -err %ofbiz_home%\logs\serviceErr.txt -current %ofbiz_home% -manual |
Note: If your java sdk is installed under a directory with a space in it, the service will install, but not start properly, unless you change java_home to the DOS 8.3 name. For example, if your java sdk is installed in C:\Program Files\Java\j2sdk1.4.2_xx
then you would set java_home=C:\PROGRA~1\Java\j2sdk1.4.2_xx
* Go to the win2k services app and you should now find a service 'OFBiz' set up to run manually (this of course can be changed to run automatically if so desired).
Advice from enki_ at users.sourceforge.net. There is an alternative to this solution : How to Run OFBiz as Windows Service with Java Service Wrapper
Brett Palmer gave a presentation on Selenium testing for Ofbiz at ApacheCon 2008. The presentation is no longer available at the ApacheCon site, but is available at http://www.kenfuse.com/forum/material-regarding-seleniumxml.
If you see the following messages at the end of the console, the Selenium server is running fine:
Entering interactive mode... type Selenium commands here (e.g: cmd=open&1=http://www.yahoo.com)
Below is deprecated but may still contain useful tips. Else rather see and follow Selenium in Webtools...
Due to some license issues with external libraries used in Selenium we cannot include this in the Apache trunk. However, a new component has been created which is free to download and use, but lives in an ofbizext repository.
https://svn.hotwaxmedia.com/svn/ofbizext/selenium Drop this in hot-deploy. If you want to know more, please look at https://issues.apache.org/jira/browse/OFBIZ-680
1) For running "successive" test cases I used browser "Refresh" button but I think there might be some better option to handle this. Is there any option exists in Selenium IDE ?
If you want to chain execution of different tests, there is the notion of test suite. A list of tests to run one after the other (see http://labs.libre-entreprise.org/scm/viewvc.php/ofbizNeogia/neogia/manufacturing/webapp/manufacturing/tests/ManufacturingTestSuite.html?revision=1.10&root=neogia&view=markup)
Otherwise if you just want to replay the same test in a loop, I'm not aware of a such feature in selenium. Bur if the loop is finite, you can achieve a similar result by using a test suite that refers x times the same test.2) Suppose I have a condition to create the new user each time. As I can put the value of user login say "user1" for the first time but when this test case runs second time it generates error (It hangs up in between). So Is there any option to put a "counter" or Javascript code
in the Test cases so I could create the "user2" when this test case runs second time ?
The general problem behind you issue is how to run a test multiple times wihtout risking duplicated primary keys or having to remove all data created by the test.
One solution is to always create business objects with different identifiers. Selenium provides a nice feature to do that: you can define variables during the test execution and use them anywhere in the test script after their creation.
Here an example based on one of my test (http://labs.libre-entreprise.org/scm/viewvc.php/ofbizNeogia/neogia/manufacturing/webapp/manufacturing/tests/TestCreateNomenclature.html?revision=1.10&root=neogia&view=markup)
<!-- create a variable named uid that contains an unique identifier --> <tr> <td>store</td> <td>javascript{(new Date()).getTime() % 10000}</td> <td>uid</td> </tr> |
<!-- use of the variable named uid to fill a form entry --> <tr> <td>type</td> <td>partyId</td> <td>user-${uid}</td> </tr> |
3) What is the difference between click and clickAndWait ? I would like to understand why I'm getting different behaviors from click and clickAndWait functions. Here is the scenario: I want to perform the login and then verify some text on the page (what should be pretty straight forward...) My first approach was using the clickfunction + pause function. Something like below:
<tr> <td>click</td> <td>submit</td> <td></td> </tr> <tr> <td>pause</td> <td>3000</td> <td></td> </tr> |
The approach above worked fine and I was able to proceed with my test. However, I was looking the clickAndWait functionality and, per my understanding, this function should have a simlar behavior to my code above.. then I wrote the following:
<tr> <td>clickAndWait</td> <td>submit</td> <td></td> </tr> |
The code above is getting a "Permission Denied" message. I already check the URLs and I'm not launching a different domain (before I click I have http://domain/Login/ and after the submission I have http://domain/App/).
I think the right solution is to use clickAndWait command instead of click+pause because it always success contrary to click+pause (we dont known the page response time). I see no reason why you don't observe the same behavior with clickAndWait. Maybe it's because your are testing the login page that can be a little tricky to test due to the session handling.
To be sure to always start a test in a clean session, my tests always do the same actions :
1. logoff
2. login
3. check error
Here, an example of my standard login procedure under selenium from (http://labs.libre-entreprise.org/scm/viewvc.php/ofbizNeogia/neogia/manufacturing/webapp/manufacturing/tests/TestCreateNomenclature.html?root=neogia&view=markup)
<!-- Begin of standard login procedure --> <tr> <td>open</td> <td>/manufacturing/control/logout</td> <td></td> </tr> <tr> <td>type</td> <td>USERNAME</td> <td>admin</td> </tr> <tr> <td>type</td> <td>PASSWORD</td> <td>ofbiz</td> </tr> <tr> <td>select</td> <td>locale</td> <td>value=fr</td> </tr> <tr> <td>clickAndWait</td> <td>submitButton</td> <td></td> </tr> <tr> <td>assertElementNotPresent</td> <td>//div[@class='errorMessage']</td> <td></td> </tr> <!-- End of standard login procedure --> |
Advices from Peter Goron
If you receive an SQL error in ofbiz, it doesn't show the error from the database itself. Instead, it shows a general error which isn't neccessarily clear. Run the SQL directly on the database get a more helpful error message.
If you need to connect OFBiz to a database without write access or you want just are sure that your users have a read acces, you can change on the entityengine.xml the helper to the class ReadOnlyHelperDAO on your data-source like that
<datasource name="localderby" helper-class="org.apache.ofbiz.entity.datasource.ReadOnlyHelperDAO" schema-name="OFBIZ" field-type-name="derby">... |
In the marketing application, click on contact list, then find your list, then click on Comm Events and then Create New Contact List. Comm Event should land you here:
http://demo-trunk-ofbiz.apache.org//marketing/control/EditContactListCommEvent?contactListId=9000&DONE_PAGE=/marketing/control/ListContactList
based on the trunk demo server.
Set your from details and party roles (maybe N/A), fill your subject and content and click save.
When you're happy with it, change the status to "In-Progress" and click save again. The comm events should then start to trigger and the email flow, although you'll want to test it on a small list to start with. If the list is clean and processes through OK the status should automatically change to "Complete" when it is done but if there are badly formatted email addresses that can stick the status and you will need to manually mark as complete and you might review the logs to find the error.
At the time of this tip was wrote, the start and finish dates do not work as expected, leave them blank for your first testing.
A Ray Barlow's tip
Add a entity-resource entry of type "data" and reader-name as "ext" in ofbiz-components.xml of your application. For example:
<entity-resource type="data" reader-name="ext" loader="main" location="data/GeoData_IN.xml"/> |
And run the
"run-install-extseed" |
ant target instead of
"run-install" |
This should load your modified data along with the seed data and without any demo data.
If you see errors like
Error:Error trying to begin transaction, could not process method: The
current transaction is marked for rollback, not beginning a new
transaction
and aborting current operation; the rollbackOnly was caused by: Service
createAcctgTransAndEntries threw an unexpected
exception/errororg.ofbiz.service.ServiceValidationException: The following
required parameter is missing: OUT
createAcctgTransAndEntries.acctgTransId (The following required
parameter
is missing: OUT createAcctgTransAndEntries.acctgTransId) calling
service
balanceInventoryItems in receiveInventoryProduct
If you are not using the Accounting module much and specifically the GL section, than go to accounting ~> ofbiz-component.xml and comment the entry for secas_ledger.xml in that file, restart the server and try again. This should solve your problem.
A Mridul Pathak's tip
From an old thread by Chris Howe and David Jones. Note that it's now easier to use the create-component ant target (just try "ant -p" to know more) or the Gradle createComponent Gradle task for newer project.
Chris Howe: Lets say that I want to create an application that most closely matches the ecommerce app. I should start with copied versions the following files only.
ofbizhome/speciapurpose/myapp/build.xml ofbizhome/speciapurpose/myapp/ofbiz-component.xml ofbizhome/speciapurpose/myapp/webapp/myapp/WEB-INF/controller.xml ofbizhome/speciapurpose/myapp/webapp/myapp/WEB-INF/web.xml ofbizhome/speciapurpose/myapp/webapp/myapp/index.jsp |
from this I should edit the following
+build.xml:+find "ecommerce"
replace with "myapp"
+ofbiz-component.xml:+find "ecommerce"
replace with "myapp"
+web.xml:+change display name and description from "ecommerce"
to "myapp"
Then change speciapurpose/component-load.xml to load
"myapp"
This should give you an exact duplication of functionality of the copied ecommerce application without the hundreds of thousands of lines of code. Then by simply copying/creating the files that need to be changed and changing the requests and views in controller.xml you will have your new application, but still benefit from svn updates. What is the potential downside of this?
David Jones: Yes, this is the best practice... Being able to do this is part of the design and intention of the screen widget. BTW, the hot-deploy directory may be easier to use than the speciapurpose directory, but of course you can mount a component from anywhere (the following paragraph explains with more details)
A David Jones's tip
One approach is to simply copy an entire component into a new directory and start hacking away at it until it fit your needs. This is a fine practice if you never have plans of bringing it up to date with a current revision or version. OFBIZ is currently making about 40 commits a week. By the time you complete your customizations, you are out of date.
Another approach is to make a different web app. This is where you copy the five essential files from a similar application that is being maintained by the project, make minor modifications to them.
Which one is right? It depends on on how much changes you are making. Modifying the following files will allow you to "customize" an application, whereas starting from scratch using an existing application as a template is better for a "custom application."
Now if you were to start OFBIZ and point your browser to mydomain.com/myapp you would see an exact duplicate of the application that you were modeling.
From there you need to understand how a page is rendered. It is more detailed than this, but this explanation will suffice for the majority of simple customizations.
The goal with the differences app is to create all of the customizations that you need without touching original OFBIZ code. That way when you update to more current versions, you're less likely to encounter significant conflicts. It makes your application close to being "turn-key".
Most likely the first thing your're going to want to customize is the decoration (the header, which screens are in the leftbar if you want to display a right bar, how the body is displayed, which UILabels you use, etc). For this you need to do two things. (As of revision 5539 you can only do this if your views are using the ecommerce application, it shouldn't be long before all of the applications support this)
Change the location of the mainDecoratorLocation in web.xml
<context-param> <param-name>mainDecoratorLocation</param-name> <param-value>component://ecommerce/widget/CommonScreens.xml</param-value> <description>The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files.</description> </context-param> |
Now your application is an exact copy of the model application with your customized decoration. The reason it's an exact copy is because you have essentially the same controller.xml files in both applications. All of the requests call the same views, which call the same screens, which in turn call the same actions and widgets. So now you want to make some more changes.
That's really all there is to it. If you call new services from the requests, make sure you create your file in component://myapp/servicedef/services.xml and make sure it gets loaded in the ofbiz-component.xml file. Same with ECAs. Need new classes, create them in your src directory and don't forget to build them with ant. Keep in mind two things and maintenance of your custom application will be easier and less error prone.
Scenario: You can extend any of the existing applications via a custom component in the hot-deploy directory. In the following example we are extending the Marketing component via our custom component called mycomponent.
First we need to create a new WEB-INF folder inside your custom component's webapp directory ($OFBIZ_HOME/hot-deploy/mycomponent/webapp). To create folders for the component you want to extend, use the name of the component you want to extend: ( OFBIZ_HOME is the location of the root directory of OFBiz)
$ cd $OFBIZ_HOME/hot-deploy/mycomponent/webapp $ mkdir -p marketing/WEB-INF |
You should have the a new WEB-INF directory: $OFBIZ_HOME/hot-deploy/mycomponent/webapp/marketing/WEB-INF
Create an empty controller.xml file in this new WEB-INF folder:
$ touch $OFBIZ_HOME/hot-deploy/mycomponent/webapp/marketing/WEB-INF/controller.xml |
In this new controller.xml file include the controller.xml file from the marketing component:
<?xml version="1.0" encoding="UTF-8"?> <site-conf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/site-conf.xsd"> <include location="component://marketing/webapp/marketing/WEB-INF/controller.xml"/> </site-conf> |
Copy the marketing component's web.xml from the marketing component's WEB-INF directory ($OFBIZ_HOME/applications/marketing/webapp/marketing/WEB-INF) into the new WEB-INF folder:
$ cp $OFBIZ_HOME/applications/marketing/webapp/marketing/WEB-INF/web.xml $OFBIZ_HOME/hot-deploy/mycomponent/webapp/marketing/WEB-INF/ |
In you custom component's ofbiz-component.xml ($OFBIZ_HOME/hot-deploy/mycomponent/) add following code:
<webapp name="marketing" title="Marketing-Customized" server="default-server" location="webapp/marketing" base-permission="OFBTOOLS,MARKETING" mount-point="/marketing"/> |
The basic setup for extending the component is completed. You can add your custom component specific request and view in controller.xml. You can add other items such as SECAs in secas.xml and have them triggered on services in the component you want to extend. You can also create screens in the extended component.
There are two main techniques in configuring SSL, through Apache (recommended), and through the JVM directly.
Configuring SSL through Apache is probably the preferred method, and is well documented.
It's also possible to have the SSL certificate in your JVM environment. The certificate is usually found in the $JAVA_HOME/jre/lib/security directory.
The default file that ships with OFBiz is called cacerts.
You will need to use the Java keytool utility to add certificates from other SSL sites (e.g. www.mywebsite.com) . Here is a pretty good tutorial on getting your SSL certificate setup
The basic steps are described here
Here are some Certificate vendors (this list is from 2005)
Add the $OFBIZ/framework/base/config dir to the jar as a <resource> in your build file (Maven's pom.xml example, to be adapted for ant)
<resources> <resource> <directory>../../../framework/base/config</directory> </resource> <resource> <directory>../../../framework/base/dtd</directory> </resource> <resource> <directory>../../../framework/datafile/dtd</directory> </resource> <resource> <directory>../../../framework/entity/dtd</directory> </resource> <resource> <directory>../../../framework/entityext/dtd</directory> </resource> <resource> <directory>../../../framework/minilang/dtd</directory> </resource> <resource> <directory>../../../framework/security/dtd</directory> </resource> <resource> <directory>../../../framework/service/dtd</directory> </resource> <resource> <directory>../../../framework/widget/dtd</directory> </resource> <resource> <directory>../../../framework/workflow/dtd</directory> </resource> <resource> <directory>../../../framework/applications/content/dtd</directory> </resource> </resources> |
A Ryan's (from Sourcelab) tip
By default, since OFBIz is under the Apache Software Fundation Licence, OFBiz comes with RMI using SSL. Before it was possible to use RMI without SSL. But due to licence constraint some code has been removed. If you need, for testing for instance, to use RMI without SSL follow this tip:
In framework/base/config/ofbiz-containers.xml comment out this snippet during tests
<property name="client-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLClientSocketFactory"/> <property name="server-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLServerSocketFactory"/> <property name="ssl-keystore" value="framework/base/config/ofbizrmi.jks"/> <property name="ssl-keystore-type" value="JKS"/> <property name="ssl-keystore-pass" value="changeit"/> <property name="ssl-keystore-alias" value="rmissl"/> <property name="ssl-client-auth" value="false"/> |
OR
In framework/base/config/ofbiz-containers.xml replace (or better comment out during tests)
<property name="client-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLClientSocketFactory"/> <property name="server-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLServerSocketFactory"/> |
by
<property name="client-factory" value="org.ofbiz.service.rmi.socket.zip.CompressionClientSocketFactory"/> <property name="server-factory" value="org.ofbiz.service.rmi.socket.zip.CompressionServerSocketFactory"/> |
Simply run the testRmi service from Webtools (not sure this is sufficient...)
OR
Unzip somewhere on you disk this attachment. From there I guess it's pretty simple.
For that simply uncomment these lines in startofiz.sh
IPADDR=`/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'` RMIIF="-Djava.rmi.server.hostname=$IPADDR" |
The first three links use the vendor branch principle
An alternative using SVK and not the vendor branch principle : How to use SVK for creating local SVN repositories (a Vinay Agarwal'tip)
A discussion about this topic on user ML proposing a simpler alternative way, extract :
Also certainly the most advanced way using *-ofbiz-patches targets from hot-deploy/vinops/build.xml
If you are not interested in posting accounting transactions to the GL then you can disable (i.e. comment out) the first eca rule in accounting/servicedef/secas_ledger.xml
<eca service="createAcctgTransAndEntries" event="commit"> <condition field-name="acctgTransId" operator="is-not-empty"/> <action service="postAcctgTrans" mode="sync"/> </eca> |
This question has been already asked many times. You should find more information in Nabble
The main idea is that in OFBiz we don't delete but use end dates to mark obsolescence.
Four main reasons :
If you really need to do it, think about these 4 points before...
In order to show the prices including VAT in the store for consumers, you need to take following steps:
For now you can't set a different VAT rate for shipping, see last comment of
You need to have the ofbizrmi.jks and ofbiztrust.jks setup at both ends. For testing, the easiest way is
For production, remember that the truststore of the "client" would hold the public key exported from the keystore of the "server". Conversely the truststore of the "server" would hold the public key exported from the keystore of the "client". Making the keystore and truststore identical on both sides makes life a bit easier for testing, but make sure you toughen things up before you go into production!!!
Thanks to Andrew Sykes
They are the timestamps that the entity engine automatically maintains for all entities, unless you use no-auto-stamp=true in the entity definition. But by default all entities will have these four fields.
The transaction stamps are when the transaction was begun that the change is part of, and the stamps are within that transaction, although they are an absolute value. But to order the actual records that changed within the transaction. The entity engine does do things for these stamp fields when it maintains them, by the way, that ensure that within a transaction each updated or created stamp, depending on whether it's a create or updated, is unique for that transaction.
So it'll keep track of the last one and always increment it by one, even if it's been less than a millisecond since the other record went through. As long as you don't have more than a thousand records going into the database per second in a single transaction then you shouldn't have problems with overflowing it too much.
But it is important that those are unique, so we can order all the records by these stamps and basically reproduce the transaction to send it over to the other server. Even reproducing the transaction we can't always eliminate problems with foreign keys. Anyway that's the intention here, to reduce problems with foreign keys as much as possible and recreate the data changes on the remote server when the synchronization goes through
Adapted from Advanced Framework Transcription PDF
Accounting transactions originated by events in different currencies from the one of GL are automatically converted using the currency exchange rate of the date of the transaction.
The "company base currency" is set in the partyAcctgPreference. You have to enter a record in the CurrencyUomDated entity.
If this information is available then you'll notice that the AcctgTransEntry will have two different amounts in the fields amount/currencyUomId and origAmount/origCurrencyUomId
The modification is done by the createAcctgTransEntry service.
From a discussion between Jacopo and Hans on dev ML
This has (at least) 2 advantages :
For that look for *-catalog.xml files in OFBiz and use them in your favorite XML editor. For instance in Eclipse : Menu Windows/XML/XML Catalog
If a View Allow category is configured only the products in that category will be visible when this catalog is active. Other products will not show up in search results, category browsing, and if someone tries to view the product by ID it will report that no product is found for this ID. There is a performance impact associated with the use of this category, so alternatives might be desirable in certain circumstances. In general for easier maintenance it is best to have this set to the same category as the Default Search category.
But in general for Catalog Setup you shoud refer at this section of the Apache OFBiz Business Setup Guide
Because customizations can dramatically change the performance
characteristics of OFBiz it is a good idea to always do performance
and load testing once development is complete.
That said... a decent mid-range server (dual processor, 4GB RAM for
example) can typically handle a peak of about 100,000 page hits per
hour, or that's what I use as a typical rule of thumb for early
estimates. Typically the peak hours are concentrated into certain
times of day, and as another rule of thumb I usually use an effective
10 hour day for estimates, so that makes roughly 1,000,000 page hits
per day.
In short your estimate of 100,000 page hits per day is WELL within
what a single server can handle, even with the database and app server
running on the same machine.
You can use TTF fonts in fo.ftl files. You need to use file "framework/webapp/config/fop.xconf". This file contain following code that responsible for font family, change font family according to the requirement, exemple
<font metrics-url="arial.xml" kerning="yes" embed-url="arial.ttf"> <font-triplet name="Arial" style="normal" weight="normal"/> <font-triplet name="ArialMT" style="normal" weight="normal"/> </font> |
I found that I could put this:
<fonts> <auto-detect/> </fonts> |
And FOP now sees all the TTF's that the system knows.
A tip from Brajesh Patel & James Mcgill
include a js code like below:
Event.observe(window, 'load', function() {if ($('formId')) validateNewUser = new Validation('formId', {immediate: true});} |
And in the respective form use the suitable class for form fields
<field ... widget-style="required"> ... </field> <field ... widget-style="validate-email"> ... </field> <field ... widget-style="validate-url"> ... </field> |
More at Really easy field validation
A tip from Atul Vani
The messages that come in different pages in OFBiz are configured using several configuration files. The best parts of message display framework under OFBiz are as follows:
The main components of the message display framework in OFBiz are
Beside these two configuration files there are at least one property key value configuration file under the config directory of the respective element for almost all elements like accounting, manufacturing, service, minilang etc. under the applications and framework directories. e.g. AccountingErrorUiLabels.xml, MiniLangErrorUiLabels.xml, ServiceErrorUiLabels.xml
One important thing to notice here is that all UI labels in OFBiz are displayed in the same manner using the property key value XML configuration files available under the config directory. In some cases there are no separate error configuration files but the error messages are included in the UI label configuration file itself. e.g. in case of marketing component related error messages are included in the MarketingUiLabels.xml under ofbiz/applications/marketing/config folder.
How to change a specific error message
The same procedure can be followed for changing the UI label elements.
A tip from Amitava Neogi
If you need to use an entity or view-entity from other components to construct a view-entity, be cautious on how the sequence of the components are loaded. This is because the view-entity will be loaded when you start OFBiz, and if the component entity xml is loaded AFTER your component, your view-entity would not be able to pick up the relevant information from the other component.
Therefore it is important to make sure that if you're using entities from other component, make sure they are loaded BEFORE your component.
This is a big, and often not enough known OFBiz great feature.
Most of the time you don't need to restart when you change things in dev mode (dev mode depends on the content of cache.properties file, see here how to set it).
It's easier to name the main cases (I'll not get into details) where you need to restart:
If the caches are on (ie not on dev mode), it's the same (you don't need to recompile) but you need to clear the caches. See at ...webtools/control/FindUtilCache You might even clear only the cache where things changed (production performance).
The ETag header is causing an issue with browser cache not being updated when the server has been updated. Actually a weak ETag, see http://en.wikipedia.org/wiki/HTTP_ETag
Seems like tomcat’s DefaultServlet will only serve weak ETag’s even though tomcat7+ does have code for strong ETag but is never used and there is no documentation on how to set it
A possible solution is to remove If-None-Match request header and ETag response header in apache http server
RequestHeader unset If-None-Match
Header unset ETag
If a query takes more than 150 ms its duration is shown in log. To change that look for:
Debug.logTiming("Ran query in "
in GenericDAO.java
[] If the list does not exist, create a new list and append item to it. If the list exist, append item to the end of the list
[+0] If list does not exist, create a new list and append item to it. If the list exist, insert item at the beginning of the list
OFBiz gave up on Workflow Engines. Shark was implemented last but never really used in OFBiz. Instead of using a Workflow Engine, OFBiz uses an Event Driven Architecture (EDA), so ECAs (SECA, EECA, MECA) are used in OFBiz to drive the Workflow. ECA is the acronym of Event Condition Action. SECAs are for Services (triggered on services conditions), EECAs are for Entity (triggered on entities conditions), MECAs are for Mail.
When you use a command like
gradlew "ofbiz --load-data readers=seed,seed-initial,ext,ext-demo"
Beware that copying this command in Microsoft Word will automatically transform the double dash in "en dashes" (Unicode 0x2013: "–" from Unicode Map)
Other cases not related to Word were also reported.So when this command does not work check that you are really using dashes!
from Turn windows feature on or off ->Windows subsystem for Linux->Restart and retry