Vista condizionale con Views Custom Fields [RISOLTO] [era: Vista condizionale basata su un campo calcolato]

8 contenuti / 0 new
Ultimo contenuto
Vista condizionale con Views Custom Fields [RISOLTO] [era: Vista condizionale basata su un campo calcolato]

Ciao,

sto provando a fare una vista condizionale come descritto qui ma per qualche ragione il valore che ottengo è sempre NULL.

Il codice che ho inserito nel campo calcolato è:

<?php
if (!$node->nid) {
node_save($node);
}
if (!
$node->field_prezzo['0']['value']) {
$node_field[0]['value'] = check_plain($node->field_prezzocopertina['0']['value']);
}
else {
$node_field[0]['value'] = check_plain($node->field_prezzo[0]['value']);
}
?>

ovviamente senza i

<?php
 
...
?>
.

Se in una pagina inserisco:

<?php
if (!$node->field_prezzo['0']['value']) {
echo
check_plain($node->field_prezzocopertina['0']['value']);
}
else {
echo
check_plain($node->field_prezzo[0]['value']);
}
?>

tutto funziona alla perfezione, mentre se inserisco il mio campo calcolato in una vista non compare nulla. Memore di precedenti esperienze ho anche provato a cambiare le righe iniziali in:

<?php
if (!$node) {
node_save($node);
}
...
?>

ma senza risultati. Avete suggerimenti?

Non usare:

<?php
 
if (!$node) {
node_save($node);
}
?>

che vuol dire se non c'è un nodo, salvalo. (Non saprei come può farlo, forse ci vuole il flag 'usa_la_fantasia'). Per il resto, sta funzionando - e anche correttamente, ma come dice la pagine del modulo (http://drupal.org/project/computed_field):
Quote:
About Computed Field

Computed Field is a very powerful CCK field module that lets you add a custom "computed fields" to your content types. These computed fields are populated with values that you define via PHP code. You may draw on anything available to Drupal, including other fields, the current user, database tables, you name it. (Feeling the power yet? :) ) You can also choose whether to store your computed field values in the database with other content fields, or have them "calculated" on the fly during node views. (Although you should note that Views use requires database stored values.) This field is literally the Swiss Army knife of CCK fields. So start cooking up your PHP based values!


La parte evidenziato - da me - dice "Per views bisogna salvare i valori nel db" Quindi per views devi salvare il risultato nel db. Presumabilmente ci sono esempi da qualche parte...E si, nella configurazione: http://drupal.org/node/149225

HTH

John

Più imparo, più dubito.

Non so darti attualmente una risposta, ma vorrei solo due spiegazioni.
1) Perchè certe volte metti ['0'] con apici e altre volte [0] senza apici?
Ad esempio $node->field_prezzo['0'] ritengo sia la componente 0 dell'array e quindi non deve essere scritta come $node->field_prezzo[0]?
Il PHP potrebbe intendere il carattere '0' e non il numero 0.
2) Chi usa l'arraya $node_field[0]['value'] sei certo che la conosca e non la ridefinisca perchè uscita dallo scope?
Ma non sarà che deve essere $node->field[0] e non $node_field[0]?

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it

enzodrup wrote:
1) Perchè certe volte metti ['0'] con apici e altre volte [0] senza apici?

Perchè sono un pasticcione, almeno quanto quello che ha scritto l'esempio. Vado subito a scrivere 100 volte "Prima di incollare bisogna controllare" :^)
enzodrup wrote:
Ma non sarà che deve essere $node->field[0] e non $node_field[0]?

Anche se non comprendo tutto quello che hai scritto ho provato ad usare l'altra forma, ma non cambia.

Penso che la strada giusta sia quella indicata da John, smanetto un poco e poi vi faccio sapere.

Un'altra alternativa sarebbe anche di cotruirimi un tpl apposta, ma non sono sicuro che sia più semplice.

jhl.verona wrote:
Non usare:
<?php
 
if (!$node) {
node_save($node);
}
?>

Però nella pagina che mi hai indicato dicono:
Quote:
If your stored field needs to access the node id, then add if (!$node->nid) node_save($node); at the start of your computed code. Otherwise the node might not yet have an nid.

Non ho ben chiaro cosa possa succedere se il nodo non ha un ID, ma non sembra bello :)
jhl.verona wrote:
Per il resto, sta funzionando - e anche correttamente, ...

Cosa intendi dire? Come hai capito che funziona?

Per quanto riguarda il salvataggio nel db è più facile di come sembrava: c'è una sezione apposita nella configurazione del campo, in cui è possibile scegliere il formato e la lunghezza del dato, e che avevo già impostato. Ho provato a smanettare un poco nei formati, che nel campo calcolato sono int, float, varchar, text e longtext mentre nella vista sono rax text, testo normale, markup e computed value. I risultati sono stati ancora un volta negativi.

Smanettando in quella sezione però mi è venuto il forte sospetto che il problema stia nella vista. Infatti nella sezione posso anche impostare un valore di default, ma anche impostandolo il risultato della vista è sempre nullo. A questo punto non so proprio più dove sbattere la testa :(

Ok, è più un workaround perchè in realtà rimane il mistero del perchè il campo calcolato non ha funzionato, ma anche questa soluzione non mi sembra male :)

In conclusione ho caricato il modulo Views Custom Field, aggiunto alla vista i due campi con cui cui devo creare la condizione, e creato un nuovo campo Customfield di tipo PHP Code con il codice:

<?php
if (!$data->node_data_field_copertina_field_prezzo_value) {
echo
'€ '. $data->node_data_field_copertina_field_prezzocopertina_value;
}
else {
echo
'€ '. $data->node_data_field_copertina_field_prezzo_value;
}
?>

Trovare i nomi delle variabili è stato semplice: ho temporaneamente inserito nel campo del codice:
<?php
print var_export($data, TRUE);
?>

ed i nomi sono comparsi nell'anteprima :)

Forse sono stato troppo frettuloso...

jimmi wrote:
jhl.verona wrote:
Non usare:
<?php
 
if (!$node) {
node_save($node);
}
?>

Però nella pagina che mi hai indicato dicono:
Quote:
If your stored field needs to access the node id, then add if (!$node->nid) node_save($node); at the start of your computed code. Otherwise the node might not yet have an nid.

Non ho ben chiaro cosa possa succedere se il nodo non ha un ID, ma non sembra bello :)

Il codice citato sopra dice "se non esiste il nodo - salvalo", il che è impossibile. Quindi non è da usare. Mentre
<?php
if (!$node->nid) {
 
node_save($node);
}
?>

dice "se il nodo non ha un nid (cioè e stato appena creato ma non ancora salvato) allora salvalo", il che è corretto, e da usare. Tutto qua.

jimmi wrote:
jhl.verona wrote:
Per il resto, sta funzionando - e anche correttamente, ...

Cosa intendi dire? Come hai capito che funziona?

Hmm. Perchè non avevo letto bene la tua domanda - scusa. Stavi dicendo che la versione echo funzionava, ma non il codice nel computed field.

jimmi wrote:
Per quanto riguarda il salvataggio nel db è più facile di come sembrava: c'è una sezione apposita nella configurazione del campo, in cui è possibile scegliere il formato e la lunghezza del dato, e che avevo già impostato. Ho provato a smanettare un poco nei formati, che nel campo calcolato sono int, float, varchar, text e longtext mentre nella vista sono rax text, testo normale, markup e computed value. I risultati sono stati ancora un volta negativi.

Smanettando in quella sezione però mi è venuto il forte sospetto che il problema stia nella vista. Infatti nella sezione posso anche impostare un valore di default, ma anche impostandolo il risultato della vista è sempre nullo. A questo punto non so proprio più dove sbattere la testa :(


Ok. Anch'io ho smanettato un pò (per scusarmi, ovvio). Ho creato un cc con il seguente codice:
Computed Code:
<?php
if (!$node->nid) {
 
node_save($node);
}
$node_field[0]['value'] = 112.34;
?>

Display Format:
<?php
 $display
= '€'. $node_field_item['value'];
?>

Data Type: float
Data Length: 5,2
Ma ho settato sia antiprima, sia Nodo completo a "Testo normale" come impostazione di base.
Il che mi sembra rappresenta (più o meno) il tuo campo - un prezzo presumibilmente in €.
Salvato la pagina, appare perfettamente in home page ed anche in una vista (frontpage).
A questo punto, tornando al tuo codice originale (un pò pulito):
<?php
if (!$node->nid) {
 
node_save($node);
}
if (!
$node->field_prezzo[0]['value']) {
 
$node_field[0]['value'] = check_plain($node->field_prezzocopertina[0]['value']);
}
else {
 
$node_field[0]['value'] = check_plain($node->field_prezzo[0]['value']);
}
?>

oltre ad osservare che se field_prezzocopertina e field_prezzo sono valori float non serve il check_plain, non so perchè non funziona... Prova togliere i check_plain

John

Più imparo, più dubito.

Dopo molti smanettamenti ho capito che il problema sta da un'altra parte, anche se non riesco a capire dove, forse un baco. So che Drupal 6 ha qualche problemino con PHP 5, e la versione che uso io è la 5.2.11 di FreeBSD compilata sulla macchina.

Nel mio tipo di contenuto ho già un campo calcolato: se ne inserisco un secondo, sia con una semplice assegnazione come hai fatto tu oppure anche con lo stesso codice del primo e li inserisco entrambi in una medesima vista il primo appare mentre il secondo è vuoto O_o

Come posso fare per tracciare il problema?