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.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

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

[RESOLVED] onBeforePublish returns an error / onBeforeWrite works

Go to End

4 Posts   2916 Views


Community Member, 47 Posts

6 December 2011 at 10:08am

Edited: 06/12/2011 10:20am

I am trying to have an email sent every time a page is published. I am thinking of using onBeforePublish() for that.

To test it, I created a new page class :

class PageEmail extends Page {

function onBeforePublish() {


$subject = 'Page published '.$this->Title;

$email = new Email();
$email->setFrom( Email::getAdminEmail());



When I try to "publish" a page of this type , I get the error message :

Error: Uncaught Exception: Object->__call(): the method 'onbeforepublish' does not exist on 'PageEmail'
At line 724 in /public_html/mydomain/silverstripe/sapphire/core/Object.php

Note that if I replace "onBeforePublish" with "onBeforeWrite" in the class definition, I get the email *twice* even though the function is not in page.php.

I also noticed that the function name in the error message is all in lower cases but I don't know if this is relevant.

I am obviously doing something wrong. Could you please point me in the right direction? ( I run version 2.4 of SilverStripe )

Thank you.


Community Member, 47 Posts

7 December 2011 at 9:54am

Edited: 07/12/2011 10:00am

I don't seem to get a lot of help on this one....

For those interested, onAfterPublish() seems to work but I still don't get why onBeforePublish() does not.

Any idea? Tip? Example?



Forum Moderator, 5523 Posts

13 December 2011 at 9:42pm

Note that if I replace "onBeforePublish" with "onBeforeWrite" in the class definition, I get the email *twice* even though the function is not in page.php.

When you publish a page it requires 2 writes by the ORM.

onBeforePublish() is different from onBeforeWrite() in that onBeforePublish is a extension (mix-in) function so parent::onBeforePublish() won't refer to anything in this case. Try remove that reference and include the parameter $object as per the function call definition.


Community Member, 47 Posts

14 December 2011 at 10:34am

Edited: 14/12/2011 10:35am

Thank you Willr for resolving this mystery.

The problem was with the call to parent::onBeforePublish(). I didn't call the parent method when I tried onAfterPublish and
didn't imagine it could be the cause of the problem. Both functions have the same signature and both work in the above code ( once the call to parent::... is removed )

Maybe I should mention that I placed the function (onBeforePublish / onAfterPublish ) in the class (not in the controller) because I vaguely remember somebody on this Forum mentioning that it would not work in the Controller (sorry I didn't bookmark it)

Thanks again