O que é um Wrapper no Salesforce?
Published: 2024-06-06 18:11:48

Em Salesforce, um "Wrapper" é um padrão de design de programação usado para agrupar um conjunto de dados ou objetos diferentes em uma única unidade lógica. Este padrão é especialmente útil quando você deseja manipular e exibir um conjunto de informações em uma interface de usuário de maneira coesa. Vamos detalhar mais sobre o conceito de Wrapper e seus usos:

### Definição
Um Wrapper é uma classe personalizada em Apex que contém outras variáveis e objetos, geralmente encapsulando várias propriedades e métodos relacionados. Ele permite que você trate um conjunto de informações relacionadas como uma única unidade, facilitando a manipulação de dados complexos em componentes visuais, como Visualforce pages ou Lightning components.

### Usos Comuns de Wrappers

1. **Agrupamento de Dados**:
   - Wrappers são frequentemente usados para agrupar dados de diferentes origens. Por exemplo, você pode ter uma classe Wrapper que agrupa informações de contas e contatos para serem exibidas juntas.

2. **Manipulação de Interfaces Complexas**:
   - Em Visualforce pages ou Lightning components, Wrappers são úteis para gerenciar listas de registros com funcionalidades adicionais, como seleção múltipla, ações específicas por linha, ou agrupamento de informações.

3. **Passagem de Dados em Métodos**:
   - Wrappers facilitam a passagem de dados complexos entre métodos, encapsulando múltiplos parâmetros em uma única estrutura de dados.

### Exemplo de Uso de Wrapper

Aqui está um exemplo básico de como você pode definir e usar um Wrapper em Apex:

```apex
public class AccountContactWrapper {
    public Account account { get; set; }
    public List<Contact> contacts { get; set; }
    public Boolean isSelected { get; set; }

    public AccountContactWrapper(Account account, List<Contact> contacts) {
        this.account = account;
        this.contacts = contacts;
        this.isSelected = false;  // Padrão para não selecionado
    }
}
```

### Exemplo de Uso em Visualforce Page

Vamos supor que você queira exibir uma lista de contas com seus contatos em uma Visualforce page, permitindo que o usuário selecione várias contas:

```apex
public with sharing class AccountController {
    public List<AccountContactWrapper> accountWrapperList { get; set; }

    public AccountController() {
        accountWrapperList = new List<AccountContactWrapper>();
        List<Account> accounts = [SELECT Id, Name FROM Account LIMIT 10];
        for(Account acc : accounts) {
            List<Contact> contacts = [SELECT Id, Name FROM Contact WHERE AccountId = :acc.Id];
            accountWrapperList.add(new AccountContactWrapper(acc, contacts));
        }
    }

    public void processSelectedAccounts() {
        for(AccountContactWrapper wrapper : accountWrapperList) {
            if(wrapper.isSelected) {
                // Processar a conta selecionada
            }
        }
    }
}
```

E a correspondente Visualforce page pode ser:

```html
<apex:page controller="AccountController">
    <apex:form>
        <apex:pageBlock title="Accounts and Contacts">
            <apex:pageBlockTable value="{!accountWrapperList}" var="wrapper">
                <apex:column>
                    <apex:inputCheckbox value="{!wrapper.isSelected}"/>
                </apex:column>
                <apex:column value="{!wrapper.account.Name}" headerValue="Account Name"/>
                <apex:column>
                    <apex:repeat value="{!wrapper.contacts}" var="contact">
                        {!contact.Name}<br/>
                    </apex:repeat>
                </apex:column>
            </apex:pageBlockTable>
            <apex:commandButton value="Process Selected" action="{!processSelectedAccounts}"/>
        </apex:pageBlock>
    </apex:form>
</apex:page>
```

### Benefícios de Usar Wrappers

- **Organização**: Facilita a organização e manipulação de dados complexos em estruturas claras e lógicas.
- **Reutilização**: Encapsula lógica comum em uma única classe, facilitando a reutilização e manutenção do código.
- **Flexibilidade**: Permite manipular e exibir dados de diferentes maneiras sem alterar a estrutura subjacente dos objetos Salesforce.

Em resumo, Wrappers são uma ferramenta poderosa no arsenal de um desenvolvedor Salesforce, permitindo a criação de interfaces de usuário ricas e interativas, bem como a manipulação eficiente de dados complexos.