Development

Documentation/pt_BR/book/1.0/04-The-Basics-of-Page-Creation (diff)

You must first sign up to be able to contribute.

Changes between Version 7 and Version 8 of Documentation/pt_BR/book/1.0/04-The-Basics-of-Page-Creation

Show
Ignore:
Author:
Edir.Dumaszak (IP: 189.26.17.171)
Timestamp:
09/02/07 08:53:08 (10 years ago)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/pt_BR/book/1.0/04-The-Basics-of-Page-Creation

    v7 v8  
    162162>Uma boa forma de verificar se a sintaxe do template esta legivel é o arquivo não conter código HTML impresso pelo PHP ou entre chaves. E na maioria das vezes, ao abrir a `<?php`, você deve fechá-lo com `?>` na mesma linha. 
    163163 
     164### Passando informações da Action para o Template 
     165         
     166O trabalho da action é fazer todo o cálculo, recuperação de dados, testes, e setar variáveis para que o template seja exibido ou testado. Symfony faz os atributos da classe da action (acessada através de `$this->variableName` na action) diretamente acessível ao template no namespace global (via `$variableName`). A listagem 4-6 e 4-7 mostra como passar a informação da action ao template. 
     167 
     168Listagem 4-6 - Setando um atributo na Action para ser acessivel ao Template. 
     169 
     170    [php] 
     171    <?php 
     172 
     173    class mymoduleActions extends sfActions 
     174    { 
     175      public function executeMyAction() 
     176      { 
     177        $today = getdate(); 
     178        $this->hour = $today['hours']; 
     179      } 
     180    } 
     181 
     182Listagem 4-7 - O Template pode acessar diretamente um atributo da Action 
     183 
     184    [php] 
     185    <p>Hello, world!</p> 
     186    <?php if ($hour >= 18): ?> 
     187    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p> 
     188    <?php endif; ?> 
     189  
     190         
     191>**NOTE** 
     192>O template já possui o acesso a algumas partes dos dados sem a necessidade de setar qualquer variável na action. Todo template pode chamar métodos dos objetos `$sf_context`, `$sf_request`, `$sf_params`, e de `$sf_user`. Eles contém os dados relacionados ao contexto atual, request, parâmetros da requisição, e sessão. Você aprenderá logo como usá-los eficientemente. 
     193 
     194Obtendo Informações do Usuário com Formulários 
     195---------------------------------------------- 
     196 
     197Os formulários são uma boa maneira de obter informação do usuário. Escrever formulários e elementos do formulário em HTML pode às vezes ser incômodo, especialmente quando você quer ser suportar XHTML. Você poderia incluir elementos do formulário em templates no symfony da maneira usual, como mostrado na listagem 4-8, mas o symfony fornece os helpers que fazem esta tarefa mais fácil. 
     198 
     199Listagem 4-8 - Templates podem incluir código HTML usual 
     200 
     201    [php] 
     202    <p>Hello, world!</p> 
     203    <?php if ($hour >= 18): ?> 
     204    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p> 
     205    <?php endif; ?>      
     206    <form method="post" target="/myapp_dev.php/mymodule/anotherAction"> 
     207      <label for="name">What is your name?</label> 
     208      <input type="text" name="name" id="name" value="" /> 
     209      <input type="submit" value="Ok" /> 
     210    </form> 
     211 
     212Um `helper` é uma função PHP definida no symfony que pode ser usado dentro dos templates. Eles geram algum código HTML e é mais rápido usar-lo do que escrever o código HTML. Usando helpers do symfony, você pode ter o mesmo resultado que da listagem 4-8 com o código mostrado na listagem 4-9. 
     213 
     214 
     215Listagem 4-9 - Isto é mais Rápido e Fácil se usar Helpers para Tags HTML 
     216 
     217    [php] 
     218    <p>Hello, world!</p> 
     219    <?php if ($hour >= 18): ?> 
     220    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p> 
     221    <?php endif; ?> 
     222    <?php echo form_tag('mymodule/anotherAction') ?> 
     223      <?php echo label_for('name', 'What is your name?') ?> 
     224      <?php echo input_tag('name') ?> 
     225      <?php echo submit_tag('Ok') ?> 
     226    </form> 
     227  
     228 
     229>**SIDEBAR** 
     230>Helpers estão aqui para ajudar você 
     231> 
     232>Se, no exemplo na listagem 4-9, você pensar que o uso do helper não é realmente a forma mais rápida para escrever HTML, considere isto: 
     233> 
     234>     [php] 
     235>     <?php 
     236>     $card_list = array( 
     237>       'VISA' => 'Visa', 
     238>       'MAST' => 'MasterCard', 
     239>       'AMEX' => 'American Express', 
     240>       'DISC' => 'Discover'); 
     241>     echo select_tag('cc_type', options_for_select($card_list, 'AMEX')); 
     242>     ?> 
     243> 
     244>Isto ira gerar o seguinte HTML: 
     245> 
     246>     [php] 
     247>     <select name="cc_type" id="cc_type"> 
     248>       <option value="VISA">Visa</option> 
     249>       <option value="MAST">MasterCard</option> 
     250>       <option value="AMEX" selected="selected">American Express</option> 
     251>       <option value="DISC">Discover</option> 
     252>     </select> 
     253> 
     254>O benefício dos helpers nos templates está na velocidade de codificar, na clareza do código, e na concisão. O único preço a pagar é o tempo para aprender, que terminará quando você finalizar este livro, e o tempo de escrever um atalho em seu editor de texto favorito. Você não é obrigado a usar os helpers do symfony nos templates e pode escrever HTML da maneira que voce sempre fez, mas isto seria uma grande perda de tempo e muito menos divertido. 
     255         
     256Note que o uso da tag curta (`<?=`, equivalente a `<?php echo`) não é recomendado para aplicações web profissionais, pois seu web server em produção pode entender mais de uma línguagem scripting e conseqüentemente gerar uma confusão. Adicionalmente, os Tag curtos não trabalham com a configuração padrão do PHP e necessitam que usuário configure para ser ativado. Finalmente, quando você tem que tratar do XML, a validação falha porque `<?` é uma expressão especial do XML. 
     257 
     258A manipulação de formulários merece um capítulo inteiro, pois o symfony fornece muitas ferramentas, na maior parte helpers, para torna-lo mais fácil. Você aprenderá mais sobre estes helpers no capítulo 10. 
     259 
     260Chamando outra Action 
     261--------------------- 
     262 
     263Você já deve saber que há uma total separação entre um nome da action e a URL usada para a chamar. Assim se você criar um link para `anotherAction` em um template como na listagem 4-10, funcionará somente com o roteamento default. Se você decidir mais tarde mudar a forma das URLs, então você necessitará rever todos os templates para mudar todos os hyperlinks. 
     264 
     265Listagem 4-1 - Hyperlinks, a maneira classica 
     266 
     267    [php] 
     268    <a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous"> 
     269      I never say my name 
     270    </a> 
     271 
     272 
     273Para evitar essa confusão, você deve sempre usar o helper `link_to()` para criar hyperlinks às actions da sua aplicação. A listagem 4-11 demonstra o uso do helper para hyperlink. 
     274 
     275Listagem 4-11 O Helper `link_to()` 
     276 
     277    [php] 
     278    <p>Hello, world!</p> 
     279    <?php if ($hour >= 18): ?> 
     280    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p> 
     281    <?php endif; ?> 
     282    <?php echo form_tag('mymodule/anotherAction') ?> 
     283      <?php echo label_for('name', 'What is your name?') ?> 
     284      <?php echo input_tag('name') ?> 
     285      <?php echo submit_tag('Ok') ?> 
     286      <?php echo link_to('I never say my name','mymodule/anotherAction?name=anonymous') ?> 
     287    </form> 
     288 
     289         
     290O HTML resultante será o mesmo que o anterior, exceto que quando você muda suas regras de roteamento, todos os templates se comportarão corretamente e reformatarão a URLs conformemente. 
     291 
     292O helper `link_to()`, como muitos outros helpers, aceita outros argumentos para opções especiais e atributos adicionais da Tag. A listagem 4-12 mostra um exemplo de um argumento opcional e o HTML resultante. O argumento opcional é qualquer array associativa ou uma simples string que tenha os pares `key=value` separados por espaços em branco. 
     293 
     294Listagem 4-12 - Muitos Helper Aceitam um Argumento opcional 
     295 
     296    [php] 
     297    // Option argument as an associative array 
     298    <?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous', 
     299      array( 
     300        'class'    => 'special_link', 
     301        'confirm'  => 'Are you sure?', 
     302        'absolute' => true 
     303    )) ?> 
     304 
     305    // Option argument as a string 
     306    <?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous', 
     307      'class=special_link confirm=Are you sure? absolute=true') ?> 
     308 
     309    // Both calls output the same 
     310     => <a class="special_link" onclick="return confirm('Are you sure?');" 
     311        href="http://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymous"> 
     312        I never say my name</a> 
     313 
     314 
     315Sempre que você usa um helper do symfony que imprime uma Tag HTML, você pode inserir atributos adicionais da Tag (como o atributo da classe no exemplo da listagem 4-12) no argumento. Você mesmo pode escrever estes atributos da maneira "rápida-e-suja" do HTML 4.0 (sem aspas duplas), e o symfony irá imprimir-los em um XHTML formatado. Esta é uma outra razão porque os helpers são mais rápidos de se escrever HTML. 
     316 
     317>**NOTE**                
     318>Porque isto requer uma analise gramatical e transformação adicionais, a sintaxe com string é uma pouco mais lenta do que a sintaxe com array. 
     319 
     320Como os helpers de formulário, os helpers de link são numerosos e têm muitas opções. O capítulo 9 descrevê-os em detalhes. 
     321 
     322Obtendo Informação da requisição 
     323-------------------------------- 
     324 
     325Quando o usuário envia a informação através de um formulário (geralmente em um pedido via POST) ou através da URL (requisição GET), você pode recuperar os dados relacionados da action com o método `getRequestParameter()` do objeto `sfActions`. A listagem 4-13 mostra como, no `anotherAction`, você recupera o valor do parâmetro `name`. 
     326 
     327Listagem 4-13 - Obtendo dados de um parametro da requisição na Action 
     328 
     329    [php] 
     330    <?php 
     331 
     332    class mymoduleActions extends sfActions 
     333    { 
     334      ... 
     335 
     336      public function executeAnotherAction() 
     337      { 
     338        $this->name = $this->getRequestParameter('name'); 
     339      } 
     340    } 
     341  
     342 
     343Se a manipulação dos dados for simples, você não necessita usar a action para recuperar os parâmetros do pedido. O template tem acesso a um objeto chamado `$sf_params`, que oferece um método `get()` para recuperar os parâmetros do pedido, assim como o `getRequestParameter()` na action. 
     344 
     345Se `executeAnotherAction()` estiver vazio, a listagem 4-14 mostra como o template `anotherActionSuccess.php` recuperaria o mesmo parâmetro. 
     346 
     347Listagem 4-14 - Obtendo dados do parâmetro do pedido diretamente no Template 
     348 
     349    [php] 
     350    <p>Hello, <?php echo $sf_params->get('name') ?>!</p> 
     351  
     352 
     353>**NOTE** 
     354>Por que não usar as variáveis `$_POST`, `$_GET`, ou `$_REQUEST`? Porque seu URL está formatado diferentemente (como em `http://localhost/articles/europe/france/finance.html`, sem o `?` nem `=`), as variáveis usuais de PHP não funcionam, e somente o sistema de roteamento consegue recuperar os parâmetros do pedido. E você pode querer ter filtros de input para impedir code injection, que é somente possível se você mantiver todos os parâmetros do pedido em um local limpo.        
     355         
     356O objeto `$sf_params` é mais poderoso do que apenas sendo equivalente a uma array. Por exemplo, se você quiser somente testar a existência de um parâmetro do pedido, você pode simplesmente usar o método de `$sf_params->has()` em vez de testar o valor real com `get()`, como na listagem 4-15. 
     357 
     358Listagem 4-15 - Testando a Existencia do parâmetro do pedido no Template 
     359 
     360    [php] 
     361    <?php if ($sf_params->has('name')): ?> 
     362      <p>Hello, <?php echo $sf_params->get('name') ?>!</p> 
     363    <?php else: ?> 
     364      <p>Hello, John Doe!</p> 
     365    <?php endif; ?> 
     366  
     367 
     368Você pode já ter percebido que isto pode ser escrito em uma única linha. Como com a maioria dos métodos getter no symfony, o método `getRequestParameter()` na action e o método `$sf_params->get()` no template (que, de fato, chama o mesmo método no mesmo objeto) aceitam um segundo argumento: o valor default a ser usado se o parâmetro do pedido não estiver presente. 
     369 
     370    [php] 
     371    <p>Hello, <?php echo $sf_params->get('name', 'John Doe') ?>!</p> 
     372  
     373 
     374Sumário 
     375------- 
     376 
     377No symfony, as páginas são compostas de uma action (um método no arquivo `actions/actions.class.php` definido como executavel) e de um template (um arquivo no diretório `templates/`, terminando geralmente com `Success.php`). São agrupados em módulos, de acordo com sua função na aplicação. Escrever templates é facilitado pelos helpers, que são funções fornecidas pelo symfony e retorna codigo HTML. Você precisa pensar na URL como parte da resposta, que pode ser formatada como necessario, e por isso você deve deixar de usar referências direta ao URL no nome da action ou do parametro de retorno da requisição. 
     378 
     379Uma vez que você saiba estes princípios básicos, você já pode escrever uma aplicação web inteira com symfony. Mas isso pode ser um tanto demorado e para resolver isso, cada tarefa que você fará durante o desenvolvimento da aplicação é facilitado por alguma característica do symfony. É por isso que o livro não termina agora. 
     380 
     381 
    164382}}}