Notifica nuovo campo in una vista

11 contenuti / 0 new
Ultimo contenuto
Notifica nuovo campo in una vista

Ciao a tutti, ho il seguente problema:
Ogni utente del mio sito, attraverso un'apposita vista, puo vedere tutti i contenuti creati dai propri amici. Ora io vorrei sapere se esiste qualche funzione di views o nel caso come si puo fare ad avvisare l'utente che uno dei suoi amici ha creato un nuovo contenuto. Pensavo di mettere un blocco con un controllo in php che facesse piu o meno questo: (pseudo-codice)

if( "vista ha nuovo campo")
print " un amico ha aggiunto un nuovo contenuto"
else
print "non hai notifiche da leggere"

nessuno mi puo aiutare?

vorrei fare il controllo tramite query, qualcuno sa come sapere se dato un uid c'è un commento non letto?

Ciao supergnomo,
ho visto nel sito api.drupal che ci sono delle funzioni che richiamano i commenti, io non le ho mail utilizzate quindi non posso darti delle dritte, bisogna che provi un po e verifichi quella che fa al caso tuo.

Trovi le funzioni comment qui: http://api.drupal.org/api/drupal/functions/6?page=4

Ad esempio forum.module utilizza questo codice con la funzione comment_num_new:

$history = _forum_user_last_visit($topic->nid);
$topic->new_replies = comment_num_new($topic->nid, $history);

Bisogna studiarci su un po, quindi se non riesci fammelo sapere. Ciao

OK perfetto!! grazie mille, come sempre di ottimo aiuto. Ora funziona per i commenti, adesso provo a riscrivere una funzione simile a comment_num_new affinchè mi restituisca anche quanti nodi nuovi sono stati creati e non sono ancora stati visitati

ho provato a scrivere questa parte di codice per far si che mi scriva se un utente ha creato un nuovo contenuto

//premetto che $sql contiene il risultato di una query che restituisce particolari nid ed è testata funzionante
$bool=0
while($row = db_fetch_array($sql)){
$nid = $row['nid'];
$timestamp = node_last_viewed($nid);
$timestamp = ($timestamp > NODE_NEW_LIMIT ? $timestamp : NODE_NEW_LIMIT);
if( db_result(db_query("SELECT COUNT(*) FROM {history} WHERE nid = %d AND timestamp > %d", $nid, $timestamp)) )
$bool=1;
}
if($bool)
print "un utente ha creato un nuovo contenuto";
else
print "non hai nuovi contenuti da visitare";

Però una volta inserito nel page.tpl funziona parzialmente. Cioè se sono su una pagina qualunque appena un utente crea un nuovo contenuto, mi appare "un utente ha creato un nuovo contenuto" quando lo visito il nodo e torno su una pagina qualunque mi scrive giustamente "non hai nuovi contenuti da visitare" fin qui tutto bene però se poi torno sul nodo "nuovo" mi riappare "un utente ha creato un nuovo contenuto" ma riscompare quando vado in altri nodi. Praticamente funziona sempre, tranne quando rivado sull'ultimo nodo creato. Com'è possibile? Dove sbaglio?

Ciao, sai non ho capito bene il codice perchè non mi dai la query $sql, comunque probabilmente ti serve questo codice che ho trovato in drupal e modificato un pochino. L'ho testato nel file page.tpl.php e ritorna un messaggio nuovo contenuto fino a quando il tempo è passato seconto la funzione riportata.

<?php
function my_node_mark($nid, $timestamp) {
  global
$user;
  static
$cache;
  if (!
$user->uid) {
    return
MARK_READ;
  }
  if (!isset(
$cache[$nid])) {
   
$cache[$nid] = node_last_viewed($nid);
  }
  if (
$cache[$nid] == 0 && $timestamp > NODE_NEW_LIMIT) {
    return
MARK_NEW;
  }
  elseif (
$timestamp > $cache[$nid] && $timestamp > NODE_NEW_LIMIT) {
    return
MARK_UPDATED;
  }
  return
MARK_READ;
}
/* controlla gli ultimi 30 contenuti in ordine di changed
 è possibile testare anche ORDER BY created
*/
$sql = db_query("SELECT nid,changed FROM {node} ORDER BY changed DESC LIMIT 0,30");
$bool="";
$marknew=0;
$markupdate=0;
while (
$node = db_fetch_object($sql)) {
   
//la funzione ritorna un valore immagazzinato in $bool
   
$bool = my_node_mark($node->nid, $node->changed);
   
//se il contenuto è nuovo incrementa la viariabile marknew
   
if(MARK_NEW AND $bool>1) $marknew++;
   
//se il contenuto è aggiornato incrementa la viariabile markupdate
   
if(MARK_UPDATED AND $bool>1) $markupdate++;
   
//è possibile aggiungere opzioni perchè la funzione ritorna anche MARK_READ
   
$bool=0;
}
if(
$marknew>0)
print
"Un utente ha creato un nuovo contenuto  ";
else
print
"Non hai nuovi contenuti da visitare  ";
if(
$markupdate>0)
print
"Un utente ha aggiornato un nuovo contenuto  ";
else
print
"Non hai contenuti aggiornati da visitare  ";
?>

Ciao alla prossima

grazie mille per la risposta, ora provo un po.

Comunque $sql la ottengo cosi: (pensavo non fosse importante)

$sql = db_query('SELECT nid FROM {node} WHERE type="tipo"');

ciao Danzisi, ho provato la tua soluzione solo che la funzione my_node_mark($node->nid, $node->changed); mi da errore, non caricando tutto il codice sotto questa funzione.. Da anche a te qualche problema? Questa funzione l'hai definita tu o è una funzione standard di Drupal? Grazie!

Ciao, la funzione node_mark($nid, $timestamp) è in node.module alla riga 201. Io sopra ti ho mostrato un esempio di come si può ottenere in page.tpl.php L'ho testato nel file page.tpl.php !

Ora tu puoi cambiare la stringa sql ma diventa:

//ad esempio per il tipo story
$tiponoodo = "story";
$sql = db_query("SELECT nid,changed FROM {node} ORDER BY changed WHERE type='%s' DESC LIMIT 0,30", $tiponoodo);
//oppure
$sql = db_query("SELECT nid,changed FROM {node} ORDER BY changed WHERE type='story' DESC LIMIT 0,30");

Quindi my_node_mark($nid, $timestamp) è una funzione messa in page.tpl e richiamata con $bool = my_node_mark($node->nid, $node->changed);

a me funziona. L'importante che ti è chiaro cosa fa la funzione (in effetti è un po complessa e difficile). Prova il mio codice e vedrai che funziona

Ciao

@supergnomo: hai provato ad utilizzare il campo "has new content" in views?