groupings.
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);
*/
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);
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;
}
/**
+ * 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
$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;
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();
+ }
}
}
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);
}
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")));
}
$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);
}
}
+ /* 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()));
$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')) {
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
*
}
/* 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) {
$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();
$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';