2011-02-07 7 views
4

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

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

ответ

11

В Silverstripe 3 это было бы лучше всего достигнуто путем создания DataExtension class (в отличие от переопределения класса). (Примечание: это было бы возможно в 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

ВАЖНО: Данное решение применимо к 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> 

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

+0

Отлично, это работает для меня. Не уверен, как это работает для отдельного контента и отображения и логических людей, но они никогда не смогут победить ... Спасибо! –

+0

:) Просто добавлена ​​опция, которая придерживается MVC. Еще немного сложнее. –

1

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^