public function executeEdit($request) { $id = $request->getParameter('id') ? $request->getParameter('id') : $request->getParameter('entity[id]'); $this->entity = Doctrine::getTable('Entity')->find($id); $this->forward404Unless($this->entity); //get networks $this->all_network_ids = EntityTable::getNetworkIdsById($id); $this->submitted_network_ids = $this->all_network_ids; $homeNetworkId = $this->getUser()->getGuardUser()->Profile->home_network_id; $this->show_networks = true; if ($this->getUser()->hasCredential('admin')) { $permittedNetworkIds = LsListTable::getAllNetworkIds(); } else { $permittedNetworkIds = array_unique(array(LsListTable::US_NETWORK_ID, $homeNetworkId)); } $this->permitted_networks = LsDoctrineQuery::create()->from('LsList l')->whereIn('l.id', $permittedNetworkIds)->execute(); $otherNetworkIds = array_diff($this->all_network_ids, $permittedNetworkIds); $this->other_networks = !count($otherNetworkIds) ? array() : LsDoctrineQuery::create()->from('LsList l')->whereIn('l.id', $otherNetworkIds)->execute(); //get extensions and definitions $primary = $this->entity->getPrimaryExtension(); $this->tier2_defs = ExtensionDefinitionTable::getByTier(2, $primary); $this->tier3_defs = ExtensionDefinitionTable::getByTier(3, $primary); $this->entity_exts = $this->entity->getExtensions(); $this->entity_exts_display = $this->entity->getExtensionsForDisplay(true); //create entity form $this->entity_form = new EntityForm($this->entity); //create primary extension form $primaryFormClass = $primary . 'Form'; $this->primary_ext_form = new $primaryFormClass($this->entity->getPrimaryExtensionObject(), null, false); //create all other extension forms $this->other_ext_forms = array(); $exts = ExtensionDefinitionTable::getNamesByTier(array(2, 3), $primary, $havingFields = true); $objects = $this->entity->getExtensionObjects(); foreach ($exts as $ext) { if ($ext != 'PublicCompany') { continue; } $class = $ext . 'Form'; if (isset($objects[$ext])) { $object = $objects[$ext]; } else { $object = new $ext(); } $this->other_ext_forms[$ext] = new $class($object, null, false); } //create reference form $this->reference_form = new ReferenceForm(); $this->reference_form->setSelectObject($this->entity); //form submission if ($request->isMethod('post')) { $this->entity_form->bind($request->getParameter('entity')); $this->primary_ext_form->bind($request->getParameter('entity')); $new_exts = array_keys((array) $request->getParameter('extensions')); $old_exts = $this->entity->getExtensions(true); $all_exts = array_merge($new_exts, $old_exts); foreach ($all_exts as $ext) { if ($ext != 'PublicCompany') { continue; } if (in_array($ext, ExtensionDefinitionTable::$extensionNamesWithFields)) { $this->other_ext_forms[$ext]->bind($request->getParameter('entity')); } } $networkIds = $request->getParameter('network_ids', array()); $this->submitted_network_ids = $networkIds; $this->reference_form->bind($request->getParameter('reference')); if ($this->entity_form->isValid() && $this->reference_form->isValid()) { //only edit networks if user's home network is not the United States if ($this->show_networks) { //save network changes if (!$networkIds) { $request->setError('network_ids', 'You must select at least one network'); return sfView::SUCCESS; } $networksToRemove = array_diff($this->all_network_ids, $networkIds); $networksToAdd = array_diff($networkIds, $this->all_network_ids); foreach ($networksToRemove as $networkId) { LsListEntity::removeByListIdAndEntityId($networkId, $this->entity['id']); } foreach ($networksToAdd as $networkId) { LsListEntity::addByListIdAndEntityId($networkId, $this->entity['id']); } } //save extension changes $exts_to_add = array_diff($new_exts, $old_exts); $exts_to_remove = array_diff($old_exts, $new_exts); foreach ($exts_to_add as $ext) { $this->entity->addExtension($ext); } foreach ($exts_to_remove as $ext) { $this->entity->removeExtension($ext); } //save entity and reference $this->entity_form->updateObject(); $this->entity->saveWithRequiredReference($request->getParameter('reference')); //clear cache $this->clearCache($this->entity); //redirect to view $this->redirect($this->entity->getInternalUrl()); } } }