Можно ли запустить функцию в переменной шаблона Silverstripe для форматирования вывода? - PullRequest
4 голосов
/ 07 февраля 2011

Я создал модель данных, которая включает в себя простое поле ввода textarea для адреса офиса. Я хотел бы сделать эквивалент nl2br($OfficeAddr) при печати данных в моем соответствующем шаблоне Silverstripe. Насколько я могу судить, их система шаблонов не поддерживает такую ​​функциональность.

Я что-то упустил? Любые рекомендуемые обходные пути?

Ответы [ 3 ]

11 голосов
/ 25 января 2013

В Silverstripe 3 этого лучше всего достичь, создав DataExtension класс (в отличие от переопределения класса).(Примечание: это было бы возможно и в 2.4.x, но код был бы совсем другим.)

Создайте новый класс с именем TextFormatter, который расширяет Extension:

class TextFormatter extends Extension { 
    public function NL2BR() {
        return nl2br($this->owner->value);
    }
}

Укажите в конфигурации, что класс Text должен быть расширен за счет вашего нового класса.Это можно сделать либо в файле _config.php, либо (предпочтительно) в файле YAML.

Если у вас его еще нет, создайте новый файл на mysite/_config/extensions.yml со следующим содержимым (или выможет добавить это к вашему существующему файлу):

Text:
  extensions:
    ['TextFormatter']

Это просто говорит "расширить класс Text классом TextFormatter", что сделает нашу новую функцию NL2BR доступной для всех Textобъекты.

Теперь в ваших шаблонах вы можете просто вызвать $OfficeAddr.NL2BR, и вывод будет проходить через вашу функцию перед выводом.

Обратите внимание, что я предположил, что ваша модель использует Text в качестве типа поля, а не HTMLText в качестве предыдущего ответа.Если вы используете HTMLText, вы можете просто расширить этот класс, изменив соответствующий файл extensions.yml.

7 голосов
/ 07 февраля 2011

ВАЖНО: Это решение применимо к SilverStripe 2.X.Если вы используете SilverStripe 3.0 - см. Ответ SS3.0 на этой странице.

Вы просто добавили бы геттер в свою модель:

public function FormattedAddress {
    return nl2br($this->OfficeAddr);
}

Затем вызовите его в своем шаблоне:

<p>$FormattedAddress</p>

ИЛИ - если вы хотите придерживаться MVC, более сложное решение будет ...

Предполагая, что вы использовали тип поля HTMLText, вы могли быРасширьте класс HTMLText:

Создайте файл с именем - Extended_HTMLText.php (или что-то подобное) - добавьте в него следующее и сохраните его в каталоге кода:

class Extended_HTMLText extends HTMLText {
    function NL2BR()    {
        return nl2br($this->value);
    }
}

Добавьте следующеев ваш файл _config.php:

Object::useCustomClass('HTMLText', 'Extended_HTMLText', true);

Затем вы можете вызвать его в своем шаблоне следующим образом:

<p>$OfficeAddr.NL2BR</p>

Это, по крайней мере, убирает вашу логику представления из вашей модели;)

1 голос
/ 11 сентября 2016

Это было исправлено в SilverStripe 3 (с мая 2013 г.), которые предшествуют всем этим ответам. Теперь, все поля базы данных Text и Varchar автоматически конвертируются с использованием nl2br().

Итак ... Если вы глупы, как я, и оказались здесь, обратите внимание, что есть вероятность, что вы на самом деле выводите поле HTMLText, но подумал , что вы использовали простой текст ( потому что, возможно, вы настроили ->getCMSFields() с TextareaField).

Надеюсь, это поможет будущим посетителям!

...