_orderingKey = $key; // $this->_orderable = 1; // $this->_autoOrdering = $auto; // $this->$key = 0; // } function setSecondaryKey($key,$keyForm=0){ $this->_skey = $key; $this->$key = array(); $this->_skeyForm = empty($keyForm)? $key:$keyForm; } function setOrderableFormname($orderAbleFormName){ $this->_okeyForm = $orderAbleFormName; } /** * swap the ordering of a record in the Xref tables * @param $direction , 1/-1 The increment to reorder by */ function move($direction, $where='', $orderingkey=0) { if(empty($this->_skey) ) { vmError( 'No secondary keys defined in VmTableXarray '.$this->_tbl ); return false; } $skeyId = vRequest::getInt($this->_skey, 0); // Initialize variables $db = JFactory::getDBO(); $cid = vRequest::getInt( $this->_pkey ); $order = vRequest::getInt( 'order' ); //I found now two times "order" instead of ordering. //This sql is broken $query = 'SELECT `id` FROM `' . $this->_tbl . '` WHERE '.$this->_pkey.' = '.(int)$cid[0].' AND `virtuemart_category_id` = '.(int)$skeyId ; $db->setQuery( $query ); $id = $db->loadResult(); $keys = array_keys($order); // TODO next 2 lines not used ???? if ($direction >0) $idToSwap = $order[$keys[array_search($id, $keys)]+1]; else $idToSwap = $order[$keys[array_search($id, $keys)]-1]; if (isset( $cid[0] )) { $query = 'UPDATE `'.$this->_tbl.'` ' . ' SET `'.$this->_orderingKey.'` = `'.$this->_orderingKey.'` + '. $direction . ' WHERE `'.$this->_pkey.'` = ' . (int)$cid[0]. ' AND `'.$this->_skey.'` = ' . (int)$skeyId ; $db->setQuery( $query ); if (!$db->execute()) { $err = $db->getErrorMsg(); JError::raiseError( 500, get_class( $this ).':: move '. $err ); } } } /** * Records in this table are arrays. Therefore we need to overload the load() function. * TODO, this function is giving back the array, not the table, it is not working like the other table, so we should change that * for the 2.2. at least. * @author Max Milbers * @param int $id */ function load($oid=null,$overWriteLoadName=0,$andWhere=0,$tableJoins= array(),$joinKey = 0){ if(empty($this->_skey) ) { vmError( 'No secondary keys defined in VmTableXarray '.$this->_tbl ); return false; } $pkey = $this->_pkey; $this->$pkey = $oid; if(empty($db)) $db = JFactory::getDBO(); if($this->_orderable){ $orderby = 'ORDER BY `'.$this->_orderingKey.'`'; } else { $orderby = ''; } $hash = md5((int)$oid. $this->_skey . $this->_tbl . $this->_pkey . $orderby); if (!isset (self::$_cache['ar'][$hash])) { $q = 'SELECT `'.$this->_skey.'` FROM `'.$this->_tbl.'` WHERE `'.$this->_pkey.'` = "'.(int)$oid.'" '.$orderby; $db->setQuery($q); $result = $db->loadColumn(); if(!$result){ //vmError(get_class( $this ).':: load' ); self::$_cache['ar'][$hash] = false; } else { if(empty($result)) $result = array(); if(!is_array($result)) $result = array($result); self::$_cache['ar'][$hash] = $result; } } $skey = $this->_skey; $this->$skey = self::$_cache['ar'][$hash]; return self::$_cache['ar'][$hash]; } /** * This binds the data to this kind of table. You can set the used name of the form with $this->skeyForm; * * @author Max Milbers * @param array $data */ public function bind($data, $ignore = array()){ if(!empty($data[$this->_pkeyForm])){ $this->_pvalue = $data[$this->_pkeyForm]; } if(!empty($data[$this->_skeyForm])){ $this->_svalue = $data[$this->_skeyForm]; } if($this->_orderable){ $orderingKey = $this->_orderingKey; if(!empty($data[$orderingKey])){ $this->$orderingKey = $data[$this->_orderingKey]; } } return true; } /** * * @author Max Milbers, George Kostopoulos * @see libraries/joomla/database/JTable#store($updateNulls) */ public function store($updateNulls = false) { $returnCode = true; $this->setLoggableFieldsForStore(); $db = JFactory::getDBO(); $pkey = $this->_pkey; $skey = $this->_skey; $tblkey = $this->_tbl_key; // We select all database rows based on our _pkey $q = 'SELECT * FROM `'.$this->_tbl.'` WHERE `'.$this->_pkey.'` = "'. $this->_pvalue.'" '; $db->setQuery($q); $objList = $db->loadObjectList(); // We convert the database object list that we got in a more friendly array $oldArray = null; if($objList) { foreach($objList as $obj){ $oldArray[] = array($pkey=>$obj->$pkey, $skey=>$obj->$skey); } } // We make another database object list with the values that we want to insert into the database $newArray = array(); if(!empty($this->_svalue)){ if(!is_array($this->_svalue)) $this->_svalue = array($this->_svalue); foreach($this->_svalue as $value) $newArray[] = array($pkey=>$this->_pvalue, $skey=>$value); } // Inserts and Updates if(count($newArray)>0){ $myOrdering = 1; foreach ($newArray as $newValue) { // We search in the existing (old) rows to find one of the new rows we want to insert $result = $this->array_msearch($oldArray, $newValue); // We start creating the row we will insert or update $obj = new stdClass; $obj->$pkey = $newValue[$pkey]; $obj->$skey = $newValue[$skey]; if($this->_autoOrdering){ $oKey = $this->_orderingKey; $obj->$oKey = $myOrdering++; } // If the new row does not exist in the old rows, we will insert it if( $result === false ) { $returnCode = $db->insertObject($this->_tbl, $obj, $pkey); } else { // If the new row exists in the old rows, we will update it $obj->$tblkey = $objList[$result]->$tblkey; $returnCode = $db->updateObject($this->_tbl, $obj, $tblkey); } } } else { // There are zero new rows, so the user asked for all the rows to be deleted $q = 'DELETE FROM `'.$this->_tbl.'` WHERE `' . $pkey.'` = "'. $this->_pvalue .'" '; $db->setQuery($q); if(!$db->execute()){ $returnCode = false; vmError(get_class( $this ).':: store '.$db->getErrorMsg()); } } // Deletions if(!empty($oldArray)) { for ($i = 0; $i < count($oldArray); $i++) { $result = $this->array_msearch($newArray, $oldArray[$i]); // If no new row exists in the old rows, we will delete the old rows if( $result === false ) { // If the old row does not exist in the new rows, we will delete it $q = 'DELETE FROM `'.$this->_tbl.'` WHERE `' . $tblkey.'` = "'. $objList[$i]->$tblkey .'" '; $db->setQuery($q); if(!$db->execute()){ $returnCode = false; vmError(get_class( $this ).':: store'.$db->getErrorMsg()); } } } } return $returnCode; } /** * * Searches in an array of arrays to find a specific array we want * * @author George Kostopoulos * @param source array of arrays that we will search * @param the target array we want to find */ protected function array_msearch($parents, $searched) { if (empty($searched) || empty($parents)) { return false; } foreach ($parents as $key => $value) { $exists = true; foreach ($searched as $skey => $svalue) { $exists = ($exists && IsSet($parents[$key][$skey]) && $parents[$key][$skey] == $svalue); } if($exists){ return $key; } } return false; } function deleteRelation(){ $db = JFactory::getDbo(); $q = 'DELETE FROM `'.$this->_tbl.'` WHERE `'.$this->_pkey.'` = "'. $this->_pvalue.'" '; $db->setQuery($q); if(!$db->execute()){ vmError(get_class( $this ).':: store'.$db->getErrorMsg(),'Couldnt delete relations'); return false; } return true; } }