Silverstripe — перебор неассоциативного массива в шаблоне

Как это можно сделать внутри шаблона? Я сделал это с ArrayData, используя ключ в цикле шаблона для доступа к значениям из шаблона, но если у меня есть произвольный массив строк без ключей, какую переменную я использую для доступа к значениям?

Если в моем контроллере у меня есть это:

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

А это в моем шаблоне:

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

Что мне поставить вместо 1, чтобы шаблон выдал «это тест»?


person danbroooks    schedule 29.07.2013    source источник


Ответы (2)


Вместо того, чтобы каждый раз создавать новый экземпляр ArrayData, вы можете просто использовать $Me. Итак, у вас будет:

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

И в вашем шаблоне:

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

$Me относится к текущему элементу в цикле. В данном случае это будут строки в массиве.

person Community    schedule 28.04.2014
comment
к сожалению, это решение в некоторых случаях приводит к непоследовательному поведению и, следовательно, ненадежно. Я бы не советовал использовать этот подход, пока ошибка не будет исправлена. Подробнее см. github.com/silverstripe/silverstripe-framework/issues/2636. Детали. - person Zauberfisch; 29.04.2014
comment
Это имеет значение только в том случае, если вы хотите получить доступ к полям. С прямыми строками не имеет смысла создавать ArrayData для каждого элемента в списке. - person ; 30.04.2014

насколько я знаю, это невозможно, вам нужно обернуть каждый элемент в объект 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;
}

и шаблон:

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

// ПРИМЕЧАНИЕ: ___::create() — это new ___() на стероидах

person Zauberfisch    schedule 29.07.2013
comment
Это не правильно. Обертка ArrayData не требуется. Элементы в ArrayList могут быть простыми ассоциативными массивами. - person Neets; 21.06.2017
comment
Боюсь, это не так. Да, обычные массивы будут работать, однако я бы настоятельно не советовал их использовать, так как это на самом деле обрабатывается непоследовательно и может привести к разному или даже неопределенному поведению в разных версиях SilverStripe. Одним из примеров этого, который все еще присутствует в SilverStripe 4 alpha7, является github.com/silverstripe. /silverstripe-framework/issues/2636 - person Zauberfisch; 21.06.2017
comment
Хотя я согласен с вами: для отдельного разработчика, работающего над отдельными проектами, эта ошибка, скорее всего, никогда не возникнет, и поэтому использование обычных массивов будет работать. - person Zauberfisch; 21.06.2017