¿Es posible ejecutar una función en una variable de plantilla Silverstripe para formatear la salida?

Creé un modelo de datos que incluye un campo de entrada de texto simple para una dirección de oficina. Me gustaría hacer el equivalente de nl2br($OfficeAddr) al imprimir los datos en mi plantilla Silverstripe relevante. Por lo que puedo decir, su sistema de plantillas no admite tal funcionalidad.

¿Me estoy perdiendo de algo? ¿Alguna solución alternativa recomendada?

En Silverstripe 3 esto se lograría mejor creando una clase DataExtension (en lugar de anular la clase). (Nota: esto también sería posible en 2.4.x, pero el código sería bastante diferente).

Crea una nueva clase llamada TextFormatter que extiende la Extension :

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

Especifique en configuración que la clase de Text debería extenderse con su nueva clase. Esto se puede hacer en su archivo _config.php o (preferiblemente) en un archivo YAML.

Si aún no tiene uno, cree un nuevo archivo en mysite/_config/extensions.yml con el siguiente contenido (o puede agregarlo a su archivo existente):

 Text: extensions: ['TextFormatter'] 

Esto simplemente dice “extender el Text de la clase con la clase TextFormatter “, lo que hará que nuestra nueva función NL2BR esté disponible en todos los objetos de Text .

Ahora, en sus plantillas, simplemente puede llamar a $OfficeAddr.NL2BR y la salida se ejecutará a través de su función antes de salir.

Tenga en cuenta que he supuesto que su modelo utiliza el Text como el tipo de campo en lugar de HTMLText como una respuesta anterior ha asumido. Si está utilizando HTMLText , simplemente puede ampliar esa clase cambiando su archivo extensions.yml según corresponda.

IMPORTANTE: esta solución es aplicable a SilverStripe 2.X. Si está utilizando SilverStripe 3.0, consulte la respuesta de SS3.0 en esta página.

Simplemente agregará un getter a su modelo:

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

Luego llámalo en tu plantilla:

 

$FormattedAddress

O bien , si desea adherirse a MVC, la solución más compleja es …

Suponiendo que haya usado el tipo de campo HTMLText, podría extender la clase HTMLText:

Cree un archivo llamado – Extended_HTMLText.php (o algo similar) – agregue lo siguiente a él y guárdelo en su directorio de códigos:

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

Agregue lo siguiente a su archivo _config.php:

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

Entonces puedes llamarlo en tu plantilla así:

 

$OfficeAddr.NL2BR

Esto al menos saca su lógica de vista de su modelo;)

Esto se ha solucionado en SilverStripe 3 (desde mayo de 2013), que todas estas respuestas son anteriores. Avanzando ahora, todos los campos de la base de datos Text y Varchar se convierten automáticamente utilizando nl2br() .

Así que … Si eres tonto como yo y terminaste aquí, ten en cuenta que existe la posibilidad de que realmente estés emitiendo un campo HTMLText pero pensaste que estabas usando texto sin formato (porque tal vez configuraste ->getCMSFields() con un TextareaField ).

¡Espero que esto ayude a los futuros visitantes!