2013-04-03 12 views
6

Diciamo che mostrare una dichiarazione casuale per ogni richiesta della pagina e utilizzare una funzione per restituire un oggetto casuale come:oggetto a caso per ogni richiesta di pagina con SilverStripe

Statement::get()->sort("RAND()")->limit("1"); 

Ma ora nel modello a cui fare riferimento due volte in posti diversi ma dovrebbe essere la stessa affermazione e non una a caso diversa. Come faresti ad assicurarti di ottenere lo stesso oggetto casuale per ogni richiesta di pagina?

+2

chi ha downvoted questo, si prega di lasciare un commento perché hai fatto? la domanda mi sembra chiara, in aumento di valore di – schellmax

+2

Questa era una domanda * reale *. Non mi piace molto questo atteggiamento "chiudiamolo" ... – ntd

risposta

4

Che ne dici di definire una funzione con una variabile statica che ricorda l'oggetto?

public function rndObj() { 
    static $obj = null; 
    if(!isset($obj)){ 
     $obj = Statement::get()->sort("RAND()")->limit("1")->first(); 
    } 
    return $obj; 
} 

e quindi utilizzare rndObj nel modello.

+0

thx ma questo ancora restituisce un oggetto casuale e non lo stesso se lo chiami due volte nella stessa richiesta – munomono

+0

@munomono Hai posto la definizione di 'rndObj' nella pagina controllore? Funziona per me (testato usando SilverStripe 2.4) –

+0

Sono su sstr3. Non fa differenza se inserisco la funzione nel controller o nel modello. La dichiarazione ha una foto e una testimonianza ma non corrispondono ancora. – munomono

1

Un modo per eseguire questa operazione è recuperare l'istruzione casuale nella funzione controller init e assegnarla a una variabile privata. Aggiungiamo una funzione getRandomStatement per recuperare l'istruzione random:

class Page_Controller extends ContentController { 

    private $randomStatement; 

    public function init() { 
     parent::init(); 

     $this->randomStatement = Statement::get()->sort('RAND()')->limit(1)->first(); 
    } 

    public function getRandomStatement() { 
     return $this->randomStatement; 
    } 
} 
+0

Per quanto posso vedere questo dovrebbe funzionare ma personalmente preferisco la soluzione di @Terje D. -> completata la risposta in base ai commenti. – munomono

+0

Freddo. Vuoi contrassegnare la risposta di @ Terje come accettata? – 3dgoo

+0

dohhh ha votato il tuo 1 su, ma non ha notato che non l'ho mai contrassegnato come risolto - thx;) – munomono