Move those classes at least to the correct places.
authorJan Schneider <jan@horde.org>
Thu, 17 Sep 2009 12:30:01 +0000 (14:30 +0200)
committerJan Schneider <jan@horde.org>
Thu, 17 Sep 2009 12:30:01 +0000 (14:30 +0200)
framework/Rdo/lib/Horde/Rdo/Form/Helper.php [new file with mode: 0644]
framework/Rdo/lib/Horde/Rdo/Form/Renderer/Helper.php [new file with mode: 0644]
framework/Rdo/lib/Horde/Rdo/Lens.php [new file with mode: 0644]
framework/Rdo/lib/Horde/Rdo/Table/Helper.php [new file with mode: 0644]
framework/Rdo/lib/Horde/Rdo/Table/Helper/Lens.php [new file with mode: 0644]
framework/Rdo/package.xml
framework/Rdo/www/Form_Helper.php [deleted file]
framework/Rdo/www/Form_Renderer_Helper.php [deleted file]
framework/Rdo/www/Lens.php [deleted file]
framework/Rdo/www/Table_Helper.php [deleted file]
framework/Rdo/www/Table_Helper_Lens.php [deleted file]

diff --git a/framework/Rdo/lib/Horde/Rdo/Form/Helper.php b/framework/Rdo/lib/Horde/Rdo/Form/Helper.php
new file mode 100644 (file)
index 0000000..c7e79c2
--- /dev/null
@@ -0,0 +1,480 @@
+<?php
+/**
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @package Horde_Rdo
+ */
+
+/**
+ * The Horde_Form_Helper:: class provides autogeneration extension to
+ * Horde_Form used for generating create and update data with various
+ * backends.
+ *
+ * @author  Duck <duck@obala.net>
+ * @since   Horde 4.0
+ * @package Horde_Rdo
+ */
+class Horde_Rdo_Form_Helper extends Horde_Form
+{
+    /**
+     * The primary key(s) of the resource.
+     *
+     * @var string
+     */
+    protected $_primaryKey;
+
+    /**
+     * Rdo_Mapper object that we display.
+     *
+     * @var Horde_Rdo_Mapper $mapper
+     */
+    protected $_mapper;
+
+    /**
+     * Extends Horde_Form for general purposes and prepare initial form.
+     */
+    public function __construct($vars, $title = '', $name = null, $params = null)
+    {
+        parent::__construct($vars, $title, $name);
+
+        if (is_array($params)) {
+            $this->_mapper = $params['mapper'];
+            unset($params['mapper']);
+        } else {
+            $this->_mapper = $params;
+            $params = array();
+        }
+
+        if ($vars->exists('action')) {
+            $this->addHidden('', 'action', 'text', true);
+        }
+        if ($vars->exists('table')) {
+            $this->addHidden('', 'table', 'text', true);
+        }
+        if ($vars->exists('what2process')) {
+            $this->addHidden('', 'what2process', 'text', true);
+        }
+
+        /* Determinate action */
+        if ($vars->get('submitbutton') == _("Advanced search")) {
+            $vars->set('action', 'search_active');
+            $this->_submitted = false;
+        } elseif ($vars->get('submitbutton') == _("Basic search")) {
+            $vars->set('action', 'search');
+            $this->_submitted = false;
+        } elseif (isset($params['action'])) {
+            $vars->set('action', $params['action']);
+        }
+
+        $i = 0;
+        $this->_getPrimaryKey();
+        $allFields = $this->_getFields($vars->get('action'));
+
+        /* Determine what to display */
+        if ($vars->get('action') == 'search_active') {
+            if ($vars->get('fields')) {
+                $fields = explode('|', $vars->get('fields'));
+            } else {
+                $fields = $this->_primaryKey;
+            }
+            if ($vars->get('horde_helper_add')) {
+                $fields[] = $vars->get('horde_helper_add');
+                $vars->set('horde_helper_add', null);
+            }
+        } else {
+            $fields = $allFields;
+        }
+
+        /* Loop to add fields */
+        foreach ($fields as $key) {
+            if ($key == 'created' || $key == 'updated') {
+                continue;
+            }
+
+            $params = $this->_formMeta($vars->get('action'), $key);
+            if (is_object($params)) {
+                return $params;
+            }
+
+            $this->_currentSection = $params['section'];
+
+            switch ($vars->get('action')) {
+            case 'create':
+                if ($params['readonly']) {
+                    continue 2;
+                }
+                break;
+
+            case 'update':
+                if (in_array($key, $this->_primaryKey)) {
+                    $this->addHidden('', $key, $params['type'], true);
+                    $params['readonly'] = true;
+                }
+                break;
+
+            case 'search':
+            case 'search_active':
+                $key .= '_' . $i++;
+                $params['readonly'] = false;
+                $params['required'] = false;
+                if (!$params['hidden']) {
+                    $this->_addCase($params['humanName'], $key);
+                }
+                break;
+            }
+
+            if ($params['hidden']) {
+                $this->addHidden('', $key, $params['type'], $params['required']);
+                continue;
+            }
+
+            $v = $this->addVariable($params['humanName'], $key, $params['type'],
+                                    $params['required'], $params['readonly'],
+                                    $params['description'], $params['params']);
+
+            if (!empty($params['help'])) {
+                $v->setHelp($params['help']);
+            }
+            if (!empty($params['default'])) {
+                $v->setDefault($params['default']);
+            }
+        }
+
+        switch ($vars->get('action')) {
+        case 'search':
+            $this->_submit = array(_("Search"), _("Advanced search"));
+            break;
+
+        case 'search_active':
+            require_once 'Horde/Array.php';
+            $params = array(Horde_Array::valuesToKeys($allFields), true);
+            $this->addVariable(_("Add"), 'horde_helper_add', 'enum', false, false, null, $params);
+            $this->_submit = array(_("Search"), _("Add"), _("Basic search"));
+            $this->addHidden('', 'fields', 'text', true);
+            $vars->set('fields', implode('|', $fields));
+            break;
+
+        case 'create':
+            $this->_submit = _("Create");
+            break;
+
+        case 'update':
+            $this->_submit = _("Update");
+            $this->_reset = _("Reset");
+        }
+    }
+
+    /**
+     * Add a comparison operator selection
+     */
+    protected function _addCase($humanName, $key)
+    {
+        $this->addVariable($humanName, 'cases_' . $key, 'enum', false, false, 'cases',
+                           array(array('=' => '=', '>' => '>', '<' => '<',
+                                       '>=' => '>=', '<=' => '<=', '<>' => '<>',
+                                       'LIKE' => 'LIKE', 'NOT LIKE' => 'NOT LIKE',
+                                       'IS' => 'IS', 'IS NOT' => 'IS NOT')));
+    }
+
+    /**
+     * Map from columns to Horde_Form types and attributes:
+     * Create values like Horde_Form::addVariable parameters
+     *   - humanName
+     *   - type
+     *   - required
+     *   - readonly
+     *   - description
+     *   - params
+     */
+    protected function _formMeta($action, $column, $key = false)
+    {
+        static $map;
+
+        if ($map === null) {
+            $map = $this->formMetaData($action);
+            if ($map instanceof PEAR_Error) {
+                return $map;
+            }
+            if (isset($map['__sections']) && $this->_vars->action != 'search_active') {
+                foreach ($map['__sections'] as $section => $value) {
+                    $this->setSection($section, $value['desc'], $value['image'], $value['expanded']);
+                }
+                unset($map['__sections']);
+            }
+
+            foreach ($this->_getFields($action) as $id) {
+                if (!isset($map[$id])) {
+                    $map[$id] = array();
+                }
+                if (!isset($map[$id]['hidden'])) {
+                    $map[$id]['hidden'] = false;
+                }
+                if (!isset($map[$id]['humanName'])) {
+                    $map[$id]['humanName'] = $id;
+                }
+                if (!isset($map[$id]['section'])) {
+                    $map[$id]['section'] = '__base';
+                }
+                if (!isset($map[$id]['readonly'])) {
+                    $map[$id]['readonly'] = false;
+                }
+                if (!isset($map[$id]['params'])) {
+                    $map[$id]['params'] = array();
+                }
+                if (!isset($map[$id]['description'])) {
+                    $map[$id]['description'] = '';
+                }
+                if (!isset($map[$id]['required'])) {
+                    $map[$id]['required'] = in_array($id, $this->_primaryKey);
+                }
+                if ($action == 'update' && in_array($id, $this->_primaryKey)) {
+                    $map[$id]['readonly'] = true;
+                }
+
+                if (!isset($map[$id]['type'])) {
+                    $map[$id]['type'] = 'text';
+                } else {
+
+                    /* trim aditonal parameters like decimal(10,2)*/
+                    if (strpos($map[$id]['type'], '(')) {
+                        $map[$id]['type'] = substr($map[$id]['type'], 0, strpos($map[$id]['type'], '('));
+                    }
+
+                    switch ($map[$id]['type']) {
+                    case 'date':
+                        $map[$id]['type'] = 'monthdayyear';
+                        $map[$id]['params'] = array('', '', true, '%Y-%m-%d');
+                        break;
+
+                    case 'number':
+                    case 'decimal':
+                    case 'real':
+                        $map[$id]['type'] = 'number';
+                        break;
+
+                    case 'text':
+                        $map[$id]['type'] = 'longtext';
+                        break;
+
+                    default:
+                        if (!class_exists('Horde_Form_Type_' . $map[$id]['type'], false)) {
+                            $map[$id]['type'] = 'text';
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+
+
+        if ($key) {
+            return $map[$column][$key];
+        } else {
+            return $map[$column];
+        }
+    }
+
+    /**
+     * Return the form values of primary keys.
+     */
+    public function getSelected()
+    {
+        static $selected;
+
+        if ($selected !== null) {
+            return $selected;
+        }
+
+        foreach ($this->_primaryKey as $key) {
+            if ($this->_vars->$key) {
+                $params[$key] = $this->_vars->$key;
+            }
+        }
+
+        $selected = $this->_mapper->findOne($params);
+
+        if ($selected === null) {
+            return PEAR::raiseError(_("Does not exists"));
+        }
+
+        return $selected;
+    }
+
+    /**
+     * Get the renderer for this form, either a custom renderer or the
+     * standard one.
+     *
+     * @param array $params  A hash of renderer-specific parameters.
+     *
+     * @return object Horde_Form_Renderer  The form renderer.
+     */
+    function getRenderer($params = array())
+    {
+        if ($this->_vars->action == 'search' || $this->_vars->action == 'search_active') {
+            require_once dirname(__FILE__) . '/Form_Renderer_Helper.php';
+            $renderer = new Horde_Form_Renderer_Form_Helper($params);
+        } else {
+            $renderer = new Horde_Form_Renderer($params);
+        }
+
+        return $renderer;
+    }
+
+    /**
+     * Fetch the field values of the submitted form.
+     *
+     * @param Variables $vars  The Variables object.
+     * @param array $info      Array to be filled with the submitted field
+     *                         values.
+     */
+    function getInfo($vars, &$info)
+    {
+        if (!$this->isSubmitted()) {
+            $info = array();
+            return;
+        }
+
+        parent::getInfo($vars, $info);
+
+        /* Add test cases and filter not existing filters */
+        if ($this->_vars->action == 'search' || $this->_vars->action == 'search_active') {
+            $fields = $this->_getFields('search');
+            foreach ($info as $key => $value) {
+                $name = substr($key, 0, strrpos($key, '_'));
+                if (empty($value) || !in_array($name, $fields)) {
+                    if (substr($key, 0, 6) != 'cases_') {
+                        unset($info[$key],
+                              $info['cases_' . $key]);
+                    }
+                    continue;
+                }
+                switch ($info['cases_' . $key]) {
+                    case 'IS':
+                    case 'IS NOT':
+                        if (!defined($value)) {
+                            unset($info[$key],
+                                  $info['cases_' . $key]);
+                            continue 2;
+                        }
+                        $value = constant($value);
+                    break;
+
+                    case 'LIKE':
+                    case 'NOT LIKE':
+                        if (strpos($value, '%') === false) {
+                            $value = "%$value%";
+                        }
+                    break;
+                }
+
+                $info[$key] = array('field' => $name,
+                                    'test' => $info['cases_' . $key],
+                                    'value' => $value);
+                unset($info['cases_' . $key]);
+            }
+        }
+    }
+
+    /**
+     * Return the form meta data
+     */
+    public function formMetaData($action)
+    {
+        if (method_exists($this->_mapper, 'formMeta')) {
+            return $this->_mapper->formMeta($action);
+        } else {
+            return $this->_mapper->fields;
+        }
+    }
+
+    /**
+     * Array of field name.
+     */
+    protected function _getFields($action)
+    {
+        static $fields;
+
+        if ($fields !== null) {
+            return $fields;
+        }
+
+        if (method_exists($this->_mapper, 'formFields')) {
+            $fields = $this->_mapper->formFields($action);
+        } else {
+            $fields = $this->_mapper->fields;
+        }
+
+        return $fields;
+    }
+
+    /**
+     * Get primary key.
+     */
+    protected function _getPrimaryKey()
+    {
+        if ($this->_primaryKey === null) {
+            if (method_exists($this->_mapper, 'getPrimaryKey')) {
+                $this->_primaryKey = $this->_mapper->getPrimaryKey();
+            } else {
+                $this->_primaryKey = $this->_mapper->tableDefinition->getPrimaryKey()->columns;
+            }
+        }
+    }
+
+    /**
+     * Delect selected record.
+     */
+    public function delete()
+    {
+        try {
+            $this->getSelected()->delete();
+        } catch (Exception $e) {
+            return PEAR::raiseError($e->getMessage());
+        }
+    }
+
+    /**
+     * Create a new record.
+     */
+    public function create($params)
+    {
+        foreach ($params as $key => $value) {
+            $meta = $this->_formMeta('update', $key);
+            if ($meta['type'] == 'set') {
+                $params[$key] = implode('|', $value);
+            }
+        }
+
+        try {
+            $this->_mapper->create($params);
+        } catch (Exception $e) {
+            return PEAR::raiseError($e->getMessage());
+        }
+    }
+
+    /**
+     * Update selected record.
+     */
+    public function update($params)
+    {
+        foreach ($params as $key => $value) {
+            $meta = $this->_formMeta('update', $key);
+            if ($meta['type'] == 'set' && is_array($value)) {
+                $params[$key] = implode('|', $value);
+            }
+        }
+
+        $selected = $this->getSelected();
+        foreach ($params as $key => $value) {
+            $selected->$key = $value;
+        }
+
+        try {
+            $selected->save();
+        } catch (Exception $e) {
+            return PEAR::raiseError($e->getMessage());
+        }
+    }
+
+}
diff --git a/framework/Rdo/lib/Horde/Rdo/Form/Renderer/Helper.php b/framework/Rdo/lib/Horde/Rdo/Form/Renderer/Helper.php
new file mode 100644 (file)
index 0000000..3476686
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Renderer for the advanced search
+ */
+class Horde_Form_Renderer_Form_Helper extends Horde_Form_Renderer
+{
+    function _renderVarInputBegin($form, $var, $vars)
+    {
+        if ($var->description != 'cases' && $var->varName != 'horde_helper_add') {
+           return;
+        }
+
+        parent::_renderVarInputBegin($form, $var, $vars);
+    }
+
+    function _renderVarInputEnd($form, $var, $vars)
+    {
+        if ($var->description == 'cases' && $var->varName != 'horde_helper_add') {
+           echo ' ';
+           return;
+        }
+
+        parent::_renderVarInputEnd($form, $var, $vars);
+    }
+
+}
diff --git a/framework/Rdo/lib/Horde/Rdo/Lens.php b/framework/Rdo/lib/Horde/Rdo/Lens.php
new file mode 100644 (file)
index 0000000..07c62a6
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+/**
+ * @package Horde_Rdo
+ */
+
+/**
+ * @package Horde_Rdo
+ */
+class Horde_Rdo_Lens extends Horde_Lens implements IteratorAggregate
+{
+    /**
+     * Implement the IteratorAggregate pattern. When a single Rdo
+     * object is iterated over, we return an iterator that loops over
+     * each property of the object.
+     *
+     * @return ArrayIterator The Iterator instance.
+     */
+    public function getIterator()
+    {
+        return new Horde_Rdo_Iterator($this);
+    }
+
+}
diff --git a/framework/Rdo/lib/Horde/Rdo/Table/Helper.php b/framework/Rdo/lib/Horde/Rdo/Table/Helper.php
new file mode 100644 (file)
index 0000000..e73754d
--- /dev/null
@@ -0,0 +1,307 @@
+<?php
+/**
+ * The Horde_Rdo_Table_Helper class provides an Rdo extension to Horde_Template
+ * used to generate browsing lists for different backends.
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Duck <duck@obala.net>
+ * @since   Horde 4.0
+ * @package Horde_Rdo
+ */
+class Horde_Rdo_Table_Helper extends Horde_Template
+{
+    /**
+     * Parameters for this Template instance.
+     *
+     * @var array
+     */
+    protected $_params = array();
+
+    /**
+     * Mapper object that we display.
+     *
+     * @var Horde_Rdo_Mapper $object
+     */
+    protected $_mapper;
+
+    /**
+     * Constructor
+     *
+     * @param Horde_Rdo_Mapper $object Mapper instance.
+     * @param array $params Template defaults.
+     */
+    public function __construct($params = array(), $object)
+    {
+        $this->_mapper = $object;
+
+        $params['name'] = $object->table;
+        $params['id'] = $object->table;
+
+        $defaults = array(
+            'delete' => true,
+            'update' => true,
+            'columns' => null,
+            'name' => '',
+            'id' => '',
+            'page' => 0,
+            'url' => Horde::selfUrl(),
+            'img_dir' => $GLOBALS['registry']->getImageDir('horde'),
+            'sort' => array(),
+            'filter' => array(),
+        );
+
+        $this->_params = array_merge($defaults, $params);
+
+        parent::Horde_Template();
+        $this->setOption('gettext', true);
+    }
+
+    /**
+     * Get Rdo members.
+     */
+    public function getRows()
+    {
+        $query = $this->_prepareQuery();
+        if (!empty($this->_params['perpage'])) {
+            $limit = $this->_params['perpage'];
+            $offset = $this->_params['page'] * $this->_params['perpage'];
+            $query->limit($limit, $offset);
+        }
+
+        $rows = new Horde_Rdo_List($query);
+
+        if (!empty($this->_params['decorator'])) {
+            $decorator = $this->_params['decorator'];
+            // $rows = new Horde_Lens_Iterator($rows, new $decorator());
+        }
+
+        return $rows;
+    }
+
+    /**
+     * Count Rdo members.
+     *
+     * @param array $filter filter/search rows
+     */
+    public function count()
+    {
+        return $this->_mapper->count($this->_prepareQuery());
+    }
+
+    /**
+     * Prepares Rdo query.
+     */
+    private function _prepareQuery()
+    {
+        $query = new Horde_Rdo_Query($this->_mapper);
+
+        if (!empty($this->_params['filter'])) {
+            foreach ($this->_params['filter'] as $key => $val) {
+                if (is_array($val)) {
+                    $query->addTest($val['field'], $val['test'], $val['value']);
+                } else {
+                    $query->addTest($key, '=', $val);
+                }
+            }
+        }
+
+        if (!empty($this->_params['sort'])) {
+            if (!is_array($this->_params['sort'])) {
+                $this->_params['sort'] = array($this->_params['sort']);
+            }
+            foreach ($this->_params['sort'] as $sort) {
+                if (is_array($sort)) {
+                    $query->sortBy($sort[0], $sort[1]);
+                } else {
+                    $query->sortBy($sort);
+                }
+            }
+        }
+
+        return $query;
+    }
+
+    /**
+     * Return field information.
+     */
+    protected function _getFields()
+    {
+        if ($this->_params['columns']) {
+            return $this->_params['columns'];
+        } elseif (!empty($this->_params['relationships'])) {
+            $fields = $this->_mapper->fields;
+            foreach ($this->_mapper->relationships as $r) {
+                $mapper_name = $r['mapper'];
+                $mapper = new $mapper_name();
+                $fields = array_merge($fields, $mapper->fields);
+            }
+            return $fields;
+        } else {
+            return $this->_mapper->fields;
+        }
+    }
+
+    /**
+     * Return field names.
+     */
+    protected function _listFields()
+    {
+        $meta = array();
+        if (method_exists($this->_mapper, 'formMeta')) {
+            $meta = $this->_mapper->formMeta('table');
+            if ($meta instanceof PEAR_Error) {
+                return $meta;
+            }
+        }
+
+        $columns = array();
+
+        $keys = $this->_getFields();
+        foreach ($keys as $key) {
+            if (isset($meta[$key]['humanName'])) {
+                $columns[$key] = $meta[$key]['humanName'];
+            } elseif ($key == 'created') {
+                $columns[$key] = 'Created';
+            } elseif ($key == 'updated') {
+                $columns[$key] = 'Updated';
+            } else {
+                $columns[$key] = $key;
+            }
+        }
+
+        return $columns;
+    }
+
+    /**
+     * Get primary key.
+     */
+    protected function _getPrimaryKey()
+    {
+        if (method_exists($this->_mapper, 'getPrimaryKey')) {
+            $keys = $this->_mapper->getPrimaryKey();
+        } else {
+            $keys = $this->_mapper->tableDefinition->getPrimaryKey()->columns;
+        }
+
+        if (empty($keys)) {
+            $keys = $this->fields;
+        }
+
+        return $keys;
+    }
+
+    /**
+     * Fetch template.
+     *
+     * @param string $template Template path.
+     */
+    public function fetch($template = null)
+    {
+        if ($template === null) {
+            $template = $this->_getTemplateFile();
+        }
+
+        if ($template) {
+            return parent::fetch($template);
+        }
+
+        return parent::parse($this->getTemplate());
+    }
+
+    public function __toString()
+    {
+        return $this->fetch();
+    }
+
+    /**
+     * Fill up table data.
+     */
+    public function fill()
+    {
+        $this->set('rows', $this->getRows());
+
+        if (empty($this->_scalars['img_dir'])) {
+            $this->set('img_dir', $this->_params['img_dir']);
+        }
+
+        if (empty($this->_scalars['url'])) {
+            $this->set('url', $this->_params['url']);
+        }
+    }
+
+    /**
+     * Get template path if it exists.
+     *
+     * @return string Template filename.
+     */
+    protected function _getTemplateFile()
+    {
+        $filename = $GLOBALS['registry']->get('templates') . DIRECTORY_SEPARATOR . $this->_params['name'] . '.html';
+        if (file_exists($filename)) {
+            return $filename;
+        }
+
+        $filename = $GLOBALS['registry']->get('templates', 'horde') . DIRECTORY_SEPARATOR . $this->_params['name'] . '.html';
+        if (file_exists($filename)) {
+            return $filename;
+        }
+
+        return false;
+    }
+
+    /**
+     * Create template content.
+     *
+     * @return string $content
+     */
+    public function getTemplate()
+    {
+        $url = '<tag:url />';
+        $columns = $this->_listFields();
+
+        $keys = array();
+        $primaryKeys = $this->_getPrimaryKey();
+        foreach ($primaryKeys as $key) {
+            $keys[] = $key . '=<tag:rows.' . $key . ' />';
+        }
+        $keys = implode('&', $keys);
+
+        $content = '<table id="' . $this->_params['id'] . '" class="striped sortable" style="width: 100%;">' . "\n" .
+            '<thead>' . "\n" . '<tr>' . "\n";
+        if ($this->_params['update'] || $this->_params['delete']) {
+            $content .= '<th class="nosort"><gettext>Actions</gettext></th>' . "\n";
+        }
+        foreach ($columns as $key => $name) {
+            if (in_array($key, $this->_params['sort'])) {
+                $content .= '<th class="sortdown">' . htmlspecialchars($name) . '</th>' . "\n";
+            } else {
+                $content .= '<th>' . htmlspecialchars($name) . '</th>' . "\n";
+            }
+        }
+        $content .= '</tr>' . "\n" . '</thead>' . "\n" . '<tbody>' .
+            '<loop:rows><tr>' . "\n";
+
+        /* Actions. */
+        if ($this->_params['update'] || $this->_params['delete']) {
+            $content .= '<td class="nowrap">' . "\n";
+            if ($this->_params['update']) {
+                $content .= '<a class="update" href="' . Horde_Util::addParameter($url, 'action', 'update') . '&' . $keys . '">' .
+                    '<img src="<tag:img_dir />/edit.png" alt="<gettext>Edit</gettext>" title="<gettext>Edit</gettext>" /></a> ' . "\n";
+            }
+            if ($this->_params['delete']) {
+                $content .= '<a class="delete" href="' . Horde_Util::addParameter($url, 'action', 'delete') . '&' . $keys . '">' .
+                    '<img src="<tag:img_dir />/delete.png" alt="<gettext>Delete</gettext>" title="<gettext>Delete</gettext>" /></a> ' . "\n";
+            }
+            $content .= '</td>' . "\n";
+        }
+
+        foreach ($columns as $key => $name) {
+            $content .= '<td><tag:rows.' . $key . ' /></td>';
+        }
+
+        return $content . '</tr>' . "\n" . '</loop:rows>' . "\n" . '</tbody></table>';
+    }
+
+}
diff --git a/framework/Rdo/lib/Horde/Rdo/Table/Helper/Lens.php b/framework/Rdo/lib/Horde/Rdo/Table/Helper/Lens.php
new file mode 100644 (file)
index 0000000..bb28838
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @package Horde_Rdo
+ */
+class Horde_Rdo_Table_Helper_Lens extends Horde_Lens
+{
+    /**
+     */
+    private $date_format = '%x';
+
+    /**
+     */
+    private $time_format = 'G:i';
+
+    /**
+     */
+    public function __construct()
+    {
+        $this->date_format = $GLOBALS['prefs']->getValue('date_format');
+        $this->time_format = $GLOBALS['prefs']->getValue('twentyFour') ? 'G:i' : 'g:ia';
+    }
+
+    /**
+     */
+    public function decorate($target)
+    {
+        if (!is_object($target)) {
+            $target = (object)$target;
+        }
+
+        return parent::decorate($target);
+    }
+
+    /**
+     */
+    public function __get($key)
+    {
+        $value = parent::__get($key);
+
+        if ($key == 'updated' || $key == 'created') {
+            return strftime($this->date_format, $value) . ' ' . date($this->time_format , $value);
+        }
+
+        return htmlspecialchars($value);
+    }
+
+}
index 0c77330..119ca4b 100644 (file)
@@ -32,11 +32,24 @@ http://pear.php.net/dtd/package-2.0.xsd">
    <dir name="lib">
     <dir name="Horde">
      <dir name="Rdo">
+      <dir name="Form">
+       <dir name="Renderer">
+        <file name="Helper.php" role="php" />
+       </dir> <!-- /lib/Horde/Rdo/Form/Renderer -->
+       <file name="Helper.php" role="php" />
+      </dir> <!-- /lib/Horde/Rdo/Form -->
       <dir name="Query">
        <file name="Literal.php" role="php" />
       </dir> <!-- /lib/Horde/Rdo/Query -->
+      <dir name="Table">
+       <dir name="Helper">
+        <file name="Lens.php" role="php" />
+       </dir> <!-- /lib/Horde/Rdo/Table/Helper -->
+       <file name="Helper.php" role="php" />
+      </dir> <!-- /lib/Horde/Rdo/Table -->
       <file name="Base.php" role="php" />
       <file name="Iterator.php" role="php" />
+      <file name="Lens.php" role="php" />
       <file name="List.php" role="php" />
       <file name="Mapper.php" role="php" />
       <file name="Query.php" role="php" />
@@ -58,9 +71,14 @@ http://pear.php.net/dtd/package-2.0.xsd">
  </dependencies>
  <phprelease>
   <filelist>
+   <install name="lib/Horde/Rdo/Form/Renderer/Helper.php" as="Horde/Rdo/Form/Renderer/Helper.php" />
+   <install name="lib/Horde/Rdo/Form/Helper.php" as="Horde/Rdo/Form/Helper.php" />
    <install name="lib/Horde/Rdo/Query/Literal.php" as="Horde/Rdo/Query/Literal.php" />
+   <install name="lib/Horde/Rdo/Table/Helper/Lens.php" as="Horde/Rdo/Table/Helper/Lens.php" />
+   <install name="lib/Horde/Rdo/Table/Helper.php" as="Horde/Rdo/Table/Helper.php" />
    <install name="lib/Horde/Rdo/Base.php" as="Horde/Rdo/Base.php" />
    <install name="lib/Horde/Rdo/Iterator.php" as="Horde/Rdo/Iterator.php" />
+   <install name="lib/Horde/Rdo/Lens.php" as="Horde/Rdo/Lens.php" />
    <install name="lib/Horde/Rdo/List.php" as="Horde/Rdo/List.php" />
    <install name="lib/Horde/Rdo/Mapper.php" as="Horde/Rdo/Mapper.php" />
    <install name="lib/Horde/Rdo/Query.php" as="Horde/Rdo/Query.php" />
diff --git a/framework/Rdo/www/Form_Helper.php b/framework/Rdo/www/Form_Helper.php
deleted file mode 100644 (file)
index c7e79c2..0000000
+++ /dev/null
@@ -1,480 +0,0 @@
-<?php
-/**
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @package Horde_Rdo
- */
-
-/**
- * The Horde_Form_Helper:: class provides autogeneration extension to
- * Horde_Form used for generating create and update data with various
- * backends.
- *
- * @author  Duck <duck@obala.net>
- * @since   Horde 4.0
- * @package Horde_Rdo
- */
-class Horde_Rdo_Form_Helper extends Horde_Form
-{
-    /**
-     * The primary key(s) of the resource.
-     *
-     * @var string
-     */
-    protected $_primaryKey;
-
-    /**
-     * Rdo_Mapper object that we display.
-     *
-     * @var Horde_Rdo_Mapper $mapper
-     */
-    protected $_mapper;
-
-    /**
-     * Extends Horde_Form for general purposes and prepare initial form.
-     */
-    public function __construct($vars, $title = '', $name = null, $params = null)
-    {
-        parent::__construct($vars, $title, $name);
-
-        if (is_array($params)) {
-            $this->_mapper = $params['mapper'];
-            unset($params['mapper']);
-        } else {
-            $this->_mapper = $params;
-            $params = array();
-        }
-
-        if ($vars->exists('action')) {
-            $this->addHidden('', 'action', 'text', true);
-        }
-        if ($vars->exists('table')) {
-            $this->addHidden('', 'table', 'text', true);
-        }
-        if ($vars->exists('what2process')) {
-            $this->addHidden('', 'what2process', 'text', true);
-        }
-
-        /* Determinate action */
-        if ($vars->get('submitbutton') == _("Advanced search")) {
-            $vars->set('action', 'search_active');
-            $this->_submitted = false;
-        } elseif ($vars->get('submitbutton') == _("Basic search")) {
-            $vars->set('action', 'search');
-            $this->_submitted = false;
-        } elseif (isset($params['action'])) {
-            $vars->set('action', $params['action']);
-        }
-
-        $i = 0;
-        $this->_getPrimaryKey();
-        $allFields = $this->_getFields($vars->get('action'));
-
-        /* Determine what to display */
-        if ($vars->get('action') == 'search_active') {
-            if ($vars->get('fields')) {
-                $fields = explode('|', $vars->get('fields'));
-            } else {
-                $fields = $this->_primaryKey;
-            }
-            if ($vars->get('horde_helper_add')) {
-                $fields[] = $vars->get('horde_helper_add');
-                $vars->set('horde_helper_add', null);
-            }
-        } else {
-            $fields = $allFields;
-        }
-
-        /* Loop to add fields */
-        foreach ($fields as $key) {
-            if ($key == 'created' || $key == 'updated') {
-                continue;
-            }
-
-            $params = $this->_formMeta($vars->get('action'), $key);
-            if (is_object($params)) {
-                return $params;
-            }
-
-            $this->_currentSection = $params['section'];
-
-            switch ($vars->get('action')) {
-            case 'create':
-                if ($params['readonly']) {
-                    continue 2;
-                }
-                break;
-
-            case 'update':
-                if (in_array($key, $this->_primaryKey)) {
-                    $this->addHidden('', $key, $params['type'], true);
-                    $params['readonly'] = true;
-                }
-                break;
-
-            case 'search':
-            case 'search_active':
-                $key .= '_' . $i++;
-                $params['readonly'] = false;
-                $params['required'] = false;
-                if (!$params['hidden']) {
-                    $this->_addCase($params['humanName'], $key);
-                }
-                break;
-            }
-
-            if ($params['hidden']) {
-                $this->addHidden('', $key, $params['type'], $params['required']);
-                continue;
-            }
-
-            $v = $this->addVariable($params['humanName'], $key, $params['type'],
-                                    $params['required'], $params['readonly'],
-                                    $params['description'], $params['params']);
-
-            if (!empty($params['help'])) {
-                $v->setHelp($params['help']);
-            }
-            if (!empty($params['default'])) {
-                $v->setDefault($params['default']);
-            }
-        }
-
-        switch ($vars->get('action')) {
-        case 'search':
-            $this->_submit = array(_("Search"), _("Advanced search"));
-            break;
-
-        case 'search_active':
-            require_once 'Horde/Array.php';
-            $params = array(Horde_Array::valuesToKeys($allFields), true);
-            $this->addVariable(_("Add"), 'horde_helper_add', 'enum', false, false, null, $params);
-            $this->_submit = array(_("Search"), _("Add"), _("Basic search"));
-            $this->addHidden('', 'fields', 'text', true);
-            $vars->set('fields', implode('|', $fields));
-            break;
-
-        case 'create':
-            $this->_submit = _("Create");
-            break;
-
-        case 'update':
-            $this->_submit = _("Update");
-            $this->_reset = _("Reset");
-        }
-    }
-
-    /**
-     * Add a comparison operator selection
-     */
-    protected function _addCase($humanName, $key)
-    {
-        $this->addVariable($humanName, 'cases_' . $key, 'enum', false, false, 'cases',
-                           array(array('=' => '=', '>' => '>', '<' => '<',
-                                       '>=' => '>=', '<=' => '<=', '<>' => '<>',
-                                       'LIKE' => 'LIKE', 'NOT LIKE' => 'NOT LIKE',
-                                       'IS' => 'IS', 'IS NOT' => 'IS NOT')));
-    }
-
-    /**
-     * Map from columns to Horde_Form types and attributes:
-     * Create values like Horde_Form::addVariable parameters
-     *   - humanName
-     *   - type
-     *   - required
-     *   - readonly
-     *   - description
-     *   - params
-     */
-    protected function _formMeta($action, $column, $key = false)
-    {
-        static $map;
-
-        if ($map === null) {
-            $map = $this->formMetaData($action);
-            if ($map instanceof PEAR_Error) {
-                return $map;
-            }
-            if (isset($map['__sections']) && $this->_vars->action != 'search_active') {
-                foreach ($map['__sections'] as $section => $value) {
-                    $this->setSection($section, $value['desc'], $value['image'], $value['expanded']);
-                }
-                unset($map['__sections']);
-            }
-
-            foreach ($this->_getFields($action) as $id) {
-                if (!isset($map[$id])) {
-                    $map[$id] = array();
-                }
-                if (!isset($map[$id]['hidden'])) {
-                    $map[$id]['hidden'] = false;
-                }
-                if (!isset($map[$id]['humanName'])) {
-                    $map[$id]['humanName'] = $id;
-                }
-                if (!isset($map[$id]['section'])) {
-                    $map[$id]['section'] = '__base';
-                }
-                if (!isset($map[$id]['readonly'])) {
-                    $map[$id]['readonly'] = false;
-                }
-                if (!isset($map[$id]['params'])) {
-                    $map[$id]['params'] = array();
-                }
-                if (!isset($map[$id]['description'])) {
-                    $map[$id]['description'] = '';
-                }
-                if (!isset($map[$id]['required'])) {
-                    $map[$id]['required'] = in_array($id, $this->_primaryKey);
-                }
-                if ($action == 'update' && in_array($id, $this->_primaryKey)) {
-                    $map[$id]['readonly'] = true;
-                }
-
-                if (!isset($map[$id]['type'])) {
-                    $map[$id]['type'] = 'text';
-                } else {
-
-                    /* trim aditonal parameters like decimal(10,2)*/
-                    if (strpos($map[$id]['type'], '(')) {
-                        $map[$id]['type'] = substr($map[$id]['type'], 0, strpos($map[$id]['type'], '('));
-                    }
-
-                    switch ($map[$id]['type']) {
-                    case 'date':
-                        $map[$id]['type'] = 'monthdayyear';
-                        $map[$id]['params'] = array('', '', true, '%Y-%m-%d');
-                        break;
-
-                    case 'number':
-                    case 'decimal':
-                    case 'real':
-                        $map[$id]['type'] = 'number';
-                        break;
-
-                    case 'text':
-                        $map[$id]['type'] = 'longtext';
-                        break;
-
-                    default:
-                        if (!class_exists('Horde_Form_Type_' . $map[$id]['type'], false)) {
-                            $map[$id]['type'] = 'text';
-                        }
-                        break;
-                    }
-                }
-            }
-        }
-
-
-        if ($key) {
-            return $map[$column][$key];
-        } else {
-            return $map[$column];
-        }
-    }
-
-    /**
-     * Return the form values of primary keys.
-     */
-    public function getSelected()
-    {
-        static $selected;
-
-        if ($selected !== null) {
-            return $selected;
-        }
-
-        foreach ($this->_primaryKey as $key) {
-            if ($this->_vars->$key) {
-                $params[$key] = $this->_vars->$key;
-            }
-        }
-
-        $selected = $this->_mapper->findOne($params);
-
-        if ($selected === null) {
-            return PEAR::raiseError(_("Does not exists"));
-        }
-
-        return $selected;
-    }
-
-    /**
-     * Get the renderer for this form, either a custom renderer or the
-     * standard one.
-     *
-     * @param array $params  A hash of renderer-specific parameters.
-     *
-     * @return object Horde_Form_Renderer  The form renderer.
-     */
-    function getRenderer($params = array())
-    {
-        if ($this->_vars->action == 'search' || $this->_vars->action == 'search_active') {
-            require_once dirname(__FILE__) . '/Form_Renderer_Helper.php';
-            $renderer = new Horde_Form_Renderer_Form_Helper($params);
-        } else {
-            $renderer = new Horde_Form_Renderer($params);
-        }
-
-        return $renderer;
-    }
-
-    /**
-     * Fetch the field values of the submitted form.
-     *
-     * @param Variables $vars  The Variables object.
-     * @param array $info      Array to be filled with the submitted field
-     *                         values.
-     */
-    function getInfo($vars, &$info)
-    {
-        if (!$this->isSubmitted()) {
-            $info = array();
-            return;
-        }
-
-        parent::getInfo($vars, $info);
-
-        /* Add test cases and filter not existing filters */
-        if ($this->_vars->action == 'search' || $this->_vars->action == 'search_active') {
-            $fields = $this->_getFields('search');
-            foreach ($info as $key => $value) {
-                $name = substr($key, 0, strrpos($key, '_'));
-                if (empty($value) || !in_array($name, $fields)) {
-                    if (substr($key, 0, 6) != 'cases_') {
-                        unset($info[$key],
-                              $info['cases_' . $key]);
-                    }
-                    continue;
-                }
-                switch ($info['cases_' . $key]) {
-                    case 'IS':
-                    case 'IS NOT':
-                        if (!defined($value)) {
-                            unset($info[$key],
-                                  $info['cases_' . $key]);
-                            continue 2;
-                        }
-                        $value = constant($value);
-                    break;
-
-                    case 'LIKE':
-                    case 'NOT LIKE':
-                        if (strpos($value, '%') === false) {
-                            $value = "%$value%";
-                        }
-                    break;
-                }
-
-                $info[$key] = array('field' => $name,
-                                    'test' => $info['cases_' . $key],
-                                    'value' => $value);
-                unset($info['cases_' . $key]);
-            }
-        }
-    }
-
-    /**
-     * Return the form meta data
-     */
-    public function formMetaData($action)
-    {
-        if (method_exists($this->_mapper, 'formMeta')) {
-            return $this->_mapper->formMeta($action);
-        } else {
-            return $this->_mapper->fields;
-        }
-    }
-
-    /**
-     * Array of field name.
-     */
-    protected function _getFields($action)
-    {
-        static $fields;
-
-        if ($fields !== null) {
-            return $fields;
-        }
-
-        if (method_exists($this->_mapper, 'formFields')) {
-            $fields = $this->_mapper->formFields($action);
-        } else {
-            $fields = $this->_mapper->fields;
-        }
-
-        return $fields;
-    }
-
-    /**
-     * Get primary key.
-     */
-    protected function _getPrimaryKey()
-    {
-        if ($this->_primaryKey === null) {
-            if (method_exists($this->_mapper, 'getPrimaryKey')) {
-                $this->_primaryKey = $this->_mapper->getPrimaryKey();
-            } else {
-                $this->_primaryKey = $this->_mapper->tableDefinition->getPrimaryKey()->columns;
-            }
-        }
-    }
-
-    /**
-     * Delect selected record.
-     */
-    public function delete()
-    {
-        try {
-            $this->getSelected()->delete();
-        } catch (Exception $e) {
-            return PEAR::raiseError($e->getMessage());
-        }
-    }
-
-    /**
-     * Create a new record.
-     */
-    public function create($params)
-    {
-        foreach ($params as $key => $value) {
-            $meta = $this->_formMeta('update', $key);
-            if ($meta['type'] == 'set') {
-                $params[$key] = implode('|', $value);
-            }
-        }
-
-        try {
-            $this->_mapper->create($params);
-        } catch (Exception $e) {
-            return PEAR::raiseError($e->getMessage());
-        }
-    }
-
-    /**
-     * Update selected record.
-     */
-    public function update($params)
-    {
-        foreach ($params as $key => $value) {
-            $meta = $this->_formMeta('update', $key);
-            if ($meta['type'] == 'set' && is_array($value)) {
-                $params[$key] = implode('|', $value);
-            }
-        }
-
-        $selected = $this->getSelected();
-        foreach ($params as $key => $value) {
-            $selected->$key = $value;
-        }
-
-        try {
-            $selected->save();
-        } catch (Exception $e) {
-            return PEAR::raiseError($e->getMessage());
-        }
-    }
-
-}
diff --git a/framework/Rdo/www/Form_Renderer_Helper.php b/framework/Rdo/www/Form_Renderer_Helper.php
deleted file mode 100644 (file)
index 3476686..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Renderer for the advanced search
- */
-class Horde_Form_Renderer_Form_Helper extends Horde_Form_Renderer
-{
-    function _renderVarInputBegin($form, $var, $vars)
-    {
-        if ($var->description != 'cases' && $var->varName != 'horde_helper_add') {
-           return;
-        }
-
-        parent::_renderVarInputBegin($form, $var, $vars);
-    }
-
-    function _renderVarInputEnd($form, $var, $vars)
-    {
-        if ($var->description == 'cases' && $var->varName != 'horde_helper_add') {
-           echo ' ';
-           return;
-        }
-
-        parent::_renderVarInputEnd($form, $var, $vars);
-    }
-
-}
diff --git a/framework/Rdo/www/Lens.php b/framework/Rdo/www/Lens.php
deleted file mode 100644 (file)
index 07c62a6..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * @package Horde_Rdo
- */
-
-/**
- * @package Horde_Rdo
- */
-class Horde_Rdo_Lens extends Horde_Lens implements IteratorAggregate
-{
-    /**
-     * Implement the IteratorAggregate pattern. When a single Rdo
-     * object is iterated over, we return an iterator that loops over
-     * each property of the object.
-     *
-     * @return ArrayIterator The Iterator instance.
-     */
-    public function getIterator()
-    {
-        return new Horde_Rdo_Iterator($this);
-    }
-
-}
diff --git a/framework/Rdo/www/Table_Helper.php b/framework/Rdo/www/Table_Helper.php
deleted file mode 100644 (file)
index e73754d..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-<?php
-/**
- * The Horde_Rdo_Table_Helper class provides an Rdo extension to Horde_Template
- * used to generate browsing lists for different backends.
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Duck <duck@obala.net>
- * @since   Horde 4.0
- * @package Horde_Rdo
- */
-class Horde_Rdo_Table_Helper extends Horde_Template
-{
-    /**
-     * Parameters for this Template instance.
-     *
-     * @var array
-     */
-    protected $_params = array();
-
-    /**
-     * Mapper object that we display.
-     *
-     * @var Horde_Rdo_Mapper $object
-     */
-    protected $_mapper;
-
-    /**
-     * Constructor
-     *
-     * @param Horde_Rdo_Mapper $object Mapper instance.
-     * @param array $params Template defaults.
-     */
-    public function __construct($params = array(), $object)
-    {
-        $this->_mapper = $object;
-
-        $params['name'] = $object->table;
-        $params['id'] = $object->table;
-
-        $defaults = array(
-            'delete' => true,
-            'update' => true,
-            'columns' => null,
-            'name' => '',
-            'id' => '',
-            'page' => 0,
-            'url' => Horde::selfUrl(),
-            'img_dir' => $GLOBALS['registry']->getImageDir('horde'),
-            'sort' => array(),
-            'filter' => array(),
-        );
-
-        $this->_params = array_merge($defaults, $params);
-
-        parent::Horde_Template();
-        $this->setOption('gettext', true);
-    }
-
-    /**
-     * Get Rdo members.
-     */
-    public function getRows()
-    {
-        $query = $this->_prepareQuery();
-        if (!empty($this->_params['perpage'])) {
-            $limit = $this->_params['perpage'];
-            $offset = $this->_params['page'] * $this->_params['perpage'];
-            $query->limit($limit, $offset);
-        }
-
-        $rows = new Horde_Rdo_List($query);
-
-        if (!empty($this->_params['decorator'])) {
-            $decorator = $this->_params['decorator'];
-            // $rows = new Horde_Lens_Iterator($rows, new $decorator());
-        }
-
-        return $rows;
-    }
-
-    /**
-     * Count Rdo members.
-     *
-     * @param array $filter filter/search rows
-     */
-    public function count()
-    {
-        return $this->_mapper->count($this->_prepareQuery());
-    }
-
-    /**
-     * Prepares Rdo query.
-     */
-    private function _prepareQuery()
-    {
-        $query = new Horde_Rdo_Query($this->_mapper);
-
-        if (!empty($this->_params['filter'])) {
-            foreach ($this->_params['filter'] as $key => $val) {
-                if (is_array($val)) {
-                    $query->addTest($val['field'], $val['test'], $val['value']);
-                } else {
-                    $query->addTest($key, '=', $val);
-                }
-            }
-        }
-
-        if (!empty($this->_params['sort'])) {
-            if (!is_array($this->_params['sort'])) {
-                $this->_params['sort'] = array($this->_params['sort']);
-            }
-            foreach ($this->_params['sort'] as $sort) {
-                if (is_array($sort)) {
-                    $query->sortBy($sort[0], $sort[1]);
-                } else {
-                    $query->sortBy($sort);
-                }
-            }
-        }
-
-        return $query;
-    }
-
-    /**
-     * Return field information.
-     */
-    protected function _getFields()
-    {
-        if ($this->_params['columns']) {
-            return $this->_params['columns'];
-        } elseif (!empty($this->_params['relationships'])) {
-            $fields = $this->_mapper->fields;
-            foreach ($this->_mapper->relationships as $r) {
-                $mapper_name = $r['mapper'];
-                $mapper = new $mapper_name();
-                $fields = array_merge($fields, $mapper->fields);
-            }
-            return $fields;
-        } else {
-            return $this->_mapper->fields;
-        }
-    }
-
-    /**
-     * Return field names.
-     */
-    protected function _listFields()
-    {
-        $meta = array();
-        if (method_exists($this->_mapper, 'formMeta')) {
-            $meta = $this->_mapper->formMeta('table');
-            if ($meta instanceof PEAR_Error) {
-                return $meta;
-            }
-        }
-
-        $columns = array();
-
-        $keys = $this->_getFields();
-        foreach ($keys as $key) {
-            if (isset($meta[$key]['humanName'])) {
-                $columns[$key] = $meta[$key]['humanName'];
-            } elseif ($key == 'created') {
-                $columns[$key] = 'Created';
-            } elseif ($key == 'updated') {
-                $columns[$key] = 'Updated';
-            } else {
-                $columns[$key] = $key;
-            }
-        }
-
-        return $columns;
-    }
-
-    /**
-     * Get primary key.
-     */
-    protected function _getPrimaryKey()
-    {
-        if (method_exists($this->_mapper, 'getPrimaryKey')) {
-            $keys = $this->_mapper->getPrimaryKey();
-        } else {
-            $keys = $this->_mapper->tableDefinition->getPrimaryKey()->columns;
-        }
-
-        if (empty($keys)) {
-            $keys = $this->fields;
-        }
-
-        return $keys;
-    }
-
-    /**
-     * Fetch template.
-     *
-     * @param string $template Template path.
-     */
-    public function fetch($template = null)
-    {
-        if ($template === null) {
-            $template = $this->_getTemplateFile();
-        }
-
-        if ($template) {
-            return parent::fetch($template);
-        }
-
-        return parent::parse($this->getTemplate());
-    }
-
-    public function __toString()
-    {
-        return $this->fetch();
-    }
-
-    /**
-     * Fill up table data.
-     */
-    public function fill()
-    {
-        $this->set('rows', $this->getRows());
-
-        if (empty($this->_scalars['img_dir'])) {
-            $this->set('img_dir', $this->_params['img_dir']);
-        }
-
-        if (empty($this->_scalars['url'])) {
-            $this->set('url', $this->_params['url']);
-        }
-    }
-
-    /**
-     * Get template path if it exists.
-     *
-     * @return string Template filename.
-     */
-    protected function _getTemplateFile()
-    {
-        $filename = $GLOBALS['registry']->get('templates') . DIRECTORY_SEPARATOR . $this->_params['name'] . '.html';
-        if (file_exists($filename)) {
-            return $filename;
-        }
-
-        $filename = $GLOBALS['registry']->get('templates', 'horde') . DIRECTORY_SEPARATOR . $this->_params['name'] . '.html';
-        if (file_exists($filename)) {
-            return $filename;
-        }
-
-        return false;
-    }
-
-    /**
-     * Create template content.
-     *
-     * @return string $content
-     */
-    public function getTemplate()
-    {
-        $url = '<tag:url />';
-        $columns = $this->_listFields();
-
-        $keys = array();
-        $primaryKeys = $this->_getPrimaryKey();
-        foreach ($primaryKeys as $key) {
-            $keys[] = $key . '=<tag:rows.' . $key . ' />';
-        }
-        $keys = implode('&', $keys);
-
-        $content = '<table id="' . $this->_params['id'] . '" class="striped sortable" style="width: 100%;">' . "\n" .
-            '<thead>' . "\n" . '<tr>' . "\n";
-        if ($this->_params['update'] || $this->_params['delete']) {
-            $content .= '<th class="nosort"><gettext>Actions</gettext></th>' . "\n";
-        }
-        foreach ($columns as $key => $name) {
-            if (in_array($key, $this->_params['sort'])) {
-                $content .= '<th class="sortdown">' . htmlspecialchars($name) . '</th>' . "\n";
-            } else {
-                $content .= '<th>' . htmlspecialchars($name) . '</th>' . "\n";
-            }
-        }
-        $content .= '</tr>' . "\n" . '</thead>' . "\n" . '<tbody>' .
-            '<loop:rows><tr>' . "\n";
-
-        /* Actions. */
-        if ($this->_params['update'] || $this->_params['delete']) {
-            $content .= '<td class="nowrap">' . "\n";
-            if ($this->_params['update']) {
-                $content .= '<a class="update" href="' . Horde_Util::addParameter($url, 'action', 'update') . '&' . $keys . '">' .
-                    '<img src="<tag:img_dir />/edit.png" alt="<gettext>Edit</gettext>" title="<gettext>Edit</gettext>" /></a> ' . "\n";
-            }
-            if ($this->_params['delete']) {
-                $content .= '<a class="delete" href="' . Horde_Util::addParameter($url, 'action', 'delete') . '&' . $keys . '">' .
-                    '<img src="<tag:img_dir />/delete.png" alt="<gettext>Delete</gettext>" title="<gettext>Delete</gettext>" /></a> ' . "\n";
-            }
-            $content .= '</td>' . "\n";
-        }
-
-        foreach ($columns as $key => $name) {
-            $content .= '<td><tag:rows.' . $key . ' /></td>';
-        }
-
-        return $content . '</tr>' . "\n" . '</loop:rows>' . "\n" . '</tbody></table>';
-    }
-
-}
diff --git a/framework/Rdo/www/Table_Helper_Lens.php b/framework/Rdo/www/Table_Helper_Lens.php
deleted file mode 100644 (file)
index bb28838..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * @package Horde_Rdo
- */
-class Horde_Rdo_Table_Helper_Lens extends Horde_Lens
-{
-    /**
-     */
-    private $date_format = '%x';
-
-    /**
-     */
-    private $time_format = 'G:i';
-
-    /**
-     */
-    public function __construct()
-    {
-        $this->date_format = $GLOBALS['prefs']->getValue('date_format');
-        $this->time_format = $GLOBALS['prefs']->getValue('twentyFour') ? 'G:i' : 'g:ia';
-    }
-
-    /**
-     */
-    public function decorate($target)
-    {
-        if (!is_object($target)) {
-            $target = (object)$target;
-        }
-
-        return parent::decorate($target);
-    }
-
-    /**
-     */
-    public function __get($key)
-    {
-        $value = parent::__get($key);
-
-        if ($key == 'updated' || $key == 'created') {
-            return strftime($this->date_format, $value) . ' ' . date($this->time_format , $value);
-        }
-
-        return htmlspecialchars($value);
-    }
-
-}