Problema desenvolvendo uma cron para uma extensão

Suporte as extensões phpBB 3.3 e 3.2
marcosfpo
Novato
Novato
Mensagens: 1
Registrado em: 18 Fev 2016, 19:09

Problema desenvolvendo uma cron para uma extensão

Mensagem por marcosfpo »

Estou desenvolvendo uma extensão (é a segunda extensão que faço e a mais complexa) para gerenciamento de colaborações, a partir da extensão phpBB Paypal Donation, do dmzx.

Em nosso fórum, que não possui fins lucrativos, uma colaboração é válida por 1 ano e após esse tempo, o colaborador sai do grupo Colaboradores e a colaboração é marcada como inativa.

Portanto, todas as colaborações são cadastradas e existe uma interface de gestão das colaborações.

Criei 2 botões: um verifica a data da colaboração e ativa e insere no grupo ou desativa e remove do grupo; o segundo botão manda mensagens privadas para os colaboradores que estão próximos do vencimento.

Tudo isso funciona.

Porém, estou com um problema na cron que faz o controle. Esta é a primeira cron que implemento.

No banco de dados, o valor de donations_check_last_gc não é atualizado pela function run, como se ela não executasse.
Mas, não dá erro nenhum e a extensão é implantada normalmente.

Ela aparece no Cron Status e se eu mando rodar, ela roda, mas não apresenta erro em tela ou no log. Não consigo entender o porquê.

Não estou usando um debbuger, pois não sei instalar e comecei a programar em php só para este pequeno projeto, que estou fazendo sem fins lucrativos. Já desenvolvi em java, vb, delphi, etc.

Alguém pode me ajudar?

Estou disposto a colocar os fontes das 2 extensões (uma já está na lista das em desenvolvimento no fórum do phpBB) aqui para uso de quem quiser.

Obrigado.

/ext/marcosfpo/donation/config/cron.yml

Código: Selecionar todos

services:
# ----- Cron tasks -----
    marcosfpo.donation.cron.donations.check:
        class: marcosfpo\donation\cron\donations_check
        arguments:
            - @config
            - @log
            - @marcosfpo.donation.admin.controller
        calls:
            - [set_name, [cron.task.donations_check]]
        tags:
            - { name: cron.task }
/ext/marcosfpo/donation/config/services.yml

Código: Selecionar todos

imports:
    - { resource: tables.yml }
    - { resource: cron.yml }
services:
    marcosfpo.donation.controller:
        class: marcosfpo\donation\controller\donation
        arguments:
            - @config
            - @controller.helper
            - @template
            - @log
            - @user
            - @dbal.conn
            - @request
            - %marcosfpo.donation.table.donation_config%
            - %marcosfpo.donation.table.donation_doles%
    marcosfpo.donation.admin.controller:
        class: marcosfpo\donation\controller\admin_controller
        arguments:
            - @config
            - @template
            - @log
            - @user
            - @dbal.conn
            - @request
            - %marcosfpo.donation.table.donation_config%
            - %marcosfpo.donation.table.donation_doles%
    marcosfpo.donation.listener:
        class: marcosfpo\donation\event\listener
        arguments:
            - @config
            - @controller.helper
            - @template
            - @user
            - @dbal.conn
            - %marcosfpo.donation.table.donation_doles%
        tags:
            - { name: event.listener }
ext/marcosfpo/donation/cron/donations_check.php

Código: Selecionar todos

<?php

namespace marcosfpo\donation\cron;

/**
 * Donation cron task.
 */
class donations_check extends \phpbb\cron\task\base
{
	protected $config;
	protected $log;
	protected $controller;

	public function __construct(\phpbb\config\config $config, \phpbb\log\log_interface $log, \marcosfpo\donation\controller\admin_controller $controller)
	{
		$this->config = $config;
		$this->log = $log;
		$this->controller = $controller;
	}
	
	protected function do_donations_check()
	{
		$begin = time();
		
		$syncary = $this->controller->do_sync_donations();
		$msgary = $this->controller->do_msg_donors();
		
		$donors = $syncary['donors'];
		$inactive = $syncary['inactive'];
		$added = $syncary['added'];
		$removed = $syncary['removed'];
		$added_list = implode(", ", $syncary['added_ary']);
		$removed_list = implode(", ", $syncary['removed_ary']);
		$messages = $msgary['messages'];
		$msg1_list = implode(", ", $msgary['msg1_ary']);
		$msg2_list = implode(", ", $msgary['msg2_ary']);
		$msg3_list = implode(", ", $msgary['msg3_ary']);
		$msg4_list = implode(", ", $msgary['msg4_ary']);
		
		$end = time();
		
		$duration = $end - $begin;
		
		$logary = array(
			$donors,
			$inactive,
			$added,
			$removed,
			$added_list,
			$removed_list,
			$messages,
			$msg1_list,
			$msg2_list,
			$msg3_list,
			$msg4_list,
			date_format($duration, "H:i:s"),
		);
			
		$this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'DONATION_CRON_LOG', time(), $logary);
	}
	
	/**
	Runs this cron task.
	*/
	public function run()
	{
		$this->do_donations_check();
		$this->config->set('donations_check_last_gc', time());
	}

	/**
	Returns whether this cron task should run now, because enough time has passed since it was last run.
	*/	
	public function should_run() 
	{
		return $this->config['donations_check_last_gc'] < time() - $this->config['donations_check_gc'];
	}

}
/ext/marcosfpo/donation/migrations/donation_schema_1_1_2.php

Código: Selecionar todos

<?php

namespace marcosfpo\donation\migrations;

class donation_schema_1_1_2 extends \phpbb\db\migration\migration
{

	static public function depends_on()
	{
		return array(
			'\marcosfpo\donation\migrations\donation_schema_1_1_1',
		);
	}
	
	public function update_data()
	{
		return array(
			array('config.update', array('mfpo_donation_version', '1.1.2')),
			array('config.add', array('donations_check_last_gc', 0, true)),
			array('config.add', array('donations_check_gc', (60 * 60 * 24))),
		);
	}
	
}
Responder