[Views] Ordinamento con Global: PHP

8 contenuti / 0 new
Ultimo contenuto
[Views] Ordinamento con Global: PHP

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.

Drupal Version:

Io al posto di intval() utilizzerei il codice PHP per ritornare un valore numerico estraenda dal campo solamente le cifre:

<?php
 
return (int)filter_var($row1->field_riferimento, FILTER_SANITIZE_NUMBER_INT);
?>

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:

<?php
 
// @file test.php
 
$var = [
   
'foo',
   
'02 foo',
   
'foo33',
   
'-44',
   
'+55',
   
'',
   
'-6 foo 6'
 
];
  foreach (
$var as $key => $value) {
    print
"<br>'$var[$key]' ---> " . (int)filter_var($value, FILTER_SANITIZE_NUMBER_INT);
  }
?>

Occhio ai numeri negativi: se devi eliminare anche il segno puoi aggiungere abs():

<?php
 abs
((int)filter_var($value, FILTER_SANITIZE_NUMBER_INT));
?>

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.

moaiamorfo wrote:
al momento non ho trovato un modo migliore oltre a utilizzare node_load: è sconsigliato?
Non lo so, avevo visto che negli esempi non viene mai utilizzato...

moaiamorfo wrote:
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).
Sembra quasi che i valori che trovi non vengano poi tenuti in considerazione per l'ordinamento della vista...

moaiamorfo wrote:
Ho letto l'issue... secondo te come potrei lavorare diversamente (magari anche utilizzando qualche altro modulo o, che so, una sorta di computed field)?
Computed field è l'alternativa a Views_php: per il codice da utilizzare in questo caso prova a dare un'occhiata qui.

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