public function testDeleteCategory() { ActiveRecord::clearPool(); $startingPositions = array(); $nodes = $this->root->getChildNodes(false, true); $nodes->add($this->root); $this->root->reload(); foreach ($nodes as $category) { $startingPositions[$category->getID()] = array('lft' => $category->getFieldValue(ActiveTreeNode::LEFT_NODE_FIELD_NAME), 'rgt' => $category->getFieldValue(ActiveTreeNode::RIGHT_NODE_FIELD_NAME), 'parent' => $category == $this->root ? '0' : $category->getFieldValue(ActiveTreeNode::PARENT_NODE_FIELD_NAME)->getID()); } // new node $newCategory = Category::getNewInstance($this->root); $newCategory->setValueByLang("name", 'en', 'NEWNODE'); $newCategory->save(); // nested nodes $nestedNodes = array(); $lastNode = $newCategory; foreach (array() as $i) { $nestedNodes[$i] = Category::getNewInstance($lastNode); $nestedNodes[$i]->setValueByLang("name", 'en', 'TEST ' . rand(1, 1000)); $nestedNodes[$i]->save(); $lastNode = $nestedNodes[$i]; } $newCategory->reload(); // Delete child node $newCategory->delete(); $this->assertFalse($newCategory->isExistingRecord()); $this->assertFalse($newCategory->isLoaded()); // Check to see if everything is back to starting values $activeTreeNodes = ActiveRecord::retrieveFromPool(get_class($newCategory)); foreach ($activeTreeNodes as $category) { try { $category->reload(); } catch (ARNotFoundException $e) { continue; } if (!$category->getID()) { continue; } $this->assertEqual($category->getFieldValue(ActiveTreeNode::LEFT_NODE_FIELD_NAME), $startingPositions[$category->getID()]['lft']); $this->assertEqual($category->getFieldValue(ActiveTreeNode::RIGHT_NODE_FIELD_NAME), $startingPositions[$category->getID()]['rgt']); if (!$category->isRoot()) { $this->assertEqual($category->getFieldValue(ActiveTreeNode::PARENT_NODE_FIELD_NAME)->getID(), $startingPositions[$category->getID()]['parent']); } } }
public static function retrieveFromPool($className, $recordID = null) { if (is_object($recordID)) { $recordID = $recordID->getID(); } if (($memPool = parent::retrieveFromPool($className, $recordID)) || is_null($recordID)) { return $memPool; } $cache = self::getApplication()->getCache(); if ($cache instanceof MemCachedCache) { if ($instance = $cache->get($className . '-' . self::getRecordHash($recordID))) { $instance->storeToPool(); return $instance; } } }
/** * Delete this node with subtree * * @return bool * * @throws Exception If failed to commit the transaction */ public function delete() { $className = get_class($this); $this->load(); $t_r = $this->getFieldValue(self::RIGHT_NODE_FIELD_NAME); $t_l = $this->getFieldValue(self::LEFT_NODE_FIELD_NAME); $width = $this->getWidth(); ActiveRecordModel::beginTransaction(); try { $updates[] = "UPDATE {$className} SET " . self::RIGHT_NODE_FIELD_NAME . " = " . self::RIGHT_NODE_FIELD_NAME . " - {$width} WHERE " . self::RIGHT_NODE_FIELD_NAME . " >= {$t_r}"; $updates[] = "UPDATE {$className} SET " . self::LEFT_NODE_FIELD_NAME . " = " . self::LEFT_NODE_FIELD_NAME . " - {$width} WHERE " . self::LEFT_NODE_FIELD_NAME . " >= {$t_l}"; foreach ($updates as $update) { self::getLogger()->logQuery($update); self::getDBConnection()->executeUpdate($update); } $result = parent::delete(); ActiveRecordModel::commit(); foreach (ActiveRecord::retrieveFromPool(get_class($this)) as $instance) { if ($instance->getFieldValue(self::RIGHT_NODE_FIELD_NAME) >= $t_r) { $instance->setFieldValue(self::RIGHT_NODE_FIELD_NAME, $instance->getFieldValue(self::RIGHT_NODE_FIELD_NAME) - $width); } if ($instance->getFieldValue(self::LEFT_NODE_FIELD_NAME) >= $t_l) { $instance->setFieldValue(self::LEFT_NODE_FIELD_NAME, $instance->getFieldValue(self::LEFT_NODE_FIELD_NAME) - $width); } } } catch (Exception $e) { ActiveRecordModel::rollback(); throw $e; } $this->setID(false); $this->markAsNotLoaded(); return $result; }
public static function retrieveFromPool($className, $recordID = null) { if (is_object($recordID)) { if (!$recordID instanceof ActiveRecord) { return; } if ($recordID instanceof ARSerializableDateTime) { debug_zval_dump($recordID); } $recordID = $recordID->getID(); } if (($memPool = parent::retrieveFromPool($className, $recordID)) || is_null($recordID)) { return $memPool; } $cache = self::getApplication()->getCache(); if ($cache instanceof MemCachedCache) { if ($instance = $cache->get($className . '-' . self::getRecordHash($recordID))) { $instance->storeToPool(); return $instance; } } }