Список пользовательских контроллеров Visualforce - PullRequest
2 голосов
/ 15 ноября 2011

То, что я хочу сделать, это создать собственный список контроллеров, который отображает множество возможностей, случаев и, возможно, еще одного объекта. Я начал использовать класс из руководства 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();
}
}

Я адаптировал некоторый код Visualforce для отображения списка дел на данный момент:

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

То, что я сейчас пытаюсь сделать, это сделать элементы в таблице активируемыми. Я хочу, чтобы можно было щелкать записи, отображаемые в списке, и открывать их.

Спасибо.

Ответы [ 3 ]

8 голосов
/ 15 ноября 2011

Вы можете использовать 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>
5 голосов
/ 15 ноября 2011

Возможно, получателем, которого я больше всего использую в Apex, является класс-оболочка.С помощью класса-оболочки вы можете добавлять в список не только ссылки / кнопки команд, но и любые другие связанные элементы, которые могут пригодиться позже, такие как флажки и изображения, учитывающие щелчки (с помощью apex: actionSupport).В Apex вы создаете список, который принимает рассматриваемый объект в качестве параметра в конструкторе.Вот как это выглядит:

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

Теперь для вашего Visualforce (внутри вашей страницы, формы, блока страницы, блока страницы)…

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

Я не тестировал этот код, но думаю,это выглядит правильно.В любом случае, вы можете создать несколько списков, подобных этим, в своем классе и визуализировать их по своему желанию в Visualforce - в комплекте с кнопками действий / ссылками действий и всем остальным, что вы хотите.

Приветствия

2 голосов
/ 29 ноября 2011
// 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)));
    }
}    

Теперь в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...