Development

/branches/1.1/lib/generator/sfAdminGenerator.class.php

You must first sign up to be able to contribute.

root/branches/1.1/lib/generator/sfAdminGenerator.class.php

Revision 9862, 24.5 kB (checked in by fabien, 6 years ago)

fixed getColumnFilterTag() component type (closes #2861)

  • Property svn:mime-type set to text/x-php
  • 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) 2004-2006 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  * Admin generator.
13  *
14  * This class generates an admin module.
15  *
16  * This class calls two ORM specific methods:
17  *   getAllColumns()
18  * and
19  *   getAdminColumnForField($field, $flag = null)
20  *
21  * @package    symfony
22  * @subpackage generator
23  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
24  * @version    SVN: $Id$
25  */
26 abstract class sfAdminGenerator extends sfCrudGenerator
27 {
28   protected
29     $fields = array();
30
31   /**
32    * Returns HTML code for a help icon.
33    *
34    * @param string $column  The column name
35    * @param string $type    The field type (list, edit)
36    *
37    * @return string HTML code
38    */
39   public function getHelpAsIcon($column, $type = '')
40   {
41     $help = $this->getParameterValue($type.'.fields.'.$column->getName().'.help');
42     if ($help)
43     {
44       return "[?php echo image_tag(sfConfig::get('sf_admin_web_dir').'/images/help.png', array('align' => 'absmiddle', 'alt' => __('".$this->escapeString($help)."'), 'title' => __('".$this->escapeString($help)."'))) ?]";
45     }
46
47     return '';
48   }
49
50   /**
51    * Returns HTML code for a help text.
52    *
53    * @param string $column  The column name
54    * @param string $type    The field type (list, edit)
55    *
56    * @return string HTML code
57    */
58   public function getHelp($column, $type = '')
59   {
60     $help = $this->getParameterValue($type.'.fields.'.$column->getName().'.help');
61     if ($help)
62     {
63       return "<div class=\"sf_admin_edit_help\">[?php echo __('".$this->escapeString($help)."') ?]</div>";
64     }
65
66     return '';
67   }
68
69   /**
70    * Returns HTML code for an action button.
71    *
72    * @param string  $actionName   The action name
73    * @param array   $params       The parameters
74    * @param boolean $pk_link      Whether to add a primary key link or not
75    *
76    * @return string HTML code
77    */
78   public function getButtonToAction($actionName, $params, $pk_link = false)
79   {
80     $params   = (array) $params;
81     $options  = isset($params['params']) ? sfToolkit::stringToArray($params['params']) : array();
82     $method   = 'button_to';
83     $li_class = '';
84     $only_for = isset($params['only_for']) ? $params['only_for'] : null;
85
86     // default values
87     if ($actionName[0] == '_')
88     {
89       $actionName     = substr($actionName, 1);
90       $default_name   = strtr($actionName, '_', ' ');
91       $default_icon   = sfConfig::get('sf_admin_web_dir').'/images/'.$actionName.'_icon.png';
92       $default_action = $actionName;
93       $default_class  = 'sf_admin_action_'.$actionName;
94
95       if ($actionName == 'save' || $actionName == 'save_and_add' || $actionName == 'save_and_list')
96       {
97         $method = 'submit_tag';
98         $options['name'] = $actionName;
99       }
100
101       if ($actionName == 'delete')
102       {
103         $options['post'] = true;
104         if (!isset($options['confirm']))
105         {
106           $options['confirm'] = 'Are you sure?';
107         }
108
109         $li_class = 'float-left';
110
111         $only_for = 'edit';
112       }
113     }
114     else
115     {
116       $default_name   = strtr($actionName, '_', ' ');
117       $default_icon   = sfConfig::get('sf_admin_web_dir').'/images/default_icon.png';
118       $default_action = 'List'.sfInflector::camelize($actionName);
119       $default_class  = '';
120     }
121
122     $name   = isset($params['name']) ? $params['name'] : $default_name;
123     $icon   = isset($params['icon']) ? sfToolkit::replaceConstants($params['icon']) : $default_icon;
124     $action = isset($params['action']) ? $params['action'] : $default_action;
125     $url_params = $pk_link ? '?'.$this->getPrimaryKeyUrlParams() : '\'';
126
127     if (!isset($options['class']))
128     {
129       if ($default_class)
130       {
131         $options['class'] = $default_class;
132       }
133       else
134       {
135         $options['style'] = 'background: #ffc url('.$icon.') no-repeat 3px 2px';
136       }
137     }
138
139     $li_class = $li_class ? ' class="'.$li_class.'"' : '';
140
141     $html = '<li'.$li_class.'>';
142
143     if ($only_for == 'edit')
144     {
145       $html .= '[?php if ('.$this->getPrimaryKeyIsSet().'): ?]'."\n";
146     }
147     else if ($only_for == 'create')
148     {
149       $html .= '[?php if (!'.$this->getPrimaryKeyIsSet().'): ?]'."\n";
150     }
151     else if ($only_for !== null)
152     {
153       throw new sfConfigurationException(sprintf('The "only_for" parameter can only takes "create" or "edit" as argument ("%s").', $only_for));
154     }
155
156     if ($method == 'submit_tag')
157     {
158       $html .= '[?php echo submit_tag(__(\''.$name.'\'), '.var_export($options, true).') ?]';
159     }
160     else
161     {
162       $phpOptions = var_export($options, true);
163
164       // little hack
165       $phpOptions = preg_replace("/'confirm' => '(.+?)(?<!\\\)'/", '\'confirm\' => __(\'$1\')', $phpOptions);
166
167       $html .= '[?php echo button_to(__(\''.$name.'\'), \''.$this->getModuleName().'/'.$action.$url_params.', '.$phpOptions.') ?]';
168     }
169
170     if ($only_for !== null)
171     {
172       $html .= '[?php endif; ?]'."\n";
173     }
174
175     $html .= '</li>'."\n";
176
177     return $html;
178   }
179
180   /**
181    * Returns HTML code for an action link.
182    *
183    * @param string  $actionName   The action name
184    * @param array   $params       The parameters
185    * @param boolean $pk_link      Whether to add a primary key link or not
186    *
187    * @return string HTML code
188    */
189   public function getLinkToAction($actionName, $params, $pk_link = false)
190   {
191     $options = isset($params['params']) ? sfToolkit::stringToArray($params['params']) : array();
192
193     // default values
194     if ($actionName[0] == '_')
195     {
196       $actionName = substr($actionName, 1);
197       $name       = $actionName;
198       $icon       = sfConfig::get('sf_admin_web_dir').'/images/'.$actionName.'_icon.png';
199       $action     = $actionName;
200
201       if ($actionName == 'delete')
202       {
203         $options['post'] = true;
204         if (!isset($options['confirm']))
205         {
206           $options['confirm'] = 'Are you sure?';
207         }
208       }
209     }
210     else
211     {
212       $name   = isset($params['name']) ? $params['name'] : $actionName;
213       $icon   = isset($params['icon']) ? sfToolkit::replaceConstants($params['icon']) : sfConfig::get('sf_admin_web_dir').'/images/default_icon.png';
214       $action = isset($params['action']) ? $params['action'] : 'List'.sfInflector::camelize($actionName);
215     }
216
217     $url_params = $pk_link ? '?'.$this->getPrimaryKeyUrlParams() : '\'';
218
219     $phpOptions = var_export($options, true);
220
221     // little hack
222     $phpOptions = preg_replace("/'confirm' => '(.+?)(?<!\\\)'/", '\'confirm\' => __(\'$1\')', $phpOptions);
223
224     return '<li>[?php echo link_to(image_tag(\''.$icon.'\', array(\'alt\' => __(\''.$name.'\'), \'title\' => __(\''.$name.'\'))), \''.$this->getModuleName().'/'.$action.$url_params.($options ? ', '.$phpOptions : '').') ?]</li>'."\n";
225   }
226
227   /**
228    * Returns HTML code for an action option in a select tag.
229    *
230    * @param string  $actionName The action name
231    * @param array   $params     The parameters
232    *
233    * @return string HTML code
234    */
235   public function getOptionToAction($actionName, $params)
236   {
237     $options = isset($params['params']) ? sfToolkit::stringToArray($params['params']) : array();
238
239     // default values
240     if ($actionName[0] == '_')
241     {
242       $actionName = substr($actionName, 1);
243       if ($actionName == 'deleteSelected')
244       {
245         $params['name'] = 'Delete Selected';
246       }
247     }
248     $name = isset($params['name']) ? $params['name'] : $actionName;
249
250     $options['value'] = $actionName;
251
252     $phpOptions = var_export($options, true);
253
254     return '[?php echo content_tag(\'option\', __(\''.$name.'\')'.($options ? ', '.$phpOptions : '').') ?]';
255   }
256
257   /**
258    * Returns HTML code for a column in edit mode.
259    *
260    * @param string  $column   The column name
261    * @param array   $params   The parameters
262    *
263    * @return string HTML code
264    */
265   public function getColumnEditTag($column, $params = array())
266   {
267     // user defined parameters
268     $user_params = $this->getParameterValue('edit.fields.'.$column->getName().'.params');
269     $user_params = is_array($user_params) ? $user_params : sfToolkit::stringToArray($user_params);
270     $params      = $user_params ? array_merge($params, $user_params) : $params;
271
272     if ($column->isComponent())
273     {
274       return "get_component('".$this->getModuleName()."', '".$column->getName()."', array('type' => 'edit', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
275     }
276     else if ($column->isPartial())
277     {
278       return "get_partial('".$column->getName()."', array('type' => 'edit', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
279     }
280
281     // default control name
282     $params = array_merge(array('control_name' => $this->getSingularName().'['.$column->getName().']'), $params);
283
284     // default parameter values
285     $type = $column->getCreoleType();
286     if ($type == CreoleTypes::DATE)
287     {
288       $params = array_merge(array('rich' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'), $params);
289     }
290     else if ($type == CreoleTypes::TIMESTAMP)
291     {
292       $params = array_merge(array('rich' => true, 'withtime' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'), $params);
293     }
294
295     // user sets a specific tag to use
296     if ($inputType = $this->getParameterValue('edit.fields.'.$column->getName().'.type'))
297     {
298       if ($inputType == 'plain')
299       {
300         return $this->getColumnListTag($column, $params);
301       }
302       else
303       {
304         return $this->getPHPObjectHelper($inputType, $column, $params);
305       }
306     }
307
308     // guess the best tag to use with column type
309     return parent::getCrudColumnEditTag($column, $params);
310   }
311
312   /**
313    * Returns all column categories.
314    *
315    * @param string $paramName The parameter name
316    *
317    * @return array The column categories
318    */
319   public function getColumnCategories($paramName)
320   {
321     if (is_array($this->getParameterValue($paramName)))
322     {
323       $fields = $this->getParameterValue($paramName);
324
325       // do we have categories?
326       if (!isset($fields[0]))
327       {
328         return array_keys($fields);
329       }
330
331     }
332
333     return array('NONE');
334   }
335
336   /**
337    * Wraps content with a credential condition.
338    *
339    * @param string  $content  The content
340    * @param array   $params   The parameters
341    *
342    * @return string HTML code
343    */
344   public function addCredentialCondition($content, $params = array())
345   {
346     if (isset($params['credentials']))
347     {
348       $credentials = str_replace("\n", ' ', var_export($params['credentials'], true));
349
350       return <<<EOF
351 [?php if (\$sf_user->hasCredential($credentials)): ?]
352 $content
353 [?php endif; ?]
354 EOF;
355     }
356     else
357     {
358       return $content;
359     }
360   }
361
362   /**
363    * Gets sfAdminColumn objects for a given category.
364    *
365    * @param string $paramName The parameter name
366    * @param string $category  The category
367    *
368    * @return array sfAdminColumn array
369    */
370   public function getColumns($paramName, $category = 'NONE')
371   {
372     $phpNames = array();
373
374     // user has set a personnalized list of fields?
375     $fields = $this->getParameterValue($paramName);
376     if (is_array($fields))
377     {
378       // categories?
379       if (isset($fields[0]))
380       {
381         // simulate a default one
382         $fields = array('NONE' => $fields);
383       }
384
385       if (!$fields)
386       {
387         return array();
388       }
389
390       foreach ($fields[$category] as $field)
391       {
392         list($field, $flags) = $this->splitFlag($field);
393
394         $phpNames[] = $this->getAdminColumnForField($field, $flags);
395       }
396     }
397     else
398     {
399       // no, just return the full list of columns in table
400       return $this->getAllColumns();
401     }
402
403     return $phpNames;
404   }
405
406   /**
407    * Gets modifier flags from a column name.
408    *
409    * @param string $text The column name
410    *
411    * @return array An array of detected flags
412    */
413   public function splitFlag($text)
414   {
415     $flags = array();
416     while (in_array($text[0], array('=', '-', '+', '_', '~')))
417     {
418       $flags[] = $text[0];
419       $text = substr($text, 1);
420     }
421
422     return array($text, $flags);
423   }
424
425   /**
426    * Gets a parameter value.
427    *
428    * @param string $key     The key name
429    * @param mixed  $default The default value
430    *
431    * @return mixed The parameter value
432    */
433   public function getParameterValue($key, $default = null)
434   {
435     if (preg_match('/^([^\.]+)\.fields\.(.+)$/', $key, $matches))
436     {
437       return $this->getFieldParameterValue($matches[2], $matches[1], $default);
438     }
439     else
440     {
441       return $this->getValueFromKey($key, $default);
442     }
443   }
444
445   /**
446    * Gets a field parameter value.
447    *
448    * @param string $key     The key name
449    * @param string $type    The type (list, edit)
450    * @param mixed  $default The default value
451    *
452    * @return mixed The parameter value
453    */
454   protected function getFieldParameterValue($key, $type = '', $default = null)
455   {
456     $retval = $this->getValueFromKey($type.'.fields.'.$key, $default);
457     if ($retval !== null)
458     {
459       return $retval;
460     }
461
462     $retval = $this->getValueFromKey('fields.'.$key, $default);
463     if ($retval !== null)
464     {
465       return $retval;
466     }
467
468     if (preg_match('/\.name$/', $key))
469     {
470       // default field.name
471       return sfInflector::humanize(($pos = strpos($key, '.')) ? substr($key, 0, $pos) : $key);
472     }
473     else
474     {
475       return null;
476     }
477   }
478
479   /**
480    * Gets the value for a given key.
481    *
482    * @param string $key     The key name
483    * @param mixed  $default The default value
484    *
485    * @return mixed The key value
486    */
487   protected function getValueFromKey($key, $default = null)
488   {
489     $ref   =& $this->params;
490     $parts explode('.', $key);
491     $count count($parts);
492     for ($i = 0; $i < $count; $i++)
493     {
494       $partKey = $parts[$i];
495       if (!isset($ref[$partKey]))
496       {
497         return $default;
498       }
499
500       if ($count == $i + 1)
501       {
502         return $ref[$partKey];
503       }
504       else
505       {
506         $ref =& $ref[$partKey];
507       }
508     }
509
510     return $default;
511   }
512
513   /**
514    * Wraps a content for I18N.
515    *
516    * @param string $key       The key name
517    * @param string $default   The defaul value
518    * @param bool   $withEcho  If true, string is wrapped in php echo
519    *
520    * @return string HTML code
521    */
522   public function getI18NString($key, $default = null, $withEcho = true)
523   {
524     $value = $this->escapeString($this->getParameterValue($key, $default));
525
526     // find %%xx%% strings
527     preg_match_all('/%%([^%]+)%%/', $value, $matches, PREG_PATTERN_ORDER);
528     $this->params['tmp']['display'] = array();
529     foreach ($matches[1] as $name)
530     {
531       $this->params['tmp']['display'][] = $name;
532     }
533
534     $vars = array();
535     foreach ($this->getColumns('tmp.display') as $column)
536     {
537       if ($column->isLink())
538       {
539         $vars[] = '\'%%'.$column->getName().'%%\' => link_to('.$this->getColumnListTag($column).', \''.$this->getModuleName().'/edit?'.$this->getPrimaryKeyUrlParams().')';
540       }
541       elseif ($column->isPartial())
542       {
543         $vars[] = '\'%%_'.$column->getName().'%%\' => '.$this->getColumnListTag($column);
544       }
545       else if ($column->isComponent())
546       {
547         $vars[] = '\'%%~'.$column->getName().'%%\' => '.$this->getColumnListTag($column);
548       }
549       else
550       {
551         $vars[] = '\'%%'.$column->getName().'%%\' => '.$this->getColumnListTag($column);
552       }
553     }
554
555     // strip all = signs
556     $value = preg_replace('/%%=([^%]+)%%/', '%%$1%%', $value);
557
558     $i18n = '__(\''.$value.'\', '."\n".'array('.implode(",\n", $vars).'))';
559
560     return $withEcho ? '[?php echo '.$i18n.' ?]' : $i18n;
561   }
562
563   /**
564    * Replaces constants in a string.
565    *
566    * @param string $value
567    *
568    * @return string
569    */
570   public function replaceConstants($value)
571   {
572     // find %%xx%% strings
573     preg_match_all('/%%([^%]+)%%/', $value, $matches, PREG_PATTERN_ORDER);
574     $this->params['tmp']['display'] = array();
575     foreach ($matches[1] as $name)
576     {
577       $this->params['tmp']['display'][] = $name;
578     }
579
580     foreach ($this->getColumns('tmp.display') as $column)
581     {
582       $value = str_replace('%%'.$column->getName().'%%', '{'.$this->getColumnGetter($column, true, 'this->').'}', $value);
583     }
584
585     return $value;
586   }
587
588   /**
589    * Returns HTML code for a column in list mode.
590    *
591    * @param string  $column The column name
592    * @param array   $params The parameters
593    *
594    * @return string HTML code
595    */
596   public function getColumnListTag($column, $params = array())
597   {
598     $user_params = $this->getParameterValue('list.fields.'.$column->getName().'.params');
599     $user_params = is_array($user_params) ? $user_params : sfToolkit::stringToArray($user_params);
600     $params      = $user_params ? array_merge($params, $user_params) : $params;
601
602     $type = $column->getCreoleType();
603     
604     $columnGetter = $this->getColumnGetter($column, true);
605
606     if ($column->isComponent())
607     {
608       return "get_component('".$this->getModuleName()."', '".$column->getName()."', array('type' => 'list', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
609     }
610     else if ($column->isPartial())
611     {
612       return "get_partial('".$column->getName()."', array('type' => 'list', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
613     }
614     else if ($type == CreoleTypes::DATE || $type == CreoleTypes::TIMESTAMP)
615     {
616       $format = isset($params['date_format']) ? $params['date_format'] : ($type == CreoleTypes::DATE ? 'D' : 'f');
617       return "($columnGetter !== null && $columnGetter !== '') ? format_date($columnGetter, \"$format\") : ''";
618     }
619     elseif ($type == CreoleTypes::BOOLEAN)
620     {
621       return "$columnGetter ? image_tag(sfConfig::get('sf_admin_web_dir').'/images/tick.png') : '&nbsp;'";
622     }
623     else
624     {
625       return "$columnGetter";
626     }
627   }
628
629   /**
630    * Returns HTML code for a column in filter mode.
631    *
632    * @param string  $column The column name
633    * @param array   $params The parameters
634    *
635    * @return string HTML code
636    */
637   public function getColumnFilterTag($column, $params = array())
638   {
639     $user_params = $this->getParameterValue('list.fields.'.$column->getName().'.params');
640     $user_params = is_array($user_params) ? $user_params : sfToolkit::stringToArray($user_params);
641     $params      = $user_params ? array_merge($params, $user_params) : $params;
642
643     if ($column->isComponent())
644     {
645       return "get_component('".$this->getModuleName()."', '".$column->getName()."', array('type' => 'filter'))";
646     }
647     else if ($column->isPartial())
648     {
649       return "get_partial('".$column->getName()."', array('type' => 'filter', 'filters' => \$filters))";
650     }
651
652     $type = $column->getCreoleType();
653
654     $default_value = "isset(\$filters['".$column->getName()."']) ? \$filters['".$column->getName()."'] : null";
655     $unquotedName = 'filters['.$column->getName().']';
656     $name = "'$unquotedName'";
657
658     if ($column->isForeignKey())
659     {
660       $params = $this->getObjectTagParams($params, array('include_blank' => true, 'related_class'=>$this->getRelatedClassName($column), 'text_method'=>'__toString', 'control_name'=>$unquotedName));
661       return "object_select_tag($default_value, null, $params)";
662
663     }
664     else if ($type == CreoleTypes::DATE)
665     {
666       // rich=false not yet implemented
667       $params = $this->getObjectTagParams($params, array('rich' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'));
668       return "input_date_range_tag($name, $default_value, $params)";
669     }
670     else if ($type == CreoleTypes::TIMESTAMP)
671     {
672       // rich=false not yet implemented
673       $params = $this->getObjectTagParams($params, array('rich' => true, 'withtime' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'));
674       return "input_date_range_tag($name, $default_value, $params)";
675     }
676     else if ($type == CreoleTypes::BOOLEAN)
677     {
678       $defaultIncludeCustom = '__("yes or no")';
679
680       $option_params = $this->getObjectTagParams($params, array('include_custom' => $defaultIncludeCustom));
681       $params = $this->getObjectTagParams($params);
682
683       // little hack
684       $option_params = preg_replace("/'".preg_quote($defaultIncludeCustom)."'/", $defaultIncludeCustom, $option_params);
685
686       $options = "options_for_select(array(1 => __('yes'), 0 => __('no')), $default_value, $option_params)";
687
688       return "select_tag($name, $options, $params)";
689     }
690     else if ($type == CreoleTypes::CHAR || $type == CreoleTypes::VARCHAR || $type == CreoleTypes::TEXT || $type == CreoleTypes::LONGVARCHAR)
691     {
692       $size = ($column->getSize() < 15 ? $column->getSize() : 15);
693       $params = $this->getObjectTagParams($params, array('size' => $size));
694       return "input_tag($name, $default_value, $params)";
695     }
696     else if ($type == CreoleTypes::INTEGER || $type == CreoleTypes::TINYINT || $type == CreoleTypes::SMALLINT || $type == CreoleTypes::BIGINT)
697     {
698       $params = $this->getObjectTagParams($params, array('size' => 7));
699       return "input_tag($name, $default_value, $params)";
700     }
701     else if ($type == CreoleTypes::FLOAT || $type == CreoleTypes::DOUBLE || $type == CreoleTypes::DECIMAL || $type == CreoleTypes::NUMERIC || $type == CreoleTypes::REAL)
702     {
703       $params = $this->getObjectTagParams($params, array('size' => 7));
704       return "input_tag($name, $default_value, $params)";
705     }
706     else
707     {
708       $params = $this->getObjectTagParams($params, array('disabled' => true));
709       return "input_tag($name, $default_value, $params)";
710     }
711   }
712
713   /**
714    * Gets the form object
715    *
716    * @return sfForm
717    */
718   public function getFormObject()
719   {
720     $class = $this->getClassName().'Form';
721
722     return new $class();
723   }
724
725   /**
726    * Retrieves all hidden fields in the widget schema
727    *
728    * @return array
729    */
730   public function getHiddenFields()
731   {
732     $form = $this->getFormObject();
733     $hiddenFields = array();
734     foreach ($form->getWidgetSchema()->getPositions() as $name)
735     {
736       if ($form[$name]->isHidden())
737       {
738         $hiddenFields[] = $name;
739       }
740     }
741
742     return $hiddenFields;
743   }
744
745   /**
746    * Gets the hidden fields as a string
747    *
748    * @return array
749    */
750   public function getHiddenFieldsAsString()
751   {
752     $hiddenFields = '';
753     foreach ($this->getHiddenFields() as $name)
754     {
755       $hiddenFields .= '        [?php echo $form[\''.$name.'\'] ?]'."\n";
756     }
757
758     return "\n".$hiddenFields;
759   }
760
761   public function getLastNonHiddenField()
762   {
763     $form = $this->getFormObject();
764     $positions = $form->getWidgetSchema()->getPositions();
765     $last = count($positions) - 1;
766     for ($i = count($positions) - 1; $i >= 0; $i--)
767     {
768       if ($form[$positions[$i]]->isHidden())
769       {
770         $last = $i - 1;
771       }
772       else
773       {
774         break;
775       }
776     }
777
778     return $last;
779   }
780
781   /**
782    * Escapes a string.
783    *
784    * @param string $string
785    */
786   protected function escapeString($string)
787   {
788     return preg_replace('/\'/', '\\\'', $string);
789   }
790 }
791
792 /**
793  * Admin generator column.
794  *
795  * @package    symfony
796  * @subpackage generator
797  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
798  * @version    SVN: $Id$
799  */
800 class sfAdminColumn
801 {
802   protected
803     $phpName    = '',
804     $column     = null,
805     $flags      = array();
806
807   /**
808    * Constructor.
809    *
810    * @param string $phpName The column php name
811    * @param string $column  The column name
812    * @param array  $flags   The column flags
813    */
814   public function __construct($phpName, $column = null, $flags = array())
815   {
816     $this->phpName = $phpName;
817     $this->column  = $column;
818     $this->flags   = (array) $flags;
819   }
820
821   /**
822    * Returns true if the column maps a database column.
823    *
824    * @return boolean true if the column maps a database column, false otherwise
825    */
826   public function isReal()
827   {
828     return $this->column ? true : false;
829   }
830
831   /**
832    * Gets the name of the column.
833    *
834    * @return string The column name
835    */
836   public function getName()
837   {
838     return sfInflector::underscore($this->phpName);
839   }
840
841   /**
842    * Returns true if the column is a partial.
843    *
844    * @return boolean true if the column is a partial, false otherwise
845    */
846   public function isPartial()
847   {
848     return in_array('_', $this->flags) ? true : false;
849   }
850
851   /**
852    * Returns true if the column is a component.
853    *
854    * @return boolean true if the column is a component, false otherwise
855    */
856   public function isComponent()
857   {
858     return in_array('~', $this->flags) ? true : false;
859   }
860
861   /**
862    * Returns true if the column has a link.
863    *
864    * @return boolean true if the column has a link, false otherwise
865    */
866   public function isLink()
867   {
868     return (in_array('=', $this->flags) || $this->isPrimaryKey()) ? true : false;
869   }
870
871   /**
872    * Gets the php name of the column.
873    *
874    * @return string The php name
875    */
876   public function getPhpName()
877   {
878     return $this->phpName;
879   }
880
881   // FIXME: those methods are only used in the propel admin generator
882   public function __call($name, $arguments)
883   {
884     return $this->column ? $this->column->$name() : null;
885   }
886 }
887
Note: See TracBrowser for help on using the browser.