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.

Data Model Questions

How to pass custom array to dataObject without updating database?


Reply

5 Posts   441 Views

Avatar
Valorez

5 August 2013 at 8:38pm (Last edited: 5 August 2013 8:47pm), Community Member, 11 Posts

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

5 August 2013 at 9:04pm Forum Moderator, 1095 Posts

$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

5 August 2013 at 9:05pm (Last edited: 5 August 2013 9:12pm), Community Member, 11 Posts

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

5 August 2013 at 9:11pm Community Member, 11 Posts

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

6 August 2013 at 3:33am Community Member, 11 Posts

Solved.