Как отобразить поля в соответствии со значением в другом
У меня есть один головной убор проблемы, для которой я не могу найти решение.
Я делаю VF-страницу, в которой я хочу отображать поля в соответствии с номером, вставленным пользователем в другие поля. Например, если пользователь вставит 2 в поле "A", он отобразит два поля на одной странице.
// Page
<apex:page standardController="Assure__c" extensions="insEnfant"
standardStylesheets="true">
<apex:sectionHeader title="Ajouter un assuré"
subtitle="{!$User.FirstName}" help="/help/doc/user_ed.jsp?loc=help"></apex:sectionHeader>
<apex:form>
<apex:pageBlock title="Nouveau assuré" id="thePageBlock" mode="edit">
<apex:pageBlockButtons>
<apex:commandButton action="{!save}" value="Enregistrer"></apex:commandButton>
<apex:commandButton action="{!cancel}" value=" Annuler "></apex:commandButton>
</apex:pageBlockButtons>
<apex:pageBlockSection title="General Information" columns="2">
<apex:pageBlockSection id="liste1" columns="1">
<apex:inputField value="{!Assure__c.Civilite__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Nom__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Prenom__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Nom_de_jeune_fille__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Date_de_naissance__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Lieu_de_naissance__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Pays_de_naissance__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Nationalit__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Situation_Familiale__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Numero_de_securit_sociale__c}"></apex:inputField>
</apex:pageBlockSection>
<apex:pageBlockSection id="liste2" columns="1">
<apex:inputField value="{!Assure__c.Telephone_bureau__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Telephone_personnel__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Portable__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Adresse_e_mail__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Adresse__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Code_postal__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Ville__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Pays__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Pays__c}"></apex:inputField>
<apex:pageBlockSectionItem>
<apex:outputLabel value="Nombre d'enfants" />
<apex:outputPanel>
<apex:inputField value="{!Assure__c.Nombre_enfants__c}">
<apex:actionSupport event="onchange" rerender="thePageBlock"
status="statut1" />
</apex:inputField>
<apex:actionStatus startText="Application..." id="statut1" />
</apex:outputPanel>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem>
<apex:outputLabel
value="{!$ObjectType.Assure__c.fields.Etudes_superieures__c.label}" />
<apex:outputPanel>
<apex:inputField value="{!Assure__c.Etudes_superieures__c}">
<apex:actionSupport event="onchange" rerender="thePageBlock"
status="statut2" />
</apex:inputField>
<apex:actionStatus startText="Application..." id="statut2" />
</apex:outputPanel>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem>
<apex:outputLabel value="Service militaire" />
<apex:outputPanel>
<apex:inputField value="{!Assure__c.Service_militaire__c}">
<apex:actionSupport event="onchange" rerender="thePageBlock"
status="statut3" />
</apex:inputField>
<apex:actionStatus startText="Application..." id="statut3" />
</apex:outputPanel>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
</apex:pageBlockSection>
<apex:pageBlockSection
title="Entrez le niveau d'études supérieures atteint" columns="1"
rendered="{!(Assure__c.Etudes_superieures__c)}">
<apex:inputField value="{!Assure__c.Type_etudes__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Diplome_obtenu__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Nombre_annees__c}"></apex:inputField>
</apex:pageBlockSection>
<apex:pageBlockSection
title="Entrez les informations concernant le service militaire"
columns="1" rendered="{!(Assure__c.Service_militaire__c)}">
<apex:inputField value="{!Assure__c.Type_de_service__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Date_de_debut__c}"></apex:inputField>
<apex:inputField value="{!Assure__c.Date_de_fin__c}"></apex:inputField>
</apex:pageBlockSection>
<apex:pageBlockSection title="Liste des enfants" columns="1"
rendered="{!IF(Assure__c.Nombre_enfants__c > 0, true, false)}">
<apex:pageBlockTable value="{!accts}" var="a" id="table">
<apex:facet name="footer">
<apex:commandLink value="Ajouter" action="{!addRow}"
rerender="table,error" />
</apex:facet>
<apex:column headerValue="Nom">
<apex:inputField value="{!a.Name}" />
</apex:column>
<apex:column headerValue="Prénom">
<apex:inputField value="{!a.Prenom__c}" />
</apex:column>
<apex:column headerValue="Né le">
<apex:inputField value="{!a.Date_de_naissance__c}" />
</apex:column>
<apex:column headerValue="Lieu de naissance">
<apex:inputField value="{!a.Lieu_de_naissance__c}" />
</apex:column>
<apex:column headerValue="Situation">
<apex:inputField value="{!a.Situation__c }" />
</apex:column>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageblock>
</apex:form>
</apex:page>
// Controller
public class insEnfant{
public List<Enfants__c> accts {get; set;}
public insererEnfant(){
accts = new List<Enfants__c>();
accts.add(new Enfants__c());
}
public void addrow(){
accts.add(new Enfants__c());
}
public PageReference save(){
insert accts;
PageReference home = new PageReference('/home/home.jsp');
home.setRedirect(true);
return home;
}
}
Кто-нибудь может мне помочь?
Спасибо!!
3 ответа
Одним из решений будет использование перерисовки в сочетании со структурой таблицы. Вам необходимо создать коллекцию (помеченную как "dataCollection" ниже) внутри контроллера. Эта коллекция управляет тем, что отображается и что будет захвачено.
<apex:actionRegion>
<apex:inputField value="{!controllerObject.NumRows__c}">
<apex:actionSupport event="onchange" action="{!refresh}" rerender="dynamicTablePanel"/>
</apex:inputField>
</apex:actionRegion>
<apex:outputPanel id="dynamicTablePanel">
<apex:pageBlockTable id="dynamicTable" value="{!dataCollection}" var="dataRow"
columns="2">
<apex:column headerValue="Column A" title="">
<apex:inputField value="{!dataRow.ColumnA__c}" />
</apex:column>
<apex:column headerValue="Column B" title="">
<apex:inputField value="{!dataRow.ColumnB__c}" />
</apex:column>
</apex:pageBlockTable>
</apex:outputPanel>
Это потребует дополнительной работы в контроллере. Вы должны обработать действие обновления, чтобы добавить или удалить записи коллекции по мере необходимости. Вы также должны обработать кнопку Сохранить; Вы должны сохранить запись контроллера, а также перебрать элементы коллекции и сохранить их где-нибудь. Я предлагаю использовать дочерний объект для коллекции.
Вы смотрите на основе ввода в одном поле, вы разрешаете / запрещаете отображение других полей?
Вы можете иметь все поля, которые вы хотите отобразить, и контролировать видимость этого поля, используя визуализированный тег.
<apex:outputField value="{!item.field1__c}" >
<apex:actionSupport event="onchange" action="{!displayOtherCols}" rerender="mainBlock2"/>
</apex:outputField>
<apex:column headerValue="Name" >
<apex:outputField value="{!item.field2__c}" rendered="{!(item.field1__c == 'option1')}" />
<apex:outputField value="{!item.field3__c}" rendered="{!(item.field1__c == 'option2')}" />
</apex:column>
Вы можете использовать actionsupport для вызова метода, который будет обрабатывать и устанавливать, какие поля должны быть обработаны. В этом примере я непосредственно проверяю значение поля, вы можете сделать это или установить значение логической переменной в методе displayothercols и использовать эту переменную для визуализации полей. убедитесь, что вы изменили блок.
в этом примере, если field1 имеет "option1", тогда отображается другое поле field2, а если field1 - "option2", то field3 отображается
Надеюсь это поможет..
удачи
Если вы хотите динамически добавлять Html, я думаю, что вы должны использовать Javascript или Javascript Framework, например JQuery, но я не могу получить то, что вы намерены делать.
Пожалуйста, будьте более конкретны. Какой тип полей вы хотите добавить? Эти поля ввода? или будут выходные поля? Можете ли вы знать заранее информацию для отображения?
Может быть, вы можете использовать компонент Apex и перерисовать его, выполнив запрос JavaScript.