Ciao a tutti,
sto provando a ordinare i risultati di una vista sulla base dei valori di un campo (Riferimento) di testo. Il campo è libero, è l'utente tipicamente immette roba del tipo "01" o "06" o "10 foo". Vorrei pescare quel valore numerico, se presente, è ordinare numericamente.
Il codice che sto usando per l'ordinamento PHP è:
return intval($row1->field_riferimento) < intval($row2->field_riferimento) ? -1 : intval($row1->field_riferimento) > intval($row2->field_riferimento);
Ma, tutto sommato, l'ordinamento pare seguire la data di pubblicazione dei nodi.
Cosa mi dite? Qualche suggerimento?
Grazie!
Saluti.
Io al posto di intval() utilizzerei il codice PHP per ritornare un valore numerico estraenda dal campo solamente le cifre:
Spero di aver reso l'idea.
Ciao
Ciao MaxSimon,
grazie mille per la tua risposta e il tuo tempo.
E se invece l'utente in quel campo immette banalmente un "foo" (senza interi, può farlo)? Cosa mi tirerebbe fuori il cast a int?
Ti ringrazio molto.
Saluti.
Ti tirerebbe fuori 0 (zero).
Puoi fare qualche prova semplicemente provando ad aggiungere qualche altro valore alla variabile $var in questo codice:
Occhio ai numeri negativi: se devi eliminare anche il segno puoi aggiungere abs():
Ciao.
Ciao MaxSimon,
grazie mille.
Al momento sto dunque utilizzando la seguente sintassi nel codice PHP per l'ordinamento:
$nodo1 = node_load($row1->nid);
$nodo2 = node_load($row2->nid);
$valore1 = (int)filter_var($nodo1->field_riferimento['und'][0]['value'], FILTER_SANITIZE_NUMBER_INT);
$valore2 = (int)filter_var($nodo2->field_riferimento['und'][0]['value'], FILTER_SANITIZE_NUMBER_INT);
if($valore1 == 0) $valore1 = 99999;
return $valore1 < $valore2 ? -1 : $valore1 > $valore2;
Come vedi, associo un valore alto alle voci che hanno delle stringhe prive di cifre (come "Grottole") per farle andare in basso nell'ordinamento. Il problema, però, è che "Grottole" me lo ritrovo un po' in mezzo, e non esattamente lì dove vorrei, ossia a fine elenco (http://www.fin-center.it/immobili/vendite/Residenziali?page=4).
Secondo te da cosa dipende?
Grazie nuovamente.
Sicuro che devi usare node_load()?
Potrebbe essere un bug del modulo: ci sono delle issues aperte in merito.
Riesci a stamparti da qualche parte i valori che trova quel codice? Magari non lavori sui dati corretti...
Ciao MaxSimon,
gentilissimo come sempre. :)
Sì, al momento non ho trovato un modo migliore oltre a utilizzare node_load: è sconsigliato?
Il codice (int)filter_var($nodo1->field_riferimento['und'][0]['value'], FILTER_SANITIZE_NUMBER_INT); in effetti mi tira fuori quanto mi aspetto (stampo il valore), ossia gli interi corrispondenti (come mi hai suggerito).
Ho letto l'issue... secondo te come potrei lavorare diversamente (magari anche utilizzando qualche altro modulo o, che so, una sorta di computed field)?
Ti saluto e ringrazio di cuore.
Il problema di fondo, secondo me, è che i valori del campo Riferimento (anche ammesso di arrivare ad uno script PHP funzionante) potrebbero portarti ad avere un ordinamento della vista non attendibile (come di fatto è ora): come stabilisci l'ordine di due campi "10 foo" e "boo10"?
Se dovessi farlo io, aggiungerei un campo al contenuto e con Rules imposterei una regola (al salvataggio/modifica del nodo) per dare un valore numerico corrispondente a ciò che l'utente ha inserito.
In questo modo la vista non dovrebbe valutare codice PHP al volo, cosa decisamente vantaggiosa per le performance.
Ciao