diff --git a/application/modules/courses/controllers/EditController.php b/application/modules/courses/controllers/EditController.php index ae6ab5dddd90ec66a0f48c318f7bd34bdcd90229..9b38c25bb7b09445354912679035fb88aae40eda 100644 --- a/application/modules/courses/controllers/EditController.php +++ b/application/modules/courses/controllers/EditController.php @@ -143,9 +143,11 @@ class Courses_EditController extends App_Controller_Action $session = new Zend_Session_Namespace('Edit Request'); if ($in['sessionId'] !== null) { $id = $in['sessionId']; - $request = $session->savedRequests[$id]['request']; - $course = $session->savedRequests[$id]['course']; - $parentCourse = $session->savedRequests[$id]['parentCourse']; + $user = Auth_UserModel::findCurrentUser(); + $savedRequests = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests')->getData(); + $request = $savedRequests[$id]['request']; + $course = $savedRequests[$id]['course']; + $parentCourse = $savedRequests[$id]['parentCourse']; $session->currentSavedRequestId = $id; } else { $id = $in['id']; @@ -202,7 +204,10 @@ class Courses_EditController extends App_Controller_Action protected function _saveForLater() { $session = new Zend_Session_Namespace('Edit Request'); - $savedRequests = $session->savedRequests; + $user = Auth_UserModel::findCurrentUser(); + $savedRequestRegistry = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests'); + $savedRequests = $savedRequestRegistry->getData(); + if (!Unl_Util::isArray($savedRequests)) { $savedRequests = array(); } @@ -219,12 +224,30 @@ class Courses_EditController extends App_Controller_Action $savedRequests[] = $newSavedRequest; } - $session->savedRequests = $savedRequests; + $savedRequestRegistry->setData($savedRequests); + $collection = new Unl_Model_Collection('RegistryModel'); + $collection[] = $savedRequestRegistry; + RegistryModel::save($collection); } protected function _saveRequest() - { + { $session = new Zend_Session_Namespace('Edit Request'); + + if ($session->currentSavedRequestId !== null) { + $id = $session->currentSavedRequestId; + $user = Auth_UserModel::findCurrentUser(); + + $savedRequestRegistry = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests'); + $savedRequests = $savedRequestRegistry->getData(); + unset($savedRequests[$id]); + $savedRequestRegistry->setData($savedRequests); + $collection = new Unl_Model_Collection('RegistryModel'); + $collection[] = $savedRequestRegistry; + RegistryModel::save($collection); + unset($session->currentSavedRequestId); + } + Requests_RequestModel::save($session->request); $session->course->setRequest($session->request); Courses_CourseModel::save($session->course); diff --git a/application/modules/default/models/RegistryModel.php b/application/modules/default/models/RegistryModel.php new file mode 100644 index 0000000000000000000000000000000000000000..29147f17a7fc95b920d230e2395a41bc68dc1e3e --- /dev/null +++ b/application/modules/default/models/RegistryModel.php @@ -0,0 +1,200 @@ +<?php + +class RegistryModel extends Unl_Model +{ + static public function find($id) + { + $db = Zend_Registry::get('db'); + $select = new Zend_Db_Select($db); + + $select->from(array('r' => 'creqRegistry')); + + if (Unl_Util::isArray($id)) { + if (count($id) == 0) { + return new Unl_Model_Collection(__CLASS__); + } + $select->where('registryId IN(?)', $id); + } else { + $select->where('registryId = ?', $id); + } + $records = $select->query()->fetchAll(); + $objects = new Unl_Model_Collection(__CLASS__); + foreach ($records as $record) { + $object = Unl_Model_Registry::getInstance()->getOrAdd(new self($record)); + $objects[$object->getId()] = $object; + } + + // if we were passed an array of users, return an array for each user + if (Unl_Util::isArray($id)) { + return $objects; + // otherwise, return an array of groups for the single user we were passed + } else { + return $objects[$id]; + } + } + + static public function findByNamespaceAndKey($namespace, $key) + { + $db = Zend_Registry::get('db'); + + $select = new Zend_Db_Select($db); + $select->from(array('r' => 'creqRegistry'), array('registryId')); + $select->where('`namespace` = ?', $namespace); + $select->where('`key` = ?', $key); + $data = $select->query()->fetchAll(); + + $registryId = $data[0]['registryId']; + + if ($registryId) { + return self::find($registryId); + } else { + $new = self::fetchNew(); + $new->_data['namespace'] = $namespace; + $new->_data['key'] = $key; + return $new; + } + + } + + /** + * Returns a new, empty model. + * + * @return RegistryModel + */ + static public function fetchNew() + { + $data = array( + 'registryId' => NULL, + 'namespace' => NULL, + 'key' => NULL, + 'data' => NULL + ); + + $new = new self($data); + $new->_setClean(); + + return $new; + } + + static public function save($models) + { + $modelsToInsert = new Unl_Model_Collection(__CLASS__); + $modelsToUpdate = new Unl_Model_Collection(__CLASS__); + + if (!Unl_Util::isArray($models)) { + $model = $models; + $models = new Unl_Model_Collection(__CLASS__); + $models[$model->getId()] = $model; + } + + foreach ($models as $model) { + if ($model->getId()) { + if ($model->_cleanData != $model->_data) { + $modelsToUpdate[] = $model; + } + } else { + $modelsToInsert[] = $model; + } + } + + if (count($modelsToInsert) > 0) { + self::_insert($modelsToInsert); + } + + if (count($modelsToUpdate) > 0) { + self::_update($modelsToUpdate); + } + + foreach ($models as $model) + { + $model->_setClean(); + } + } + + static protected function _update(Unl_Model_Collection $models) + { + $db = Zend_Registry::get('db'); + + $sql = 'CREATE TEMPORARY TABLE creqRegistryUpdate ' + . 'SELECT * FROM creqRegistry LIMIT 0'; + $db->query($sql); + + $sql = 'INSERT INTO creqRegistryUpdate VALUES '; + $sqlParts = array(); + foreach ($models as $model) { + $sqlParts[] = $db->quoteInto('(?, ', $model->_data['registryId']) + . $db->quoteInto('?, ' , $model->_data['namespace']) + . $db->quoteInto('?, ' , $model->_data['key']) + . $db->quoteInto('?)' , base64_encode(serialize($model->_data['data']))); + } + $sql .= implode(', ', $sqlParts); + $db->query($sql); + + $sql = 'UPDATE creqRegistry AS a, ' + . ' creqRegistryUpdate AS b ' + . 'SET a.namespace = b.namespace, ' + . ' a.key = b.key, ' + . ' a.data = b.data ' + . 'WHERE a.registryId = b.registryId '; + $db->query($sql); + } + + static protected function _insert(Unl_Model_Collection $models) + { + $db = Zend_Registry::get('db'); + + $sql = 'INSERT INTO creqRegistry (`namespace`, `key`, `data`) VALUES '; + $sqlParts = array(); + foreach ($models as $model) { + $sqlParts[] = $db->quoteInto('(?, ', $model->_data['namespace']) + . $db->quoteInto('?, ' , $model->_data['key']) + . $db->quoteInto('?)' , base64_encode(serialize($model->_data['data']))); + } + $sql .= implode(', ', $sqlParts); + $db->query($sql); + + $lastId = $db->lastInsertId(); + foreach ($models as $model) { + $model->_data['registryId'] = $lastId; + $lastId++; + } + } + + static public function delete($models) + { + if (!Unl_Util::isArray($models)) { + $model = $models; + $models = new Unl_Model_Collection(__CLASS__); + $models[$model->getId()] = $model; + } + + if (count($models) == 0) { + return; + } + + $db = Zend_Registry::get('db'); + $sql = $db->quoteInto('DELETE FROM creqRegistry WHERE registryId IN (?)', $models->getId()); + $db->query($sql); + } + + public function __construct($data) + { + parent::__construct($data); + $this->_data['data'] = unserialize(base64_decode($this->_data['data'])); + } + + public function getId() + { + return $this->_data['registryId']; + } + + public function getData() + { + return $this->_data['data']; + } + + public function setData($data) + { + $this->_data['data'] = $data; + } +} \ No newline at end of file diff --git a/application/modules/requests/controllers/EditController.php b/application/modules/requests/controllers/EditController.php index 45acc7552941d1cd3176dbcdb2dc10072dfae694..195407e431247ac7273ab96d2d4cd0a193e8c0a0 100644 --- a/application/modules/requests/controllers/EditController.php +++ b/application/modules/requests/controllers/EditController.php @@ -8,7 +8,9 @@ class Requests_EditController extends App_Controller_Action if ($in['sessionId'] !== null) { $id = $in['sessionId']; $session = new Zend_Session_Namespace('Edit Request'); - $request = $session->savedRequests[$id]['request']; + $user = Auth_UserModel::findCurrentUser(); + $savedRequests = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests')->getData(); + $request = $savedRequests[$id]['request']; $module = $request->getModule(); $redirectUrl = '/' . $module . '/edit/load/sessionId/' . $id; } else { @@ -24,8 +26,15 @@ class Requests_EditController extends App_Controller_Action public function deleteSavedAction() { $id = $this->getRequest()->getParam('id'); - $session = new Zend_Session_Namespace('Edit Request'); - unset($session->savedRequests[$id]); + $user = Auth_UserModel::findCurrentUser(); + $savedRequestRegistry = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests'); + $savedRequests = $savedRequestRegistry->getData(); + unset($savedRequests[$id]); + $savedRequestRegistry->setData($savedRequests); + $collection = new Unl_Model_Collection('RegistryModel'); + $collection[] = $savedRequestRegistry; + RegistryModel::save($collection); + $this->_redirect('/requests'); } diff --git a/application/modules/requests/controllers/IndexController.php b/application/modules/requests/controllers/IndexController.php index d06986cc900db31a190072f3765affc0db4d942d..1cbb3cfd27cc24a601c23263dcc7ea9014e986b7 100644 --- a/application/modules/requests/controllers/IndexController.php +++ b/application/modules/requests/controllers/IndexController.php @@ -40,7 +40,7 @@ class Requests_IndexController extends App_Controller_Action $requestVotes = Requests_ApproverVoteModel::findUsersVotesForRequsets($user, $allRequests); $session = new Zend_Session_Namespace('Edit Request'); - $savedRequests = $session->savedRequests; + $savedRequests = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests')->getData(); if (!Unl_Util::isArray($savedRequests)) { $savedRequests = array();