Development

Documentation/pt_BR/forms_in_action/1.2/01-Validacao-de-Formulario (diff)

You must first sign up to be able to contribute.

Changes between Version 1 and Version 2 of Documentation/pt_BR/forms_in_action/1.2/01-Validacao-de-Formulario

Show
Ignore:
Author:
raphox (IP: 189.27.72.208)
Timestamp:
03/24/09 02:20:40 (8 years ago)
Comment:

correção ortográfica

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/pt_BR/forms_in_action/1.2/01-Validacao-de-Formulario

    v1 v2  
    1010--------------- 
    1111 
    12 O formulário de contato no capítulo 1 não é completamente funcional ainda. O que acontece se um usuário submite um endereço de email inválido or se a mensagem que submetida for vazia? Neste caso, nos gostariamos de mostrar mensagens de erro para requer ao usuário a entrada correta, como mostar a Figura 2-1. 
     12O formulário de contato no capítulo 1 não é completamente funcional ainda. O que acontece se um usuário submite um endereço de email inválido or se a mensagem que submetida for vazia? Neste caso, nos gostaríamos de mostrar mensagens de erro para requerer ao usuário a entrada correta, como mostra a Figura 2-1. 
    1313 
    1414Figura 2-1 - Exibindo mensagens de erro. 
    2424 
    2525>**Note** 
    26 >Porque nś precisamos validar o campo 'subject'? A tag `<select>` já esta limitando o usuário com valores pré-definidos. Uma parte dos usuários poem apenas uma das opções exibidas, mas outros valores podem ser submetdios utilizando ferramentas com o Firefox Developer Toolbar, ou através da simulação de um pedido com ferramentas como 'curl' ou 'wget'. 
     26>Porque nós precisamos validar o campo 'subject'? A tag `<select>` já esta limitando o usuário com valores pré-definidos. Uma parte dos usuários poem apenas uma das opções exibidas, mas outros valores podem ser submetidos utilizando ferramentas com o Firefox Developer Toolbar, ou através da simulação de um pedido com ferramentas como 'curl' ou 'wget'. 
    2727 
    2828Listagem 2-1 mostra a template que usamos no capítulo 1. 
    4949![Interaction between the Application and the User](/images/forms_book/en/02_02.png "Interaction between the Application and the User") 
    5050 
    51 Validaddores 
     51Validadores 
    5252---------- 
    5353 
    54 Um formulário Symfony é foramdo de campos. Cada campo po ser indenficado por um nomem único com nós oberservamos no capítulo 1. Nós conectamos um widget para cada campo na ordem de amostragem para o usuário, agora vamos ver como nós pode aplicar regras de validação para cada um dos campos. 
     54Um formulário Symfony é formado de campos. Cada campo pode ser idenficado por um nome único com nós observamos no capítulo 1. Nós conectamos um widget para cada campo na ordem de amostragem para o usuário, agora vamos ver como nós pode aplicar regras de validação para cada um dos campos. 
    5555 
    5656### A classe `sfValidatorBase` 
    5757 
    58 A validação de cada campo é feita por objetos herdados da classe 'sfValidatorBase'. Na ordem de validação do formulário de contato, nós devemos definir objetos de validação para cada um dos quatro campos: 'name', 'email', 'subjetc' e 'message'. Listagem 2-2 mostra a implementado destes validadores na classe do formulário utilizando o método 'setValidators()'. 
     58A validação de cada campo é feita por objetos herdados da classe 'sfValidatorBase'. Na ordem de validação do formulário de contato, nós devemos definir objetos de validação para cada um dos quatro campos: 'name', 'email', 'subjetc' e 'message'. Listagem 2-2 mostra a implementação destes validadores na classe do formulário utilizando o método 'setValidators()'. 
    5959 
    6060Listagem 2-2 - Adicionando validadores para classe 'ContactForm' 
    9191  * `sfValidatorChoice`: valida a valor de entrada vindo de uma lista pré-definida de opções 
    9292 
    93 Cada validador recebe uma lista de opções como primeior argumento. Como os widgets, alguns destas opções são obrigatórias, outras não. Por exemplo, o validador 'sfValidatorChoice' recebe uma opção obrigatória, 'choices' (escolhas). Cada validador pode também receber as opções 'required' (requerido) e 'trim' (preparo), defindos por padrão na classe 'sfValidaroBase': 
     93Cada validador recebe uma lista de opções como primeiro argumento. Como os widgets, algumas destas opções são obrigatórias, outras não. Por exemplo, o validador 'sfValidatorChoice' recebe uma opção obrigatória, 'choices' (escolhas). Cada validador pode também receber as opções 'required' (requerido) e 'trim' (preparo), definidos por padrão na classe 'sfValidaroBase': 
    9494 
    9595  | **Opção**  | **Valor Padrão** | **Descrição** 
    9696  | ----------- | ----------------- | --------------- 
    9797  | required    | `true`            | Especifica se o campo é obrigatório 
    98   | trim        | `false`           | Remove automáticamente espaços em branco no iníco e no final da string antes de ser feita a validação. 
    99  
    100 Vamos ver as opções disponíveis para os validores que acabamos de utilizar. 
     98  | trim        | `false`           | Remove automaticamente espaços em branco no início e no final da string antes de ser feita a validação. 
     99 
     100Vamos ver as opções disponíveis para os validadores que acabamos de utilizar. 
    101101 
    102102  | **Validador**     | **Opções obrigatórias** | **Opções opcionais** | 
    107107  | sfValidatorChoice | `choices`             |                      | 
    108108 
    109 Se você tentar submeter o formulário com valores inválidos, você não ver nenhuma mudança no comportamento. Nós devemos atualizar o modulo 'contact' para validar os valores submetidos, como mostra a listagem 2-3. 
     109Se você tentar submeter o formulário com valores inválidos, você não vai ver nenhuma mudança no comportamento. Nós devemos atualizar o modulo 'contact' para validar os valores submetidos, como mostra a listagem 2-3. 
    110110 
    111111Listagem 2-3 - Implementado Validação no Modulo 'contact' 
    133133    } 
    134134 
    135 A listagem 2-3 introduz você a muitos novos conceitos: 
    136  
    137   * No caso da requisição 'GET', o formulário é inicializado e passado à template para ser excibido ao usuário. O formulário esta entaão em um **estado inicial**: 
     135A listagem 2-3 introduz você a vários conceitos novos: 
     136 
     137  * No caso da requisição 'GET', o formulário é inicializado e passado à template para ser exibido ao usuário. O formulário esta então em um **estado inicial**: 
    138138 
    139139        [php] 
    140140        $this->form = new ContactForm(); 
    141141 
    142   * Quando o usuário submete o formulário com uma requisição 'POST', o method 'bind()' junta o formulário com os dados de entrada do usuário e dispara o mecanismod de validação. O formulário então muda para um **estado de 'bound' (intermediário)** 
     142  * Quando o usuário submete o formulário com uma requisição 'POST', o method 'bind()' junta o formulário com os dados de entrada do usuário e dispara o mecanismo de validação. O formulário então muda para um **estado de 'bound' (intermediário)** 
    143143 
    144144        [php] 
    149149  * Uma fez o formulário em estado intermediário, é possível checar a validade utilizando o método 'isValid()': 
    150150 
    151       * Se o retorn for 'true':, o formulário é valido e o usuário pode ser redirecionado para página de agradecimentos. 
     151      * Se o retorno for 'true':, o formulário é valido e o usuário pode ser redirecionado para página de agradecimentos. 
    152152 
    153153            [php] 
    160160 
    161161>**Note** 
    162 >Quando um formulário está em um estado inicial, o método 'isValid()' sempres retorna 'false' e o método 'getValues()' sempre retornará um array vazio. 
     162>Quando um formulário está em um estado inicial, o método 'isValid()' sempre retorna 'false' e o método 'getValues()' sempre retornará um array vazio. 
    163163 
    164164A Figura 2-3 mostra o código que é executado durante a interação entre a aplicação e o usuário. 
    165165 
    166 Figura 2-3 - Código executado durante a interação entre a aplicacao e o usuário 
     166Figura 2-3 - Código executado durante a interação entre a aplicação e o usuário 
    167167 
    168168![Code executed during the Interaction between the Application and the User](/images/forms_book/en/02_03.png "Code executed during the Interaction between the Application and the User") 
    176176O processo de limpeza tem duas principais ações: **normalização** and **conversão** dos dados de entrada. 
    177177 
    178 Nos já vimos um caso de normalização com a opção 'trim'. Mas a ação de normalização é muito mais importante para um campo de data por exemplo. O `sfValidatorDate` valida uma data. Este validador recebe muitos formatos de entrada (um timestam, um formato baseado em expressão regular, ...) Ao em vez de simplismente devolver o valor de entrada, ele converte para um formato padrão na forma de 'Y-m-d H:i:s'. Por esta razão, o desenvolvedor está garantido de receber formatos stáveis, apesar da qualidade do formato de entrada. O sistema oferece muita flexibilidade para o usuário, and assegura consistencia para o desenvolvedor. 
    179  
    180 Agora considere uma ação de conversão, como um upload de arquivo. Uma validação de arquivo pode ser feita utilizando o 'sfValidaorFile'. Uma vez o arquivo carregado, em vez de retornar o nome do arquivo, o validador retorna um objeto 'sfVAlidatedFile', tornando mais fácil lidar com as informações do arquivo. Nós veremos depois neste capítulo com utilizar este validador. 
     178Nos já vimos um caso de normalização com a opção 'trim'. Mas a ação de normalização é muito mais importante para um campo de data por exemplo. O `sfValidatorDate` valida uma data. Este validador recebe muitos formatos de entrada (um timestamp, um formato baseado em expressão regular, ...) Ao em vez de simplesmente devolver o valor de entrada, ele converte para um formato padrão na forma de 'Y-m-d H:i:s'. Por esta razão, o desenvolvedor está garantido de receber formatos estáveis, apesar da qualidade do formato de entrada. O sistema oferece muita flexibilidade para o usuário, e assegura consistência para o desenvolvedor. 
     179 
     180Agora considere uma ação de conversão, como um upload de arquivo. Uma validação de arquivo pode ser feita utilizando o 'sfValidatorFile'. Uma vez o arquivo carregado, em vez de retornar o nome do arquivo, o validador retorna um objeto 'sfVAlidatedFile', tornando mais fácil lidar com as informações do arquivo. Nós veremos depois neste capítulo com utilizar este validador. 
    181181 
    182182>**Tip** 
    183 >O método `getValues()` retor um array com todos os dados validados e limpos. Mas como as vezes é útil recuperar apenas um valor, há também method 'getValue()': $email = $this->form->getValue('email'). 
     183>O método `getValues()` retor um array com todos os dados validados e limpos. Mas como as vezes é útil recuperar apenas um valor, há também o método 'getValue()': $email = $this->form->getValue('email'). 
    184184 
    185185### Formulário inválido 
    191191![Invalid Form](/images/forms_book/en/02_04.png "Invalid Form") 
    192192 
    193 A chamada para declaração '<?php echo $form ?>' leva automicamente em consideração as mensagens de erros associados ao campos, e preencherá automáticamento os dados limpos da entrada do usuário. 
    194  
    195 Quando um formulário está vinculado a dados externos através do method 'bind()', o formulário muda para um estado intermediário e as seguintes ações são desparadas: 
     193A chamada para declaração '<?php echo $form ?>' leva automaticamente em consideração as mensagens de erros associados ao campos, e preencherá automaticamente os dados limpos da entrada do usuário. 
     194 
     195Quando um formulário está vinculado a dados externos através do método 'bind()', o formulário muda para um estado intermediário e as seguintes ações são disparadas: 
    196196 
    197197  * O processo de validação é executado 
    199199  * As mensagens de erros são armazenadas no formulário em ordem para serem apresentadas para a template 
    200200 
    201   * Os valores padrões do formulário são substituidos pelos dados limpos do usuário 
     201  * Os valores padrões do formulário são substituídos pelos dados limpos do usuário 
    202202 
    203203As informações necessários para apresentar as mensagens de erro ou os dados do usuário, são facilmente acessadas utilizando a variável 'form' na template. 
    204204 
    205205>**Atenção** 
    206 >Com vimos no capítulo 1, nós podemos passar valores padrões para o constructro da classe do form. Após a submissão dum formulário inválido, estes valores padrões são substituidos pelos valores submetidos, de formar que o usuário possa corrigir os seus errors. Então, nunca utilize os dados de entrada como um valor padrão como neste exemplo: '$this->setDefaults($request->getParameter('contact'))'.. 
     206>Com vimos no capítulo 1, nós podemos passar valores padrões para o construtor da classe do form. Após a submissão de um formulário inválido, estes valores padrões são substituidos pelos valores submetidos, de forma que o usuário possa corrigir os seus errors. Então, nunca utilize os dados de entrada como um valor padrão como neste exemplo: '$this->setDefaults($request->getParameter('contact'))'.. 
    207207 
    208208Personalização de validadores 
    209209----------------------- 
    210210 
    211 ### Cusomizando mensagem de erros 
     211### Customizando mensagem de erros 
    212212 
    213213Como você deve ter notado na Figura 2-4, mensagens de erro não são muito úteis. Vamos ver como fazer então para ser mais intuitiva. 
    214214 
    215 Cada valida pode adicionar erros no formulário. Um erro consiste de um código e uma mensagem. Todo validador tem pelo menos o 'required' (requerido) e 'invalid' (inválido) erros definidos no `sfValidatorBase`: 
     215Cada validador pode adicionar erros no formulário. Um erro consiste de um código e uma mensagem. Todo validador tem pelo menos o 'required' (requerido) e 'invalid' (inválido) erros definidos no `sfValidatorBase`: 
    216216 
    217217  | **Código**     | **Mensagem**     | **Descrição** 
    229229  | sfValidatorChoice |                 | 
    230230 
    231 Customizing error messages can be done by passing a second argument when creating the validation objects. A Listagem 2-4 customiza várias menssagens de erro e a Figura 2-5 mostra menssagens de erro customizadas em ação. 
     231Customização de mensagens de erro podem ser feitas passando um segundo argumento quando é criado o objeto de validação. 
     232A Listagem 2-4 customiza várias menssagens de erro e a Figura 2-5 mostra menssagens de erro customizadas em ação. 
    232233 
    233234Lsitagem 2-4 - Customizando mensagens de erro 
    263264A mensagem de erro padrão associada a este código ('min_lenght') é diferente da mensagem que nos já vimos antes, uma vez implementado dois valores dinâmicos: o usuário insere o valor ('foo') e o minímo de caracteres permitidos para esse campo é ('4'). A Listagem 2-5 customiza esta mensagem utilizando estes valores dinâmicos e a Figura 2-7 mostra o resultado. 
    264265 
    265 Listagem 2-5 - Custommizando a mensagem de erro com valores dinâmicos 
     266Listagem 2-5 - Customizando a mensagem de erro com valores dinâmicos 
    266267 
    267268    [php] 
    291292 
    292293>**Tip** 
    293 >Se você quer recaptular todos os código de erros, options, and mensagens padrão de um validador, por favor recorra a documentação da API online ([http://www.symfony-project.org/api/1_2/](http://www.symfony-project.org/api/1_2/)). Cada código, optição e mensagem de erro esta detalhado lá, junto com seus valores padrão (por exmeplo, o validador sfValidatorString` API esta disponível em [http://www.symfony-project.org/api/1_1/sfValidatorString](http://www.symfony-project.org/api/1_1/sfValidatorString)). 
     294>Se você quer recaptular todos os código de erros, options, e mensagens padrão de um validador, por favor recorra a documentação da API online ([http://www.symfony-project.org/api/1_2/](http://www.symfony-project.org/api/1_2/)). Cada código, optição e mensagem de erro esta detalhado lá, junto com seus valores padrão (por exmeplo, o validador sfValidatorString` API esta disponível em [http://www.symfony-project.org/api/1_1/sfValidatorString](http://www.symfony-project.org/api/1_1/sfValidatorString)). 
    294295 
    295296Validaores de segurança 
    296297------------------- 
    297298 
    298 Por padrão, um formulário é valido apenas se todos os campos submetido pelo usuário tiver um validador. Isto garante que cada campo tenha um regra de validação e que não seja possível injetar valores para campos que não estejão definidos no formulário.  
     299Por padrão, um formulário é valido apenas se todos os campos submetido pelo usuário tiverem um validador. Isto garante que cada campo tenha um regra de validação e que não seja possível injetar valores para campos que não estejão definidos no formulário.  
    299300 
    300301Para ajudar a entender esta regra de segura, vamos considerar um objeto usuário com mostra a Listagem 2-6. 
    341342    } 
    342343 
    343 A Listagem 2-8 mostra uma implementação do modulo 'user' utilizando o formulário previamente definido premitindo o usuário modificar o campo nome. 
     344A Listagem 2-8 mostra uma implementação do modulo 'user' utilizando o formulário previamente definido permitindo o usuário modificar o campo nome. 
    344345 
    345346Listagem 2-8 - Implementação do Modulo `user` 
    367368    } 
    368369 
    369 Sem nenhum proteção, se o usuário submeter um formulário com um valor para o campo 'name', e também para o 'is_admin', então nosso código esta vunerável. Isto é facilmente efetuado utilizando uma ferrament como Firebug. De fato, o valor 'is_admin' é sempre válido, por que o campo não tem nenhum validador associado a ele no formulário. Seja qual for o valor, o método 'setFields()' atualizará não apenas a propriedade 'name', mas também a propriedade 'is_admin'. 
    370  
    371 se você testar este código passando um valor para ambos campos 'name' e 'is_admin', você receberá um mensagem de erro global "Extra field name" (Nome de campo extra), como mostrado na figura 2-8. O sistem gerou um erro porque alguns campos submetidos não tinha qualquer validador associado a si próprios; o campo 'is_admin' não foi definido no formulário 'UserForm'. 
     370Sem nenhuma proteção, se o usuário submeter um formulário com um valor para o campo 'name', e também para o 'is_admin', então nosso código esta vunerável. Isto é facilmente efetuado utilizando uma ferramenta como Firebug. De fato, o valor 'is_admin' é sempre válido, por que o campo não tem nenhum validador associado a ele no formulário. Seja qual for o valor, o método 'setFields()' atualizará não apenas a propriedade 'name', mas também a propriedade 'is_admin'. 
     371 
     372Se você testar este código passando um valor para ambos campos 'name' e 'is_admin', você receberá um mensagem de erro global "Extra field name" (Nome de campo extra), como mostrado na figura 2-8. O sistema gerou um erro porque alguns campos submetidos não tinha qualquer validador associado a si próprios; o campo 'is_admin' não foi definido no formulário 'UserForm'. 
    372373 
    373374Figura 2-8 - Erro Validor Faltando 
    386387O `sfValidatorSchema` tem duas regras de validação ativadas por padrão para proteger a coleção de validadores. Estas regras podem ser configuras com as opções `allow_extra_fields` e `filter_extra_fields`. 
    387388 
    388 A opção `allow_extra_fields`, que é definida como 'false' por padrão, verifica que cada dado de entrada tem um validador. Se não, um erro global "Extra field name." é gerado, como mostrado o exemplo anterior. Ao desenvolver, isto permite que os desenvolvedores sejam alertado se esquecer de expedificar a validação de um campo. 
     389A opção `allow_extra_fields`, que é definida como 'false' por padrão, verifica que cada dado de entrada tem um validador. Se não, um erro global "Extra field name." é gerado, como mostrado no exemplo anterior. Ao desenvolver, isto permite que os desenvolvedores sejam alertado se esquecer de expecificar a validação de um campo. 
    389390 
    390391Vamos voltar para o formulário de contato. Vamos trocar a regra de validação, trocando o campo 'name' por um campo obrigatório. Uma vez que o valor da opção 'require' é 'true', poderiamos mudar o validor do campo 'name' para:  
    393394    $nameValidator = new sfValidatorString(); 
    394395 
    395 Este validador não tem impacto, uma vez que não tem a opção 'min_length' nem a 'max_lenght'. Neste caso, poderiamos também substituií-lo por um validador 'empty': 
     396Este validador não tem impacto, uma vez que não tem a opção 'min_length' nem a 'max_lenght'. Neste caso, poderiamos também substituí-lo por um validador 'empty': 
    396397 
    397398    [php] 
    398399    $nameValidator = new sfValidatorPass(); 
    399400 
    400 Em vez que definir um validdor 'empty', poderiamos nos livra dele, mas a proteção padrão que vimos anteriormente nos empede de nos livrarmos dele. A listagem 2-9 mostra como desabilitar a proteção utilizando a opção 'allow_extra_fields'. 
     401Em vez que definir um validdor 'empty', poderiamos nos livrar dele, mas a proteção padrão que vimos anteriormente nos empede de nos livrarmos dele. A listagem 2-9 mostra como desabilitar a proteção utilizando a opção 'allow_extra_fields'. 
    401402 
    402403Listagem 2-9 - Desabilitando a protção `allow_extra_fields` 
    419420    } 
    420421 
    421 Voce agora deve ser capaz de validar o formulário como mostra a Figura 2-9. 
     422Você agora deve ser capaz de validar o formulário como mostra a Figura 2-9. 
    422423 
    423424Figra 2-9 - Validatando com `allow_extra_fields` atribuida com `true` 
    425426![Validating with `allow_extra_fields` set to `true`](/images/forms_book/en/02_09.png "Validating with `allow_extra_fields` set to `true`") 
    426427 
    427 Se você tiver um olhar mais atento, você irá notar que, mesmo se o formulário for válido, o valor do campo `name` está vazio na página de agradecimento, apesar de qualquer valor que foi apresentado. De fato, o valor ainda não foi atribuido ao array reenviado pelo '$this->fomr->getValues()'. Desabilitando a opção `allow_extra_fields`, vamos nos livrar do erro devido a falta do validaor, mas a opção `filter_extra_fields`, a qual esta atribuida como `true` por padrão, filtra esses valores, retirando-os dos valores validados. Claro que é possível alterar este comportamento, como mostrado na Listagem 2-10. 
     428Se você tiver um olhar mais atento, você irá notar que, mesmo se o formulário for válido, o valor do campo `name` está vazio na página de agradecimento, apesar de qualquer valor que foi apresentado. De fato, o valor ainda não foi atribuido ao array reenviado pelo '$this->fomr->getValues()'. Desabilitando a opção `allow_extra_fields`, vamos nos livrar do erro devido a falta do validador, mas a opção `filter_extra_fields`, a qual esta atribuida como `true` por padrão, filtra esses valores, retirando-os dos valores validados. Claro que é possível alterar este comportamento, como mostrado na Listagem 2-10. 
    428429 
    429430Listagem 2-10 - Desabilitando a proteção `filter_extra_fields` 
    447448    } 
    448449 
    449 Você agora de ser capaz de validar seu formulário e recuperar o valor de entrada na sua página de agradecimento. 
    450  
    451 Veremos no capítulo 4 que esta proteção pode ser utilizada com seguranção em objetos serialiazdos do Propel vindo de valores de formulário. 
     450Você agora de ser capaz de validar seu formulário e recuperar os valores de entrada na sua página de agradecimento. 
     451 
     452Veremos no capítulo 4 que esta proteção pode ser utilizada com segurança em objetos serealizados do Propel vindo de valores do formulário. 
    452453 
    453454Validadores Lógicos 
    454455------------------ 
    455456 
    456 Vários validadores podem ser definidos para apenas um campo utlizando validadores lógicos: 
     457Vários validadores podem ser definidos para apenas um campo utilizando validadores lógicos: 
    457458 
    458459  * `sfValidatorAnd`: Para ser válido, o campo tem de passar por todos os validadores 
    460461  * `sfValidatorOr` : Para ser válido, o campo tem de passar por ao menos um validador 
    461462 
    462 O construtor de um operador lógico requer uma lista de validores como seu primeiro arqumento. A Listagem 2-11 utiliza o `sfValidatorAnd` para associar dois validores exigidos pelo campo 'name'. 
     463O construtor de um operador lógico requer uma lista de validores como seu primeiro argumento. A Listagem 2-11 utiliza o `sfValidatorAnd` para associar dois validores exigidos pelo campo 'name'. 
    463464 
    464465Listagem 2-11 - Utilizando o validor 'sfValidatorAnd' 
    510511----------------- 
    511512 
    512 Cada validador que vimos até agora são associados a um campo em espécifico e nos permite validar um valor por vez. Por padrão, eles se comportam ignorando outros dados apresentados pelo usário, mas as vezes a validação de um campo depende do contexto e depende de muitos outros valores do campo. Por exemplo, um validor global é necessário quando duas senha devem ser iguais, or quando uma data de início de ser anterior a data final. 
    513  
    514 Em ambos os caso, nos precisamos utilizar validores globais pra validar os dados inseridos pelo usuário em seu contexto. Nós podemos inserir um validador global antes ou depois da validação do campo através da utilização de um pre-validator ou um post-validator respectivamente. Normalmente é melhor utilizar um post-validator, porque o valor já validada e limpar, ou seja, em formato normalizado. A Listagem 2-13 mostra como implementar a comparação de duas senha utilizando o validador `sfValidatorSchemaCompare`. 
     513Cada validador que vimos até agora são associados a um campo em espécifico e nos permite validar um valor por vez. Por padrão, eles se comportam ignorando outros dados apresentados pelo usário, mas as vezes a validação de um campo depende do contexto e depende de muitos outros valores do campo. Por exemplo, um validor global é necessário quando duas senhas devem ser iguais, ou quando uma data de início deve ser anterior a data final. 
     514 
     515Em ambos os caso, nós precisamos utilizar validores globais pra validar os dados inseridos pelo usuário em seu contexto. Nós podemos inserir um validador global antes ou depois da validação do campo através da utilização de um pre-validator ou um post-validator respectivamente. Normalmente é melhor utilizar um post-validator, porque o valor já validada e limpa, ou seja, em formato normalizado. A Listagem 2-13 mostra como implementar a comparação de duas senha utilizando o validador `sfValidatorSchemaCompare`. 
    515516 
    516517Listagem 2-13 - Utilizando o Validador `sfValidatorSchemaCompare` 
    525526 
    526527>**Tip** 
    527 >A clasee `sfValidatorSchemaCompare` herdade do validador `sfValidatorSchema`, como todos os validadores globais. `sfValidatorSchema` é ela própria um validor global, uma vez que valida todos os dados insedos pelo usuário, passando para outros validadores a validação de cada campo. 
    528  
    529 A Listagem 2-14 mostra como utilizar um simples validador para validarq que uma data inicial é antes de uma data final, customizando a mensagem de erro. 
     528>A classe `sfValidatorSchemaCompare` herda do validador `sfValidatorSchema`, como todos os validadores globais. `sfValidatorSchema` é ela própria um validor global, uma vez que valida todos os dados insedos pelo usuário, passando para outros validadores a validação de cada campo. 
     529 
     530A Listagem 2-14 mostra como utilizar um simples validador para validar que uma data inicial esta antes de uma data final, customizando a mensagem de erro. 
    530531 
    531532Listagem 2-14 - Utilizando o validador `sfValidatorSchemaCompare` 
    539540    ); 
    540541 
    541 Utilizanod um post-validador grante que a comparação de duas datas serão precisas. Seja qual foi o formato de entrado, a validação dos campo 'start_date' e 'end_date' irá sempre ser convertido para valores em formato compátivel com (`Y-m-d H:i:s` por padrão). 
    542  
    543 Por padrão, pre-validators and post-validators return erros globais para o formulário. Entretanto, alguns deles podem associar um erro para um campo específico. Por exemplo, a opção 'throw_global_error' do validador 'sfVAlidatorSchemaCompare' pode escolher entre um glogal error (Figura 2-10) ou um erro associado ao primeiro campo (Figure 2-11). A Listagem 2-15 mostra como utilizar a opção `throw_global_error`. 
     542Utilizando um post-validador garante que a comparação de duas datas serão precisas. Seja qual foi o formato de entrado, a validação dos campo 'start_date' e 'end_date' irá sempre ser convertido para valores em formato compátivel com (`Y-m-d H:i:s` por padrão). 
     543 
     544Por padrão, pre-validators and post-validators retorna erros globais para o formulário. Entretanto, alguns deles podem associar um erro para um campo específico. Por exemplo, a opção 'throw_global_error' do validador 'sfVAlidatorSchemaCompare' pode escolher entre um glogal error (Figura 2-10) ou um erro associado ao primeiro campo (Figure 2-11). A Listagem 2-15 mostra como utilizar a opção `throw_global_error`. 
    544545 
    545546Listagem 2-15 - Utilizando a opção `throw_global_error` 
    574575----------- 
    575576 
    576 Lidar com upload de arquivo, como em todas as linguagens orientadas da web, envolve manipulão de código HTML e no lado do servidor recuperação de arquivo. Nesta seção veremos as ferramente de formulário que o framework tem a oferecer para tornar sua vida mais fácil. Nós veremos também como não cair em armadilhas comuns. 
    577  
    578 Vamos mudar o formulário de contado para permitiar anexar um arquivo a mensagem a ser enviada. Para fazer isto, iremos adicionar um campo 'file' como mostrado na Listagem 2-17. 
    579  
    580 Listagem 2-17 - Adiconando um Campo 'file' no formulario 'ContactForm' 
     577Lidar com upload de arquivo, como em todas as linguagens orientadas da web, envolve manipulão de código HTML e no lado do servidor recuperação de arquivo. Nesta seção veremos as ferramente de formulário que o framework tem a oferecer para tornar sua vida mais fácil. Nós veremos também como não cair em armadilhas comuns. 
     578 
     579Vamos mudar o formulário de contado para permitir anexar um arquivo a mensagem a ser enviada. Para fazer isto, iremos adicionar um campo 'file' como mostrado na Listagem 2-17. 
     580 
     581Listagem 2-17 - Adicionando um Campo 'file' no formulário 'ContactForm' 
    581582 
    582583    [php] 
    607608    } 
    608609 
    609 Quando há um widget sfWidgetFormInputFile` em um formulário que permite o upload de um arquivo, precisamos também adicionar um attributo 'enctype' ao formulário como é mostrado na Listagem 2-18. 
     610Quando há um widget `sfWidgetFormInputFile` em um formulário que permite o upload de um arquivo, precisamos também adicionar um atributo 'enctype' ao formulário como é mostrado na Listagem 2-18. 
    610611 
    611612Listagem 2-18 - Modificando a template para ter o campo 'file' em seu contexto. 
    624625 
    625626>**Note** 
    626 >Se você gerar dinâmicamente a template associado ao formulário, o método 'isMultipart()' do objeto do formulário returnará 'true', é necessário do atributo 'enctype'. 
    627  
    628 Informação sobre arquivos carregados não são armazenadas com aos demais valores submetidos no PHP. Em seguida é necessário modificar a chamado do metodo 'bind()' para passar esta informação como um segundo arqumento, como mostrado na listagem 2-19. 
     627>Se você gerar dinâmicamente a template associado ao formulário, o método 'isMultipart()' do objeto do formulário retornará 'true', é necessário do atributo 'enctype'. 
     628 
     629Informações sobre arquivos carregados não são armazenadas como os demais valores submetidos no PHP. Em seguida é necessário modificar a chamado do metodo 'bind()' para passar esta informação como um segundo arqumento, como mostrado na listagem 2-19. 
    629630 
    630631Listagem 2-19 - Passando arquivos carregados para o método 'bind()' 
    686687 
    687688>**Tip** 
    688 >O mime type fornecido pelo navegador durante o carregamento do arquivo não é confiável. A fim de garantir uma máxima segurança, as funções 'finfo_open' and 'mime_content_type' e a ferramenta 'file' é utilizada durante a validação do arquivo. Como último recuros, se qualquer função não consiguir advinhar o mime type, ou se o sistema não prevê-lo, o browser mime type é é tida como valor. Para adicionar or alterar a função que advinha o mime type, basta passar a opção 'mime_type_guessers' para o construtor 'sfVAlidatorFile'. 
     689>O mime type fornecido pelo navegador durante o carregamento do arquivo não é confiável. A fim de garantir uma máxima segurança, as funções 'finfo_open' and 'mime_content_type' e a ferramenta 'file' é utilizada durante a validação do arquivo. Como último recurso, se qualquer função não consiguir advinhar o mime type, ou se o sistema não prevê-lo, o browser mime type é tida como valor. Para adicionar ou alterar a função que advinha o mime type, basta passar a opção 'mime_type_guessers' para o construtor 'sfVAlidatorFile'. 
    689690 
    690691}}}