2013-07-29 8 views
8

Come si può fare all'interno di un modello? L'ho fatto con ArrayData usando la chiave nel loop dei modelli per accedere ai valori dal template, ma se ho una matrice arbitraria di stringhe senza chiavi, quale variabile devo usare per accedere ai valori?Silverstripe - In loop su array non associativo nel modello

Se nel mio controller ho questo:

public function ArrayList() 
{ 
    $ArrayList = new ArrayList(array('this', 'is', 'a', 'test')); 
    return $ArrayList; 
} 

E questo nel mio modello:

<% loop $ArrayList %>1<% end_loop %> 

Cosa ho messo al posto di 1 per ottenere il modello di sputare fuori "questo è un test"?

risposta

7

Invece di creare una nuova istanza ArrayData ogni volta, è sufficiente utilizzare $Me. Così si avrebbe:

public function ArrayList() 
{ 
    $ArrayList = new ArrayList(array('this', 'is', 'a', 'test')); 
    return $ArrayList; 
} 

E, nel modello:

<% loop $ArrayList %>$Me<% end_loop %> 

$Me si riferisce alla voce corrente nel ciclo. In questo caso, saranno le stringhe dell'array.

+1

sfortunatamente questa soluzione porta a comportamenti incoerenti in alcuni casi e quindi non è affidabile. Vi sconsigliamo di usare questo approccio fino a quando il bug non sarà stato corretto. Vedere https://github.com/silverstripe/silverstripe-framework/issues/2636 per ulteriori dettagli. – Zauberfisch

+0

Ciò conta solo se si desidera accedere ai campi. Con le stringhe diritte, non ha senso dover costruire un 'ArrayData' per ogni elemento nell'elenco. –

13

per quanto ne so questo non è possibile, è necessario avvolgere ogni elemento in un oggetto ArrayData

public function ArrayList() 
{ 
    $ArrayList = ArrayList::create(array(
     ArrayData::create(array('Text' => 'this')), 
     ArrayData::create(array('Text' => 'is')), 
     ArrayData::create(array('Text' => 'a')), 
     ArrayData::create(array('Text' => 'test')), 
    )); 
    return $ArrayList; 
} 

e il modello:

<% loop $ArrayList %>$Text<% end_loop %> 

// NOTA: ___::create() è la new ___() su steroidi

+0

Questo è sbagliato. Il wrapping ArrayData non è necessario. Gli elementi in ArrayList possono essere semplici array associativi. – Neets

+1

Ho paura che non lo sia. Sì, gli array regolari funzioneranno, tuttavia consiglio vivamente di non usarli, poiché questo è in realtà gestito in modo incoerente e potrebbe causare comportamenti diversi o addirittura indefiniti nelle diverse versioni SilverStripe. Un esempio di questo, che è ancora presente in SilverStripe 4 alpha7, è https://github.com/silverstripe/silverstripe-framework/issues/2636 – Zauberfisch

+1

Anche se ti concedo questo: per un singolo sviluppatore che lavora su singoli progetti, questo bug molto probabilmente non si verificherà mai e quindi utilizzando gli array regolari funzionerà. – Zauberfisch