Tradução do Getting Started with Symfony

Fala pessoal. Essa semana eu (Pedro Casado) e o Bernardo Dantas traduzimos o “Getting started with symfony”. Os arquivos já foram commitados pelo Lucas Stephanou e podem ser vistos em: “http://www.symfony-project.org/getting-started/1_2/pt_BR/”:http://www.symfony-project.org/getting-started/1_2/pt_BR/

No mais, é só isso.

Valeu queiroZ!

php

Comments (1)

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”:http://www.symfony-project.org/plugins/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

Dinamizando conteúdo no symfony com slots

Em diversos casos precisamos completar nosso layout com mais de uma área dinâmica. Por exemplo, suponha uma situação em que nós precisamos ter as meta-tags diferentes para cada action executada. No nosso caso, nós teremos as meta-tags padrões e estaremos fazendo um override delas no template. A intenção é termos as meta-tags de _description_ e _keywords_ (nesse exemplo) dinâmicas. Sendo assim, cada página terá as keywords e descriptions respectivas. Isso é fundamental para motores de busca, SEO, etc..

Para essa solução, utilizaremos o *slot*. Basicamente, slot é um lugar que você estará reservando para um conteúdo específico. Esse lugar pode ser definido no layout, template ou até em um partial. Está muito abstrato ainda, não é? Vou mostrar um exemplo.

Podemos ter por exemplo no *apps/APLICACAO/templates/layout.php* algo assim:

<html>
<head>
 <?php if (has_slot(‘http_metas’)): ?>
   <?php include_slot(‘http_metas’) ?>
 <?php endif: ?>
</head>
 

Dentro de um template, *apps/APLICACAO/modules/faleconosco/indexSuccess.php* poderíamos ter um código como esse:

<?php slot(‘http_metas’) ?>
 <meta name="title" content="Fale conosco" />
 <meta name="description" content="Entre em contato conosco pelo formulário abaixo ou fale direto conosco pelo telefone xxxxx" />
 <meta name="keywords" content="contato, telefone, etc, etc" />
<?php end_slot() ?>
 

Ou seja, quando o usuário acessar a action index do módulo faleconosco, as meta-tags dele serão essas citadas acima. É claro que esse é um exemplo muito simples.

Isso pode ficar mais interessante pegando palavras-chave de um banco de dados, ou a descrição de um produto, artigo, etc.. É bom lembrar que a meta-tag de description tem um ideal de caracteres. Se não me engano é algo em torno de 200~300. Corrijam se estiver errado.

Vale a pena lembrar que para setar os meta-tags não é obrigatório utilizar os slots. Eles podem ser setados direto na action *apps/APLICACAO/modules/faleconosco/actions/actions.class.php*:

$this\->getResponse()\->setTitle(‘My Title’);
$this\->getResponse()\->addMeta(‘description’,‘My Description’);
$this\->getResponse()\->addMeta(‘keywords’,‘My Keywords’);
 

Esse foi só um exemplo da utilização dos slots. Eles possuem diversas outras utilidades para dinamizar conteúdos.

php
symfony

Comments (1)

Permalink

Descompactando arquivos ZIP vindo de um form com symfony

Nesse post vou mostrar como faço para tratar arquivos ZIP vindo de um formulário.

Primeiramente, precisamos ter instalado a biblioteca zip. Para isso, podemos utilizar o comando abaixo:

$ pecl install zip

Suponhamos um formulário simples:

    <?php echo form_tag("upload/do" , "method=post multipart=true") ?>
      <?php echo input_file_tag("anexos") ?>
    </form>
 

Na action que irá tratar o formulário:

    $phpFile = sfContext::getInstance()\->getRequest()\->getFile(‘anexos’);

    $zip = new ZipArchive();
    $res = $zip->open($phpFile["tmp_name"]);
    if ($res === TRUE) {
        $zip->extractTo(sfConfig::get(‘sf_upload_dir’).‘/imagens/’); // web/uploads/imagens
        $zip->close();
    } else {
         // logar o erro onde preferir..
        // echo ‘failed, code:’ . $res;
    }
 

Neste exemplo não estou considerando validação do tipo de arquivo, etc..

*É obrigatório ter no formulário multipart=true senão não irá funcionar.*

Valeeeeu! =)

php
symfony

Comments (0)

Permalink

Utilizando o rsync do symfony com parâmetros personalizados

Essa é uma dica legal que descobri a um tempo. Para aqueles que quiserem utilizar outras funçoes que o rsync oferece, segue abaixo um trecho de código.

Editando o arquivo *config/properties.ini*:

[producao]
  host=servidor
  port=porta
  user=usuario
  dir=/diretorio
  parameters="-azC –copy-links –exclude-from=config/rsync_exclude.txt –force –delete"
 

Através do “parameters” podemos passar os parâmetros manualmente.. Nesse caso adicionei o –copy-links

Agora é mole

$ symfony sync producao go

Valeu!

producao
symfony

Comments (0)

Permalink

Utilizando um CSS específico para cada módulo do symfony

Essa é uma dica simples. Se você tem alguns módulos e quer ter um CSS para cada módulo, aqui vai uma linha que pode ser bastante útil.

  <?php use_stylesheet($sf_context->getModuleName()) ?>  
 

ciao!

css
php
symfony

Comments (0)

Permalink

Trabalhando com Symfony 1.1 e Doctrine

Quer experimentar o symfony 1.1? Primeiramente vamos ter que configurar um novo projeto e instalar o sfDoctrine para o symfony 1.1. Execute os comandos abaixo e continue lendo:

$ mkdir symfony1.1Doctrine
$ cd symfony1.1Doctrine
$ /path/to/symfony generate:project symfony1.1Doctrine
$ svn co http://svn.symfony-project.com/plugins/sfDoctrinePlugin/trunk plugins/sfDoctrinePlugin
$ php symfony cc

Agora, digite o comando abaixo para listar tudo que o `sfDoctrinePlugin` oferece. Você vai perceber que o comando vai listar os mesmos comandos do `sfPropelPlugin` e muitos outros.

$ php symfony list doctrine
Available tasks for the “doctrine” namespace:
:build-all Generates Doctrine model, SQL and initializes the database (doctrine-build-all)
:build-all-load Generates Doctrine model, SQL, initializes database, and load data (doctrine-build-all-load)
:build-all-reload Generates Doctrine model, SQL, initializes database, and load data (doctrine-build-all-reload)
:build-all-reload-test-all Generates Doctrine model, SQL, initializes database, load data and run all test suites (doctrine-build-all-reload-test-all)
:build-db Creates database for current model (doctrine-build-db)
:build-forms Creates form classes for the current model (doctrine-build-forms)
:build-model Creates classes for the current model (doctrine-build-model)
:build-schema Creates a schema.xml from an existing database (doctrine-build-schema)
:build-sql Creates SQL for the current model (doctrine-build-sql)
:data-dump Dumps data to the fixtures directory (doctrine-dump-data)
:data-load Loads data from fixtures directory (doctrine-load-data)
:dql Execute a DQL query and view the results (doctrine-dql)
:drop-db Drops database for current model (doctrine-drop-db)
:generate-crud Generates a Doctrine CRUD module (doctrine-generate-crud)
:generate-migration Generate migration class (doctrine-generate-migration)
:generate-migrations-db Generate migration classes from existing database connections (doctrine-generate-migrations-db, doctrine-gen-migrations-from-db)
:generate-migrations-models Generate migration classes from an existing set of models (doctrine-generate-migrations-models, doctrine-gen-migrations-from-models)
:init-admin Initializes a Doctrine admin module (doctrine-init-admin)
:insert-sql Inserts SQL for current model (doctrine-insert-sql)
:migrate Migrates database to current/specified version (doctrine-migrate)
:rebuild-db Creates database for current model (doctrine-rebuild-db)

O `sfDoctrinePlugin` atualmente necessita de pelo menos uma aplicação configurada, então, vamos instanciar a aplicação `frontend`.

$ php symfony generate:app frontend

Agora vamos configurar nosso banco de dados em `config/databases.yml`. Abra o arquivo no seu editor predileto e utilize o YAML abaixo. Para esse teste, estamos simplesmente utilizando um banco de dados SQLite. O Doctrine é capaz de criar o banco de dados em `config/doctrine.db`.

    all:
      doctrine:
        class:    sfDoctrineDatabase
        param:
          dsn:    sqlite:///<?php echo dirname(__FILE__); ?>/doctrine.db
   

Agora que nós temos nosso banco de dados configurado, vamos definir nosso schema em `config/doctrine/schema.yml`. Nesse exemplo nós estamos configurando o modelo `BlogPost` que `hasMany` (possui diversas) , `Tags`.

    —
    BlogPost:
      actAs:
        Sluggable:
          fields: [title]
        Timestampable:
      columns:
        title: string(255)
        body: clob
        author: string(255)
      relations:
        Tags:
          class: Tag
          refClass: BlogPostTag
          foreignAlias: BlogPosts
   
    BlogPostTag:
      columns:
        blog_post_id:
          type: integer
          primary: true
        tag_id:
          type: integer
          primary: true
   
    Tag:
      actAs: [Timestampable]
      columns:
        name: string(255)
   

Agora que nos temos nosso schema definido, vamos criar uma massa de teste em `data/fixtures/data.yml`. Abra o arquivo, e cole o YAML abaixo.

    —
    BlogPost:
      BlogPost_1:
        title:  symfony + Doctrine
        body:   symfony and Doctrine are great!
        author: Jonathan H. Wage
        Tags:   [symfony, doctrine, php]
   
    Tag:
      symfony:
        name: symfony
      doctrine:
        name: doctrine
      php:
        name: php
   

Ok, vamos para parte legal. Nós temos nosso schema, e temos também nossa massa, então vamos rodar uma única fez o comando do Doctrine abaixo para criar nosso banco de dados, gerar os modelos, criar as tabelas e carregar a massa de teste.

$ php symfony doctrine-build-all-reload frontend
>> doctrine Are you sure you wish to drop your databases? (y/n)
y
>> doctrine Successfully dropped database f…1.1Doctrine/config/doctrine.db”
>> doctrine Successfully created database f…1.1Doctrine/config/doctrine.db”
>> doctrine Generated models successfully
>> doctrine Created tables successfully
>> doctrine Data was successfully loaded

Agora nosso banco de dados SQLite `doctrine.db` foi criado, todas as tabelas do nosso schema foram criadas e populadas. Agora vamos começar a brincar com os dados e ver como nós podemos utilizar o Doctrine Query Language para trazer as informações do banco.

$ php symfony doctrine:dql frontend “FROM BlogPost p, p.Tags t”
>> doctrine executing: “FROM BlogPost p, p.Tags t” ()
>> doctrine –
>> doctrine id: 1
>> doctrine title: symfony + Doctrine
>> doctrine body: symfony and Doctrine are great!
>> doctrine author: Jonathan H. Wage
>> doctrine slug: symfony-doctrine
>> doctrine created_at: 2008-06-16 12:28:57
>> doctrine updated_at: 2008-06-16 12:28:57
>> doctrine Tags:
>> doctrine –
>> doctrine id: 1
>> doctrine name: symfony
>> doctrine created_at: 2008-06-16 12:28:57
>> doctrine updated_at: 2008-06-16 12:28:57
>> doctrine –
>> doctrine id: 2
>> doctrine name: doctrine
>> doctrine created_at: 2008-06-16 12:28:57
>> doctrine updated_at: 2008-06-16 12:28:57
>> doctrine –
>> doctrine id: 3
>> doctrine name: php
>> doctrine created_at: 2008-06-16 12:28:57
>> doctrine updated_at: 2008-06-16 12:28:57

Agora, vamos explicar um pouco os resultados obtidos. Como você pode ver, nos modelos nós temos as colunas created_at, updated_at and slug que não foram definidas no schema. Essas colunas são adicionadas pelo behavior anexado ao schema dentro da configuração actAs. As colunas `created_at` e `updated_at` são automaticamente atualizadas `onInsert` e `onUpdate`, e a coluna do slug é uma string criada baseada na coluna name para ser utilizada na url(url amigável). O Doctrine tem alguns behaviors que são incluídos no core como `Sluggable` e `Timestampable`, mas o sistema de behavior é feito para permitir que qualquer pessoa escreva novos behaviors para os modelos e serem reutilizados.

Agora que nós temos nossa base configurada e populada, vamos fazer alguns testes utilizando o admin generator para manipular os posts e tags do blog.

$ php symfony doctrine:init-admin frontend blog_posts BlogPost
$ php symfony doctrine:init-admin frontend tags Tag

*Nota*
> Os templates do admin generator para `sfDoctrinePlugin` ainda não foram totalmente atualizados para o symfony 1.1, então vamos precisar ativar a opção `compat_10` em `apps/frontend/config/settings.yml`. Eles vão ser atualizados antes do lançamento da versão estável do symfony 1.1.

Agora vamos abrir nosso browser e verificar a aplicação `frontend` e os módulos `blog_posts` e `tags`. Eles devem ser localizados numas urls parecida com essas

    http://localhost/symfony1.1Doctrine/web/frontend_dev.php/blog_posts
    http://localhost/symfony1.1Doctrine/web/frontend_dev.php/tags
   

Agora, com um pouco de configuração no admin generator do blog_post, nós podemos controlar o relacionamento entre blog_post e tags marcando checkboxes quando editando um post. Abra o arquivo `apps/frontend/modules/blog_posts/config/generator.yml` e troque o conteúdo pelo YAML abaixo:

    generator:
      class:              sfDoctrineAdminGenerator
      param:
        model_class:      BlogPost
        theme:            default
        list:
          display:        [=title, author]
          object_actions:
            _edit:        -
            _delete:      -
        edit:
          display:        [author, title, body, Tags]
          fields:
            author:
              type:       input_tag
            title:
              type:       input_tag
            body:
              type:       textarea_tag
              params:     size=50×10
            Tags:
              type:       doctrine_admin_check_list
              params:     through_class=BlogPostTag

   

Agora atualize (f5) seu browser para listar os posts do blog. Você vai ver tudo de uma maneira mais limpa. Edite um post clicando no ícone ou no título. Veja abaixo como você pode marcar as tags associadas ao post.

99% das ferramentas que você vê funcionando no Propel, você pode ver também no Doctrine. Então, é fácil entender e aplicar. O sfDoctrinePlugin implementa todas as funcionalidades que o sfPropelPlugin e algumas mais. Nos links abaixo você pode obter mais informação sobre o que o Doctrine suporta.

  • “Behaviors”:http://www.phpdoctrine.org/documentation/manual/0_11?chapter=plugins – Easily create reusable behaviors for your Doctrine models.
  • “Migrations”:http://www.phpdoctrine.org/documentation/manual/0_11?chapter=migration – Deploy database schema changes to your production environment through a programmatic interface.
  • “Doctrine Query Language”:http://www.phpdoctrine.org/documentation/manual/0_11?chapter=dql-doctrine-query-language – Build your database queries through a fluent OO interface
  • “Validators”:http://www.phpdoctrine.org/documentation/manual/0_11?chapter=basic-schema-mapping#constraints-and-validators – Turn on column validators for both database and code level validation.
  • “Hierarchical Data”:http://www.phpdoctrine.org/documentation/manual/0_11?chapter=hierarchical-data – Turn your models in to nested sets easily with the flip of a switch.
  • “Caching”:http://www.phpdoctrine.org/documentation/manual/0_11?chapter=caching – Tune performance by caching your DQL query parsing and the result sets of queries.

Se esse pequeno tutorial despertou seu interesse no Doctrine, você pode encontrar mais informações do Doctrine abaixo e aprender um pouco mais sobre ele:

  • “Full User Manual”:http://www.phpdoctrine.org/documentation/manual/0_11?one-page
  • “API Documentation”:http://www.phpdoctrine.org/documentation/api/0_11
  • “Cheatsheet”:http://www.phpdoctrine.org/Doctrine-Cheat-Sheet.pdf
  • “Blog”:http://www.phpdoctrine.org/blog
  • “Community”:http://www.phpdoctrine.org/community
  • “Frequently Asked Questions”:http://www.phpdoctrine.org/faq
  • “Download”:http://www.phpdoctrine.org/download

doctrine
php
symfony

Comments (1)

Permalink

Gerando feeds rss com sfFeed2Plugin

Vou mostrar nesse post uma maneira que utilizo para gerar RSS de notícias publicadas.

Primeiramente, precisamos ter instalado o plugin “sfFeed2Plugin”:http://trac.symfony-project.org/wiki/sfFeed2Plugin

symfony plugin-install http://plugins.symfony-project.com/sfFeed2Plugin

Considere um *schema.yml* parecido com esse

propel:
  artigo:
    _attributes: { Artigo }
    id:
    titulo:     varchar(200)
    data:      date
    resumo:    varchar(200)
    texto:     longvarchar
    …
 

Estou usando também uma rota para os links de noticias. O *apps/APLICACAO/config/routings.yml* precisa ser configurado para isso. Essa rota será utilizada no link para o artigo.

noticiaver:
  url: /noticia/:id
  param: { module: noticias , action: ver }
 

Dentro do módulo *noticias*, vamos adicionar no *apps/APLICACAO/modules/noticias/actions/actions.class.php*

public function executeRss() {
      $feed = new sfAtom1Feed();

      $feed->initialize(array(
        ‘title’       => ‘RSS – Notícias’,
        ‘link’        => ‘http://www.link-do-titulo-do-rss.com.br/’
      ));

      // selecionando os artigos de 5 em 5
      $c = new Criteria;
      $c->addDescendingOrderByColumn(ArtigoPeer::DATA);
      $c->setLimit(5);
      $artigos = ArtigoPeer::doSelect($c);

      foreach ($artigos as $artigo)
      {
        $item = new sfFeedItem();
        $item->initialize(array(
          ‘title’       => $artigo->getTitulo(),
          ‘link’        => ‘@noticiaver?id=’.$artigo->getId(),        
          ‘pubDate’     => $artigo->getData("U"),
          ‘uniqueId’    => $artigo->getId(),
          ‘description’ => $artigo->getResumo(),
        ));

        $feed->addItem($item);
      }
      $this->feed = $feed;
      $this->setLayout(false);
  }
 

No template *apps/APLICACAO/modules/noticias/templates/rssSuccess.php* precisamos ter somente

<?php
decorate_with(false);
echo $feed->asXml();
 

Pronto. Você terá o RSS das notícias em um endereço parecido com esse, *www.seusite.com.br/noticias/rss*.

php
RSS
symfony

Comments (2)

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”:http://www.symfony-project.org/blog/2008/06/20/how-to-work-with-plugins-in-symfony-1-1

Até mais.

php
plugins
symfony

Comments (0)

Permalink

Enviando uma newsletter com Swift e Symfony

Olá! Nesse post vou mostrar uma maneira que utilizei para disparar uma newsletter com o Symfony utilizando o “Swift”:http://swiftmailer.org . Atualmente esse processo funciona comigo para uma listagem de aprox. 10.000 emails.

Primeiramente, é preciso ter o Swift instalado. Eu utilizei o plugin “sfSwiftPlugin”:http://trac.symfony-project.com/wiki/sfSwiftPlugin

symfony plugin-install http://plugins.symfony-project.com/sfSwiftPlugin

Acesse a página do plugin para fazer os ajustes necessários

Com base num *schema.yml*:

propel:
  newsletter:
    _attributes:  { phpName: Newsletter }
    id:
    nome:         varchar(200)
    email:        varchar(200)
    ativo:        boolean
    created_at:
 

Geramos os modelos:

$ symfony propel-build-all

Vamos criar um _batch_ que irá enviar nossa newsletter. Esse comando gera o arquivo *`batch/newsletter.php`*

$ symfony init-batch default newsletter frontend

Vamos editar o *`batch/newsletter.php`*

<?php

define(‘SF_ROOT_DIR’,    realpath(dirname(__file__).‘/..’));
define(‘SF_APP’,         ‘frontend’);
define(‘SF_ENVIRONMENT’, ‘prod’); // eu uso em prod.. por default vem dev
define(‘SF_DEBUG’,       1);

require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.‘apps’.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.‘config’.DIRECTORY_SEPARATOR.‘config.php’);

// initialize database manager
$databaseManager = new sfDatabaseManager();
$databaseManager->initialize();

// batch process here

$body = "Conteúdo do email…";

$smtp = new Swift_Connection_SMTP("mail.servidor.com", 25);
$smtp->setUsername("email@servidor.com");
$smtp->setpassword("senha");
$smtp->setTimeout(60);
$swift = new Swift($smtp);

$message = new Swift_Message("Título da Newsletter", $body , "text/html" , "utf-8");        
$message->setReturnPath("bounces@servidor.com"); // o return-path é bom para pegar os bounces

// criamos a lista de emails que receberão a newsletter
$recipients = new Swift_RecipientList();

// selecionando todos os assinantes ativos
$c = new Criteria();
$c->add(NewsletterPeer::ATIVO , true);
$assinantes = NewsletterPeer::doSelect($c);

// preenchendo a lista de recipientes
foreach($assinantes as $assinante) {
    $recipients\->addTo($assinante\->getEmail());
}

// esse plugin do Swift é muito util
$swift->attachPlugin(new Swift_Plugin_AntiFlood(200), "anti-flood");

$batch = new Swift_BatchMailer($swift);
$batch->setMaxTries(2); // nmro max de tentativas
$batch->setMaxSuccessiveFailures(2); // nmro max de falhas

$batch->send($message, $recipients, new Swift_Address("email_from@servidor.com" , "Título Newsletter"));  

$swift->disconnect();

Para fazer o envio execute o arquivo dentro da pasta `batch/`

$ php newsletter.php

Se você for fazer um disparo que leve muito tempo, é aconselhável colocar o script para ser executado em background com “batch”:http://www.oreillynet.com/linux/cmd/cmd.csp?path=b/batch ou “at”:http://www.oreillynet.com/linux/cmd/cmd.csp?path=a/at

$ at -f php newsletter.php now

Em um post futuro eu mostro como fazer tudo isso sem utilizar linha de comando, ou seja executar uma action via web para executar o script e/ou colocar em background *at*.

php
swift
symfony

Comments (0)

Permalink