/sbweb/sbweb_logica/lib/symfony/plugins/sfPropelPlugin/lib/form/sfFormPropel.class.php
PHP | 531 lines | 292 code | 65 blank | 174 comment | 34 complexity | ba9ed1e2c37d0b76380939c8f47c85cc MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-3.0
- <?php
-
- /*
- * This file is part of the symfony package.
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-
- /**
- * sfFormPropel is the base class for forms based on Propel objects.
- *
- * @package symfony
- * @subpackage form
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
- * @version SVN: $Id: sfFormPropel.class.php 15033 2009-01-28 22:40:25Z FabianLange $
- */
- abstract class sfFormPropel extends sfForm
- {
- protected
- $isNew = true,
- $object = null;
-
- /**
- * Constructor.
- *
- * @param BaseObject $object A Propel object used to initialize default values
- * @param array $options An array of options
- * @param string $CSRFSecret A CSRF secret (false to disable CSRF protection, null to use the global CSRF secret)
- *
- * @see sfForm
- */
- public function __construct(BaseObject $object = null, $options = array(), $CSRFSecret = null)
- {
- $class = $this->getModelName();
- if (is_null($object))
- {
- $this->object = new $class();
- }
- else
- {
- if (!$object instanceof $class)
- {
- throw new sfException(sprintf('The "%s" form only accepts a "%s" object.', get_class($this), $class));
- }
-
- $this->object = $object;
- $this->isNew = $this->object->isNew();
- }
-
- parent::__construct(array(), $options, $CSRFSecret);
-
- $this->updateDefaultsFromObject();
- }
-
- /**
- * Returns the default connection for the current model.
- *
- * @return PropelPDO A database connection
- */
- public function getConnection()
- {
- return Propel::getConnection(constant(sprintf('%s::DATABASE_NAME', get_class($this->object->getPeer()))));
- }
-
- /**
- * Returns the current model name.
- */
- abstract public function getModelName();
-
- /**
- * Returns true if the current form embeds a new object.
- *
- * @return Boolean true if the current form embeds a new object, false otherwise
- */
- public function isNew()
- {
- return $this->isNew;
- }
-
- /**
- * Embeds i18n objects into the current form.
- *
- * @param array $cultures An array of cultures
- * @param string $decorator A HTML decorator for the embedded form
- */
- public function embedI18n($cultures, $decorator = null)
- {
- if (!$this->isI18n())
- {
- throw new sfException(sprintf('The model "%s" is not internationalized.', $this->getModelName()));
- }
-
- $class = $this->getI18nFormClass();
- foreach ($cultures as $culture)
- {
- $method = sprintf('getCurrent%s', $this->getI18nModelName($culture));
- $i18nObject = $this->object->$method($culture);
- $i18n = new $class($i18nObject);
- unset($i18n['id'], $i18n['culture']);
-
- $this->embedForm($culture, $i18n, $decorator);
- }
- }
-
- /**
- * Returns the current object for this form.
- *
- * @return BaseObject The current object.
- */
- public function getObject()
- {
- return $this->object;
- }
-
- /**
- * Binds the current form and save the to the database in one step.
- *
- * @param array $taintedValues An array of tainted values to use to bind the form
- * @param array $taintedFiles An array of uploaded files (in the $_FILES or $_GET format)
- * @param PropelPDO $con An optional PropelPDO object
- *
- * @return Boolean true if the form is valid, false otherwise
- */
- public function bindAndSave($taintedValues, $taintedFiles = null, $con = null)
- {
- $this->bind($taintedValues, $taintedFiles);
- if ($this->isValid())
- {
- $this->save($con);
-
- return true;
- }
-
- return false;
- }
-
- /**
- * Saves the current object to the database.
- *
- * The object saving is done in a transaction and handled by the doSave() method.
- *
- * If the form is not valid, it throws an sfValidatorError.
- *
- * @param PropelPDO $con An optional PropelPDO object
- *
- * @return BaseObject The current saved object
- *
- * @see doSave()
- */
- public function save($con = null)
- {
- if (!$this->isValid())
- {
- throw $this->getErrorSchema();
- }
-
- if (is_null($con))
- {
- $con = $this->getConnection();
- }
-
- try
- {
- $con->beginTransaction();
-
- $this->doSave($con);
-
- $con->commit();
- }
- catch (Exception $e)
- {
- $con->rollBack();
-
- throw $e;
- }
-
- return $this->object;
- }
-
- /**
- * Updates the values of the object with the cleaned up values.
- *
- * @param array $values An array of values
- *
- * @return BaseObject The current updated object
- */
- public function updateObject($values = null)
- {
- if (is_null($values))
- {
- $values = $this->values;
- }
-
- $values = $this->processValues($values);
-
- $this->object->fromArray($values, BasePeer::TYPE_FIELDNAME);
-
- // embedded forms
- $this->updateObjectEmbeddedForms($values);
-
- return $this->object;
- }
-
- /**
- * Updates the values of the objects in embedded forms.
- *
- * @param array $values An array of values
- * @param array $forms An array of forms
- */
- public function updateObjectEmbeddedForms($values, $forms = null)
- {
- if (is_null($forms))
- {
- $forms = $this->embeddedForms;
- }
-
- foreach ($forms as $name => $form)
- {
- if (!is_array($values[$name]))
- {
- continue;
- }
-
- if ($form instanceof sfFormPropel)
- {
- $form->updateObject($values[$name]);
- }
- else
- {
- $this->updateObjectEmbeddedForms($values[$name], $form->getEmbeddedForms());
- }
- }
- }
-
- /**
- * Processes cleaned up values with user defined methods.
- *
- * To process a value before it is used by the updateObject() method,
- * you need to define an updateXXXColumn() method where XXX is the PHP name
- * of the column.
- *
- * The method must return the processed value or false to remove the value
- * from the array of cleaned up values.
- *
- * @param array $values An array of values
- *
- * @return array An array of cleaned up values processed by the user defined methods
- */
- public function processValues($values)
- {
- // see if the user has overridden some column setter
- $valuesToProcess = $values;
- foreach ($valuesToProcess as $field => $value)
- {
- try
- {
- $method = sprintf('update%sColumn', call_user_func(array(constant(get_class($this->object).'::PEER'), 'translateFieldName'), $field, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_PHPNAME));
- }
- catch (Exception $e)
- {
- // not a "real" column of this object
- if (!method_exists($this, $method = sprintf('update%sColumn', self::camelize($field))))
- {
- continue;
- }
- }
-
- if (method_exists($this, $method))
- {
- if (false === $ret = $this->$method($value))
- {
- unset($values[$field]);
- }
- else
- {
- $values[$field] = $ret;
- }
- }
- else
- {
- // save files
- if ($this->validatorSchema[$field] instanceof sfValidatorFile)
- {
- $values[$field] = $this->processUploadedFile($field, null, $valuesToProcess);
- }
- }
- }
-
- return $values;
- }
-
- /**
- * Returns true if the current form has some associated i18n objects.
- *
- * @return Boolean true if the current form has some associated i18n objects, false otherwise
- */
- public function isI18n()
- {
- return !is_null($this->getI18nFormClass());
- }
-
- /**
- * Returns the name of the i18n model.
- *
- * @return string The name of the i18n model
- */
- public function getI18nModelName()
- {
- return null;
- }
-
- /**
- * Returns the name of the i18n form class.
- *
- * @return string The name of the i18n form class
- */
- public function getI18nFormClass()
- {
- return null;
- }
-
- /**
- * Renders a form tag suitable for the related Propel object.
- *
- * The method is automatically guessed based on the Propel object:
- *
- * * if the object is new, the method is POST
- * * if the object already exists, the method is PUT
- *
- * @param string $url The URL for the action
- * @param array $attributes An array of HTML attributes
- *
- * @return string An HTML representation of the opening form tag
- *
- * @see sfForm
- */
- public function renderFormTag($url, array $attributes = array())
- {
- if (!isset($attributes['method']))
- {
- $attributes['method'] = $this->getObject()->isNew() ? 'post' : 'put';
- }
-
- return parent::renderFormTag($url, $attributes);
- }
-
- /**
- * Updates and saves the current object.
- *
- * If you want to add some logic before saving or save other associated objects,
- * this is the method to override.
- *
- * @param PropelPDO $con An optional PropelPDO object
- */
- protected function doSave($con = null)
- {
- if (is_null($con))
- {
- $con = $this->getConnection();
- }
-
- $this->updateObject();
-
- $this->object->save($con);
-
- // embedded forms
- $this->saveEmbeddedForms($con);
- }
-
- /**
- * Saves embedded form objects.
- *
- * @param PropelPDO $con An optional PropelPDO object
- * @param array $forms An array of forms
- */
- public function saveEmbeddedForms($con = null, $forms = null)
- {
- if (is_null($con))
- {
- $con = $this->getConnection();
- }
-
- if (is_null($forms))
- {
- $forms = $this->embeddedForms;
- }
-
- foreach ($forms as $form)
- {
- if ($form instanceof sfFormPropel)
- {
- $form->saveEmbeddedForms($con);
- $form->getObject()->save($con);
- }
- else
- {
- $this->saveEmbeddedForms($con, $form->getEmbeddedForms());
- }
- }
- }
-
- /**
- * Updates the default values of the form with the current values of the current object.
- */
- protected function updateDefaultsFromObject()
- {
- // update defaults for the main object
- if ($this->isNew)
- {
- $this->setDefaults(array_merge($this->object->toArray(BasePeer::TYPE_FIELDNAME), $this->getDefaults()));
- }
- else
- {
- $this->setDefaults(array_merge($this->getDefaults(), $this->object->toArray(BasePeer::TYPE_FIELDNAME)));
- }
- }
-
- /**
- * Saves the uploaded file for the given field.
- *
- * @param string $field The field name
- * @param string $filename The file name of the file to save
- * @param array $values An array of values
- *
- * @return string The filename used to save the file
- */
- protected function processUploadedFile($field, $filename = null, $values = null)
- {
- if (!$this->validatorSchema[$field] instanceof sfValidatorFile)
- {
- throw new LogicException(sprintf('You cannot save the current file for field "%s" as the field is not a file.', $field));
- }
-
- if (is_null($values))
- {
- $values = $this->values;
- }
-
- if (isset($values[$field.'_delete']) && $values[$field.'_delete'])
- {
- $this->removeFile($field);
-
- return '';
- }
-
- if (!$values[$field])
- {
- $column = call_user_func(array(constant(get_class($this->object).'::PEER'), 'translateFieldName'), $field, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_PHPNAME);
- $getter = 'get'.$column;
-
- return $this->object->$getter();
- }
-
- // we need the base directory
- if (!$this->validatorSchema[$field]->getOption('path'))
- {
- return $values[$field];
- }
-
- $this->removeFile($field);
-
- return $this->saveFile($field, $filename, $values[$field]);
- }
-
- /**
- * Removes the current file for the field.
- *
- * @param string $field The field name
- */
- protected function removeFile($field)
- {
- if (!$this->validatorSchema[$field] instanceof sfValidatorFile)
- {
- throw new LogicException(sprintf('You cannot remove the current file for field "%s" as the field is not a file.', $field));
- }
-
- $column = call_user_func(array(constant(get_class($this->object).'::PEER'), 'translateFieldName'), $field, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_PHPNAME);
- $getter = 'get'.$column;
-
- if (($directory = $this->validatorSchema[$field]->getOption('path')) && is_file($directory.DIRECTORY_SEPARATOR.$this->object->$getter()))
- {
- unlink($directory.DIRECTORY_SEPARATOR.$this->object->$getter());
- }
- }
-
- /**
- * Saves the current file for the field.
- *
- * @param string $field The field name
- * @param string $filename The file name of the file to save
- * @param sfValidatedFile $file The validated file to save
- *
- * @return string The filename used to save the file
- */
- protected function saveFile($field, $filename = null, sfValidatedFile $file = null)
- {
- if (!$this->validatorSchema[$field] instanceof sfValidatorFile)
- {
- throw new LogicException(sprintf('You cannot save the current file for field "%s" as the field is not a file.', $field));
- }
-
- if (is_null($file))
- {
- $file = $this->getValue($field);
- }
-
- $column = call_user_func(array(constant(get_class($this->object).'::PEER'), 'translateFieldName'), $field, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_PHPNAME);
- $method = sprintf('generate%sFilename', $column);
-
- if (!is_null($filename))
- {
- return $file->save($filename);
- }
- else if (method_exists($this->object, $method))
- {
- return $file->save($this->object->$method($file));
- }
- else
- {
- return $file->save();
- }
- }
-
- protected function camelize($text)
- {
- return sfToolkit::pregtr($text, array('#/(.?)#e' => "'::'.strtoupper('\\1')", '/(^|_|-)+(.)/e' => "strtoupper('\\2')"));
- }
- }