problema con hook_cron()

6 contenuti / 0 new
Ultimo contenuto
problema con hook_cron()

Ciao,
apro una nuova discussione perchè nell'altra parlavo di un problema con node_delete() ma ora cambio argomento.
Ho creato un modulo e vorrei che agisse ogni volta che eseguo il cron del sito.
Mi è stato detto che dovrei implementare la funzione hook_cron() ma non riesco proprio a trovare come si faccia.
Sono alle primissime armi con drupal e php quindi avrei bisogno di un bel tutorial o di un esempio abbastanza chiaro...
scusate la rottura!
:D

Grazie a chi risponderà!
:D

ps: questo è il mio codice:

<?php
// $Id$
/**
* @file
* Esempio minimo di un modulo per Drupal con
* l'implementazione del blocco e della sezione di help
*/
/**
* Implementazione hook_help()
*/
function testblock_help($section, $arg) {
switch (
$section) {
case
'admin/help#testblock':
return
t('Test module about blocks creation');
}
}
$node_counter="0";
//eliminazione dei vecchi nodi
$res = db_query("SELECT nid FROM {node} WHERE TYPE = '%s' 'alunno'");
while (
$data = db_fetch_array($res)) {
 
node_delete($data['nid']);
 
$node_counter++;
}
  echo
"cancellati ".$node_counter." nodi";
$db_name="content_type_alunni2";
mysql_select_db($db_name,$myconn);
$query_leggi="SELECT * FROM content_type_alunno2";
$result=mysql_query($query_leggi,$myconn);
echo
"result=".$result."</br>";
$numero_righe=mysql_num_rows($result);
for (
$i=0;$i<$numero_righe;$i++)
{
$array_result=mysql_fetch_row($result);
$id=$array_result[2];
$idagenzia=$array_result[3];
$codice=$array_result[4];
//echo $id."|".$idagenzia."|".$codice."<br>";
//creazione di un nuovo nodo (funziona)
$nodo = new StdClass();
$nodo->type = 'alunno';
$nodo->title = 'titolo';
$nodo->field_id[0]['value']=$id;
$nodo->field_idagenzia[0]['value']=$idagenzia;
$nodo->field_regione[0]['value']=$regione;
$nodo->field_provincia[0]['value']=$provincia;
node_save($nodo);
}
?>

nessuno che sa indirizzarmi ad un buon tutorial per il hook_cron()?!?
:(

Tutte le funzioni sono documentati su api.drupal.org. Io di solito faccio una ricerca per "drupal api xxx" in questo caso hook_cron mi da questo: http://api.drupal.org/api/function/hook_cron/6

Come mi l'aspettavo non prende parametri. Per creare una mia funzione devo solo sostituire 'hook' con il nome del mio modulo, quindi nel tuo caso testblock_cron().

Il tuo codice iniziando a $node_counter="0"; è al di fuori di una funzione - il che sarebbe sbagliato, o è semplicemente questo codice che vuoi mettere nel cron?

Altro osservazione, cron funzione meglio 'nel silenzio assoluto', cioè senza scrivere nessun messaggio. Usa watchdog (http://api.drupal.org/api/function/watchdog) per registrare gli errori se succedono.

Più imparo, più dubito.

Grazie,
mi hai dato un ottimo consiglio...
Quello che deve fare ad ogni cron è quello che attualmente sta tra:

$node_counter="0";
...
node_save($nodo);

cioè quello fuori dalla funzione...
dici che quindi sarebbe meglio metterlo dentro a una funzione del tipo:
nomefunzione_cron()?
Per quanto riguarda il "silenzio assoluto" avevo messo gli echo per vedere eventuali errori durante le prove, nella versione finale avevo intenzione di toglierli...
Ora comunque mi studio un pò il link che mi hai dato!
Grazie ancora!
:D

ertone wrote:
Quello che deve fare ad ogni cron è quello che attualmente sta tra:
$node_counter="0";
...
node_save($nodo);

cioè quello fuori dalla funzione...
dici che quindi sarebbe meglio metterlo dentro a una funzione del tipo:
nomefunzione_cron()?

Si, come ti ha detto John, crei l'hook_cron() e dentro ci sposti il codice che deve essere esguito

<?php
/**
 * Implementazione hook_cron()
 */
function testblock_cron() {
 
$node_counter="0";
 
//eliminazione dei vecchi nodi
 
$res = db_query("SELECT nid FROM {node} WHERE TYPE = '%s' 'alunno'");
  while (
$data = db_fetch_array($res)) {
   
node_delete($data['nid']);
   
$node_counter++;
  }
  echo
"cancellati ".$node_counter." nodi";
 
$db_name="content_type_alunni2";
 
mysql_select_db($db_name,$myconn);
 
$query_leggi="SELECT * FROM content_type_alunno2";
 
$result=mysql_query($query_leggi,$myconn);
  echo
"result=".$result."</br>";
 
$numero_righe=mysql_num_rows($result);
  for (
$i=0;$i<$numero_righe;$i++) {
   
$array_result=mysql_fetch_row($result);
   
$id=$array_result[2];
   
$idagenzia=$array_result[3];
   
$codice=$array_result[4];
   
$nodo = new StdClass();
   
$nodo->type = 'alunno';
   
$nodo->title = 'titolo';
   
$nodo->field_id[0]['value']=$id;
   
$nodo->field_idagenzia[0]['value']=$idagenzia;
   
$nodo->field_regione[0]['value']=$regione;
   
$nodo->field_provincia[0]['value']=$provincia;
   
node_save($nodo);
  }
}
 
?>

Usando cron non toglie i soliti limiti di un applicativo web (memoria e tempo). Se non prevedi di importare più di qualche centinaio di nodi, il tuo codice 'martello' potrebbe funzionare...

Ma attenzione ai delete/create - creano lo stesso nodo, ma con un id diverso. Questo crea problemi per i path alias, ma anche per gli utenti se creano un link a diciamo node/111. Va bene ora, ma al prossimo cron, darà un 404.

Se hai un identificatore univoco di qualche tipo nei dati di input (field_id?), allora se forse in te penserei di utilizzarlo di già per non cambiare dati che non è cambiato (node_load poi node_save).

Se arrivi ai limiti (memoria o tempo) dello script allora devi farlo operare in modo batch (cioè pezzettini alla volta) forse girando cron più velocemente. Dato che ci sono già parecchie ruote in giro più o meno rotondo, andrei a cercare codice già funzionante e copiare il pezzo che serve - uno dei benifici di open source.

Qualche indicazione:
http://stackoverflow.com/questions/748807/best-way-to-gather-then-import...
http://groups.drupal.org/node/21338

Più imparo, più dubito.