public function updateAction() { $data =& $_POST; $data = $this->noDupes($data); $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); db()->beginTransaction(); try { if ($data['id'] == '0') { $data['id'] = ''; } if (isset($data['name']) == true) { $data['name'] = ltrim(rtrim($data['name'])); } if (isset($data['description']) == true) { $data['description'] = ltrim(rtrim($data['description'])); } if (isset($data['abstract']) == true) { $data['abstract'] = rtrim($data['abstract']); } if ($this->session->userid !== null) { $users = new Default_Model_Researchers(); $users->filter->id->equals($this->session->userid); $user = $users->items[0]; $apps = new Default_Model_Applications(); if ($data['id'] != '') { // UPDATE $apps->filter->id->equals($data['id']); $app = $apps->items[0]; if ($user->privs->canModifyApplicationName($app)) { $app->name = $data['name']; } if ($user->privs->canModifyApplicationDescription($app)) { $app->description = $data['description']; } if ($user->privs->canModifyApplicationAbstract($app)) { $app->abstract = $data['abstract']; } if ($user->privs->canModifyApplicationStatus($app)) { if ($data['statusID'] != '') { $app->statusID = $data['statusID']; } } if ($_POST['newimage'] !== "") { if ($user->privs->canModifyApplicationLogo($app)) { $imgfile = APPLICATION_PATH . "/../public/" . $_POST['newimage']; if (file_exists(APPLICATION_PATH . "/../cache/app-logo-" . $data["id"] . ".png")) { unlink(APPLICATION_PATH . "/../cache/app-logo-" . $data["id"] . ".png"); } if (file_exists(APPLICATION_PATH . "/../cache/55x55/app-logo-" . $data["id"] . ".png")) { unlink(APPLICATION_PATH . "/../cache/55x55/app-logo-" . $data["id"] . ".png"); } if (file_exists(APPLICATION_PATH . "/../cache/100x100/app-logo-" . $data["id"] . ".png")) { unlink(APPLICATION_PATH . "/../cache/55x55/app-logo-" . $data["id"] . ".png"); } $app->logo = pg_escape_bytea(base64_encode(@file_get_contents($imgfile))); } } if (isset($_POST['addedBy'])) { if ($_POST['addedBy'] !== '') { if ($user->privs->canGrantOwnership($app)) { $app->addedBy = $_POST['addedBy']; $app->ownerID = $_POST['addedBy']; } } } $app->lastUpdated = date('Y-m-d'); $app->keywords = null; $app->save(); if ($user->privs->canModifyApplicationCategory($app)) { $this->syncDBCollection("appid", $data['id'], "categoryid", "AppCategories", "AppCategory", $data); } /* set primary category */ $newapps = new Default_Model_Applications(); $newapps->filter->id->equals($app->id); if (count($newapps->items) > 0) { if (count($newapps->items[0]->categories) > 0) { foreach ($newapps->items[0]->categories as $cat) { if (isset($data["categoryID0"]) && $cat->categoryid == $data["categoryID0"]) { if (!$cat->isPrimary) { $cat->isPrimary = true; $cat->save(); break; } } } } } if ($user->privs->canModifyApplicationDiscipline($app)) { $this->syncDBCollection("appid", $data['id'], "disciplineid", "AppDisciplines", "AppDiscipline", $data); } $this->session->privs = null; if ($user->privs->canModifyApplicationVO($app)) { $this->syncDBCollection("appid", $data['id'], "void", "AppVOs", "AppVO", $data, "vo"); } if ($user->privs->canModifyApplicationMiddleware($app)) { $this->syncDBCollection("appid", $data['id'], "middlewareid", "AppMiddlewares", "AppMiddleware", $data, "mw"); } if ($user->privs->canAssociatePersonToApplication($app)) { $this->syncDBCollection("appid", $data['id'], "researcherid", "ResearchersApps", "ResearchersApp", $data, "scicon"); $this->syncAppContactItems($data['id'], $data); } if ($user->privs->canModifyApplicationCountry($app)) { $this->syncDBCollection("appid", $data['id'], "countryid", "AppManualCountries", "AppManualCountry", $data); } if ($user->privs->canModifyApplicationURLs($app)) { $this->syncDBCollection("appid", $data['id'], "id", "AppUrls", "AppUrl", $data, "url"); } if ($user->privs->canModifyApplicationDocuments($app)) { // this is rather too complicated to be included in syncDBCollection... if ($data['documents'] != "UNCHANGED") { $xdocs = new SimpleXMLElement($data['documents']); $docdata = array(); foreach ($xdocs->document as $doc) { $ddd = "" . $doc; $ddd = base64_decode($ddd); $ddd = urldecode($ddd); $ddd = json_decode($ddd, true); $docdata[] = $ddd; } $docs = new Default_Model_AppDocuments(); $docs->filter->appid->equals($data['id']); $docs->refresh(); $docCount = count($docs->items); //handle existing and deleted entries for ($i = $docCount - 1; $i >= 0; $i--) { $existing = null; foreach ($docdata as $docdatum) { $doc = $docs->items[$i]; if ($doc->id == $docdatum['id']) { $existing = $this->populateAppDoc($doc, $docdatum); break; } } if ($existing === null) { $docs->remove($docs->items[$i]); } else { $existing->save(); } } //handle new entries foreach ($docdata as $docdatum) { if ($docdatum['id'] == '' || strtolower($docdatum['id']) == 'null') { $doc = new Default_Model_AppDocument(); //first time only main data is saved $doc->appID = $data['id']; $doc = $this->populateAppDoc($doc, $docdatum); $docs->add($doc); //second time referenced data is saved $doc = $this->populateAppDoc($doc, $docdatum); $doc->save(); } } } } } else { // INSERT if ($user->privs->canInsertApplication()) { if ($data['tool'] == "true") { $data['tool'] = true; } else { $data['tool'] = false; } $app = new Default_Model_Application(); $app->name = $data['name']; $app->description = $data['description']; $app->abstract = $data['abstract']; if ($data['statusID'] != '') { $app->statusID = $data['statusID']; } //EGI RT #1820: Remove RESPECT //$app->respect = $data['respect']; $app->respect = false; if ($data['tool']) { $app->tool = true; } else { $app->tool = false; } $app->dateAdded = date('Y-m-d'); $app->lastUpdated = date('Y-m-d'); if (array_key_exists('addedBy', $_POST)) { if ($user->privs->canGrantOwnership($app)) { $app->addedBy = $_POST['addedBy']; $app->ownerID = $_POST['addedBy']; } else { $app->addedBy = $this->session->userid; $app->ownerID = $this->session->userid; } } else { $app->addedBy = $this->session->userid; $app->ownerID = $this->session->userid; } if ($_POST['newimage'] !== "") { $imgfile = APPLICATION_PATH . "/../public/" . $_POST['newimage']; $app->logo = pg_escape_bytea(base64_encode(@file_get_contents($imgfile))); } $app->keywords = null; $apps->add($app); $this->syncDBCollection("appid", $app->id, "categoryid", "AppCategories", "AppCategory", $data); $this->syncDBCollection("appid", $app->id, "disciplineid", "AppDisciplines", "AppDiscipline", $data); $this->session->lastAppID = $app->id; $this->session->privs = null; } } } db()->commit(); } catch (Exception $e) { db()->rollBack(); $this->getResponse()->clearAllHeaders(); $this->getResponse()->setRawHeader("HTTP/1.0 500 Internal server error"); $this->getResponse()->setHeader("Status", "500 Internal server error"); echo base64_encode(encrypt($e, ApplicationConfiguration::api('key', ''))); error_log("Transaction ROLLBACKed: {$e}"); } }
protected function init() { $this->_res = new Default_Model_Applications(); $id = normalizeAppID($this); $this->_res->filter->id->numequals($id); $this->_res->refresh(); if (count($this->_res->items) > 0) { $this->_res = $this->_res->items[0]; $res = new Default_Model_AppDocuments(); $res->filter->id->equals($this->getParam('pid'))->and($res->filter->appid->numequals($id)); $res->refresh(); if (!(count($res->items) > 0)) { $this->_res = null; $this->setError(RestErrorEnum::RE_ITEM_NOT_FOUND); } } else { $this->_res = null; $this->setError(RestErrorEnum::RE_ITEM_NOT_FOUND); } }