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