# Coverage for Doctrine_Plugin

Back to coverage report

1 | <?php
2 | /*
3 | * $Id$
4 | *
5 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16 | *
17 | * This software consists of voluntary contributions made by many individuals
18 | * and is licensed under the LGPL. For more information, see
19 | * <http://www.phpdoctrine.org>.
20 | */
21 |
22 | /**
23 | * Doctrine_Plugin
24 | *
25 | * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
26 | * @package Doctrine
27 | * @subpackage Plugin
28 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
29 | * @version $Revision$
30 | * @link www.phpdoctrine.org
31 | * @since 1.0
32 | */
33 | abstract class Doctrine_Plugin
34 | {
35 | /**
36 | * @var array $_options an array of plugin specific options
37 | */
38 | protected $_options = array('generateFiles' => false,
39 | 'identifier' => false,
40 | 'generateFiles' => false,
41 | 'table' => false,
42 | 'pluginTable' => false,
43 | 'children' => array(),);
44 |
45 | /**
46 | * __get
47 | * an alias for getOption
48 | *
49 | * @param string $option
50 | */
51 | public function __get($option)
52 | {
53 | if (isset($this->_options[$option])) {
54 | return $this->_options[$option];
55 | }
56 | return null;
57 | }
58 |
59 | /**
60 | * __isset
61 | *
62 | * @param string $option
63 | */
64 | public function __isset($option)
65 | {
66 | return isset($this->_options[$option]);
67 | }
68 |
69 | /**
70 | * returns the value of an option
71 | *
72 | * @param $option the name of the option to retrieve
73 | * @return mixed the value of the option
74 | */
75 | public function getOption($name)
76 | {
77 | if ( ! isset($this->_options[$name])) {
78 | throw new Doctrine_Plugin_Exception('Unknown option ' . $name);
79 | }
80 |
81 | return $this->_options[$name];
82 | }
83 |
84 | /**
85 | * sets given value to an option
86 | *
87 | * @param $option the name of the option to be changed
88 | * @param $value the value of the option
89 | * @return Doctrine_Plugin this object
90 | */
91 | public function setOption($name, $value)
92 | {
93 | $this->_options[$name] = $value;
94 |
95 | return $this;
96 | }
97 |
98 | public function addChild(Doctrine_Template $template)
99 | {
100 | $this->_options['children'][] = $template;
101 | }
102 |
103 | /**
104 | * returns all options and their associated values
105 | *
106 | * @return array all options as an associative array
107 | */
108 | public function getOptions()
109 | {
110 | return $this->_options;
111 | }
112 |
113 | public function buildPluginDefinition(Doctrine_Table $table)
114 | {
115 | $this->_options['table'] = $table;
116 |
117 | $this->_options['className'] = str_replace('%CLASS%',
118 | $this->_options['table']->getComponentName(),
119 | $this->_options['className']);
120 |
121 | // check that class doesn't exist (otherwise we cannot create it)
122 | if (class_exists($this->_options['className'])) {
123 | return false;
124 | }
125 |
126 | $this->buildDefinition();
127 | }
128 |
129 | abstract public function buildDefinition();
130 |
131 | public function buildForeignKeys(Doctrine_Table $table)
132 | {
133 | $id = $table->getIdentifier();
134 |
135 | $fk = array();
136 | foreach ((array) $id as $column) {
137 | $def = $table->getDefinitionOf($column);
138 |
139 | unset($def['autoincrement']);
140 | unset($def['sequence']);
141 | unset($def['unique']);
142 |
143 | $fk[$column] = $def;
144 | }
145 |
146 | return $fk;
147 | }
148 |
149 | public function generateChildDefinitions()
150 | {
151 | foreach ($this->_options['children'] as $child) {
152 | $this->_options['pluginTable']->addTemplate(get_class($child), $child);
153 |
154 | $child->setTable($this->_options['pluginTable']);
155 |
156 | $child->setUp();
157 | }
158 | }
159 |
160 | /**
161 | * generates foreign keys for the plugin table based on the owner table
162 | *
163 | * the foreign keys generated by this method can be used for
164 | * setting the relations between the owner and the plugin classes
165 | *
166 | * @param Doctrine_Table $table the table object that owns the plugin
167 | * @return array an array of foreign key definitions
168 | */
169 | public function generateForeignKeys(Doctrine_Table $table)
170 | {
171 | $fk = array();
172 |
173 | foreach ((array) $table->getIdentifier() as $column) {
174 | $def = $table->getDefinitionOf($column);
175 |
176 | unset($def['autoincrement']);
177 | unset($def['sequence']);
178 | unset($def['primary']);
179 |
180 | $col = $column;
181 |
182 | $def['primary'] = true;
183 | $fk[$col] = $def;
184 | }
185 | return $fk;
186 | }
187 |
188 | /**
189 | * generates a relation array to given table
190 | *
191 | * this method can be used for generating the relation from the plugin
192 | * table to the owner table
193 | *
194 | * @param Doctrine_Table $table the table object to construct the relation to
195 | * @param array $foreignKeys an array of foreign keys
196 | * @return array the generated relation array
197 | */
198 | public function generateRelation(Doctrine_Table $table, array $foreignKeys)
199 | {
200 | $local = (count($foreignKeys) > 1) ? array_keys($foreignKeys) : key($foreignKeys);
201 |
202 | $relation = array($table->getComponentName() =>
203 | array('local' => $local,
204 | 'foreign' => $table->getIdentifier(),
205 | 'onDelete' => 'CASCADE',
206 | 'onUpdate' => 'CASCADE'));
207 |
208 | return $relation;
209 | }
210 |
211 | /**
212 | * generates the class definition for plugin class
213 | *
214 | * @param array $options plugin class options, keys representing the option names
215 | * and values as option values
216 | * @param array $columns the plugin class columns, keys representing the column names
217 | * and values as column definitions
218 | * @param array $relations the bound relations of the plugin class
219 | * @return void
220 | */
221 | public function generateClass($options, $columns, $relations)
222 | {
223 | $builder = new Doctrine_Import_Builder();
224 |
225 | if ($this->_options['generateFiles']) {
226 | if (isset($this->_options['generatePath']) && $this->_options['generatePath']) {
227 | $builder->setTargetPath($this->_options['generatePath']);
228 |
229 | $builder->buildRecord($options, $columns, $relations);
230 | } else {
231 | throw new Doctrine_Plugin_Exception('If you wish to generate files then you must specify the path to generate the files in.');
232 | }
233 | } else {
234 | $def = $builder->buildDefinition($options, $columns, $relations);
235 |
236 | eval($def);
237 | }
238 | }
239 | }