Buongiorno, mi trovo di fronte ad un enigma. Ho creato due tipi di contenuto: Locali ed Eventi. Ogni locale può avere più eventi e quindi ho un campo Node Reference ai Locali nel tipo di contenuto Eventi. Infine, ho creato una vista dove visualizzo la scheda del locale. Adesso mi piacerebbe che sotto la scheda locale appaiano i prossimi 5 eventi del locale interessato. Ho provato a fare qualcosa con le relazioni ma non riesco a capire l'esatto funzionamento.
Grazie..
le relazioni servono ad includere altre tabelle nelle query di views.
nel tuo caso devi aggiungere una relazione di tipo nodereference e specificare a quale campo noderef fare riferimento.
se imposti la relazione come obbligatoria, la view restituirà solo i contenuti che hanno quella relazione.
a questo punto nella lista dei campi da aggiungere dovresti trovare anche i campi del nodo a cui fai riferimento (ovvero quello a cui punta il tuo campo noderef)
Certified to Rock
Ok, funziona parzialmente.
La corretta visualizzazione della scheda del locale dovrebbe essere la seguente:
Nome Locale: Pippo
Indirizzo: Via Pippo, 1
Evento 1
Evento 2
Evento 3
Evento 4
Evento 5
..mentre la visualizzazione attuale, nonchè errata, è la seguente:
Nome Locale: Pippo
Indirizzo: Via Pippo, 1
Evento 1
Nome Locale: Pippo
Indirizzo: Via Pippo, 1
Evento 2
Nome Locale: Pippo
Indirizzo: Via Pippo, 1
Evento 3
Nome Locale: Pippo
Indirizzo: Via Pippo, 1
Evento 4
Nome Locale: Pippo
Indirizzo: Via Pippo, 1
Evento 5
..ovvero per ogni evento mi riscrive i dati del locale. Ovviamente la funzione distinct non può funzionare dato che c'è il campo Evento che cambia per ogni record.
Come devo intervenire?! Anzichè agire con una singola query, è possibile agire con 2 query differenti?
non capisco come fai a generare quei risultati.
se la view visualizza nodi di tipo "locale"
devi inserire una relazione con il campo noderef che si trova nel content type "locale"
poi nei campi inserisci il campo del type "evento" che ti interessa, il titolo suppongo.
e quello (soltanto) si deve vedere.
Certified to Rock
Nel Content Type Evento c'è un campo Node Reference che punta al Content Type Locale in modo da memorizzare il locale che terrà l'evento.
Nella vista le impostazioni sono le seguenti:
Relazioni
Contenuto: Locale (field_eve_loc) - Node reference Appears in: Evento
Argomenti
Nodo: Nid
Campi
Contenuto: Indirizzo
Nodo: Titolo
In quale di questi campi devo applicare la relazione?
aha
stai facendo il contrario.
è ovvio che se il campo noderef si trova su "evento" e tu fai una lista di campi di "locale"
la vista ti restituisce l'indirizzo del locale per ciascun record.
quello che stai cercando di fare è di elencare i referenti, non i riferiti
ovvero tutti i locali a cui si riferisce un evento.
hai diverse possibilità:
1) sposti il campo noderef da "evento" a "locale"
il che mi pare più logico visto che ci possono essere molti eventi per un locale e non molti locali per un evento
2) installi il modulo nodereferrer ed utilizzi quello per la tua relazione
nodereferrer permette di inserire i nodi referenti in un vista di riferiti
Certified to Rock
Non capisco, pensiamo la stessa cosa ma usiamo una logica diversa. Io voglio associare per ogni evento un locale e quindi molti eventi per un locale. È molto probabile che stia sbagliando io ma vorrei anche capire il perchè.
CREAZIONE DEL CAMPO NODE REFERENCE
Nel tipo di contenuto "Evento", ovvero la scheda dell'evento, ho creato il seguente campo:
Etichetta: Locale
Nome: field_eve_loc
Tipo: Node reference
Widget Type: Select list
Tipi di contenuto che possono essere usati come riferimento: Locale
In questo modo quando creo un evento ho la possibilità di associargli un unico locale.
Vorrei provare a risolvere il problema prima con Node Reference e, al massimo, proverò con il modulo che mi hai suggerito.
Non c'è nessun errore ;)
il punto è che nodereferece ha una polarità, ovvero referente->riferito
in views, questa polarità si riflette con il fatto che puoi fare una vista di nodi (o campi dei nodi) referenti ed includere campi del nodo riferito
ma NON puoi (non facilmente almeno) ottenere una lista di nodi riferiti ed includere campi dei nodi referenti.
a questo si può ovviare:
a) inserendo un campo nodereferrer nel nodo riferito in modo da generare referente<-riferito, e poi usare il campo nodereferrer come relazione in views
b)spostare il campo nodereference dal referente al riferito. nel tuo caso da evento a locale
Certified to Rock
Ok, ho capito..proverò ad utilizzare il modulo NodeReferrer e vediamo a cos'altro vado incontro.. :)
Prima che inizi a farti domande su eventuali difficoltà che riscontrerò con questo nuovo modulo, vorrei chiederti se è possibile includere una vista all'interno di un'altra vista. Intendo dire un solo argomento in input nella vista principale, che sarebbe il NID del Locale, e l'altra vista che contiene i prossimi 5 eventi del Locale. Due query differenti che in comune hanno come argomento il NID del Locale.
Che dici?? Esiste un qualcosa di simile?
views_attach mi sembra che faccia qualcosa di simile ma attenzione: di default le viste sono allegate al nodo prima del contenuto, quindi se le vuoi dopo o in altra posizione devi lòavorare sui templates o posizionando le viste con CSS.
altri moduli: view_reference
Certified to Rock
Ciao bohz,
ho letto che parli di relazioni con le viste in Drupal, ed essendo da poco che mi sono affacciato a questo CMS ti volevo esporre un problema che ho incontrato con una vista che potrebbe essere di facile soluzione.
Ti faccio un esempio, la vista creata è:
SELECT node.nid AS nid,
node_data_field_cognome.field_cognome_value AS node_data_field_cognome_field_cognome_value,
node.type AS node_type,
node.vid AS node_vid
FROM node node
LEFT JOIN content_type_prenotazione node_data_field_cognome ON node.vid = node_data_field_cognome.vid
ORDER BY node_data_field_cognome_field_cognome_value ASC
in quanto nonostante ho preso solo il campo field_cognome_value dalla tabella "content_type_prenotazione" Drupal mi referenzia anche node.
Ora il problema è che questo tipo di relazione mi prende anche valori vuoti e invece la dovrei modificare come segue levando il LEFT JOIN:
FROM node,content_type_prenotazione node_data_field_cognome
where node.vid = node_data_field_cognome.vid
Come posso fare ??
Grazie
www.LatinaInVetrina.it
mi dispiace ma dalla sola query non capisco.
non ho capito cosa vuoi ottenere
non ho capito come hai costruito la vista e il content type.
se mi descrivi meglio queste cose forse posso aiutarti
Certified to Rock
Ho creato un content-type per l'inserimento di alcuni dati utente con alcuni campi testo ed uno "attività" come select-list.
La tabella relativa è appunto content_type_prenotazione.
Poi ho creato una vista come nodo, ho scelto i campi, in questo caso per semplificare, solo cognome e ho applicato un ordinamento, quindi questa è la select che mi ha generato:
SELECT node.nid AS nid,
node_data_field_cognome.field_cognome_value AS node_data_field_cognome_field_cognome_value,
node.type AS node_type,
node.vid AS node_vid
FROM node node
LEFT JOIN content_type_prenotazione node_data_field_cognome ON node.vid = node_data_field_cognome.vid
ORDER BY node_data_field_cognome_field_cognome_value ASC
e questo il risultato
Cognome: Rossi
Cognome: Franti
Cognome: Gersi
Cognome: Portello
Cognome:
Cognome:
Cognome:
Cognome:
Cognome:
Cognome:
come puoi vedere ci sono diversi record vuoti dovuti al fatto che la select utilizza questo join:
FROM node node
LEFT JOIN content_type_prenotazione node_data_field_cognome ON node.vid = node_data_field_cognome.vid
invece di:
FROM node,content_type_prenotazione node_data_field_cognome
where node.vid = node_data_field_cognome.vid
ora potrei cliccare sull'opzione "Hide if empty" del campo cognome ma mi pare una porcata.
Vorrei modificare il join come descritto sopra.
All'inizio pensavo che drupal generasse una semplice query del tipo:
SELECT
node_data_field_cognome.field_cognome_value AS node_data_field_cognome_field_cognome_value
FROM content_type_prenotazione node_data_field_cognome
ORDER BY node_data_field_cognome_field_cognome_value ASC
non sapendo che Drupal fa riferimento all'entità node.
Spero di essere stato più preciso.
www.LatinaInVetrina.it
hide if empty è perfettamente normale. sta li apposta.
Comunque risolvi anche inserendo un filtro per il campo "cognome" = non vuoto
Poi, dovresti comunque inserire un filtro almeno per i tipi di contenuto che intendi listare.
Se vuoi costruirti una query ad hoc è meglio fare "a mano". vedi
http://api.drupal.org/api/function/db_query/6
ed altre funzioni relative in http://api.drupal.org/
un consiglio: views è un'interfaccia utente per creare e mostrare delle query, quindi ha poco senso descrivere la query quando si chiede aiuto; molto meglio descrivere le impostazioni che hai usato sull'interfaccia e, soprattutto, le condizioni di partenza e quello che vuoi ottenere.
Certified to Rock
Grazie Bohz,
ma non c'è modo di modificare il join della select con il Views ? sarebbe veramente comodo..
Invece per quanto riguarda l'utilizzo di db_query, quindi di scrivere direttamente codice Php, scusa l'ignoranza, ma dovrei riportarlo all'interno del body di un contenuto o potrei scriverlo sempre attraverso la creazione di una nuova vista ?
..porta pazienza.. :)
p.s. Accetto il tuo consiglio, ma per ora queste select sono di prova.
www.LatinaInVetrina.it