Archive for fevereiro, 2009
Facilidades para sua vida – Parte 8 – Cronjobs com cakephp
by Michael Mafort on fev.26, 2009, under CakePHP, Facilidades para sua vida, Linux, PHP
Bom pessoal, de volta a ativa, vou neste post falar um pouco sobre como utilizar tarefas agendadas utilizando o crontab do linux.
Primeiro passo, copie o arquivo webroot/index.php para cron_dispatcher.php.
No cakephp versão final 1.2.1.8004, a linha a ser editada é após a 83, que está o seguinte código:
1 2 3 | if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) { trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR); } |
Você irá substituir para:
1 2 3 4 5 6 7 8 9 10 | if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) { trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR); } else { define(‘CRON_DISPATCHER’, true); if($argc == 2) { $Dispatcher = new Dispatcher(); $Dispatcher -> dispatch($argv[1]); } } |
Assim seu script dará acesso ao seu controller através do dispatcher, utilizando o phpclient. Para executar o script utilizando o crontab, deve-se fazer o seguinte:
1 | * * * * * php -q /var/www/app/webroot/cron_dispatcher.php /products/cron/ |
Onde os asteriscos na ordem significam:
1 – Minuto (0-59)
2 – Hora (0-23)
3 – Dia (1-31)
4 – Mês (1-12)
5 – Semana (0-6)
Para que os valores repitam sempre utilize o mesmo asterisco, exemplo: para executar o script 1 vez por dia a 0h use:
1 | 0 0 * * * php -q /var/www/app/webroot/cron_dispatcher.php /products/cron/ |
“php -q” executa o arquivo passado a seguir como parametro. neste exemplo vai chamar o arquivo /var/www/app/webroot/cron_dispatcher.php (lembre de passar o caminho absoluto ao arquivo).
O parametro /products/cron/ diz que o seu dispatcher vai chamar o action cron do controller products.
Agora já esta pronto o seu crontab, é só rodar e testar.
Abraço!
Facilidades para sua vida – Parte 7 – CakePHP json encode
by Michael Mafort on fev.02, 2009, under CakePHP, Facilidades para sua vida, PHP
Bom nesta parte vamos tratar de um problema muito comum quando vamos trabalhar com ajax, utilizando json como padrão de dados. O principal problema que enfrentamos é referente ao uso de palavras acentuadas e configurações do servidor, então para livrar deste problema criei um component que transforma as informações de uma query em json.
jsonComponent.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class jsonComponent extends Object { public function encode($data){ $tmp_arr = array(); if( is_array($data) ){ foreach( $data as $key => $value ){ if( is_array($value) ){ $tmp_arr[] = "'$key':{" . $this->encode($value) . "}"; } else{ $tmp_arr[] = "'$key':'$value'"; } } } else { return "'$data'"; } return join(", ", $tmp_arr); } } |
Para utilizá-lo basta inserir em seu controller a variável:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $components = array('json'); //para converter um array em json use: function minha_funcao(){ $produtos = array('Produto'=>array( array('id'=>1, 'descricao'=> 'Carne moída', 'valor'=>10.50), array('id'=>2, 'descricao'=>'Feijão preto', 'valor'=>2.90))); $json = "{" . $this->json->encode($produtos) . "}"; echo $json; //resultado será: //{'Produto':{'0':{'id':'1', 'descricao':'Carne moída', 'valor':'10.5'}, '1':{'id':'2', 'descricao':'Feijão preto', 'valor':'2.9'}}} |
Ou você poderá criar diretamente um novo método ao seu app_model da seguinte forma:
app_model.php
1 2 3 4 5 6 7 8 | public function json($type='all', $conditions=array()){ $result = $this->find($type, $conditions); App::import("Component", "json"); $json = new jsonComponent(); return "{". $json->encode($result) ."}"; } |
Com o método no app_model, você vai chamar o seu método da seguinte forma:
1 2 3 4 5 6 7 8 9 | //Utilize a mesma sintaxe do find $meu_json = $this->MeuModel->json('all', array('conditions'=>array('MeuModel.preco < 2'), 'fields'=>array('MeuModel.id','MeuModel.descricao'))); echo $meu_json;//{'Produto':{'0':{'id':'1', 'descricao':'Carne moída', 'valor':'10.5'}, '1':{'id':'2', 'descricao':'Feijão preto', 'valor':'2.9'}}} //Lembre-se sempre de definir o header antes da saída de dados "echo" quando estiver utilizando json. //Exemplo: header('Content-Type: text/javascript'); echo $meu_json; |
No javascript para acessar os valores pode-se usar:
1 2 3 | var json = {'Produto':{'0':{'id':'1', 'descricao':'Carne moída', 'valor':'10.5'}, '1':{'id':'2', 'descricao':'Feijão preto', 'valor':'2.9'}}}; produto_um = json.Produto[0].id; // use um loop para percorrer dinamicamente todo o objeto, recomendo utilizar "for in". |
Bom espero que possa ser mais uma facilidade para vocês também.
Abraço!