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.

We're retiring the forums!

The SilverStripe forums have passed their heyday. They'll stick around, but will be read only. We'd encourage you to get involved in the community via the following channels instead:

Customising the CMS /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

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


Go to End


2 Posts   1821 Views

Avatar
memdev

Community Member, 6 Posts

5 October 2012 at 10:02pm

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.

Community Member, 21 Posts

25 October 2012 at 2:02am

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."