[轉]在Liferay開發中如何避免使用EXT插件

 

儘量使用hook代替ext

假如你須要覆蓋諸如 *ServiceImp l類, 好比 UserLocalServiceImpl類,能夠擴展UserLocalServiceWrapper ,重寫你想要的方法, 而後在 liferay-hook.xml中進行以下的聲明: javascript

<hook>
    <service>
        <service-type>com.liferay.portal.service.UserLocalService</service-type>
        <service-impl>com.liferay.testhook.hook.service.impl.TestUserLocalServiceImpl</service-impl>
    </service>
</hook>

其中

public class TestUserLocalServiceImpl extends UserLocalServiceWrapper {
   // override what you want ...
}

若是你須要覆蓋在liferay-hook.dtd文件中聲明的類或添加event action, 好比你但願覆蓋ScreennameValidator, ScreennameGenerator, 或者添加postLoginActions, servicePreActions等, 能夠在portal-ext.properties覆蓋所需的hook. 這樣你不須要重啓應用服務器,就能夠當即看到修改後的效果.html


儘可能使用自定義屬性

若是你須要自定義屬性,那麼儘可能不要使用service.xml往數據庫添加新的表字段並從新生成全部的service, 你可使用自定義的屬性。二者不存在性能差異。字符串索引(只有字符串)會被索引,你能夠經過liferay的管理控制檯界面進行設置。你須要注意的是恰當添加view和update權限。java

以create account form爲例,你不須要修改任何java類給註冊過程添加新的屬性,只需建立一個 hook 插件並在create-account.jsp中添加以下代碼數據庫

<liferay-ui:custom-attribute
       className="com.liferay.portal.model.User"
       classPK="<%= 0 %>"
       editable="<%= true %>"
       label="<%= true %>"
       name="favoriteColor"
/>

那麼action類會自動得到你新加的屬性並更新他們。 其餘大部分的model類也如此,好比Documents, Images, Web content)服務器


儘可能使用擴展而不要覆蓋

假如你須要覆蓋諸如 *Action 類, 那麼你應該繼承來擴展它,而不是在ext中直接修改他,而且在struts-config.xml或liferay-portlet.xml 將相應的action類做替換。好比你須要添加一個叫「Favorite Color」的必填屬性, 你能夠這樣作: app

<struts-config>
    <action-mappings>
        <action path="/login/create_account" type="com.liferay.test.ext.portlet.login.action.TestCreateAccountAction">
            <forward name="portlet.login.create_account" path="portlet.login.create_account" />
        </action>
</struts-config>

public class TestCreateAccountAction extends CreateAccountAction {
    protected void addUser(ActionRequest actionRequest, ActionResponse actionResponse)
        throws Exception {

        Map<String, Serializable> expandoBridgeAttributes =
            PortalUtil.getExpandoBridgeAttributes(
                ExpandoBridgeFactoryUtil.getExpandoBridge(User.class.getName()), actionRequest);

         String favoriteColor = (String)expandoBridgeAttributes.get("favoriteColor");

         if (Validator.isNull(favoriteColor)) {
                throw new RequiredFieldException("favoriteColor", "favoriteColorLabel"); // v6.0/EE specific code           
         }

        super.addUser(actionRequest, actionResponse);  // Don't touch current code to make upgrades painless =)
    }
}


儘可能使用hook插件修改JSP頁面,而不要使用ext插件。關於hook插件的使用,請參閱http://www.liferay.com/community/wiki/-/wiki/Main/Portal+Hook+Pluginsless

好比你可使用buffer的taglib標籤爲建立帳戶的表單作一些修改. 這裏假設咱們須要將移除底部的javascript代碼,將按鈕的文字從"save"改爲"create", 而且添加一個叫"favorite color"的自定義屬性. 咱們能夠在ROOT.war/html/portlet/login/create_account.jsp中添加以下的代碼: jsp

<%@ include file="/html/portlet/login/init.jsp" %>

<liferay-util:buffer var="html">
    <liferay-util:include page="/html/portlet/login/create_account.portal.jsp" />
</liferay-util:buffer>

<liferay-util:buffer var="customHtml">
   <liferay-ui:custom-attribute
        className="com.liferay.portal.model.User"
        classPK="<%= 0 %>"
        editable="<%= true %>"
        label="<%= true %>"
        name="favoriteColor"
    />
</liferay-util:buffer>

<%
int x = html.lastIndexOf("<script type=\"text/javascript\"");

if (x != -1) {
    y = html.indexOf("</script>", x);

    html = html.substring(0, x) + html.substring(y + 9);
}

html = html.replace(LanguageUtil.get(pageContext, "save"), LanguageUtil.get(pageContext, "create"));

x = html.indexOf(LanguageUtil.get(pageContext, "last-name"));

if (x != -1) {
    y = html.indexOf("</div>", x);

    html = html.substring(0, y) + customHtml + html.substring(y);
}
%>

<%= html %>
相關文章
相關標籤/搜索