From: Michael J. Rubinsky Date: Wed, 21 Oct 2009 23:28:55 +0000 (-0400) Subject: Add a multienum to single resources to allow changing/showing it's X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=5d9d84de685de67787ca6a1f7fcc4b95a81e7bdb;p=horde.git Add a multienum to single resources to allow changing/showing it's groupings. --- diff --git a/kronolith/lib/Driver/Resource.php b/kronolith/lib/Driver/Resource.php index 82c61c72d..18968a895 100644 --- a/kronolith/lib/Driver/Resource.php +++ b/kronolith/lib/Driver/Resource.php @@ -65,18 +65,18 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql public function save($resource) { if ($resource->getId()) { - $query = 'UPDATE kronolith_resources SET resource_name = ?, resource_calendar = ?, resource_category = ? , resource_description = ?, resource_response_type = ?, resource_type = ?, resource_members = ? WHERE resource_id = ?'; - $values = array($this->convertToDriver($resource->get('name')), $resource->get('calendar'), $resource->get('category'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), $resource->get('members'), $resource->getId()); + $query = 'UPDATE kronolith_resources SET resource_name = ?, resource_calendar = ? , resource_description = ?, resource_response_type = ?, resource_type = ?, resource_members = ? WHERE resource_id = ?'; + $values = array($this->convertToDriver($resource->get('name')), $resource->get('calendar'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), serialize($resource->get('members')), $resource->getId()); $result = $this->_write_db->query($query, $values); if ($result instanceof PEAR_Error) { Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); throw new Horde_Exception($result); } } else { - $query = 'INSERT INTO kronolith_resources (resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type, resource_type, resource_members)'; - $cols_values = ' VALUES (?, ?, ?, ?, ?, ?, ?, ?)'; + $query = 'INSERT INTO kronolith_resources (resource_id, resource_name, resource_calendar, resource_description, resource_response_type, resource_type, resource_members)'; + $cols_values = ' VALUES (?, ?, ?, ?, ?, ?, ?)'; $id = $this->_db->nextId('kronolith_resources'); - $values = array($id, $this->convertToDriver($resource->get('name')), $resource->get('calendar'), $resource->get('category'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), $resource->get('members')); + $values = array($id, $this->convertToDriver($resource->get('name')), $resource->get('calendar'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), serialize($resource->get('members'))); $result = $this->_write_db->query($query . $cols_values, $values); if ($result instanceof PEAR_Error) { Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); @@ -130,7 +130,7 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql */ public function getResource($id) { - $query = 'SELECT resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources WHERE resource_id = ?'; + $query = 'SELECT resource_id, resource_name, resource_calendar, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources WHERE resource_id = ?'; $results = $this->_db->getRow($query, array($id), DB_FETCHMODE_ASSOC); if ($results instanceof PEAR_Error) { Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR); @@ -186,7 +186,7 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql return array(); } - $query = 'SELECT resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources'; + $query = 'SELECT resource_id, resource_name, resource_calendar, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources'; if (count($filter)) { $clause = ' WHERE '; $i = 0; @@ -213,6 +213,27 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql } /** + * Obtain the group id for each group the speciied resource is a member of. + * + * @param integer $resource_id The resource id to check for. + * + * @return array of group ids. + */ + public function getGroupMemberships($resource_id) + { + $groups = $this->listResources(PERMS_READ, array('type' => Kronolith_Resource::TYPE_GROUP)); + $in = array(); + foreach ($groups as $group) { + $members = $group->get('members'); + if (array_search($resource_id, $members) !== false) { + $in[] = $group->getId(); + } + } + + return $in; + } + + /** * * @param $params * @return unknown_type @@ -222,10 +243,12 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql $return = array(); foreach ($params as $field => $value) { if ($field == 'resource_name' || $field == 'resource_description') { - $return[str_replace('resource_', '', $field)] = $this->convertFromDriver($value); - } else { - $return[str_replace('resource_', '', $field)] = $value; + $value = $this->convertFromDriver($value); + } elseif ($field == 'resource_members') { + $value = @unserialize($value); } + + $return[str_replace('resource_', '', $field)] = $value; } return $return; diff --git a/kronolith/lib/Forms/CreateResource.php b/kronolith/lib/Forms/CreateResource.php index 37c4d48a2..621d275ae 100644 --- a/kronolith/lib/Forms/CreateResource.php +++ b/kronolith/lib/Forms/CreateResource.php @@ -33,22 +33,38 @@ class Kronolith_CreateResourceForm extends Horde_Form { Kronolith_Resource::RESPONSETYPE_MANUAL => _("Manual"), Kronolith_Resource::RESPONSETYPE_NONE => _("None")); + /* Get a list of available resource groups */ + $driver = Kronolith::getDriver('Resource'); + $groups = $driver->listResources(PERMS_READ, array('type' => Kronolith_Resource::TYPE_GROUP)); + foreach ($groups as $id => $group) { + $enum[$id] = $group->get('name'); + } + $this->addVariable(_("Name"), 'name', 'text', true); $this->addVariable(_("Description"), 'description', 'longtext', false, false, null, array(4, 60)); $this->addVariable(_("Response type"), 'responsetype', 'enum', true, false, null, array('enum' => $responses)); - $this->addVariable(_("Category"), 'category', 'text', false); + $this->addVariable(_("Groups"), 'category', 'multienum', false, false, null, array('enum' => $enum)); $this->setButtons(array(_("Create"))); } function execute() { $new = array('name' => $this->_vars->get('name'), - 'category' => $this->_vars->get('category'), 'description' => $this->_vars->get('description'), 'response_type' => $this->_vars->get('responsetype')); $resource = new Kronolith_Resource_Single($new); - return $results = Kronolith_Resource::addResource($resource); + $resource = Kronolith_Resource::addResource($resource); + + /* Do we need to add this to any groups? */ + $groups = $this->_vars->get('category'); + foreach ($groups as $group_id) { + $group = Kronolith::getDriver('Resource')->getResource($group_id); + $members = $group->get('members'); + $members[] = $resource->getId(); + $group->set('members', $members); + $group->save(); + } } } diff --git a/kronolith/lib/Forms/CreateResourceGroup.php b/kronolith/lib/Forms/CreateResourceGroup.php index 9cc1a9557..bce170f43 100644 --- a/kronolith/lib/Forms/CreateResourceGroup.php +++ b/kronolith/lib/Forms/CreateResourceGroup.php @@ -41,12 +41,12 @@ class Kronolith_CreateResourceGroupForm extends Horde_Form { function execute() { - $members = serialize($this->_vars->get('members')); $new = array('name' => $this->_vars->get('name'), 'description' => $this->_vars->get('description'), - 'members' => $members); + 'members' => $this->_vars->get('members')); $resource = new Kronolith_Resource_Group($new); + return $results = Kronolith_Resource::addResource($resource); } diff --git a/kronolith/lib/Forms/EditResource.php b/kronolith/lib/Forms/EditResource.php index 840c03fac..3381d7b3e 100644 --- a/kronolith/lib/Forms/EditResource.php +++ b/kronolith/lib/Forms/EditResource.php @@ -37,11 +37,20 @@ class Kronolith_EditResourceForm extends Horde_Form { Kronolith_Resource::RESPONSETYPE_AUTO => _("Automatically"), Kronolith_Resource::RESPONSETYPE_MANUAL => _("Manual"), Kronolith_Resource::RESPONSETYPE_NONE => _("None")); + + /* Get a list of available resource groups */ + $driver = Kronolith::getDriver('Resource'); + $groups = $driver->listResources(PERMS_READ, array('type' => Kronolith_Resource::TYPE_GROUP)); + $enum = array(); + foreach ($groups as $id => $group) { + $enum[$id] = $group->get('name'); + } + $this->addHidden('', 'c', 'text', true); $this->addVariable(_("Name"), 'name', 'text', true); $this->addVariable(_("Description"), 'description', 'longtext', false, false, null, array(4, 60)); $this->addVariable(_("Response type"), 'responsetype', 'enum', true, false, null, array('enum' => $responses)); - $this->addVariable(_("Category"), 'category', 'text', false); + $this->addVariable(_("Groups"), 'category', 'multienum', false, false, null, array('enum' => $enum)); $this->setButtons(array(_("Save"))); } @@ -51,7 +60,6 @@ class Kronolith_EditResourceForm extends Horde_Form { $new_name = $this->_vars->get('name'); $this->_resource->set('name', $new_name); $this->_resource->set('description', $this->_vars->get('description')); - $this->_resource->set('category', $this->_vars->get('category')); $this->_resource->set('response_type', $this->_vars->get('responsetype')); if ($original_name != $new_name) { $result = Kronolith::getDriver()->rename($original_name, $new_name); @@ -60,6 +68,41 @@ class Kronolith_EditResourceForm extends Horde_Form { } } + /* Update group memberships */ + $driver = Kronolith::getDriver('Resource'); + $existing_groups = $driver->getGroupMemberships($this->_resource->getId()); + $new_groups = $this->_vars->get('category'); + $new_groups = (is_null($new_groups) ? array() : $new_groups); + foreach ($existing_groups as $gid) { + $i = array_search($gid, $new_groups); + if ($i === false) { + // No longer in this group + $group = $driver->getResource($gid); + $members = $group->get('members'); + $idx = array_search($this->_resource->getId(), $members); + if ($idx !== false) { + unset($members[$idx]); + reset($members); + $group->set('members', $members); + $group->save(); + } + } else { + // We know it's already in the group, remove it so we don't + // have to check/add it again later. + unset($new_groups[$i]); + } + } + + reset($new_groups); + foreach ($new_groups as $gid) { + $group = $driver->getResource($gid); + $members = $group->get('members'); + $members[] = $this->_resource->getId(); + $group->set('members', $members); + $group->save(); + } + + $result = $this->_resource->save(); if (is_a($result, 'PEAR_Error')) { return PEAR::raiseError(sprintf(_("Unable to save resource \"%s\": %s"), $new_name, $result->getMessage())); diff --git a/kronolith/lib/Forms/EditResourceGroup.php b/kronolith/lib/Forms/EditResourceGroup.php index 92d305deb..32c660317 100644 --- a/kronolith/lib/Forms/EditResourceGroup.php +++ b/kronolith/lib/Forms/EditResourceGroup.php @@ -52,7 +52,7 @@ class Kronolith_EditResourceGroupForm extends Horde_Form { $new_name = $this->_vars->get('name'); $this->_resource->set('name', $new_name); $this->_resource->set('description', $this->_vars->get('description')); - $this->_resource->set('members', serialize($this->_vars->get('members'))); + $this->_resource->set('members', $this->_vars->get('members')); if ($original_name != $new_name) { $result = Kronolith::getDriver()->rename($original_name, $new_name); if (is_a($result, 'PEAR_Error')) { diff --git a/kronolith/lib/Resource.php b/kronolith/lib/Resource.php index 2c28dba44..2317b54ff 100644 --- a/kronolith/lib/Resource.php +++ b/kronolith/lib/Resource.php @@ -20,6 +20,10 @@ class Kronolith_Resource const RESPONSETYPE_ALWAYS_DECLINE = 3; const RESPONSETYPE_MANUAL = 4; + /* Resource Type constants */ + const TYPE_SINGLE = 'Single'; + const TYPE_GROUP = 'Group'; + /** * Adds a new resource to storage * diff --git a/kronolith/lib/Resource/Group.php b/kronolith/lib/Resource/Group.php index 0860976f0..d6b5ae573 100644 --- a/kronolith/lib/Resource/Group.php +++ b/kronolith/lib/Resource/Group.php @@ -90,7 +90,7 @@ class Kronolith_Resource_Group extends Kronolith_Resource_Base } /* Get all resources that are included in this category */ - $resources = unserialize($this->get('members')); + $resources = $this->get('members'); /* Iterate over all resources until one with no conflicts is found */ foreach ($resources as $resource_id) { diff --git a/kronolith/resources/edit.php b/kronolith/resources/edit.php index b2cf64242..8cb515a87 100644 --- a/kronolith/resources/edit.php +++ b/kronolith/resources/edit.php @@ -52,7 +52,7 @@ if ($form->validate($vars)) { $vars->set('name', $resource->get('name')); $vars->set('description', $resource->get('description')); -$vars->set('category', $resource->get('category')); +$vars->set('category', Kronolith::getDriver('Resource')->getGroupMemberships($resource->getId())); $vars->set('responsetype', $resource->get('response_type')); $title = $form->getTitle(); diff --git a/kronolith/resources/groups/edit.php b/kronolith/resources/groups/edit.php index f53bfe5bd..4f77ff24e 100644 --- a/kronolith/resources/groups/edit.php +++ b/kronolith/resources/groups/edit.php @@ -52,7 +52,7 @@ if ($form->validate($vars)) { $vars->set('name', $group->get('name')); $vars->set('description', $group->get('description')); -$vars->set('members', unserialize($group->get('members'))); +$vars->set('members', $group->get('members')); $title = $form->getTitle(); require KRONOLITH_TEMPLATES . '/common-header.inc';