Utilizando Partial e Components



Partial


Se você quiser utilizar alguns códigos ou textos em sua página de outros arquivos, você pensa em include. No symfony existe um comando semelhante, que é o partial. Os partials são pedaços de códigos reutilizáveis, são armazenados na pasta templates/, contém código HTML e php embutido. Um arquivo partial SEMPRE começa com sublinhado (_), isso ajuda a distiguir os arquivos, já que eles ficam no mesmo diretório. Um partial pode ser incluido se estiver no mesmo módulo, em outro módulo, ou no diretório global templates/.
O comando para usar é include_partial(), os parâmetros são o nome do módulo e o nome do arquivo sem o sublinhado (_) e o .php.

Exemplo:


//myapp/modules/seumodulo/templates/_testepartial.php do mesmo módulo
//Como o partial está no mesmo módulo, você pode omiti-lo

<?php include_partial(‘testepartial’); ?>

//myapp/modules/fotos/templates/_testepartial.php
//‘fotos’ é um exemplo do nome do módulo

<?php include_partial(‘fotos/testepartial’);

“Como utilizar variáveis do meu template (indexSuccess.php por exemplo) na minha partial (no caso _testepartial.php)?”
Muita calma nessa hora.
Para resolver isso é muito simples, basta você definir uma variável no seumodulo/actions/actions.class.php

class seumoduloActions extends sfActions {
  public function executeIndex()
  {
    $this->total = 2000;
  }
}

Agora o seu template seumodulo/templates/indexSuccess.php terá:

<p>www.symfonybr.com</p>
<?php include_partial(‘testepartial’,array(‘totalpartial’ => $total)) ?>

E no myapp/modules/seumodulo/templates/_testepartial.php:

<p>Visitas: <?php echo $totalpartial; ?> por dia :x!</p>

Se você quiser pegar o conteúdo de uma partial sem exibi-lo, utilize o get_partial().



Components


E se você quiser ao invés de usar apenas alguns códigos ou textos, utilizar um template de outro módulo com suas próprias actions?
Muito mais calma nessa hora porque é pra isso que serve o components.

Digamos que você tem um site e tenha 2 links: um pra videos e outro pra fotos. Você agora quer exibir apenas o conteúdo do módulo videos e do módulo fotos.
No módulo videos, adicione em modules/videos/template/_index.php


<?php echo "Lista de videos"; ?>

Para que as actions do módulo videos funcionem no components, faça o seguinte:
Na pasta modules/videos/actions/ copie e cole o arquivo actions.class.php e renomeie para components.class.php.
Agora, altere ele onde tem

class videosActions extends sfActions

para

class videosComponents extends sfComponents

PS: Lembrar de trocar o nome do módulo (videos)

Agora na sua página principal, use o helper include_components():


<?php include_component(‘videos’,‘index’); ?>

Como no partial, você pode passar variáveis para os components:

<?php include_component(‘videos’,‘index’, array(‘foo’ => ‘bar’); ?>

;//No próprio componente
<?php echo $this->foo; ?> //retorna bar

//No _index.php
<?php echo $foo; ?> //retorna bar

A grande diferença é que no Components, você pode usar as actions do módulo, ou seja, colocar a lógica de programação (consulta de banco, por exemplo) no arquivo actions.class.php e utilizá-los no template.

O Partial não dá suporte ao actions.class.php, então seguindo o padrão MVC, você só usaria o partial para mostrar algum conteúdo html que não precise de lógica de programação.