Example #1
0
 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());
         }
     }
 }