Иметь командную кнопку как часть выходного текста

У меня есть объекты класса-оболочки в списке, и на моей странице Vf я проверяю, содержит ли объект оболочки значение null, если оно имеет значение null, то я показываю «Свободно», иначе отображаю детали встречи.

Я хочу, чтобы кнопка создавала встречу вместо «Бесплатно».

Как правильно вставить код кнопки?

<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>   

EDIT : Before i read the answers from mmmix and LaceySnr i implemented with use of css classes. not sure if this is the best way. But now the issue is of the param value not coming up on the controller method.

<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;
}

person Prady    schedule 15.02.2012    source источник


Ответы (2)


Не уверен, что понимаю, что такое кнопка, но у вас также есть альтернативный способ сделать !IF, например:

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

Если для кнопки вы думаете о вставке apex:commands в повторитель и привязке обработчика событий к определенной строке, это можно сделать с помощью параметров

например, я использовал это для создания ссылки на команду в каждой строке таблицы:

<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')

Кроме того, если вы хотите иметь рендеринг текста/кнопки if/then/else внутри тега td, вы можете использовать это

<td>
    <apex:outputText .... rendered="{!condition"} />
    <apex:commandButton .... rendered="{!NOT(condition)"} />
</td>
person mmix    schedule 15.02.2012
comment
спасибо mmix .. но это решение будет создавать командную ссылку в каждой строке. если хотите показать только тогда, когда slot.sAppointment имеет значение null. Я также попытался добавить параметр к командной кнопке. Но я не могу зафиксировать значение параметра в контроллере... он возвращает ноль. Обновил вопрос. - person Prady; 15.02.2012
comment
извините .. я понял, что вы имели в виду под использованием рендеринга для получения условного отображения. Спасибо за совет - person Prady; 15.02.2012
comment
у вас также есть атрибут rendered в commandButton, вам не нужно играть со стилями, чтобы скрыть кнопку. - person mmix; 15.02.2012
comment
Спасибо, mmix, я бы изменил код, чтобы использовать отображаемый атрибут. Любая идея о том, что вызывает то, что параметр не передается методу контроллера? - person Prady; 15.02.2012
comment
Это строковое значение в списке liTimeSlots, который является списком класса-оболочки. я использую это в моем первом TD. который отображается правильно - person Prady; 15.02.2012
comment
давайте продолжим это обсуждение в чате - person Prady; 15.02.2012
comment
mmix, ваше предложение по ререндеру помогло.. огромное спасибо - person Prady; 15.02.2012

Я бы предложил просто использовать другой механизм для управления условным рендерингом. <apex:variable> хорошо подходит для этого, несмотря на то, что он специально не предназначен для этой цели, например, вы можете изменить:

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

to:

<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.

person Matt Lacey    schedule 15.02.2012
comment
вау .. это здорово ... Я получил результат, аналогичный тому, что мне нужно, используя css. вы бы порекомендовали использовать этот метод или css? Я предполагаю, что это будет быстрее при рендеринге... не уверен в обработке - person Prady; 15.02.2012
comment
избегайте использования css, чтобы скрыть/показать вещи вершины. команды так и так, однако, если у вас есть скрытое обязательное поле ввода, оно не удалит его из проверки проверки. - person mmix; 15.02.2012
comment
Как говорит @mmix, я бы по возможности избегал использования CSS/Javascript. Это означает, что все, что должно быть перенесено в состояние просмотра, будет перенесено. - person Matt Lacey; 15.02.2012
comment
@LaceySnr - разве использование outputPanel с layout=none не является немного более правильным подходом? - person jkraybill; 20.02.2012
comment
@jkraybill Я так думаю, но я сначала узнал о var, поэтому, как правило, это тот, который приходит на ум :) - person Matt Lacey; 20.02.2012