2014-09-03 3 views
2

Ну. Я создал пользовательский компонент для CRUD, а страница формы - это параметр. В этом случае мне нужны две страницы, одна для определения компонента, а другая - с формой.Объявить разметку вне cc: реализация и позволить cc: реализация включить его

Есть ли способ сделать это?

следующим образом:

Реализация:

Компонент

<cc:interface> 
    <cc:attribute name="formPage" type="java.lang.String" required="true"/> 
    ..... 
</cc:interface> 

<cc:implementation> 
... 
    <h:form id="form-crud"> 
     <ui:include src="#{cc.attrs.formPage}" />  
    </h:form> 
... 
</cc:implementation> 

Page 1: crud.xhtml

<ui:define name="content-template" > 
    <comp:crud 
     paginaForm="crud-form.xhtml" /> 
</ui:define> 

Page 2: падла-form.xhtml

<html ... 
    <p:panelGrid id="grid-crud" columns="2" > 
     <h:outputLabel for="dsName" value="Name: " /> 
     <p:inputText id="dsName" value="#{crudBean.dsName}"/> 
    </p:panelGrid> 
</html> 

Новая реализация (образец)

Для упрощения, я хотел бы иметь компонент defnition и форму на той же странице, что-то вроде этого , Является ли это возможным? Я знаю, что могу использовать шаблон, но пользовательский компонент имеет больше атрибутов.

Новый компонент

<cc:implementation> 
... 
    <h:form id="form-crud"> 
     <XX:SOMETING name="#{cc.attrs.formContent}" />  
    </h:form> 
... 
</cc:implementation> 

New Page 1: новый-crud.xhtml

... 
<ui:define name="content-template" > 
    <comp:crud 
     form="new-form" /> 

    <XX:SOMETING id="new-form"> 

     <p:panelGrid id="grid-crud" columns="2" > 
      <h:outputLabel for="dsName" value="Name: " /> 
      <p:inputText id="dsName" value="#{crudBean.dsName}"/> 
     </p:panelGrid> 

    </XX:SOMETING> 

</ui:define> 
... 
+0

Это второй раз, когда я исправил терминологическую ошибку в вашем вопросе. Это не пользовательские компоненты. Это составные компоненты. Чтобы узнать разницу, см. Http://stackoverflow.com/questions/6822000/when-to-use-uiinclude-tag-files-composite-components-and-or-custom-componen – BalusC

+0

ok @BalusC, полученный отзыв! Я обращу внимание на это! –

ответ

2

Вы можете использовать <f:facet> так же, как в те работы с, например, <h:dataTable>/<h:column> header/footer.

Сначала объявить <cc:facet> с желаемым именем:

<cc:interface> 
    <cc:facet name="form" /> 
</cc:interface> 

Затем объявить <cc:renderFacet> в нужном месте, где она должна в конечном итоге:

<cc:implementation> 
    ... 
    <h:form> 
     <cc:renderFacet name="form" /> 
    </h:form> 
    ... 
</cc:implementation> 

Теперь вы можете использовать его следующим образом:

<comp:crud> 
    <f:facet name="form"> 
     ... 
    </f:facet> 
</comp:crud> 

Обратите внимание, что эта конструкция также возможно с помощью «plain vanilla» Facelets tagfiles через <ui:define>/<ui:insert> механизмов.