Changeset 6973
- Timestamp:
- 01/06/08 11:15:51 (1 year ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/1.1/lib/plugins/sfPropelPlugin/lib/propel/sfPropelData.class.php
r6970 r6973 22 22 { 23 23 protected 24 $maps = array(),25 24 $deletedClasses = array(), 26 25 $con = null; 27 26 28 // symfony load-data (file|dir)29 27 /** 30 28 * Loads data from a file or directory into a Propel data source … … 38 36 { 39 37 $fixture_files = $this->getFiles($directory_or_file); 38 39 // load map classes 40 $this->loadMapBuilders(); 41 $this->dbMap = Propel::getDatabaseMap($connectionName); 40 42 41 43 // wrap all database operations in a single transaction … … 81 83 $peer_class = $class.'Peer'; 82 84 83 // load map class 84 $this->loadMapBuilder($class); 85 86 $tableMap = $this->maps[$class]->getDatabaseMap()->getTable(constant($peer_class.'::TABLE_NAME')); 85 $tableMap = $this->dbMap->getTable(constant($peer_class.'::TABLE_NAME')); 87 86 88 87 $column_names = call_user_func_array(array($peer_class, 'getFieldNames'), array(BasePeer::TYPE_FIELDNAME)); … … 112 111 foreach ($data as $name => $value) 113 112 { 113 // will need to be updated for Propel 1.3 114 if (is_array($value) && 's' == substr($name, -1)) 115 { 116 // many to many relationship 117 $this->loadMany2Many($obj, substr($name, 0, -1), $value); 118 119 continue; 120 } 121 114 122 $isARealColumn = true; 115 123 try … … 127 135 if ($column->isForeignKey() && !is_null($value)) 128 136 { 129 $relatedTable = $this-> maps[$class]->getDatabaseMap()->getTable($column->getRelatedTableName());137 $relatedTable = $this->dbMap->getTable($column->getRelatedTableName()); 130 138 if (!isset($this->object_references[$relatedTable->getPhpName().'_'.$value])) 131 139 { 132 140 throw new sfException(sprintf('The object "%s" from class "%s" is not defined in your data file.', $value, $relatedTable->getPhpName())); 133 141 } 134 $value = $this->object_references[$relatedTable->getPhpName().'_'.$value] ;142 $value = $this->object_references[$relatedTable->getPhpName().'_'.$value]->getPrimaryKey(); 135 143 } 136 144 } … … 151 159 $obj->save($this->con); 152 160 153 // save the idfor future reference161 // save the object for future reference 154 162 if (method_exists($obj, 'getPrimaryKey')) 155 163 { 156 $this->object_references[$class.'_'.$key] = $obj->getPrimaryKey(); 157 } 158 } 164 $this->object_references[$class.'_'.$key] = $obj; 165 } 166 } 167 } 168 } 169 170 /** 171 * Loads many to many objects. 172 * 173 * @param BaseObject A Propel object 174 * @param string The middle table name 175 * @param array An array of values 176 */ 177 protected function loadMany2Many($obj, $middleTableName, $values) 178 { 179 $middleTable = $this->dbMap->getTable($middleTableName); 180 $middleClass = $middleTable->getPhpName(); 181 foreach ($middleTable->getColumns() as $column) 182 { 183 if ($column->isPrimaryKey() && $column->isForeignKey() && constant(get_class($obj).'Peer::TABLE_NAME') != $column->getRelatedTableName()) 184 { 185 $relatedClass = $this->dbMap->getTable($column->getRelatedTableName())->getPhpName(); 186 break; 187 } 188 } 189 190 if (!isset($relatedClass)) 191 { 192 throw new sfException(sprintf('Unable to find the many-to-many relationship for object "%s"', get_class($obj))); 193 } 194 195 $setter = 'set'.get_class($obj); 196 $relatedSetter = 'set'.$relatedClass; 197 198 foreach ($values as $value) 199 { 200 if (!isset($this->object_references[$relatedClass.'_'.$value])) 201 { 202 throw new sfException(sprintf('The object "%s" from class "%s" is not defined in your data file.', $value, $relatedClass)); 203 } 204 205 $middle = new $middleClass(); 206 $middle->$setter($obj); 207 $middle->$relatedSetter($this->object_references[$relatedClass.'_'.$value]); 208 $middle->save(); 159 209 } 160 210 } … … 215 265 216 266 /** 217 * Loads the mappings for the classes 218 * 219 * @param string The model class name 267 * Loads all map builders. 220 268 * 221 269 * @throws sfException If the class cannot be found 222 270 */ 223 protected function loadMapBuilder($class) 224 { 225 $mapBuilderClass = $class.'MapBuilder'; 226 if (!isset($this->maps[$class])) 227 { 228 if (!$classPath = sfAutoload::getInstance()->getClassPath($mapBuilderClass)) 229 { 230 throw new sfException(sprintf('Unable to find path for class "%s".', $mapBuilderClass)); 231 } 232 233 require_once($classPath); 234 $this->maps[$class] = new $mapBuilderClass(); 235 $this->maps[$class]->doBuild(); 271 protected function loadMapBuilders() 272 { 273 $files = sfFinder::type('file')->name('*MapBuilder.php')->in(sfLoader::getModelDirs()); 274 foreach ($files as $file) 275 { 276 $mapBuilderClass = basename($file, '.php'); 277 $map = new $mapBuilderClass(); 278 $map->doBuild(); 236 279 } 237 280 } … … 258 301 } 259 302 303 $this->loadMapBuilders(); 260 304 $this->con = Propel::getConnection($connectionName); 305 $this->dbMap = Propel::getDatabaseMap($connectionName); 261 306 262 307 // get tables 263 308 if ('all' === $tables || is_null($tables)) 264 309 { 265 // load all map builder classes266 $files = sfFinder::type('file')->name('*MapBuilder.php')->in(sfLoader::getModelDirs());267 foreach ($files as $file)268 {269 $mapBuilderClass = basename($file, '.php');270 $map = new $mapBuilderClass();271 $map->doBuild();272 }273 274 $dbMap = Propel::getDatabaseMap($connectionName);275 310 $tables = array(); 276 foreach ($ dbMap->getTables() as $table)311 foreach ($this->dbMap->getTables() as $table) 277 312 { 278 313 $tables[] = $table->getPhpName(); … … 285 320 286 321 $dumpData = array(); 287 288 // load map classes289 array_walk($tables, array($this, 'loadMapBuilder'));290 322 291 323 $tables = $this->fixOrderingOfForeignKeyData($tables); 292 324 foreach ($tables as $tableName) 293 325 { 294 $tableMap = $this-> maps[$tableName]->getDatabaseMap()->getTable(constant($tableName.'Peer::TABLE_NAME'));326 $tableMap = $this->dbMap->getTable(constant($tableName.'Peer::TABLE_NAME')); 295 327 $hasParent = false; 296 328 $haveParents = false; … … 301 333 if ($column->isForeignKey()) 302 334 { 303 $relatedTable = $this-> maps[$tableName]->getDatabaseMap()->getTable($column->getRelatedTableName());335 $relatedTable = $this->dbMap->getTable($column->getRelatedTableName()); 304 336 if ($tableName === $relatedTable->getPhpName()) 305 337 { … … 366 398 if ($column->isForeignKey()) 367 399 { 368 $relatedTable = $this-> maps[$tableName]->getDatabaseMap()->getTable($column->getRelatedTableName());400 $relatedTable = $this->dbMap->getTable($column->getRelatedTableName()); 369 401 if ($isPrimaryKey) 370 402 { … … 425 457 { 426 458 $class = $classes[$i]; 427 $tableMap = $this-> maps[$class]->getDatabaseMap()->getTable(constant($class.'Peer::TABLE_NAME'));459 $tableMap = $this->dbMap->getTable(constant($class.'Peer::TABLE_NAME')); 428 460 foreach ($tableMap->getColumns() as $column) 429 461 { 430 462 if ($column->isForeignKey()) 431 463 { 432 $relatedTable = $this-> maps[$class]->getDatabaseMap()->getTable($column->getRelatedTableName());464 $relatedTable = $this->dbMap->getTable($column->getRelatedTableName()); 433 465 $relatedTablePos = array_search($relatedTable->getPhpName(), $classes); 434 466

