Esempio n. 1
0
 /**
  * Saves Entity and (by default) adds/removes/updates extensions
  *
  * @param   Doctrine_Connection   $conn             Optional connection instance
  * @param   boolean               $saveExtensions   Whether to save extensions & their data; true by default
  * @return  Entity                                  The saved Entity
  *
  * @see Doctrine_record
  */
 public function save(Doctrine_Connection $conn = null, $saveExtensions = true, array $networkIds = null)
 {
     if (!$this->exists()) {
         $this->_isFirstSave = true;
     }
     if ($conn === null) {
         $conn = Doctrine_Manager::connection();
     }
     //make sure extensions are loaded
     $this->_loadExtensions();
     try {
         $conn->beginTransaction();
         if ($saveExtensions) {
             //run extensions' onEntitySave methods
             foreach ($this->_extensionObjects as $name => $object) {
                 if (method_exists($object, 'onEntitySave')) {
                     $object->onEntitySave($this);
                 }
             }
         }
         //set primary extension
         if (!$this->primary_ext) {
             $this->primary_ext = $this->getPrimaryExtension();
         }
         if ($this->primary_ext == 'Person') {
             $this->name = PersonTable::nameizePersonName($this->name);
         }
         //set delta field for sphinx indexing (in rails)
         $this->delta = true;
         //save entity
         $ret = parent::save($conn);
         //add primary alias if needed
         if (!LsDoctrineQuery::create()->from('Alias a')->where('a.entity_id = ?', $this->id)->count()) {
             $a = new Alias();
             $a->entity_id = $this->id;
             $a->name = $this->rawGet('name');
             $a->is_primary = true;
             $a->save(null, false);
         }
         if ($saveExtensions) {
             //save extensions
             foreach ($this->_extensionObjects as $name => $object) {
                 //set entity_id in case it isn't set
                 $object->entity_id = $this->id;
                 $object->save($conn);
             }
             //save new extensions
             foreach (array_keys($this->_extensionsAdded) as $name) {
                 $def = $this->_extensionDefinitions[$name];
                 //record shouldn't already exist
                 if ($this->getExtensionRecordForDefinition($def)) {
                     throw new Exception("Can't add record for extension " . $name . "; alrady exists");
                 }
                 //create record
                 $record = new ExtensionRecord();
                 $record->Entity = $this;
                 $record->Definition = $def;
                 $record->save($conn);
             }
             $this->_extensionsAdded = array();
             //remove extensions
             foreach ($this->_extensionsRemoved as $name => $extAry) {
                 $def = $extAry['definition'];
                 if ($def->has_fields) {
                     $object = $extAry['object'];
                     $object->delete($conn);
                 }
                 if (!($record = $this->getExtensionRecordForDefinition($def))) {
                     throw new Exception("Can't remove record for extension " . $name . "; doesn't exist");
                 }
                 $record->delete($conn);
             }
         }
         //if creating, add entity to specified networks, otherwise, default network
         if ($this->_isFirstSave) {
             if ($networkIds) {
                 foreach ($networkIds as $networkId) {
                     $le = new LsListEntity();
                     $le->list_id = $networkId;
                     $le->entity_id = $this->id;
                     $le->save(null, true, false);
                     //prevents it from trying to update the entity updated_at and last_user_id fields
                 }
             } else {
                 if (sfContext::hasInstance() && ($user = sfContext::getInstance()->getUser()->getGuardUser())) {
                     $networkId = $user->Profile->home_network_id;
                 } else {
                     $networkId = LsListTable::US_NETWORK_ID;
                 }
                 $le = new LsListEntity();
                 $le->list_id = $networkId;
                 $le->entity_id = $this->id;
                 $le->save(null, true, false);
                 //prevents it from trying to update the entity updated_at and last_user_id fields
             }
         }
         $conn->commit();
     } catch (Exception $e) {
         $conn->rollback();
         throw $e;
     }
     $this->_isFirstSave = false;
     return $ret;
 }