views:

523

answers:

2

I'm using a custom Widget for date fields, and I want to use it in all my forms. The problem is that symfony uses the default sfWidgetFormDate. What I want is to change this default widget in order to generate forms with my custom Widget. I don't want to change by hand all the forms generated.

The only approach I have found is the trik of modify BaseFormDoctrine.php:

public function setup()
{
    foreach($this->getWidgetSchema()->getFields() as $name=>$widget)
    {
        if($widget instanceof sfWidgetFormDate) 
        {
            $this->widgetSchema[$name] = new sfWidgetFormJQueryDate(array(
                'config' => '{}',
                'image'=>'/images/calendar.png',
            ));
        }
    }
}
+2  A: 

What you could do is create your own form generator class.

class myFormGenerator extents sfDoctrineFormGenerator
{

  public function getWidgetClassForColumn($column)
  { 
    switch ($column->getDoctrineType())
    {
      case 'date':
        return 'sfWidgetFormJQueryDate';
        break;
      default:
        return parent::getWidgetClassForColumn($column); 
    }
  }
}

Save that somewhere sensible in your lib folder, clearing the cache etc..

Then rerun your for generator like so...

php doctrine:build-forms --generator-class='myFormGenerator'

I haven't tried any of the above, but the theory is sound I think...

Have a look at the following files to see where I figured this out from:

lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/task/sfDoctrineBuildFormsTask.class.php
lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php
johnwards
Fantastic! I have tried it and works
caymcorp
A: 

Following johnwards answer, as I want to define default options for the widget, I also override the function to do that:

class myFormGenerator extents sfDoctrineFormGenerator
{

  public function getWidgetClassForColumn($column)
  { 
    ...
  }

  public function getWidgetOptionsForColumn($column)
  {
    switch ($column->getDoctrineType())
    {
      case 'date':
        return "array('config' => '{}', 'image'=>'/images/calendar.png')";
    break;
      default:
        return parent::getWidgetOptionsForColumn($column); 
    }
  }
}
caymcorp
Would have been better practice to accept my answer so I get the points reward, thats what we do this for ;).
johnwards
Oops! I'm so sorry. I accepted your answer before accepting mine. I believed there could be more than one answer accepted... I have amended my mistake, accepting your answer again. Please, accept my apologies
caymcorp