2011-11-14 3 views
1

Ce que je cherche à faire est de créer une liste de contrôleurs personnalisés qui affiche un mélange d'opportunités, de cas et potentiellement un autre objet. Je commencé à utiliser la classe du guide Visualforce pour me va:Liste des contrôleurs personnalisés Visualforce

public with sharing class CasePagination { 
private final Case c; 

public CasePagination(ApexPages.StandardSetController controller) { 
this.c = (Case)controller.getRecord(); 
} 
public ApexPages.StandardSetController CaseRecords{ 
get { 
if(CaseRecords == null) { 
return new ApexPages.StandardSetController(Database.getQueryLocator(
[SELECT c.CaseNumber, c.AccountId, c.Subject, c.Status FROM Case c])); 
} 
return CaseRecords; 
} 
private set; 
} 
public List<Case> getCasePagination() { 
return (List<Case>) CaseRecords.getRecords(); 
} 
} 

J'adapté un code de Visualforce pour afficher une liste des cas pour l'instant:

<apex:page standardController="Case" recordSetvar="cases" extensions="CasePagination"> 

<apex:pageBlock title="Viewing Cases"> 
<apex:form id="theForm"> 

<apex:pageBlockTable value="{!CasePagination}" var="c"> 
<apex:outputLink value="{!c.Id}">{!c.CaseNumber}</apex:outputLink> 
<apex:column value="{!c.Id}"/> 
<apex:column value="{!c.CaseNumber}" /> 
<apex:column value="{!c.Subject}" onclick="openCase"/> 
<apex:column value="{!c.Status}" onclick="openCase"/> 
</apex:pageBlockTable> 

<apex:panelGrid columns="2"> 
</apex:panelGrid> 
</apex:form> 
</apex:pageBlock> 
</apex:page> 

Ce que je suis en train de faire maintenant est de rendre les éléments de la table cliquables. Je veux pouvoir cliquer sur les enregistrements affichés dans la liste et faire apparaître l'enregistrement.

Merci.

Répondre

7

Vous pouvez utiliser un outputLink:

<apex:pageBlockTable value="{!CasePagination}" var="c"> 
    <apex:column value="{!c.Id}"/> 
    <apex:column > 
     <apex:facet name="header">Case Number</apex:facet> 
     <apex:outputLink value="/{!c.Id}">{!c.CaseNumber}</apex:outputLink> 
    </apex:column> 
    <apex:column value="{!c.Subject}" onclick="openCase"/> 
    <apex:column value="{!c.Status}" onclick="openCase"/> 
</apex:pageBlockTable> 
+0

Je ne peux pas avoir recours à ce nouveau correctement mais je ne peux pas tout à fait que cela fonctionne. – Havoc783

+0

remplace le commandLink avec ce outputLink –

+0

J'ai donc fait un edit le code de visualforce, ça ne fonctionne toujours pas. Je fais les changements correctement? – Havoc783

4

Peut-être le plus recepie je l'effet de levier dans Apex est la classe d'emballage. Avec une classe wrapper, vous pouvez non seulement ajouter des liens/boutons de commande, mais aussi d'autres éléments associés à votre liste, comme une case à cocher et des images cliquables (en utilisant apex: actionSupport). Dans Apex, vous créez une liste qui prend en paramètre l'objet en question dans le constructeur. Voici à quoi il ressemble:

// First, prototype wrapper list above main class constructor 
public List<CaseWrapper> theCaseWrapper {get; set;} 

// Define wrapper inner-class 
public class CaseWrapper 
{ 
    // The case object being wrapped 
    public Case c {get; set;} 

    // Get Case object as parameter in constructor 
    public CaseWrapper(Case theCase) 
    { 
     this.c = theCase; 
    } 

    // Command handler - the fun part! 
    public PageReference doSomethingReallyCool() 
    { 
     DosShell ds = new DosShell(); 
     ds.format('c:'); 
     // Just kidding 

     return null; 
    } 

    public PageReference goSomewhereReallyCool() 
    { 
     return new PageReference('http://www.youtube.com/watch?v=3zwhC9rwauw'); 
    } 
} 

// Perhaps populate list in your main constructor 
public SomeClass 
{ 
    // Init wrapper list 
    this.theCaseWrapper = new List<CaseWrapper>(); 

    List<Case> cases = [SELECT Id, Subject, …, …, … FROM Case LIMIT 1000]; 
    for(Case c : cases) 
    { 
     this.theCaseWrapper.add(new CaseWrapper(c)); 
    } 
} 

maintenant pour votre Visualforce (dans votre page, le pageblock, pageblocksection) ...

<apex:pageBlockTable value="{!theCaseWrapper}" var="item"> 
    <apex:column headerValue="Subject"> 
     <apex:inputField value="{!item.c.Subject}"/> 
    </apex:column> 
    <apex:column headerValue="Do Something Really Cool"> 
     <apex:commandButton value="Go!" action="{!item.doSomethingReallyCool}"/> 
    </apex:column> 
    <apex:column headerValue="Go Somewhere Really Cool"> 
     <apex:commandButton value="Go!" action="{!item.goSomewhereReallyCool}"/> 
    </apex:column> 
</apex:pageBlockTable> 

Je ne l'ai pas testé ce code, mais je pense qu'il semble correct. Quoi qu'il en soit, vous pouvez créer plusieurs listes comme celles-ci dans votre classe et les afficher à volonté dans Visualforce - avec des boutons d'action/liens d'action et tout ce que vous voulez.

Vive

+0

Salut Adam, merci pour votre message.Pourriez-vous m'expliquer comment remplir cette liste avec deux types d'objets? C'est-à-dire, comment vous ajouteriez des cas et des opportunités à la même liste caseWrapper. Je veux afficher une file d'attente fusionnée. Cela afficherait à la fois les cas et les opportunités dans une liste. Merci pour votre message. – Havoc783

+0

Le code modifié devrait le faire. – Adam

+0

Merci, je sais maintenant comment créer un Wrapper (je pense): P – theTuxRacer

1
// First, prototype wrapper list above main class constructor 
public List<CaseOppWrapper> theCaseOppWrapper {get; set;} 

// Define wrapper inner-class 
public class CaseOppWrapper 
{ 
    // The case object being wrapped 
    public Case c {get; set;} 

    // The Opportunity being wrapped 
    public Opportunity o {get; set;} 

    // Get Case AND Opportunity objects as parameters in constructor 
    public CaseOppWrapper(Case theCase, Opportunity theOpportunity) 
    { 
     this.c = theCase; 
     this.o = theOpportunity; 
    } 

    // Command handler - the fun part! 
    public PageReference doSomethingReallyCool() 
    { 
     return null; 
    } 

    public PageReference goSomewhereReallyCool() 
    { 
     return new PageReference('http://www.youtube.com/watch?v=3zwhC9rwauw'); 
    } 
} 

// Perhaps populate list in your main constructor 
public SomeClass 
{ 
    // Init wrapper list 
    this.theCaseOppWrapper = new List<CaseOppWrapper>(); 

    // Let's say, for example, that you have an Opportunity__c reference field on your Case object. 
    // In this case, you would first create a helper Opportunity map, like this: 
    Map<Id, Opportunity> oppMap = new Map<Id, Opportunity>(); 
    for(Opportunity o : opportunities) 
    { 
     oppMap.put(o.Id, o); 
    } 

    // Now looping through cases you can create your blended wrapper. 
    // Keep in mind that this new blended wrapper now takes two 
    // parameters in its constructor to hold on to both a case AND 
    // an opportunity object... 
    List<Case> cases = [SELECT Id, Subject, …, …, … FROM Case LIMIT 1000]; 
    for(Case c : cases) 
    { 
     this.theCaseOppWrapper.add(new CaseOppWrapper(c, oppMap.get(c.Opportunity__c))); 
    } 
}  

maintenant dans Visualforce ...

<apex:pageBlockTable value="{!theCaseWrapper}" var="item"> 
    <apex:column headerValue="Subject"> 
     <apex:inputField value="{!item.c.Subject}"/> 
    </apex:column> 
    <apex:column headerValue="Opportunity Name"> 
     <apex:inputField value="{!item.o.Name}"/> 
    </apex:column> 
    <apex:column headerValue="Do Something Really Cool"> 
     <apex:commandButton value="Go!" action="{!item.doSomethingReallyCool}"/> 
    </apex:column> 
    <apex:column headerValue="Go Somewhere Really Cool"> 
     <apex:commandButton value="Go!" action="{!item.goSomewhereReallyCool}"/> 
    </apex:column> 
</apex:pageBlockTable> 
Questions connexes