Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

Customising the CMS

SS 2.4.7: Is it possible to override a class method in an extension?


Reply

2 Posts   770 Views

Avatar
memdev

5 October 2012 at 10:02pm Community Member, 3 Posts

Hi,

I want to extend SS 2.4 form fields to be able to add html5 attributes and some other stuff.
I don't want to override every form field, so I tried to adapt the createTag method from the FormField class.

Trying the following did not work:
File: MyHTML5FormField.php

<?php

class MyHTML5FormField extends FormField {

/**
* Construct and return HTML tag.
*
* @todo Transform to static helper method.
*/
public function createTag($tag, $attributes, $content = null) {

// my custom stuff here

$preparedAttributes = '';
foreach($attributes as $k => $v) {
// Note: as indicated by the $k == value item here; the decisions over what to include in the attributes can sometimes get finicky
if (!empty($v) || $v === '0' || $k == 'value') $preparedAttributes .= " $k=\"" . Convert::raw2att($v) . "\"";
}

if ($content || !in_array($tag, array('input', 'img'))) {
return "<$tag$preparedAttributes>$content</$tag>";
} else {
return "<$tag$preparedAttributes />";
}
}

}


File: _config.php

Object::useCustomClass('FormField', 'MyHTML5FormField');

Then I tried to use Extensions, which also did not work:
File: MyHTML5FormFieldExtensions.php

<?php

class MyHTML5FormFieldExtensions extends Extension {

/**
* Construct and return HTML tag.
*
* @todo Transform to static helper method.
*/
public function createTag($tag, $attributes, $content = null) {

// my custom stuff here

$preparedAttributes = '';
foreach($attributes as $k => $v) {
// Note: as indicated by the $k == value item here; the decisions over what to include in the attributes can sometimes get finicky
if (!empty($v) || $v === '0' || $k == 'value') $preparedAttributes .= " $k=\"" . Convert::raw2att($v) . "\"";
}

if ($content || !in_array($tag, array('input', 'img'))) {
return "<$tag$preparedAttributes>$content</$tag>";
} else {
return "<$tag$preparedAttributes />";
}
}

}


File: _config.php

Object::add_extension('FormField', 'MyHTML5FormFieldExtensions');

So, is it possible to do it as I tried? Or do I have to extend FormField with my own class and "re-write" every single form field and inherit it from my custom class?

thanks for your help!

Manuel

Avatar
Martin D.

25 October 2012 at 2:02am Community Member, 21 Posts

I am having the same issue at the moment so I found this article online:
http://www.webbower.com/blog/the-power-of-the-silverstripe-extension-class/

The bad news is:
"you can ADD functionality in the form of new methods, but you can't overwrite existing methods on the class you're extending."