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

How to pass custom array to dataObject without updating database?


Go to End


5 Posts   1400 Views

Avatar
Valorez

Community Member, 11 Posts

5 August 2013 at 8:38pm

Edited: 05/08/2013 8:47pm

Hello!

I have a problem. I'm saving outclicks on products, to show them on the site reports section in the CMS. The only problem is, I can't seem to figure out how to pass the array to the sourceRecords() in extended SS_Report, without using a DataObject.

I tried to create a DataObject for the results, but it keeps creating new ones.

I have 2 objects/databases, 1 is the clicks where there are many ProductID's, the other one is the object/database where I pull the counted clicks, so the ProductID's there should be unique.

How can I UPDATE an object, with a specific ID, rather then it adding a new one?

I've tried using the ->write(), but that only creates a new one. Also using ->push() doesn't work. What should I do?

PS. To make it even more clear:

ProductOutclicks.php

	static $db = array(
		);
	
	public static $has_one = array(
			"Product" => "Product"
		);

----------

In between here, I collect all the above ProductOutclicks, and merge them into their respective ProductID, counting the total amount of clicks.

---------

ProductOutclickReportObject.php

static $db = array(
		"Name" => "Text",
		"Clicks" => "Int",
		"ProductsID" => "Int"
	);

Now I want to pull a specific ProductID from this object and UPDATE it, if the ProductID does not work, we add it to the DataObject.

I've tried all kinds of stuff,
->write()
->push()
custom code

Thanks in advance,
Andreas Saarva.

Avatar
martimiz

Forum Moderator, 1391 Posts

5 August 2013 at 9:04pm

$myObject>write() should update the object if you make sure $myObject->ID is set to the right ID first. If the ID is left empty, a new object is inserted.

Avatar
Valorez

Community Member, 11 Posts

5 August 2013 at 9:05pm

Edited: 05/08/2013 9:12pm

These are my 2 functions:

	static function CalculateTime($limit) {
		$period = 0;
		$temp = explode(" ",trim($limit));
		foreach($temp as $time) {
			if(strstr($time,"m")) {
				$timeMultiplier = 60; // 1 minute
			}
			else if(strstr($time,"h")) {
				$timeMultiplier = 60*60; // 1 hour
			}
			else if(strstr($time,"d")) {
				$timeMultiplier = 60*60*24; // 1 day
			}
			$period = $period + (intval($time)*$timeMultiplier);
		}
		return $period;
	}

	function sourceRecords($params, $sort, $limit) {
		$calculatedLimit = $this->CalculateTime($params['TimeRange']);
		$time = time();
		$timeFrom = $time - $calculatedLimit;
		$timeTo = $time; // Support for date ranges in later updates
		
		$dataObject = DataObject::get("ProductOutclicks","","ProductID");
		$items = array();
		
		foreach($dataObject as $do) {
			$Name = DataObject::get_by_id("Product",$do->ProductID);
			$do->setField("Name", $Name->Name);
			if(!isset($items['items'][$do->ProductID]['Clicks']) && $items['items'][$do->ProductID]['Clicks'] <= 0) {
				$items['items'][$do->ProductID]['ProductID'] = $do->ProductID;
				$items['items'][$do->ProductID]['Clicks'] = 1;
				$items['items'][$do->ProductID]['Name'] = $Name->Name;
			}
			else {
				$items['items'][$do->ProductID]['Clicks']++;
			}
		}
		
		
		// Then we save all the new statistics
		foreach($items['items'] as $id => $item) {
			$check = DataObject::get_by_id("ProductOutclickReportObject",$id);
			$check->Name = $item['Name'];
			$check->Clicks = $item['Clicks'];
			$check->ProductID = $item['ProductID'];
			$check->write();
		}

		return DataObject::get("ProductOutclickReportObject");
	}

Avatar
Valorez

Community Member, 11 Posts

5 August 2013 at 9:11pm

Fatal error: Call to undefined method stdClass::write() in /wwwsf/exam/mysite/code/ProductOutclickReport.php on line 63

It doesn't seem to like the ->write()

Avatar
Valorez

Community Member, 11 Posts

6 August 2013 at 3:33am

Solved.