2014/01/20

Symfony 1.4: sfWidgetFormDoctrineChoice виджетийн method-ийг параметертэй болгож сайжруулсан нь.

<?php
/**
* sfWidgetFormDoctrineChoiceWithParams represents a sfWidgetFormDoctrineChoice with parameter capability on table_method.
*/
class sfWidgetFormDoctrineChoiceWithParams extends sfWidgetFormDoctrineChoice {
  /**
  * @see sfWidget
  */
  public function __construct($options = array(), $attributes = array()) {
    $options['choices'] = array();
    parent::__construct($options, $attributes);
  }
  /**
  * Constructor.
  *
  * Available options:
  *
  *  * model:        The model class (required)
  *  * add_empty:    Whether to add a first empty value or not (false by default)
  *                  If the option is not a Boolean, the value will be used as the text value
  *  * method:       The method to use to display object values (__toString by default)
  *  * key_method:   The method to use to display the object keys (getPrimaryKey by default)
  *  * order_by:     An array composed of two fields:
  *                    * The column to order by the results (must be in the PhpName format)
  *                    * asc or desc
  *  * query:        A query to use when retrieving objects
  *  * multiple:     true if the select tag must allow multiple selections
  *  * table_method: A method to return either a query, collection or single object
  *
  * @see sfWidgetFormSelect
  */
  protected function configure($options = array(), $attributes = array()) {
    $this->addRequiredOption('model');
    $this->addOption('add_empty', false);
    $this->addOption('method', '__toString');
    $this->addOption('key_method', 'getPrimaryKey');
    $this->addOption('order_by', null);
    $this->addOption('query', null);
    $this->addOption('multiple', false);
    $this->addOption('table_method', null);
    parent::configure($options, $attributes);
  }
  /**
  * Returns the choices associated to the model.
  *
  * @return array An array of choices
  */
  public function getChoices() {
    $choices = array();
    if (false !== $this->getOption('add_empty')) {
      $choices[''] = true === $this->getOption('add_empty') ? '' : $this->translate($this->getOption('add_empty'));
    }
    if (null === $this->getOption('table_method')) {
      $query = null === $this->getOption('query') ? Doctrine_Core::getTable($this->getOption('model'))->createQuery() : $this->getOption('query');
      if ($order = $this->getOption('order_by')) {
        $query->addOrderBy($order[0] . ' ' . $order[1]);
      }
      $objects = $query->execute();
    } else {
      $results = $this->callTableMethod();
      if ($results instanceof Doctrine_Query) {
        $objects = $results->execute();
      } else if ($results instanceof Doctrine_Collection) {
        $objects = $results;
      } else if ($results instanceof Doctrine_Record) {
        $objects = new Doctrine_Collection($this->getOption('model'));
        $objects[] = $results;
      } else {
        $objects = array();
      }
    }
    $method = $this->getOption('method');
    $keyMethod = $this->getOption('key_method');
    foreach ($objects as $object) {
      $choices[$object->$keyMethod()] = $object->$method();
    }
    return $choices;
  }
  /**
  * Gets result for 'choices' from the Table class of model
  *
  * @return mixed Result of table method [Doctrine_Query, Doctrine_Collection, Doctrine_Record]
  */
  private function callTableMethod() {
    $tableMethod = $this->getOption('table_method');
    if (is_array($tableMethod)) {
      $results = call_user_func_array(array(Doctrine::getTable($this->getOption('model')),
        $tableMethod['method']), $tableMethod['parameters']);
    } else {
      $results = Doctrine::getTable($this->getOption('model'))->$tableMethod();
    }
    return $results;
  }
}
?>

Ашиглахдаа:

<?php
$this->setWidgets(array(
  'portraits' => new customWidgetFormDoctrineChoiceWithParams(array(
    'model' => 'EclecticPortrait',
    'multiple' => true,
    'expanded' => true,
    'table_method' => array('method' => 'getUserPortraits', 'parameters' => array($this->getOption('contact'), $this->getOption('id'))),
    )),
  ));
?>