Uma area administrativa e diversos sites (One backend, many sites)

Imagine que você tenha 2~3 blogs e cada um sobre um assunto diferente. Entretanto, a estrutura deles é semelhante, ou seja, mesmos modulos, schema, etc. Acontece que, muitas das vezes um post serve tanto para um blog quanto para o outro, ou para os 3. Qual a melhor solução nesse caso? Colocar o mesmo post 3 vezes ? Não.

Aqui, mostrarei uma possível solução para essa situação.

Editar o arquivo databases.yml para suportar os respectivos bancos de dados:


# Mysql – mysql://
# Postgres – pgsql://
# SQL Server – sqlserver:// ou mssql:// # testei
# SQLite – sqlite:// – oracle://
# ODBC/JDBC – odbc:// ~ jdbc://
all:
  db_blog01:
    class:       sfPropelDatabase
    param:
      dsn:       pgsql://login:senha@host/nome_do_db1
  db_blog02:
    class:       sfPropelDatabase
    param:
      dsn:       pgsql://login:senha@host/nome_do_db2
  db_blog02:
    class:       sfPropelDatabase
    param:
      dsn:       pgsql://login:senha@host/nome_do_db3

Sendo assim, no form para criar o post do blog, coloque os 3 checkboxes dos bancos de dados em questao.


<?php echo checkbox_tag(‘blog02’, 2, false) ?>
<?php echo checkbox_tag(‘blog03’, 3, false) ?>

Receba os parametros e verifique em quais bancos será feita a inclusão do post.

$article = new Article();
$article->setTitle("Test article");
$article->setBody("Blah blah blah");

if($this->getRequestParameter("blog01")) {
    $con = Propel::getConnection(db_blog01);
    $article->save($con);
} elseif ($this->getRequestParameter("blog02")) {
    $con = Propel::getConnection(db_blog02);
    $article->save($con);
} elseif ($this->getRequestParameter("blog03")) {
    $con = Propel::getConnection(db_blog03);
    $article->save($con);
}

Caso queira compartilhar imagens, uma solução é utilizar o tipo de campo BLOB. O propel até hoje funcionou bem com BLOB e base Postgres 8.