27 de abril de 2010

Duas instalações de Symfony no mesmo domínio sem criar subdomínios

Para conseguir ter duas instalações de Symfony no mesmo domínio sem criar subdomínios (usando directorias/pastas diferentes)


Em primeiro ligar é necessário garantir que conseguimos aceder às aplicações de forma separada e, para isso, vamos criar, por exemplo, um alias no nosso servidor (apache).


Alias /applicacao1/sf "/var/www/aplicacao1/data/web/sf"
Alias /applicacao2/sf "/var/www/aplicacao2/data/web/sf" 
Alias /applicacao1 "/var/www/aplicacao1/web"
Alias /applicacao2 "/var/www/aplicacao1/web"
 


Depois é necessário alterar o .htaccess de cada aplicação:

/var/www/aplicacao1/web/.htaccess:
# uncomment the following line, if you are having trouble
# getting no_script_name to work
RewriteBase /applicacao1


/var/www/aplicacao2/web/.htaccess:
# uncomment the following line, if you are having trouble
# getting no_script_name to work
RewriteBase /applicacao2


Mais informação aqui:

http://stackoverflow.com/questions/2148182/how-to-configure-apache-to-have-two-symfony-projects-in-the-same-domain-without

20 de abril de 2010

I18N Extract para além das path's predefinidas

php symfony i18n:extract frontend en --auto-save

Como já devem saber, esta task pesquisa por strings "i18n ready" nos nossos ficheiros .php.

Por strings "i18n ready" entenda-se chamadas à função __() do I18N Helper.

Por default, esta task pesquisa apenas nos templates e nos lib's da aplicação escolhida. Deixando por extrair as strings que estão, por exemplo, nos nossos plugins.

Para forçar a pesquisa de "i18n ready strings" noutras localizações podemos fazer uma coisa feia e desaconselhável mas que resulta...

Basta editar um ficheiro do core do symfony:
symfony/lib/i18n/extract/sfI18nApplicationExtract.class.php

public function extract()
  {
    foreach ($this->extractObjects as $extractObject)
    {
      $extractObject->extract();
    }

    // Add global templates
    $this->extractFromPhpFiles(sfConfig::get('sf_app_template_dir'));

    // Add global librairies
    $this->extractFromPhpFiles(sfConfig::get('sf_app_lib_dir'));

    // Hack: Pesquisar tambem no directorio dos plugins
    $this->extractFromPhpFiles(sfConfig::get('sf_plugins_dir'));
  }

No exemplo acima forçei a pesquisa no sf_plugins_dir.

16 de abril de 2010

CMS/CMF em Symfony

Hoje queria apresentar 3 Content Management Systems (ou Frameworks), feitos em Symfony. Confesso que apenas dei uma vista d'olhos, mas, embora todos me pareçam bastante poderosos, a simplicidade de edição do Apostrophe foi a que me agradou mais.

Apostrophe

Website: http://www.apostrophenow.com/
Demonstração (Front/Back Office): http://demo.apostrophenow.com/


Sympal

Website: http://www.sympalphp.org/
Demonstração (Front/Back Office): http://www.sympalphp.org/sympal_demo/

Diem

Website: http://diem-project.org/

Demonstração (Front Office): http://demo.diem-project.org/
Demonstração (Back Office): http://demo.diem-project.org/admin

13 de abril de 2010

I18N a sério - O URL também é para ser traduzido

Sempre li que I18N é fácil de o implementar, mas muitas vezes esquecem-se de "pormenores". Como por exemplo, questões relacionadas com o SEO como a tradução dos URL's.

Após vasculhar a web à procura de uma solução para o symfony 1.2, experimentei mais que um plugin mas este foi o que melhor funcionou uma vez que permite a criação de ficheiros routing.yml para cada culture

Para instalar usem o SVN:
cd project/plugins
svn export http://svn.symfony-project.com/plugins/ysfDimensionsPlugin/branches/1.2/ ysfDimensionsPlugin

Dicas para a sua utilização podem ser encontradas aqui:
http://svn.symfony-project.com/plugins/ysfDimensionsPlugin/branches/1.2/README

e aqui:
http://www.sadai.net/full-i18n-with-ysfdimensionsplugin

5 de abril de 2010

Função de geração slug

Ainda que o Doctrine tenha um behaviour que automaticamente gera slugs, por vezes é necessário uma função para criar uma slug, fica aqui uma exemplo:
function slugString($string, $replacement = '_')
{
  $aux = preg_quote($replacement, '/');
 
  $map = array(
    '/à|á|ã|â/' => 'a',
    '/è|é|ê|ẽ|ë/' => 'e',
    '/ì|í|î/' => 'i',
    '/ò|ó|ô|õ|ø/' => 'o',
    '/ù|ú|ũ|û/' => 'u',
    '/ç/' => 'c',
    '/ñ/' => 'n',
    '/ä|æ/' => 'ae',
    '/ö/' => 'oe',
    '/ü/' => 'ue',
    '/Ä/' => 'Ae',
    '/Ü/' => 'Ue',
    '/Ö/' => 'Oe',
    '/ß/' => 'ss',
    '/[^\w\s]/' => ' ',
    '/\\s+/' => $replacement
  );
 
  return preg_replace(array_keys($map), array_values($map), $string);
}
Retirada daqui.