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

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

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

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

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

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

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

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

 Text: extensions: ['TextFormatter'] 

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

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

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

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

Вы просто добавили getter к вашей модели:

 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> 

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

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

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

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