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've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Data Model Questions /

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

Using standard php __construct (ors) with SS DataObject


Go to End


2 Posts   2747 Views

Avatar
nicola

Community Member, 2 Posts

17 January 2011 at 5:58pm

Hey everyone,

I have been using Silverstripe full-time for over a year now and very happy with it, however I have been having a little trouble finding a solution to a surprisingly simple problem.

I want to use the standard php _construct on my DataObjects so that I can use some initialization logic in the constructor to set up the DataObject. This allows nicer and more intuitive syntax.

I want to be able to be able to do this:

foreach($orders as $order){
$completedOrder = new CompletedOrder($order);
}

I have been tying a constructor in CompletedOrder like this:

function __construct($order){
parent::__construct();
$this->$orderID;
$this->$orderBlahblah;
//etc etc
$this->write();
}

I cant seem to get the __construct to write to the db. It gets stuck in a recursive loop creating db rows.

Is there a simple elegant fix for this? It seems like it would be a really common use case. I know I could just call the method CompletedOrder::create($order) but syntactically that doesnt work as well. Now the loop looks like this:

$completedOrder = new CompletedOrder();
foreach($orders as $order){
$anotherCompletedOrder = completedOrder->create($order);
}

Does anyone know how to use __construct (ors) that write to the underlying db table of the DataObject? Any help would be much appreciated!!

Cheers

Avatar
Willr

Forum Moderator, 5523 Posts

18 January 2011 at 5:01pm

The default dataobject __construct defines a lot of functionality (take a look!) so you will need to at least call parent::__construct() as well. You should also keep the same arguments as the dataobject.php file to ensure you don't break anything.

I would potentially recommend not using __construct. Perhaps have a setOrder function.

$obj = new MyDataObject();
$obj->setOrder($order);
$obj->write();

...
function setOrder($order) {
$this->$orderID;
$this->$orderBlahblah;
}