Development

/branches/1.3/lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php

You must first sign up to be able to contribute.

root/branches/1.3/lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php

Revision 27842, 10.3 kB (checked in by Kris.Wallsmith, 4 years ago)

[1.3, 1.4] fixed typo, fixed consistent use of field rather than column name in doctrine form generators (closes #8254)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1 <?php
2
3 /*
4  * This file is part of the symfony package.
5  * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6  *
7  * For the full copyright and license information, please view the LICENSE
8  * file that was distributed with this source code.
9  */
10
11 /**
12  * Doctrine filter form generator.
13  *
14  * This class generates a Doctrine filter forms.
15  *
16  * @package    symfony
17  * @subpackage generator
18  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
19  * @version    SVN: $Id$
20  */
21 class sfDoctrineFormFilterGenerator extends sfDoctrineFormGenerator
22 {
23   /**
24    * Initializes the current sfGenerator instance.
25    *
26    * @param sfGeneratorManager $generatorManager A sfGeneratorManager instance
27    */
28   public function initialize(sfGeneratorManager $generatorManager)
29   {
30     parent::initialize($generatorManager);
31
32     $this->setGeneratorClass('sfDoctrineFormFilter');
33   }
34
35   /**
36    * Generates classes and templates in cache.
37    *
38    * @param array $params The parameters
39    *
40    * @return string The data to put in configuration cache
41    */
42   public function generate($params = array())
43   {
44     $this->params = $params;
45
46     if (!isset($this->params['model_dir_name']))
47     {
48       $this->params['model_dir_name'] = 'model';
49     }
50
51     if (!isset($this->params['filter_dir_name']))
52     {
53       $this->params['filter_dir_name'] = 'filter';
54     }
55
56     $models = $this->loadModels();
57
58     // create the project base class for all forms
59     $file = sfConfig::get('sf_lib_dir').'/filter/doctrine/BaseFormFilterDoctrine.class.php';
60     if (!file_exists($file))
61     {
62       if (!is_dir($directory = dirname($file)))
63       {
64         mkdir($directory, 0777, true);
65       }
66
67       file_put_contents($file, $this->evalTemplate('sfDoctrineFormFilterBaseTemplate.php'));
68     }
69
70     $pluginPaths = $this->generatorManager->getConfiguration()->getAllPluginPaths();
71
72     // create a form class for every Doctrine class
73     foreach ($models as $model)
74     {
75       $this->table = Doctrine_Core::getTable($model);
76       $this->modelName = $model;
77
78       $baseDir = sfConfig::get('sf_lib_dir') . '/filter/doctrine';
79
80       $isPluginModel = $this->isPluginModel($model);
81       if ($isPluginModel)
82       {
83         $pluginName = $this->getPluginNameForModel($model);
84         $baseDir .= '/' . $pluginName;
85       }
86
87       if (!is_dir($baseDir.'/base'))
88       {
89         mkdir($baseDir.'/base', 0777, true);
90       }
91
92       file_put_contents($baseDir.'/base/Base'.$model.'FormFilter.class.php', $this->evalTemplate(null === $this->getParentModel() ? 'sfDoctrineFormFilterGeneratedTemplate.php' : 'sfDoctrineFormFilterGeneratedInheritanceTemplate.php'));
93
94       if ($isPluginModel)
95       {
96         $pluginBaseDir = $pluginPaths[$pluginName].'/lib/filter/doctrine';
97         if (!file_exists($classFile = $pluginBaseDir.'/Plugin'.$model.'FormFilter.class.php'))
98         {
99             if (!is_dir($pluginBaseDir))
100             {
101               mkdir($pluginBaseDir, 0777, true);
102             }
103             file_put_contents($classFile, $this->evalTemplate('sfDoctrineFormFilterPluginTemplate.php'));
104         }
105       }
106       if (!file_exists($classFile = $baseDir.'/'.$model.'FormFilter.class.php'))
107       {
108         if ($isPluginModel)
109         {
110            file_put_contents($classFile, $this->evalTemplate('sfDoctrinePluginFormFilterTemplate.php'));
111         } else {
112            file_put_contents($classFile, $this->evalTemplate('sfDoctrineFormFilterTemplate.php'));
113         }
114       }
115     }
116   }
117
118   /**
119    * Returns a sfWidgetForm class name for a given column.
120    *
121    * @param  sfDoctrineColumn $column
122    * @return string    The name of a subclass of sfWidgetForm
123    */
124   public function getWidgetClassForColumn($column)
125   {
126     switch ($column->getDoctrineType())
127     {
128       case 'boolean':
129         $name = 'Choice';
130         break;
131       case 'date':
132       case 'datetime':
133       case 'timestamp':
134         $name = 'FilterDate';
135         break;
136       case 'enum':
137         $name = 'Choice';
138         break;
139       default:
140         $name = 'FilterInput';
141     }
142
143     if ($column->isForeignKey())
144     {
145       $name = 'DoctrineChoice';
146     }
147
148     return sprintf('sfWidgetForm%s', $name);
149   }
150
151   /**
152    * Returns a PHP string representing options to pass to a widget for a given column.
153    *
154    * @param  sfDoctrineColumn $column
155    * @return string    The options to pass to the widget as a PHP string
156    */
157   public function getWidgetOptionsForColumn($column)
158   {
159     $options = array();
160
161     $withEmpty = $column->isNotNull() && !$column->isForeignKey() ? array("'with_empty' => false") : array();
162     switch ($column->getDoctrineType())
163     {
164       case 'boolean':
165         $options[] = "'choices' => array('' => 'yes or no', 1 => 'yes', 0 => 'no')";
166         break;
167       case 'date':
168       case 'datetime':
169       case 'timestamp':
170         $options[] = "'from_date' => new sfWidgetFormDate(), 'to_date' => new sfWidgetFormDate()";
171         $options = array_merge($options, $withEmpty);
172         break;
173       case 'enum':
174         $values = array('' => '');
175         $values = array_merge($values, $column['values']);
176         $values = array_combine($values, $values);
177         $options[] = "'choices' => ".$this->arrayExport($values);
178         break;
179       default:
180         $options = array_merge($options, $withEmpty);
181     }
182
183     if ($column->isForeignKey())
184     {
185       $options[] = sprintf('\'model\' => $this->getRelatedModelName(\'%s\'), \'add_empty\' => true', $column->getRelationKey('alias'));
186     }
187
188     return count($options) ? sprintf('array(%s)', implode(', ', $options)) : '';
189   }
190
191   /**
192    * Returns a sfValidator class name for a given column.
193    *
194    * @param  sfDoctrineColumn $column
195    * @return string    The name of a subclass of sfValidator
196    */
197   public function getValidatorClassForColumn($column)
198   {
199     switch ($column->getDoctrineType())
200     {
201       case 'boolean':
202         $name = 'Choice';
203         break;
204       case 'float':
205       case 'decimal':
206         $name = 'Number';
207         break;
208       case 'integer':
209         $name = 'Integer';
210         break;
211       case 'date':
212       case 'datetime':
213       case 'timestamp':
214         $name = 'DateRange';
215         break;
216       case 'enum':
217         $name = 'Choice';
218         break;
219       default:
220         $name = 'Pass';
221     }
222
223     if ($column->isPrimarykey() || $column->isForeignKey())
224     {
225       $name = 'DoctrineChoice';
226     }
227
228     return sprintf('sfValidator%s', $name);
229   }
230
231   /**
232    * Returns a PHP string representing options to pass to a validator for a given column.
233    *
234    * @param  sfDoctrineColumn $column
235    * @return string    The options to pass to the validator as a PHP string
236    */
237   public function getValidatorOptionsForColumn($column)
238   {
239     $options = array('\'required\' => false');
240
241     if ($column->isForeignKey())
242     {
243       $columns = $column->getForeignTable()->getColumns();
244       foreach ($columns as $name => $col)
245       {
246         if (isset($col['primary']) && $col['primary'])
247         {
248           break;
249         }
250       }
251
252       $options[] = sprintf('\'model\' => $this->getRelatedModelName(\'%s\'), \'column\' => \'%s\'', $column->getRelationKey('alias'), $column->getForeignTable()->getFieldName($name));
253     }
254     else if ($column->isPrimaryKey())
255     {
256       $options[] = sprintf('\'model\' => \'%s\', \'column\' => \'%s\'', $this->table->getOption('name'), $column->getFieldName());
257     }
258     else
259     {
260       switch ($column->getDoctrineType())
261       {
262         case 'boolean':
263           $options[] = "'choices' => array('', 1, 0)";
264           break;
265         case 'date':
266           $options[] = "'from_date' => new sfValidatorDate(array('required' => false)), 'to_date' => new sfValidatorDateTime(array('required' => false))";
267           break;
268         case 'datetime':
269         case 'timestamp':
270           $options[] = "'from_date' => new sfValidatorDateTime(array('required' => false, 'datetime_output' => 'Y-m-d 00:00:00')), 'to_date' => new sfValidatorDateTime(array('required' => false, 'datetime_output' => 'Y-m-d 23:59:59'))";
271           break;
272         case 'enum':
273           $values = array_combine($column['values'], $column['values']);
274           $options[] = "'choices' => ".$this->arrayExport($values);
275           break;
276       }
277     }
278
279     return count($options) ? sprintf('array(%s)', implode(', ', $options)) : '';
280   }
281
282   public function getValidatorForColumn($column)
283   {
284     $format = 'new %s(%s)';
285
286     if (in_array($class = $this->getValidatorClassForColumn($column), array('sfValidatorInteger', 'sfValidatorNumber')))
287     {
288       $format = 'new sfValidatorSchemaFilter(\'text\', new %s(%s))';
289     }
290
291     return sprintf($format, $class, $this->getValidatorOptionsForColumn($column));
292   }
293
294   public function getType($column)
295   {
296     if ($column->isForeignKey())
297     {
298       return 'ForeignKey';
299     }
300
301     switch ($column->getDoctrineType())
302     {
303       case 'enum':
304         return 'Enum';
305       case 'boolean':
306         return 'Boolean';
307       case 'date':
308       case 'datetime':
309       case 'timestamp':
310         return 'Date';
311       case 'integer':
312       case 'decimal':
313       case 'float':
314         return 'Number';
315       default:
316         return 'Text';
317     }
318   }
319
320   /**
321    * Array export. Export array to formatted php code
322    *
323    * @param array $values
324    * @return string $php
325    */
326   protected function arrayExport($values)
327   {
328     $php = var_export($values, true);
329     $php = str_replace("\n", '', $php);
330     $php = str_replace('array (  ', 'array(', $php);
331     $php = str_replace(',)', ')', $php);
332     $php = str_replace('  ', ' ', $php);
333     return $php;
334   }
335
336   /**
337    * Filter out models that have disabled generation of form classes
338    *
339    * @return array $models Array of models to generate forms for
340    */
341   protected function filterModels($models)
342   {
343     foreach ($models as $key => $model)
344     {
345       $table = Doctrine_Core::getTable($model);
346       $symfonyOptions = (array) $table->getOption('symfony');
347
348       if ($table->isGenerator())
349       {
350         $symfonyOptions = array_merge((array) $table->getParentGenerator()->getOption('table')->getOption('symfony'), $symfonyOptions);
351       }
352
353       if (isset($symfonyOptions['filter']) && !$symfonyOptions['filter'])
354       {
355         unset($models[$key]);
356       }
357     }
358
359     return $models;
360   }
361
362   /**
363    * Get the name of the form class to extend based on the inheritance of the model
364    *
365    * @return string
366    */
367   public function getFormClassToExtend()
368   {
369     return null === ($model = $this->getParentModel()) ? 'BaseFormFilterDoctrine' : sprintf('%sFormFilter', $model);
370   }
371 }
372
Note: See TracBrowser for help on using the browser.