codice php che ritorna TRUE se nel nodo visualizzato ci sono due termini particolari di tassonomia

5 contenuti / 0 new
Ultimo contenuto
codice php che ritorna TRUE se nel nodo visualizzato ci sono due termini particolari di tassonomia

ciao a tutti, se potete darmi due dritte

voglio realizzare un menù che venga visualizzato quando vengono visualizzati dei contenuti che contengono 2 termini particolari di tassonomia.

penso sia una cosa abbastanza semplice, ma sono agli inizi con drupal, mysql e php.

grazie; ettore,

Bhè, tanto semplice no, ma si può fare ;)

<?php
if(arg(0) == 'node' && arg(1) != 'add' ) {
 
// Ovviamente aggiungere i controlli per essere sicuri
  // che non cerchino di iniettare codice strano
 
$nid = arg(1);
 
// Ora devi controlare se i tuoi termini con tid1 e tid2
  // sono collegati al nodo in questione, ci sono tanti modi
  // più o meno performanti, possiamo farlo, per esempio,
  // usando le API di taxonomy:
 
$tid1 = 10;
 
$tid2 = 13;
 
// Recupero i termini legati al NID
 
$terms = taxonomy_node_get_terms($nid);
 
// Devo fare un confronto tra i termini, prima recupero tutti
  // i tid collegati al nodo
 
$value_term = array();
  foreach(
$terms as $term) {
   
$value_term = $term->tid;
  }
 
// Controllo se i termini sono presenti nell'array
 
if (in_array($tid1$value_term ) && in_array($tid2$value_term ) ) {
    return
true;
  } else {
    return
false;
  }
} else {
  return
false;
}
?>

Ci sono modi più puliti, usando altre api, ma sarebbero risultati più difficili di comprensione (credo). Questo è una linea guida, il codice l'ho scritto al volo e non testato, quindi vai delle prove e cerca di correggere i possibii errori :D

Ciao
Marco
--
My blog
Working at @agavee

ciao,
ti ringrazio per la risposta,
nel frattempo ho fatto un po' di prove,
utilizzando phpMyAdmin sono andato a vedermi i database usati da drupal
e ho provato a fare delle query; ho ottenuti del codice che funziona, ma
ho deciso di mettere su il tuo, decisamente molto più elegante

nel sito www.arthenaweb.org, ora ho messo un menù che viene visualizzato soltanto quando si selezionano contenuti con questi due tag

grazie ancora, ettore

<?php
$match
= FALSE;
if (
arg(0) == 'node' && is_numeric(arg(1))) {
 
$nid = arg(1);
//
// ottengo tid tag1
//
 
$name1       = ""Laboratorio"";
 
$query_tag1  = "SELECT tid FROM {term_data} WHERE name = ".$name1;
 
$tid1        = db_result(db_query($query_tag1));
//
// ottengo tid tag2
//
 
$name2       = ""Scrittura Creativa"";
 
$query_tag2  = "SELECT tid FROM {term_data} WHERE name = ".$name2;
 
$tid2        = db_result(db_query($query_tag2));
//
//
//
 
$query3      = "SELECT COUNT(*) FROM term_node WHERE nid = ".$nid." AND tid = ".$tid1;
 
$row1        = db_result(db_query($query3));
  if(
$row1 > 0)
  {
   
$query4      = "SELECT COUNT(*) FROM term_node WHERE nid = ".$nid." AND tid = ".$tid2;
   
$row2        = db_result(db_query($query4));
    if(
$row2 > 0)
     
$match = TRUE;
  }
}
return (
$match==TRUE);
?>

scusa, ma il codice che hai scritto è talmente pericoloso che preferisco dirtelo chiaramente, in modo che tu possa correggere gli errori (e sopratutto chi legge usi un codice più corretto), innaiztutto quando si fanno delle query, non concatenare MAI del testo, si usa db_query apposta, permette di mettere dei marker all'interno della query (%d, %s, ...) in modo che venga fatto un controllo e si eviti SQL Inectjon, quindi:

<?php
  $name1      
= ""Laboratorio"";
 
$query_tag1  = "SELECT tid FROM {term_data} WHERE name = ".$name1;
 
$tid1        = db_result(db_query($query_tag1));
?>

dovrebbe diventare:
<?php
  $name1      
= ""Laboratorio"";
 
$tid1        = db_result(db_query("SELECT tid FROM {term_data} WHERE name = '%s'", $name1));
?>

Per evitare la query, inoltre, ti consiglio di recuperare il tid a manina e inserire direttamente il tid in modo da risparmiare un pò di esecuzioen di codice inutlie, essendo fisso, infatti, il tidnon cambia mai, inoltre nel caso ci siano due termini con lo stesso nome, anche in vocabolari differenti possono esserci problemi.

Idem per Query3 e 4, ma lascio a te il compito di correggere ;)

Ciao
Marco
--
My blog
Working at @agavee

grazie, capito,
grazie del tuo tempo,
ora dedico un po del mio a tradurre un po di stringhe per la versione 6.3
ciao, ettore