Custom fields of Organization in Liferay

I like this functionality in Liferay, we can customize liferay without creating Hook or Ext plugins. When I want to add Twitter field for organization to add twitter screen name, I was thinking I have to create a hook or ext plugins to do that. It would be very frustrating. Then my coworker told me I just need to go to Control panel as a admin, and in the left navigation, go to User and Organization. Next, you'll find a custom field link. Here you can add any custom fields you like.

Suppose you add a new column named Twitter. In the database, liferay doesn't change structure of organization_ table, what it does is to add a row in expando table. Custom field affects four tables. Let's list them:

1. expandocolumn: column name twitter will be stored here

2. expandorow: I don't know the one.

3. expandotable: Here specify the column belongs to organization_.

4. expandovalue: the value of twitter filed will be stored here

The next thing is how to get value of twitter:

protected String getTwitterScreenNameByOrganization(Organization org)
throws PortalException, SystemException {
ExpandoBridge bridge = org.getExpandoBridge();
String twitterScreenName = null;
if (bridge.hasAttribute("twitter")) {
twitterScreenName = (String) ExpandoValueLocalServiceUtil.getData(
bridge.getClassName(),
ExpandoTableConstants.DEFAULT_TABLE_NAME, "twitter",
org.getPrimaryKey());
}
return twitterScreenName;
}

Here it is! When you get the organization, you'll get it. The other way in the api is really easy, just use bridge.getAttribute("twitter"), but in my case, I always get null. I don't know the reason, so just use the way. 

你可能感兴趣的:(Field,liferay,bridge,custom,organization,expando)