Cron Job?

salve a tutti,

Ho una tabella offerte = id,titolo,descrizione,data_inizio,data_fine

quando la data odierna è uguale a quella della data_fine, dovrei eliminare questo record in automatico

Essendo un novizio, ho sentito che bisogna usare un cron job, c’è qualche estensione? o comunque una strada da seguire per questo caso?

Non ti serve un cron job. Ti serve cancellare il record quando viene salvato o modificato in quel modo. Punto =). Il model di Yii fornisce degli eventi come onAfterSave. Intercetta quegli eventi e se il record risponde a determinate condizioni (come quelle delle date che tu hai indicato), lo pialli.

ma se ad esempio io inserisco un offerta con data_inizio ad esempio 2013-10-27, e la data_fin = 2013-10-31

controllando questo nell’evento afterSave… come fa ad eliminarlo, cioè controlla sempre la data odierna del server e la confronta con quella che sta scritta sul db??

Io ho fatto una prova… ma non succede nulla




public function beforeSave() {

    if ($this->isNewRecord)

        $this->data_in = new CDbExpression('NOW()');

    	$this->data_fin = new CDbExpression('NOW()');

    

 

    return parent::beforeSave();

}




	public function afterSave(){


		if ($this->data_fin == '2013-10-27')

			echo 'elimina';

		

return parent::afterSave

	}




Puoi creare un command che cancella i record scaduti, e richiamarlo con cron.

Vedi qua per creare il comando.

Ho controllato la guida e ho fatto i sueguenti passi:

directory applicazione/cron.php




<?php

// change the following paths if necessary

$yii=dirname(__FILE__).'/../framework/yii.php';

$config=dirname(__FILE__).'/protected/config/console.php';


require_once($yii);

Yii::createConsoleApplication($config)->run();


?>



protected/config/console.php




// Any writable CConsoleApplication properties can be configured here.

return array(

    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',

    'name'=>'My Console Application',


    // preloading 'log' component

    'preload'=>array('log'),

        'import'=>array(

                'application.components.*',

                'application.models.*',

        ),


    // application components

    'components'=>array(

            

        // uncomment the following to use a MySQL database        

        'db'=>array(

            'connectionString' => 'mysql:host=localhost;dbname=database',

            'emulatePrepare' => true,

            'username' => 'root',

            'password' => 'password',

            'charset' => 'utf8',

                        'enableProfiling' => true,

        ),

        

        'log'=>array(

            'class'=>'CLogRouter',

            'routes'=>array(

                array(

                    'class'=>'CFileLogRoute',

                                        'logFile'=>'cron.log',

                    'levels'=>'error, warning',

                ),

                                array(

                                        'class'=>'CFileLogRoute',

                                        'logFile'=>'cron_trace.log',

                                        'levels'=>'trace',

                                ),

            ),

                        

        ),

    ),

    

);



protected/commands/OfferteCronCommand




<?php

class OfferteCronCommand extends CConsoleCommand

{

   


    public function run($args)

    {


    	$offerte = Offerte::model()->findBySql('SELECT * FROM `Offerte` '.'WHERE `data_fin` = NOW()');


    	echo count($offerte) . " offerte found\n";


    	foreach ($offerte as $offerta) {

    		offerta->delete()

    	}

																		





    }




}    



Ho trovato un tutorial…,mah poi per farlo richiamare dal cron…,devo installare un extension?

sto provando su un server altervista,ho notato che c’era…l’opzione cronjobs, li ho inserito la directory www.miosito/applicazione/cron.php

sono questi i passi da seguire?

Per come si usa cront e crontab vedi queste guide. 1 e 2

Di solito si fa da terminale con crontab -l, cmq e’ una questione di sistema e non un problema di yii, il comando l’hai gia’ scritto

Su altervista non c’è il terminale, da quel che ricordo, ma i concetti rimangono. In pratica fissi ore, minuti, secondi, … del tuo cronjob ed indichi il file che deve essere eseguito. L’ho provato ed è interessante come soluzione per alcune tipologie di problemi.

ho provato da console con yiic nomecommando, e me lo esegue in locale, su altervista devo caricare il cron.php che poi richiama offertecron (dove c’è la query di delete da eseguire)…o deve caricare direttamente offertecron?

Prova =)