将命令按钮作为输出文本的一部分

时间:2012-02-15 09:01:54

标签: salesforce apex-code visualforce

我在列表中有包装类的对象,在我的Vf页面中,我正在检查包装器的对象是否包含null,如果它有null,那么我显示“Free”,否则显示约会详细信息。

我想要一个按钮创建约会而不是'免费'。

插入按钮代码的正确方法是什么?

<apex:repeat var="slot" value="{!liTimeSlots}">

<tr class="{!IF(ISNULL(slot.sAppointment), 'Free', 'Fill')}">
    <td ><apex:outputText value="{!slot.tstart1}"/></td>

      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointment), 'Free', slot.sAppointment.name)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointment), '', slot.sAppointment.Appointment_Type__c)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointment), '', slot.sAppointment.Patient__c)}"/></td>
        </tr> 
    <tr>
    <td></td>

      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointmentOverlap), ' ', slot.sAppointmentOverlap.name)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointmentOverlap), '', slot.sAppointmentOverlap.Appointment_Type__c)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointmentOverlap), '', slot.sAppointmentOverlap.Patient__c)}"/></td>
        </tr>   

编辑: 在我阅读mmmix和LaceySnr的答案之前,我使用了css类来实现。不确定这是不是最好的方法。但现在问题在于控制器方法没有提出参数值。

<apex:repeat var="slot" value="{!liTimeSlots}">

<tr class="{!IF(ISNULL(slot.sAppointment), 'Free', 'Fill')}">
    <td ><apex:outputText value="{!slot.tstart1}"/></td>

      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointment), 'Free', slot.sAppointment.name)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointment), '', slot.sAppointment.Appointment_Type__c)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointment), '', slot.sAppointment.Patient__c)}"/></td>
      <td><div Class="{!IF(ISNULL(slot.sAppointment), 'ShowButton', 'HideButton')}">
      <apex:commandButton action="{!Book}" Value="Book">
      <apex:param name="Timev" value="{!slot.tstart1}"/></apex:commandButton></div></td>
        </tr> 
    <tr>
    <td></td>

      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointmentOverlap), ' ', slot.sAppointmentOverlap.name)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointmentOverlap), '', slot.sAppointmentOverlap.Appointment_Type__c)}"/></td>
      <td><apex:outputText value="{!IF(ISNULL(slot.sAppointmentOverlap), '', slot.sAppointmentOverlap.Patient__c)}"/></td>
        </tr>   

public  PageReference Book()
{
String Timeval=ApexPages.CurrentPage().getParameters().get('Timev');
system.debug('timeval +++++++++++++++'+Timeval) ;// This is returning null
pr=Page.Appointment;
pr.setRedirect(true);
pr.getParameters().put('App_start',Timeval);
pr.getParameters().put('App_start_Date',string.valueof(Appointment.Start_Date__c));

return pr;
}

2 个答案:

答案 0 :(得分:1)

我建议只使用另一种机制来控制条件渲染。 <apex:variable>虽然没有明确地为此目的而设计,但也适用于此,例如,您可以更改:

<td><apex:outputText value="{!IF(ISNULL(slot.sAppointment), 'Free', slot.sAppointment.name)}"/></td>

为:

<apex:variable var="v" value="" rendered="{!IF(ISNULL(slot.sAppointment), true, false)}">
    <td><apex:commandButton action="{!someAction} value="Do This!"/></td>
</apex:variable>
<apex:variable var="v" value="" rendered="{!IF(ISNULL(slot.sAppointment), false, true)}">
    <td><apex:outputText value="{!slot.sAppointment.name}"/></td>
</apex:variable>

显然,在这种情况下,它生成了更多的代码,但是看看其余部分,我认为你可以(使用上下文)将其进一步简化为仅使用其中一些标记和更少的rendered属性。

答案 1 :(得分:1)

我不确定我是否了解按钮的内容,但您还有另一种方法!例如:IF,

<apex:outputText value="{!field}" rendered="{!condition"} />

如果对于按钮,您正在考虑将apex:命令插入到转发器中并将事件处理程序绑定到特定行,这可以通过参数来完成

例如我用它来在每个表行中创建一个comamnd链接:

<apex:column headerValue="Action">
    <apex:commandLink id="cmdDetachService" action="{!detachService}" value="Detach" rerender="mainBlock, errors" status="ajaxPostStatus" >
        <apex:param value="{!item.id}" name="activeService" />
    </apex:commandLink>
</apex:column>

然后在事件处理程序中,您可以从页面参数中提取参数,例如ApexPages.CurrentPage().getParameters().get('activeService')

另外,如果你想在td标签内有if / then / else文本/按钮渲染,你可以使用这个

<td>
    <apex:outputText .... rendered="{!condition"} />
    <apex:commandButton .... rendered="{!NOT(condition)"} />
</td>