plugins

Selectbox para escolher cidade de acordo com o estado utilizando widgets e symfony 1.4 (Propel/Doctrine)

Nesse post vou explicar como fazer um selectbox que só mostra as cidades referentes ao respectivo estado selecionado anteriormente.

stado_cidade_sfDependentPlugin1.jpg

Vamos considerar a seguinte modelagem (config/schema.yml):


propel:
  estado:
    id:
    uf:   varchar(2)
    nome: varchar(60)

  cidade:
    id:
    nome:       varchar(40)
    estado_id:  { type: integer, foreignTable: estado, foreignReference: id, onDelete: cascade }
    capital:    varchar(1)
    created_at:
    updated_at:

  usuario:
    id:
    nome:        varchar(100)
    cidade_id:  { type: integer, foreignTable: cidade, foreignReference: id, onDelete: cascade }
 

Para preencher as tabelas estado e cidade, utilizei o seguinte SQL com dados do Brasil. CARGA_CIDADES_E_ESTADOS_BRASIL.zip

O próximo passo é instalar o plugin sfDependentSelectPlugin em nosso projeto. Baixe o arquivo sfDependentSelectPlugin-0.1.5.tgz e descompacte na pasta plugins/ de seu projeto. Eu renomeei a pasta de plugins/sfDependentSelectPlugin-0.1.5/ para plugins/sfDependentSelectPlugin/.

Habilite o plugin no seu projeto (config/ProjectConfiguration.class.php)

$this->enablePlugins(…, ‘sfDependentSelectPlugin’);

Limpe o cache do seu projeto:
$ php symfony cc

Publique o javascript do plugin com o comando:
$ php symfony plugin:publish-assets

Crie o CRUD para o usuário:
$ php symfony propel:generate-module frontend usuario Usuario

Agora vamos alterar o form do usuário: lib/form/UsuarioForm.class.php:
class UsuarioForm extends BaseUsuarioForm
{
  public function configure()
  {
    $this->widgetSchema[‘estado_id’] = new sfWidgetFormPropelChoice(array(
            ‘model’     => ‘Estado’,
            ‘add_empty’ => true
     ));

    $this->widgetSchema[‘cidade_id’] = new sfWidgetFormPropelDependentSelect (array(
            ‘model’     => ‘Cidade’,
            ‘depends’   => ‘Estado’,
            ‘add_empty’ => ‘Selecione a cidade’
    ));

    $this->validatorSchema[‘estado_id’] = new sfValidatorPropelChoice(array(
        ‘model’ => ‘Estado’,
    ));

    $this->validatorSchema[‘cidade_id’] = new sfValidatorPropelChoice(array(
        ‘model’ => ‘Cidade’,
    ));
  }
}

Vale lembrar que você pode utilizar o sfWidgetFormDoctrineDependentSelect ao invés do sfWidgetFormPropelDependentSelect.

Agora vamos alterar o template para receber o widget do estado também (\apps\APLICACAO\modules\usuario\templates\_form.php)


      <tr>
        <th><?php echo $form[‘estado_id’]->renderLabel() ?></th>
        <td>
          <?php echo $form[‘estado_id’]->renderError() ?>
          <?php echo $form[‘estado_id’] ?>
        </td>
      </tr>
      <tr>
        <th><?php echo $form[‘cidade_id’]->renderLabel() ?></th>
        <td>
          <?php echo $form[‘cidade_id’]->renderError() ?>
          <?php echo $form[‘cidade_id’] ?>
        </td>
      </tr>

Pronto! Acesse a página do módulo e veja o select da cidade dependente do select do estado.

Esse plugin faz um pouco mais do que isso como dependência infinita, utilização de ajax, etc.. Para ver a documentação completa acesse: http://www.symfony-project.org/plugins/sfDependentSelectPlugin

ajax
doctrine
form
php
plugins
propel

Comments (3)

Permalink

sfPropelSyncContentPlugin: Plugin para importar/exportar o banco de dados entre ambientes (dev/prod)

Saiu no dia 16/10/2008 um novo plugin chamando sfPropelSyncContentPlugin

Esse plugin tem a função de tornar mais prático a manipulação do banco de dados. Com ele podemos facilmente importar todo o banco de dados de produção para desenvolvimento e vice-versa. Ele utiliza o mysqldump e alguns outros comandos do mysql.

Podemos atualizar nossa base de desenvolvimento com os dados de produção com o seguinte comando:

$ symfony propel-sync-content frontend dev from prod@production

Por outro lado, podemos fazer o inverso, ou seja, atualizar a base de produção com os dados de desenvolvimento:

$ symfony propel-sync-content frontend dev to prod@production

O plugin também permite atualização de diretórios. Basta configurar o app.yml em: apps/frontend/config/app.yml


all:
  sfPropelSyncContentPlugin:
    content:
      * "web/uploads"
 

Com a configuração acima, além de atualizarmos a base de dados, vamos atualizar a pasta web/upload também.

Valeu!

plugins
producao
symfony

Comments (0)

Permalink

Instalando plugins no symfony 1.1

No symfony 1.1, o sistema de plugins foi totalmente reescrito. Isto vai permitir melhoras no modo de trabalho e facilitar o uso no seu projeto.

Instalando um plugin

Para instalar plugins de um channel padrão (o oficial do symfony), não é mais necessário usar a URL toda. Basta:

$ php symfony plugin:install sfGuardPlugin

Isto irá instalar o plugin sfGuardPlugin. Entretanto, há mais opções disponíveis:

$ php symfony plugin:install —stability=beta sfGuardPlugin

Ele irá instalar a versão beta do plugin no seu projeto, o que é útil se você quiser testar uma versão mais recente, mas não é recomendável pois é uma versão non-stable (instável).

Você pode também especificar qual versão do plugin quer instalar:

$ php symfony plugin:install —release=1.0.0 sfGuardPlugin

Ele irá instalar a versão 1.0.0 do plugin.

Vários plugins são dependentes de outros para funcionar completamente. No symfony 1.0, você tinha que instalar uma série de plugins antes de poder instalar o plugin de sua escolha. No symfony 1.1, basta você digitar o comando a seguir, que irá instalar o plugin e suas dependências:

$ php symfony plugin-install install-deps sfGuardPlugin

Outra melhoria, graças à utilização de canais PEAR é a capacidade de utilização de diversos canais (channels) diferentes.
Por padrão, o symfony usa o channel oficial (plugins.symfony-project.org) que vai pelo nome de symfony-plugins (não precisa especificar na instalação do plugin). Para usar outros, primeiro adicione um novo:

$ php symfony plugin:add-channel custom-channel.example.com

Agora você pode instalar plugins vindo deste canal especificando na instalação:

$ php symfony plugin:install —channel=custom-channel.example.com sfGuardPlugin

Para saber mais parâmetros utilize o help:

$ php symfony help plugin:install

Também é possível fazer uma referência direta ao plugin que quer instalar, tanto usando a URL completa como um caminho local:

$ php symfony plugin:install http://www.example.com/sfGuardPlugin-1.0.0.tgz

ou

$ php symfony plugin:install /home/stefan/plugins/sfGuardPlugin-1.0.0.tgz

Desinstalando um plugin

Para desinstalar um plugin do seu projeto continua fácil. Um simples comando fará o truque:

$ php symfony plugin:uninstall sfGuardPlugin

Para desinstalar um plugin vindo de outro canal (channel), você precisa especificá-lo:

$ php symfony plugin:uninstall —channel=custom-channel.example.com sfGuardPlugin

Para saber qual canal o plugin está instalado, use o plugin:list.

Atualizando um plugin

Também é muito simples. Basta o comando a seguir, e seu plugin estará com a última versão:

$ php symfony plugin:upgrade sfGuardPlugin

Os parâmetros —stability, —release e —channel, também está disponível para esta tarefa e é aplicada do mesmo modo.

Listando os plugins instalados

A tarefa mais fácil de todas é listar os plugins instalados. Para isso, basta o comando:

$ php symfony plugin:list

Este comando não tem parâmetros.

Como você pode ver, a reescrita do sistema de plugins está mais poderosa e permite um gerenciamento mais fácil dos plugins.

Tutorial em inglês

Até mais.

php
plugins
symfony

Comments (0)

Permalink