2013-07-29 19 views
8

Jak to zrobić w szablonie? Zrobiłem to z ArrayData za pomocą klucza w pętli szablonu, aby uzyskać dostęp do wartości z szablonu, ale jeśli mam arbitralną tablicę ciągów bez kluczy, jakiej zmiennej używam, aby uzyskać dostęp do wartości?Silverstripe - Pętla nad niezespoloną tablicą w szablonie

Jeśli w moim kontrolera mam to:

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

a to z mojego szablonu:

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

Co mogę umieścić zamiast 1 dostać szablon wypluć „to jest Badanie"?

Odpowiedz

7

Zamiast tworzyć nową instancję ArrayData za każdym razem, można po prostu użyć $Me. Więc trzeba:

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

A w szablonie:

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

$Me odnosi się do bieżącego elementu w pętli. W tym przypadku będą to ciągi w tablicy.

+1

Niestety to rozwiązanie prowadzi do niespójnego zachowania w niektórych przypadkach i dlatego jest niewiarygodne. Odradzam stosowanie tego podejścia, dopóki bug nie zostanie naprawiony. Więcej informacji można znaleźć na stronie https://github.com/silverstripe/silverstripe-framework/issues/2636. – Zauberfisch

+0

Ma to znaczenie tylko wtedy, gdy chcesz uzyskać dostęp do pól. W przypadku prostych łańcuchów nie ma sensu tworzenie "ArrayData" dla każdego elementu na liście. –

13

o ile wiem, nie jest to możliwe, należy owinąć każdą pozycję do obiektu 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; 
} 

i szablonu:

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

// UWAGA: ___::create() jest new ___() na sterydach

+0

To jest złe. Owijanie ArrayData nie jest konieczne. Elementy w tablicy ArrayList mogą być prostymi tablicami asocjacyjnymi. – Neets

+1

Obawiam się, że tak nie jest. Tak, regularne tablice będą działały, jednak zdecydowanie nie zaleca się ich używania, ponieważ jest to niespójnie obsługiwane i może powodować różne lub nawet niezdefiniowane zachowanie w różnych wersjach SilverStripe. Jednym z przykładów tego, który jest nadal obecny w SilverStripe 4 alpha7, jest https://github.com/silverstripe/silverstripe-framework/issues/2636 – Zauberfisch

+1

Chociaż przyznam ci to: dla indywidualnego programisty pracującego nad poszczególnymi projektami, ten błąd najprawdopodobniej nigdy nie wystąpią, a tym samym będzie działać regularne tablice. – Zauberfisch