All posts by O Maior

How can I check if DKIM is configured

To check if dkim key is present in a certain domain you can use this command line tool:

dig txt <full_key_name> @<nameserver>

 

For instance:

dig txt key1._domainkey.joinyo.com @pdns01.domaincontrol.com

; <<>> DiG 9.7.3 <<>> txt key1._domainkey.joinyo.com @pdns01.domaincontrol.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57040
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;key1._domainkey.joinyo.com.    IN    TXT

;; ANSWER SECTION:
key1._domainkey.joinyo.com. 3555 IN    TXT    “k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3/ss2gtuJ8ZBXe/Byoiobcxjt ilMXW+ZJigAu0SCED7mHPBFMdiaxvElyC3BdLjzwR2PbpO+0yNdd1OJlSbVJ4wFS +DHgJLZJVMZIhTwDRbWa+AwPAKCVh+fPPRXM0ho1VO6SzlBUvJrNmxMIhXgIbumV 0CIZEHtbCYE/bhny8wIDAQAB”

;; Query time: 43 msec
;; SERVER: 216.69.185.50#53(216.69.185.50)
;; WHEN: Fri Nov  4 20:47:15 2011
;; MSG SIZE  rcvd: 285

Verificar memória ocupada numa task symfony

Quem usa objectos em PHP já se deve ter deparado com esta frase:

As of version 5.2.5, PHP is not able to garbage collect object graphs that have circular references, e.g. Parent has a reference to Child which has a reference to Parent. Since many doctrine model objects have such relations, PHP will not free their memory even when the objects go out of scope.

Ou seja, para objectos mais “complexos” nem o unset() resulta pois o PHP não consegue libertar os objectos ligados, que é o caso dos objectos model.
Nesse caso o symfony tenta dar uma ajuda com o método $meu_objecto->free().
Ou seja, para limpar:

$meu_objecto->free();
unset($meu_objecto);

Mesmo assim já tive casos em que isso não resolveu completamente e a solução foi não usar o Doctrine, outras vezes executar o ciclo um número limitado de vezes dentro do mesmo processo (task).
Para calcular o número de ciclos que o processo aguenta antes de recebntar com a memória usei este pedaço de código dentro do ciclo (de uma task) para ir vendo como evolui o consumo de memória.

//memory check
$memOld = $memNow;
$memNow = memory_get_usage();
$this->log(‘Memory usage: ‘ . $memNow . ‘ (diff=’ . ($memNow – $memOld) . ‘)';

Form Validator usando dois campos

Os Validators dos forms normalmente apenas se aplicam a um campo, mas há formas de comparar vários campos e fazer uma validação conjunta.
Neste exemplo nem sequer foi preciso criar um Custom Validator, porque a simples comparação já é possível:

class TransactionForm extends BaseTransactionForm {

public function configure() {

$this->mergePostValidator(
new sfValidatorSchemaCompare('source_id',
sfValidatorSchemaCompare::NOT_EQUAL,
'destination_id',
array(),
array('invalid' => 'Source and Destination Accounts cannot be the same.')));

}
}

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).


1
<span class="pln"><br /></span><span class="typ" style='font-family: "Courier New",Courier,monospace; font-size: small;'>Alias</span><span class="pln" style='font-family: "Courier New",Courier,monospace; font-size: small;'> </span><span class="pun" style='font-family: "Courier New",Courier,monospace; font-size: small;'>/</span><span class="pln" style='font-family: "Courier New",Courier,monospace; font-size: small;'>applicacao1</span><span class="pun" style='font-family: "Courier New",Courier,monospace; font-size: small;'>/</span><span class="pln" style='font-family: "Courier New",Courier,monospace; font-size: small;'>sf </span><span class="str" style='font-family: "Courier New",Courier,monospace; font-size: small;'>"/var/www/aplicacao1/data/web/sf"</span>


1
<span class="typ">Alias</span><span class="pln"> </span><span class="pun">/</span><span class="pln">applicacao2</span><span class="pun">/</span><span class="pln">sf </span><span class="str">"/var/www/aplicacao2/data/web/sf"</span>
1
<span class="str"> </span><span class="pln"><br /></span><span class="typ">Alias</span><span class="pln"> </span><span class="pun">/</span><span class="pln">applicacao1</span><span class="pln"> </span><span class="str">"/var/www/aplicacao1/web"</span>



1
<span class="typ">Alias</span><span class="pln"> </span><span class="pun">/</span><span class="pln">applicacao2</span><span class="pln"> </span><span class="str">"/var/www/aplicacao1/web"</span>


1
<span class="pln"><br /></span>

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

/var/www/aplicacao1/web/.htaccess:


1
<span class="com"># uncomment the following line, if you are having trouble</span><span class="pln"><br /></span><span class="com"># getting no_script_name to work</span><span class="pln"><br /></span><span class="typ">RewriteBase</span><span class="pln"> </span><span class="pun">/</span>
1
<span class="pln">applicacao1</span>

/var/www/aplicacao2/web/.htaccess:


1
<span class="com"># uncomment the following line, if you are having trouble</span><span class="pln"><br /></span><span class="com"># getting no_script_name to work</span><span class="pln"><br /></span><span class="typ">RewriteBase</span><span class="pln"> </span><span class="pun">/</span>
1
<span class="pln">applicacao2</span>

Mais informação aqui:

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

Numa listagem do admin generator criar um link para um módulo e acção diferentes

Criar o método para devolver o link, no modelo que estamos a trabalhar:

public function getArticleLink()
{
return link_to($this->getArticle()->getTitle(), 'article/edit?id='.$this->getArticleId());
}

No generator.yml colocar a entrada respectiva:

generator:
class: sfPropelAdminGenerator
param:
model_class: Comment
theme: default

fields:
id: { name: Id }
article_link: { name: Article }
author: { name: Author }
date: { name: Published on }
content: { name: Body }

list:
display: [id, article_link, date]
...

Retirado daqui:
http://vit.free.fr/symfony/0.6.3/generator.html

Criar administração com acção SHOW

Em symfony 1.2 com propel pode usar-se este plugin:

http://www.symfony-project.org/plugins/sfPropelAdminGeneratorWithShowPlugin
ou aqui:
http://symplist.net/plugins/sfPropelAdminGeneratorWithShowPlugin

No caso do symfony 1.4 com doctrine, já temos uma opção mais completa, com este plugin:

http://www.symfony-project.org/plugins/sfAdminThemejRollerPlugin

Motor de templating no symfony 2.0?

Pois é, um dos aspectos que, por um lado gostei, mas por outro lado estranhei quando comecei a trabalhar com Symfony, foi o facto de não usar nenhum mecanismo de templates adicional como acontece em muitas frameworks (motores como por exemplo Smarty).

Apesar dos mecanismos de templating tenderem a ser muito simples, o facto é que se trata de uma outra “linguagem” que é necessário aprender, daí ter achado boa ideia poder usar o PHP para fazer os templates.

Agora um dos fundadores/developers do Symfony aborda este tema de uma forma muito interessante explorando as vantagens e desvantagens desta escolha:

http://fabien.potencier.org/article/34/templating-engines-in-php

Provavelmente terei de concordar que o uso do PHP pode “complicar” alguns templates, sobretudo do ponto de vista de um Web Designer, e também pode “incentivar” o programador a fazer “asneiras” deixando-o implementar algumas tarefas que deveriam ter sido feitas no controlador ou no modelo.

Vamos ver como correm os desenvolvimentos do Twig até ao lançamento do symfony 2, mas a julgar pelo sucesso que foi a história do YAML, parece-me que a participação do Fabien neste projecto pode indiciar mais um caso de sucesso .

Inserir valores extra nos formulários antes da validação

Retirado daqui:

http://groups.google.com/group/symfony-users/browse_thread/thread/c4a90c5a140a90ed

O problema é:
- quero especificar o ACCOUNT_ID no objecto a ser editado/criado, mas sem que esse valor alguma vez passe para o utilizador sob a forma de hidden field.
- quero ainda manter o validador do formulário para garantir que esse account_id existe. Além disso quero manter o estado original no backend (admin generator)

1ª hipótese (“martelada”):
Fazer set ao validator – sfValidatorPass(), e inserir de account_id o valor no controller ou no $form->updateObject()

2ª hipótese:
Se o account_id é determinado na action, ou seja, não pode ser obtido a partir do objecto em si (nesse caso alteraria dentro do próprio ojecto),  então colocar o valor de account_id numa option do form e de seguida adicionar esse valor usando updateObject() . Como, desta forma, o account_id nunca entra no “mundo” do utilizador não há necessidade de o validar. As validações de base de dados garantem que não ocorre nenhum erro inesperado.

3ª hipótese:
Popular o objecto antes de o passar ao form, ou depois de fazer bind (antes de fazer save()). Neste caso para manter a lógica do account_id completamente fora da class form.

4ª hipótese:
Fazer merge do account_id no array que é passado ao bind. Desta forma tudo se processa como se o account_id tivesse sido submetido. Para manter a validação deve-se manter o validator e apenas fazer unset do widget.