Я создал модель данных, которая включает поле ввода обычного текстового поля для адреса офиса. Я хотел бы сделать эквивалент 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 ).
Надеюсь, это поможет будущим посетителям!