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 /

Override a function from SiteTree with a module


Reply


5 Posts   2781 Views

Avatar
John Silver

Community Member, 10 Posts

13 August 2009 at 4:15am

I'd like to override the function MetaTags from \sapphire\core\model\SiteTree.php. Of course I could just extend SiteTree with a new Page.php, but I want to make my new MetaTags available as a module.

I tried the following:
- created a new folder inside the silverstripe
- created a new "_config.php" with the following content:

DataObject::add_extension('SiteTree', 'SiteTreeExtensions');


-created a file "code/SiteTreeExtensions.php" with the following content:

class SiteTreeExtensions extends DataObjectDecorator {
   public function MetaTags($includeTitle = true) {
      $tags = "XXX";

      return $tags;
   }
}

When check the output, I still get the text from the "old" MetaTag-function.

Is it simply not possible to override functions, or am I doing it wrong?

Avatar
Martijn

Community Member, 271 Posts

15 August 2009 at 3:22pm

Maybe you can rip some code from the MetaManager:

[url]http://silverstripe.org/all-other-modules/show/265170?showPost=265210[/url]

Avatar
John Silver

Community Member, 10 Posts

18 August 2009 at 8:02pm

Thanks for the answer, I will check it out.

Avatar
Pigeon

Community Member, 243 Posts

18 August 2009 at 11:25pm

This might not at all be what you are trying to do, but it might be useful to you:

http://ssbits.com/autofill-metadescription-and-metakeywords-on-page-save/

Avatar
John Silver

Community Member, 10 Posts

19 August 2009 at 10:17pm

Pigeon: Thanks, that was not exactly what I was looking for, but the site is great and has lots of other interesting stuff.

Martijn: Great Extension, but it's also not quite what I'm looking for. I want to overwrite the "MetaTags" function so I can call "$MetaTags(0)" in my template and get the output generated by my module.

For now I solved it by overwriting the function in the controller, but I think that's not very clean. The original function is located in SiteTree, which is the model.

_config.php

   DataObject::add_extension('SiteTree', 'SiteTreeExtension');
   DataObject::add_extension('Page_Controller', 'SiteTreeExtension_Controller');

SiteTreeExtension.php

class SiteTreeExtension extends DataObjectDecorator {
   
}

class SiteTreeExtension_Controller extends Extension {

   public function MetaTags($includeTitle = true) {
      
      // Vars
      $version = SapphireInfo::Version();
      $charset = ContentNegotiator::get_encoding();
      $currentLang = i18n::convert_rfc1766(Translatable::get_current_locale());
      $lastChangedDate = date("Y-m-d\TH:i:sP", strtotime($this->owner->LastEdited));
      
      // Set Array
      $metaData = array(
         array("generator", "SilverStripe $version - http://www.silverstripe.com"),
         array("Content-type" , "text/html; charset=$charset"),
         array("keywords" , Convert::raw2att($this->owner->MetaKeywords)),
         array("description" , Convert::raw2att($this->owner->MetaDescription)),
         array("Content-Language" , $currentLang),
         array("date" , $lastChangedDate)
      );
      $tags = "";
      foreach($metaData as $metaLine) {
         $tags .= $metaLine[1] != "" ? "<meta name=\"$metaLine[0]\" content=\"$metaLine[1]\" />\n" : "";
      }
      if ($this->ExtraMeta) {
         $tags .= $this->ExtraMeta."\n";
      }
      $this->extend('updateMetaTags', $tags);
      
      $this->extend('MetaTags', $tags);
      return $tags;
   }
   

}

(Obviously far from being finished)