File: Manager.php

package info (click to toggle)
php-horde-content 2.0.4-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 308 kB
  • ctags: 377
  • sloc: php: 1,454; xml: 474; makefile: 10; sh: 3
file content (99 lines) | stat: -rw-r--r-- 2,859 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
/**
 * Copyright 2008-2014 Horde LLC (http://www.horde.org/)
 *
 * @author   Chuck Hagenbuch <chuck@horde.org>
 * @author   Michael Rubinsky <mrubinsk@horde.org>
 * @license  http://www.horde.org/licenses/bsd BSD
 * @category Horde
 * @package  Horde_Content
 */
class Content_Types_Manager
{
    /**
     * Database adapter
     * @var Horde_Db_Adapter
     */
    protected $_db;

    /**
     * Tables
     * @var array
     */
    protected $_tables = array(
        'types' => 'rampage_types',
    );

    public function __construct(Horde_Db_Adapter $db)
    {
        $this->_db = $db;
    }

    /**
     * Ensure that an array of types exist in storage. Create any that don't,
     * return type_ids for all.
     *
     * @param mixed $types  An array of types or single type value. Values typed
     *                      as an integer are assumed to already be an type_id.
     *
     * @return array  An array of type_ids.
     * @throws Content_Exception
     */
    public function ensureTypes($types)
    {
        if (!is_array($types)) {
            $types = array($types);
        }

        $typeIds = array();
        $typeName = array();

        // Anything already typed as an integer is assumed to be a type id.
        foreach ($types as $typeIndex => $type) {
            if (is_int($type)) {
                $typeIds[$typeIndex] = $type;
            } else {
                $typeName[$type] = $typeIndex;
            }
        }

        try {
            // Get the ids for any types that already exist.
            if (count($typeName)) {
                $rows = $this->_db->selectAssoc('SELECT type_id, type_name FROM '
                    . $this->_t('types') . ' WHERE type_name IN ('
                    . implode(',', array_map(array($this->_db, 'quoteString'), array_keys($typeName)))
                    . ')');
                foreach ($rows as $id => $type) {
                    $typeIndex = $typeName[$type];
                    unset($typeName[$type]);
                    $typeIds[$typeIndex] = (int)$id;
                }
            }

            // Create any types that didn't already exist
            foreach ($typeName as $type => $typeIndex) {
                $typeIds[$typeIndex] = intval($this->_db->insert(
                    'INSERT INTO ' . $this->_t('types')
                        . ' (type_name) VALUES ('
                        . $this->_db->quoteString($type) . ')'));
            }
        } catch (Horde_Db_Exception $e) {
            throw new Content_Exception($e);
        }

        return $typeIds;
    }

    /**
     * Shortcut for getting a table name.
     *
     * @param string $tableType
     *
     * @return string  Configured table name.
     */
    protected function _t($tableType)
    {
        return $this->_db->quoteTableName($this->_tables[$tableType]);
    }
}