![]() |
|
Snippets |
|
The code below shows how to enhance a base model from a custom query.
<?php /** * Subclass for representing a row from the 'md_components' table. * * * * @package lib.model */ class Navigation extends BaseNavigation { private $customAttributes = array( "isLevel", "selfFirstLevel", "hasChilds", "prevSibling", "nextSibling", "firstChild", "lastChild", "prevRoot", "nextRoot", "selfRoot" ); protected function getCustomAttributes(){ return $this->customAttributes(); } public function makeNextRoot() { $max = $this->getMaxRight(); $this->setLeftValue($max + 1); $this->setRightValue($max + 2); } public function getNavigationId(){ return $this->getComponentId(); } public function getMaxRight(){ $connection = Propel::getConnection(); $query = 'SELECT MAX(%s) AS max FROM %s'; $query = sprintf($query, NavigationPeer::TREE_RIGHT, NavigationPeer::TABLE_NAME); $statement = $connection->prepareStatement($query); $resultset = $statement->executeQuery(); $resultset->next(); return $resultset->getInt('max'); } public function getMaxLeft(){ $connection = Propel::getConnection(); $query = 'SELECT MAX(%s) AS max FROM %s'; $query = sprintf($query, NavigationPeer::TREE_LEFT, NavigationPeer::TABLE_NAME); $statement = $connection->prepareStatement($query); $resultset = $statement->executeQuery(); $resultset->next(); return $resultset->getInt('max'); } public function getRootNodes(){ $connection = Propel::getConnection(); $query = 'SELECT * FROM %s WHERE %s %s %s;'; $query = sprintf($query, NavigationPeer::TABLE_NAME, NavigationPeer::TREE_PARENT, Criteria::EQUAL, 0); $statement = $connection->prepareStatement($query); $resultset = $statement->executeQuery(); $credential = array(); foreach($resultset as $result){ $credential[$result["name"]]["component_id"] = $result["component_id"]; $credential[$result["name"]]["name"] = $result["name"]; $credential[$result["name"]]["left"] = $result["tree_left"]; $credential[$result["name"]]["right"] = $result["tree_right"]; } return $credential; } public function getTree($offset = 0, $limit = 10, $options = null){ $query = ' SELECT *, ( SELECT CONCAT(COUNT(*)) FROM md_components MA WHERE ( ( MA.TREE_LEFT < MM.TREE_LEFT AND MA.TREE_RIGHT > MM.TREE_RIGHT ) AND MA.TREE_SCOPE = MM.TREE_SCOPE ) ) AS isLevel, ( SELECT MZ4.COMPONENT_ID FROM md_components MZ4 , md_components MZ5 WHERE MZ5.TREE_LEFT BETWEEN MZ4.TREE_LEFT AND MZ4.TREE_RIGHT AND MZ5.COMPONENT_ID = MM.COMPONENT_ID ORDER BY MZ4.TREE_LEFT LIMIT 1,1 ) AS selfFirstLevel, ( SELECT IF( MB.TREE_RIGHT - MB.TREE_LEFT > 1, 1, 0) FROM md_components MB WHERE MB.COMPONENT_ID = MM.COMPONENT_ID AND MB.TREE_SCOPE = MM.TREE_SCOPE ) AS hasChilds, ( SELECT MC.COMPONENT_ID FROM md_components MC WHERE (MM.TREE_LEFT = MC.TREE_RIGHT + 1) AND MC.TREE_SCOPE = MM.TREE_SCOPE ) AS prevSibling, ( SELECT MD.COMPONENT_ID FROM md_components MD WHERE (MM.TREE_RIGHT = MD.TREE_LEFT - 1) AND MD.TREE_SCOPE = MM.TREE_SCOPE ) AS nextSibling, ( SELECT IF ( ( SELECT IF ( MQ.TREE_RIGHT - MQ.TREE_LEFT > 1, 1, 0 ) FROM md_components MQ WHERE MQ.COMPONENT_ID = MM.COMPONENT_ID AND MQ.TREE_SCOPE = MM.TREE_SCOPE ) = 1 , ME.COMPONENT_ID, NULL ) FROM md_components ME WHERE ME.TREE_LEFT = MM.TREE_LEFT + 1 AND ME.TREE_SCOPE = MM.TREE_SCOPE ) AS firstChild, ( SELECT IF ( ( SELECT IF( MS.TREE_RIGHT - MS.TREE_LEFT > 1, 1, 0 ) FROM md_components MS WHERE MS.COMPONENT_ID = MM.COMPONENT_ID AND MS.TREE_SCOPE = MM.TREE_SCOPE ) = 1 , MF.COMPONENT_ID, NULL ) FROM md_components MF WHERE MF.TREE_RIGHT = MM.TREE_RIGHT - 1 AND MF.TREE_SCOPE = MM.TREE_SCOPE ) AS lastChild, ( SELECT MX.COMPONENT_ID FROM md_components MX WHERE MX.TREE_LEFT - 1 = ( SELECT MZ.TREE_RIGHT FROM md_components MZ WHERE (MZ.TREE_RIGHT > MM.TREE_RIGHT) AND (MZ.TREE_LEFT < MM.TREE_LEFT) AND (MZ.TREE_PARENT = 0) AND MZ.TREE_SCOPE = MM.TREE_SCOPE ) ) AS nextRoot, ( SELECT MX.COMPONENT_ID FROM md_components MX WHERE MX.TREE_RIGHT + 1 = ( SELECT MZ2.TREE_LEFT FROM md_components MZ2 WHERE (MZ2.TREE_RIGHT > MM.TREE_RIGHT) AND (MZ2.TREE_LEFT < MM.TREE_LEFT) AND (MZ2.TREE_PARENT = 0) AND MZ2.TREE_SCOPE = MM.TREE_SCOPE ) ) AS prevRoot, ( SELECT MZ3.COMPONENT_ID FROM md_components MZ3 WHERE (MZ3.TREE_RIGHT > MM.TREE_RIGHT) AND (MZ3.TREE_LEFT < MM.TREE_LEFT) AND (MZ3.TREE_PARENT = 0) AND MZ3.TREE_SCOPE = MM.TREE_SCOPE ) AS selfRoot FROM md_components MM '; $query .= ' ORDER BY MM.TREE_LEFT ASC '; $query .= 'LIMIT '. $offset . ', ' . $limit; $connection = Propel::getConnection(); $statement = $connection->createStatement( ); $result = $statement->executeQuery( $query , ResultSet::FETCHMODE_NUM); $objects = NavigationPeer::populateObjects( $result ); $phpNames = NavigationPeer::getFieldNames(BasePeer::TYPE_PHPNAME); // merge custom and native attributes $additionalColumns = array_merge( $phpNames, $this->getCustomAttributes() ); foreach($result as $key => $object){ foreach($object as $column => $value){ if($column > count($phpNames)-1){ $method = $additionalColumns[$column]; $objects[$key-1]->$method = $value; } } } return $objects; } /*custom getter functions*/ public function lastChild(){ return $this->lastChild; } public function selfFirstLevel(){ return $this->selfFirstLevel; } public function firstChild(){ return $this->firstChild; } public function prevRoot(){ return $this->prevRoot; } public function nextRoot(){ return $this->nextRoot; } public function selfRoot(){ return $this->selfRoot; } public function nextSibling(){ return $this->nextSibling; } public function prevSibling(){ return $this->prevSibling; } public function isLevel(){ return $this->isLevel; } public function hasChilds(){ return $this->hasChilds; } } $columns_map = array ( 'left' => NavigationPeer::TREE_LEFT, 'right' => NavigationPeer::TREE_RIGHT, 'parent' => NavigationPeer::TREE_PARENT, 'scope' => NavigationPeer::TREE_SCOPE ); sfPropelBehavior::add('Navigation', array('actasnestedset' => array('columns' => $columns_map)));