Páginas

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.