removed Propel bridge from Symfony Core
This commit is contained in:
parent
9509fb7f51
commit
3f4b87d8c0
@ -46,7 +46,6 @@
|
||||
"symfony/monolog-bridge": "self.version",
|
||||
"symfony/options-resolver": "self.version",
|
||||
"symfony/process": "self.version",
|
||||
"symfony/propel1-bridge": "self.version",
|
||||
"symfony/property-access": "self.version",
|
||||
"symfony/proxy-manager-bridge": "self.version",
|
||||
"symfony/routing": "self.version",
|
||||
|
3
src/Symfony/Bridge/Propel1/.gitignore
vendored
3
src/Symfony/Bridge/Propel1/.gitignore
vendored
@ -1,3 +0,0 @@
|
||||
vendor/
|
||||
composer.lock
|
||||
phpunit.xml
|
@ -1,15 +0,0 @@
|
||||
CHANGELOG
|
||||
=========
|
||||
|
||||
2.2.0
|
||||
-----
|
||||
|
||||
* added a collection type for the I18n behavior
|
||||
* added an optional PropertyAccessorInterface parameter to ModelType and
|
||||
ModelChoiceList
|
||||
* [BC BREAK] ModelType now has a constructor
|
||||
|
||||
2.1.0
|
||||
-----
|
||||
|
||||
* added the bridge
|
@ -1,147 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\DataCollector;
|
||||
|
||||
use Symfony\Bridge\Propel1\Logger\PropelLogger;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
|
||||
|
||||
/**
|
||||
* The PropelDataCollector collector class collects information.
|
||||
*
|
||||
* @author William Durand <william.durand1@gmail.com>
|
||||
*/
|
||||
class PropelDataCollector extends DataCollector
|
||||
{
|
||||
/**
|
||||
* Propel logger.
|
||||
*
|
||||
* @var PropelLogger
|
||||
*/
|
||||
private $logger;
|
||||
|
||||
/**
|
||||
* Propel configuration.
|
||||
*
|
||||
* @var \PropelConfiguration
|
||||
*/
|
||||
protected $propelConfiguration;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param PropelLogger $logger A Propel logger.
|
||||
* @param \PropelConfiguration $propelConfiguration The Propel configuration object.
|
||||
*/
|
||||
public function __construct(PropelLogger $logger, \PropelConfiguration $propelConfiguration)
|
||||
{
|
||||
$this->logger = $logger;
|
||||
$this->propelConfiguration = $propelConfiguration;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function collect(Request $request, Response $response, \Exception $exception = null)
|
||||
{
|
||||
$this->data = array(
|
||||
'queries' => $this->buildQueries(),
|
||||
'querycount' => $this->countQueries(),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the collector name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'propel';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the collected stats for all executed SQL queries.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getQueries()
|
||||
{
|
||||
return $this->data['queries'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the query count.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getQueryCount()
|
||||
{
|
||||
return $this->data['querycount'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total time spent on running all queries.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTime()
|
||||
{
|
||||
$time = 0;
|
||||
foreach ($this->data['queries'] as $query) {
|
||||
$time += (float) $query['time'];
|
||||
}
|
||||
|
||||
return $time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the stats of all executed SQL queries.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function buildQueries()
|
||||
{
|
||||
$queries = array();
|
||||
|
||||
$outerGlue = $this->propelConfiguration->getParameter('debugpdo.logging.outerglue', ' | ');
|
||||
$innerGlue = $this->propelConfiguration->getParameter('debugpdo.logging.innerglue', ': ');
|
||||
|
||||
foreach ($this->logger->getQueries() as $q) {
|
||||
$parts = explode($outerGlue, $q, 4);
|
||||
|
||||
$times = explode($innerGlue, $parts[0]);
|
||||
$con = explode($innerGlue, $parts[2]);
|
||||
$memories = explode($innerGlue, $parts[1]);
|
||||
|
||||
$sql = trim($parts[3]);
|
||||
$con = trim($con[1]);
|
||||
$time = trim($times[1]);
|
||||
$memory = trim($memories[1]);
|
||||
|
||||
$queries[] = array('connection' => $con, 'sql' => $sql, 'time' => $time, 'memory' => $memory);
|
||||
}
|
||||
|
||||
return $queries;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total count of SQL queries.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private function countQueries()
|
||||
{
|
||||
return count($this->logger->getQueries());
|
||||
}
|
||||
}
|
@ -1,69 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\DependencyInjection\Security\UserProvider;
|
||||
|
||||
use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\UserProvider\UserProviderFactoryInterface;
|
||||
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
|
||||
use Symfony\Component\DependencyInjection\DefinitionDecorator;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
|
||||
/**
|
||||
* PropelFactory creates services for Propel user provider.
|
||||
*
|
||||
* @author William Durand <william.durand1@gmail.com>
|
||||
*/
|
||||
class PropelFactory implements UserProviderFactoryInterface
|
||||
{
|
||||
private $key;
|
||||
private $providerId;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $providerId
|
||||
*/
|
||||
public function __construct($key, $providerId)
|
||||
{
|
||||
$this->key = $key;
|
||||
$this->providerId = $providerId;
|
||||
}
|
||||
|
||||
public function create(ContainerBuilder $container, $id, $config)
|
||||
{
|
||||
$container
|
||||
->setDefinition($id, new DefinitionDecorator($this->providerId))
|
||||
->addArgument($config['class'])
|
||||
->addArgument($config['property'])
|
||||
;
|
||||
}
|
||||
|
||||
public function getKey()
|
||||
{
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
public function addConfiguration(NodeDefinition $node)
|
||||
{
|
||||
$node
|
||||
->children()
|
||||
->scalarNode('class')
|
||||
->isRequired()
|
||||
->cannotBeEmpty()
|
||||
->end()
|
||||
->scalarNode('property')
|
||||
->defaultNull()
|
||||
->end()
|
||||
->end()
|
||||
;
|
||||
}
|
||||
}
|
@ -1,512 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form\ChoiceList;
|
||||
|
||||
use Symfony\Bridge\Propel1\Form\Type\ModelType;
|
||||
use Symfony\Component\Form\Exception\StringCastException;
|
||||
use Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList;
|
||||
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer;
|
||||
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoicesToValuesTransformer;
|
||||
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
|
||||
use Symfony\Component\OptionsResolver\Exception\MissingOptionsException;
|
||||
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
|
||||
|
||||
/**
|
||||
* A choice list for object choices based on Propel model.
|
||||
*
|
||||
* @author William Durand <william.durand1@gmail.com>
|
||||
* @author Toni Uebernickel <tuebernickel@gmail.com>
|
||||
*/
|
||||
class ModelChoiceList extends ObjectChoiceList
|
||||
{
|
||||
/**
|
||||
* The fields of which the identifier of the underlying class consists.
|
||||
*
|
||||
* This property should only be accessed through identifier.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $identifier = array();
|
||||
|
||||
/**
|
||||
* The query to retrieve the choices of this list.
|
||||
*
|
||||
* @var \ModelCriteria
|
||||
*/
|
||||
protected $query;
|
||||
|
||||
/**
|
||||
* The query to retrieve the preferred choices for this list.
|
||||
*
|
||||
* @var \ModelCriteria
|
||||
*/
|
||||
protected $preferredQuery;
|
||||
|
||||
/**
|
||||
* Whether the model objects have already been loaded.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $loaded = false;
|
||||
|
||||
/**
|
||||
* Whether to use the identifier for index generation.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $identifierAsIndex = false;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @see ModelType How to use the preferred choices.
|
||||
*
|
||||
* @param string $class The FQCN of the model class to be loaded.
|
||||
* @param string $labelPath A property path pointing to the property used for the choice labels.
|
||||
* @param array $choices An optional array to use, rather than fetching the models.
|
||||
* @param \ModelCriteria $queryObject The query to use retrieving model data from database.
|
||||
* @param string $groupPath A property path pointing to the property used to group the choices.
|
||||
* @param array|\ModelCriteria $preferred The preferred items of this choice.
|
||||
* Either an array if $choices is given,
|
||||
* or a \ModelCriteria to be merged with the $queryObject.
|
||||
* @param PropertyAccessorInterface $propertyAccessor The reflection graph for reading property paths.
|
||||
* @param string $useAsIdentifier a custom unique column (eg slug) to use instead of primary key.
|
||||
*
|
||||
* @throws MissingOptionsException In case the class parameter is empty.
|
||||
* @throws InvalidOptionsException In case the query class is not found.
|
||||
*/
|
||||
public function __construct($class, $labelPath = null, $choices = null, $queryObject = null, $groupPath = null, $preferred = array(), PropertyAccessorInterface $propertyAccessor = null, $useAsIdentifier = null)
|
||||
{
|
||||
$this->class = $class;
|
||||
|
||||
$queryClass = $this->class.'Query';
|
||||
if (!class_exists($queryClass)) {
|
||||
if (empty($this->class)) {
|
||||
throw new MissingOptionsException('The "class" parameter is empty, you should provide the model class');
|
||||
}
|
||||
throw new InvalidOptionsException(sprintf('The query class "%s" is not found, you should provide the FQCN of the model class', $queryClass));
|
||||
}
|
||||
|
||||
$query = new $queryClass();
|
||||
|
||||
$this->query = $queryObject ?: $query;
|
||||
if ($useAsIdentifier) {
|
||||
$this->identifier = array( $this->query->getTableMap()->getColumn($useAsIdentifier) );
|
||||
} else {
|
||||
$this->identifier = $this->query->getTableMap()->getPrimaryKeys();
|
||||
}
|
||||
|
||||
$this->loaded = is_array($choices) || $choices instanceof \Traversable;
|
||||
|
||||
if ($preferred instanceof \ModelCriteria) {
|
||||
$this->preferredQuery = $preferred->mergeWith($this->query);
|
||||
}
|
||||
|
||||
if (!$this->loaded) {
|
||||
// Make sure the constraints of the parent constructor are
|
||||
// fulfilled
|
||||
$choices = array();
|
||||
$preferred = array();
|
||||
}
|
||||
|
||||
if (1 === count($this->identifier) && $this->isScalar(current($this->identifier))) {
|
||||
$this->identifierAsIndex = true;
|
||||
}
|
||||
|
||||
parent::__construct($choices, $labelPath, $preferred, $groupPath, null, $propertyAccessor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the class name of the model.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getClass()
|
||||
{
|
||||
return $this->class;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getChoices()
|
||||
{
|
||||
$this->load();
|
||||
|
||||
return parent::getChoices();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getValues()
|
||||
{
|
||||
$this->load();
|
||||
|
||||
return parent::getValues();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getPreferredViews()
|
||||
{
|
||||
$this->load();
|
||||
|
||||
return parent::getPreferredViews();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getRemainingViews()
|
||||
{
|
||||
$this->load();
|
||||
|
||||
return parent::getRemainingViews();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getChoicesForValues(array $values)
|
||||
{
|
||||
if (empty($values)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
/*
|
||||
* This performance optimization reflects a common scenario:
|
||||
* * A simple select of a model entry.
|
||||
* * The choice option "expanded" is set to false.
|
||||
* * The current request is the submission of the selected value.
|
||||
*
|
||||
* @see ChoicesToValuesTransformer::reverseTransform()
|
||||
* @see ChoiceToValueTransformer::reverseTransform()
|
||||
*/
|
||||
if (!$this->loaded) {
|
||||
if (1 === count($this->identifier)) {
|
||||
$filterBy = 'filterBy'.current($this->identifier)->getPhpName();
|
||||
|
||||
// The initial query is cloned, so all additional filters are applied correctly.
|
||||
$query = clone $this->query;
|
||||
$result = (array) $query
|
||||
->$filterBy($values)
|
||||
->find();
|
||||
|
||||
// Preserve the keys as provided by the values.
|
||||
$models = array();
|
||||
foreach ($values as $index => $value) {
|
||||
foreach ($result as $eachModel) {
|
||||
if ($value === $this->createValue($eachModel)) {
|
||||
// Make sure to convert to the right format
|
||||
$models[$index] = $this->fixChoice($eachModel);
|
||||
|
||||
// If all values have been assigned, skip further loops.
|
||||
unset($values[$index]);
|
||||
if (0 === count($values)) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $models;
|
||||
}
|
||||
}
|
||||
|
||||
$this->load();
|
||||
|
||||
return parent::getChoicesForValues($values);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getValuesForChoices(array $models)
|
||||
{
|
||||
if (empty($models)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
if (!$this->loaded) {
|
||||
/*
|
||||
* This performance optimization assumes the validation of the respective values will be done by other means.
|
||||
*
|
||||
* It correlates with the performance optimization in {@link ModelChoiceList::getChoicesForValues()}
|
||||
* as it won't load the actual entries from the database.
|
||||
*
|
||||
* @see ChoicesToValuesTransformer::transform()
|
||||
* @see ChoiceToValueTransformer::transform()
|
||||
*/
|
||||
if (1 === count($this->identifier)) {
|
||||
$values = array();
|
||||
foreach ($models as $index => $model) {
|
||||
if ($model instanceof $this->class) {
|
||||
// Make sure to convert to the right format
|
||||
$values[$index] = $this->fixValue(current($this->getIdentifierValues($model)));
|
||||
}
|
||||
}
|
||||
|
||||
return $values;
|
||||
}
|
||||
}
|
||||
|
||||
$this->load();
|
||||
|
||||
$values = array();
|
||||
$availableValues = $this->getValues();
|
||||
|
||||
/*
|
||||
* Overwriting default implementation.
|
||||
*
|
||||
* The two objects may represent the same entry in the database,
|
||||
* but if they originated from different queries, there are not the same object within the code.
|
||||
*
|
||||
* This happens when using m:n relations with either sides model as data_class of the form.
|
||||
* The choicelist will retrieve the list of available related models with a different query, resulting in different objects.
|
||||
*/
|
||||
$choices = $this->fixChoices($models);
|
||||
foreach ($choices as $i => $givenChoice) {
|
||||
if (null === $givenChoice) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($this->getChoices() as $j => $choice) {
|
||||
if ($this->isEqual($choice, $givenChoice)) {
|
||||
$values[$i] = $availableValues[$j];
|
||||
|
||||
// If all choices have been assigned, skip further loops.
|
||||
unset($choices[$i]);
|
||||
if (0 === count($choices)) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @deprecated since version 2.4, to be removed in 3.0.
|
||||
*/
|
||||
public function getIndicesForChoices(array $models)
|
||||
{
|
||||
trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0.', E_USER_DEPRECATED);
|
||||
|
||||
if (empty($models)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$this->load();
|
||||
|
||||
$indices = array();
|
||||
|
||||
/*
|
||||
* Overwriting default implementation.
|
||||
*
|
||||
* The two objects may represent the same entry in the database,
|
||||
* but if they originated from different queries, there are not the same object within the code.
|
||||
*
|
||||
* This happens when using m:n relations with either sides model as data_class of the form.
|
||||
* The choice list will retrieve the list of available related models with a different query, resulting in different objects.
|
||||
*/
|
||||
$choices = $this->fixChoices($models);
|
||||
foreach ($choices as $i => $givenChoice) {
|
||||
if (null === $givenChoice) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($this->getChoices() as $j => $choice) {
|
||||
if ($this->isEqual($choice, $givenChoice)) {
|
||||
$indices[$i] = $j;
|
||||
|
||||
// If all choices have been assigned, skip further loops.
|
||||
unset($choices[$i]);
|
||||
if (0 === count($choices)) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $indices;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @deprecated since version 2.4, to be removed in 3.0.
|
||||
*/
|
||||
public function getIndicesForValues(array $values)
|
||||
{
|
||||
trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0.', E_USER_DEPRECATED);
|
||||
|
||||
if (empty($values)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$this->load();
|
||||
|
||||
return parent::getIndicesForValues($values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new unique index for this model.
|
||||
*
|
||||
* If the model has a single-field identifier, this identifier is used.
|
||||
*
|
||||
* Otherwise a new integer is generated.
|
||||
*
|
||||
* @param mixed $model The choice to create an index for
|
||||
*
|
||||
* @return int|string A unique index containing only ASCII letters,
|
||||
* digits and underscores.
|
||||
*/
|
||||
protected function createIndex($model)
|
||||
{
|
||||
if ($this->identifierAsIndex) {
|
||||
return current($this->getIdentifierValues($model));
|
||||
}
|
||||
|
||||
return parent::createIndex($model);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new unique value for this model.
|
||||
*
|
||||
* If the model has a single-field identifier, this identifier is used.
|
||||
*
|
||||
* Otherwise a new integer is generated.
|
||||
*
|
||||
* @param mixed $model The choice to create a value for
|
||||
*
|
||||
* @return int|string A unique value without character limitations.
|
||||
*/
|
||||
protected function createValue($model)
|
||||
{
|
||||
if ($this->identifierAsIndex) {
|
||||
return (string) current($this->getIdentifierValues($model));
|
||||
}
|
||||
|
||||
return parent::createValue($model);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the complete choice list entries, once.
|
||||
*
|
||||
* If data has been loaded the choice list is initialized with the retrieved data.
|
||||
*/
|
||||
private function load()
|
||||
{
|
||||
if ($this->loaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
$models = (array) $this->query->find();
|
||||
|
||||
$preferred = array();
|
||||
if ($this->preferredQuery instanceof \ModelCriteria) {
|
||||
$preferred = (array) $this->preferredQuery->find();
|
||||
}
|
||||
|
||||
try {
|
||||
// The second parameter $labels is ignored by ObjectChoiceList
|
||||
parent::initialize($models, array(), $preferred);
|
||||
|
||||
$this->loaded = true;
|
||||
} catch (StringCastException $e) {
|
||||
throw new StringCastException(str_replace('argument $labelPath', 'option "property"', $e->getMessage()), null, $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the values of the identifier fields of a model.
|
||||
*
|
||||
* Propel must know about this model, that is, the model must already
|
||||
* be persisted or added to the idmodel map before. Otherwise an
|
||||
* exception is thrown.
|
||||
*
|
||||
* @param object $model The model for which to get the identifier
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getIdentifierValues($model)
|
||||
{
|
||||
if (!$model instanceof $this->class) {
|
||||
return array();
|
||||
}
|
||||
|
||||
if (1 === count($this->identifier) && current($this->identifier) instanceof \ColumnMap) {
|
||||
$phpName = current($this->identifier)->getPhpName();
|
||||
|
||||
if (method_exists($model, 'get'.$phpName)) {
|
||||
return array($model->{'get'.$phpName}());
|
||||
}
|
||||
}
|
||||
|
||||
if ($model instanceof \Persistent) {
|
||||
return array($model->getPrimaryKey());
|
||||
}
|
||||
|
||||
// readonly="true" models do not implement \Persistent.
|
||||
if ($model instanceof \BaseObject && method_exists($model, 'getPrimaryKey')) {
|
||||
return array($model->getPrimaryKey());
|
||||
}
|
||||
|
||||
if (!method_exists($model, 'getPrimaryKeys')) {
|
||||
return array();
|
||||
}
|
||||
|
||||
return $model->getPrimaryKeys();
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether this column contains scalar values (to be used as indices).
|
||||
*
|
||||
* @param \ColumnMap $column
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isScalar(\ColumnMap $column)
|
||||
{
|
||||
return in_array($column->getPdoType(), array(
|
||||
\PDO::PARAM_BOOL,
|
||||
\PDO::PARAM_INT,
|
||||
\PDO::PARAM_STR,
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the given choices for equality.
|
||||
*
|
||||
* @param mixed $choice
|
||||
* @param mixed $givenChoice
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isEqual($choice, $givenChoice)
|
||||
{
|
||||
if ($choice === $givenChoice) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($this->getIdentifierValues($choice) === $this->getIdentifierValues($givenChoice)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form\DataTransformer;
|
||||
|
||||
use PropelObjectCollection;
|
||||
use Symfony\Component\Form\DataTransformerInterface;
|
||||
use Symfony\Component\Form\Exception\TransformationFailedException;
|
||||
|
||||
/**
|
||||
* CollectionToArrayTransformer class.
|
||||
*
|
||||
* @author William Durand <william.durand1@gmail.com>
|
||||
* @author Pierre-Yves Lebecq <py.lebecq@gmail.com>
|
||||
*/
|
||||
class CollectionToArrayTransformer implements DataTransformerInterface
|
||||
{
|
||||
public function transform($collection)
|
||||
{
|
||||
if (null === $collection) {
|
||||
return array();
|
||||
}
|
||||
|
||||
if (!$collection instanceof PropelObjectCollection) {
|
||||
throw new TransformationFailedException('Expected a \PropelObjectCollection.');
|
||||
}
|
||||
|
||||
return $collection->getData();
|
||||
}
|
||||
|
||||
public function reverseTransform($array)
|
||||
{
|
||||
$collection = new PropelObjectCollection();
|
||||
|
||||
if ('' === $array || null === $array) {
|
||||
return $collection;
|
||||
}
|
||||
|
||||
if (!is_array($array)) {
|
||||
throw new TransformationFailedException('Expected an array.');
|
||||
}
|
||||
|
||||
$collection->setData($array);
|
||||
|
||||
return $collection;
|
||||
}
|
||||
}
|
@ -1,102 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form\EventListener;
|
||||
|
||||
use Symfony\Component\Form\FormEvents;
|
||||
use Symfony\Component\Form\Exception\UnexpectedTypeException;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
|
||||
/**
|
||||
* listener class for propel1_translatable_collection.
|
||||
*
|
||||
* @author Patrick Kaufmann
|
||||
*/
|
||||
class TranslationCollectionFormListener implements EventSubscriberInterface
|
||||
{
|
||||
private $i18nClass;
|
||||
private $languages;
|
||||
|
||||
public function __construct($languages, $i18nClass)
|
||||
{
|
||||
$this->i18nClass = $i18nClass;
|
||||
$this->languages = $languages;
|
||||
}
|
||||
|
||||
public static function getSubscribedEvents()
|
||||
{
|
||||
return array(
|
||||
FormEvents::PRE_SET_DATA => array('preSetData', 1),
|
||||
);
|
||||
}
|
||||
|
||||
public function preSetData(FormEvent $event)
|
||||
{
|
||||
$form = $event->getForm();
|
||||
$data = $event->getData();
|
||||
|
||||
if (null === $data) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) {
|
||||
throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)');
|
||||
}
|
||||
|
||||
//get the class name of the i18nClass
|
||||
$temp = explode('\\', $this->i18nClass);
|
||||
$dataClass = end($temp);
|
||||
|
||||
$rootData = $form->getRoot()->getData();
|
||||
$foundData = false;
|
||||
|
||||
$addFunction = 'add'.$dataClass;
|
||||
|
||||
//add a database row for every needed language
|
||||
foreach ($this->languages as $lang) {
|
||||
$found = false;
|
||||
|
||||
foreach ($data as $i18n) {
|
||||
if (!method_exists($i18n, 'getLocale')) {
|
||||
throw new UnexpectedTypeException($i18n, 'Propel i18n object');
|
||||
}
|
||||
|
||||
if ($i18n->getLocale() == $lang) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$found) {
|
||||
$currentForm = $form;
|
||||
while (!$foundData) {
|
||||
if (method_exists($rootData, $addFunction)) {
|
||||
$foundData = true;
|
||||
break;
|
||||
} elseif ($currentForm->hasParent()) {
|
||||
$currentForm = $currentForm->getParent();
|
||||
$rootData = $currentForm->getData();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$foundData) {
|
||||
throw new UnexpectedTypeException($rootData, 'Propel i18n object');
|
||||
}
|
||||
|
||||
$newTranslation = new $this->i18nClass();
|
||||
$newTranslation->setLocale($lang);
|
||||
|
||||
$rootData->$addFunction($newTranslation);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form\EventListener;
|
||||
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
use Symfony\Component\Form\FormEvents;
|
||||
|
||||
/**
|
||||
* Event Listener class for propel1_translation.
|
||||
*
|
||||
* @author Patrick Kaufmann
|
||||
*/
|
||||
class TranslationFormListener implements EventSubscriberInterface
|
||||
{
|
||||
private $columns;
|
||||
private $dataClass;
|
||||
|
||||
public function __construct($columns, $dataClass)
|
||||
{
|
||||
$this->columns = $columns;
|
||||
$this->dataClass = $dataClass;
|
||||
}
|
||||
|
||||
public static function getSubscribedEvents()
|
||||
{
|
||||
return array(
|
||||
FormEvents::PRE_SET_DATA => array('preSetData', 1),
|
||||
);
|
||||
}
|
||||
|
||||
public function preSetData(FormEvent $event)
|
||||
{
|
||||
$form = $event->getForm();
|
||||
$data = $event->getData();
|
||||
|
||||
if (!$data instanceof $this->dataClass) {
|
||||
return;
|
||||
}
|
||||
|
||||
//loop over all columns and add the input
|
||||
foreach ($this->columns as $column => $options) {
|
||||
if (is_string($options)) {
|
||||
$column = $options;
|
||||
$options = array();
|
||||
}
|
||||
if (null === $options) {
|
||||
$options = array();
|
||||
}
|
||||
|
||||
$type = 'text';
|
||||
if (array_key_exists('type', $options)) {
|
||||
$type = $options['type'];
|
||||
}
|
||||
$label = $column;
|
||||
if (array_key_exists('label', $options)) {
|
||||
$label = $options['label'];
|
||||
}
|
||||
|
||||
$customOptions = array();
|
||||
if (array_key_exists('options', $options)) {
|
||||
$customOptions = $options['options'];
|
||||
}
|
||||
$options = array(
|
||||
'label' => $label.' '.strtoupper($data->getLocale()),
|
||||
);
|
||||
|
||||
$options = array_merge($options, $customOptions);
|
||||
|
||||
$form->add($column, $type, $options);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form;
|
||||
|
||||
use Symfony\Component\Form\AbstractExtension;
|
||||
use Symfony\Component\PropertyAccess\PropertyAccess;
|
||||
|
||||
/**
|
||||
* Represents the Propel form extension, which loads the Propel functionality.
|
||||
*
|
||||
* @author Joseph Rouff <rouffj@gmail.com>
|
||||
*/
|
||||
class PropelExtension extends AbstractExtension
|
||||
{
|
||||
protected function loadTypes()
|
||||
{
|
||||
return array(
|
||||
new Type\ModelType(PropertyAccess::createPropertyAccessor()),
|
||||
new Type\TranslationCollectionType(),
|
||||
new Type\TranslationType(),
|
||||
);
|
||||
}
|
||||
|
||||
protected function loadTypeGuesser()
|
||||
{
|
||||
return new PropelTypeGuesser();
|
||||
}
|
||||
}
|
@ -1,184 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form;
|
||||
|
||||
use Symfony\Component\Form\FormTypeGuesserInterface;
|
||||
use Symfony\Component\Form\Guess\Guess;
|
||||
use Symfony\Component\Form\Guess\TypeGuess;
|
||||
use Symfony\Component\Form\Guess\ValueGuess;
|
||||
|
||||
/**
|
||||
* Propel Type guesser.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class PropelTypeGuesser implements FormTypeGuesserInterface
|
||||
{
|
||||
private $cache = array();
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function guessType($class, $property)
|
||||
{
|
||||
if (!$table = $this->getTable($class)) {
|
||||
return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
|
||||
}
|
||||
|
||||
foreach ($table->getRelations() as $relation) {
|
||||
if ($relation->getType() === \RelationMap::MANY_TO_ONE) {
|
||||
if (strtolower($property) === strtolower($relation->getName())) {
|
||||
return new TypeGuess('model', array(
|
||||
'class' => $relation->getForeignTable()->getClassName(),
|
||||
'multiple' => false,
|
||||
), Guess::HIGH_CONFIDENCE);
|
||||
}
|
||||
} elseif ($relation->getType() === \RelationMap::ONE_TO_MANY) {
|
||||
if (strtolower($property) === strtolower($relation->getPluralName())) {
|
||||
return new TypeGuess('model', array(
|
||||
'class' => $relation->getForeignTable()->getClassName(),
|
||||
'multiple' => true,
|
||||
), Guess::HIGH_CONFIDENCE);
|
||||
}
|
||||
} elseif ($relation->getType() === \RelationMap::MANY_TO_MANY) {
|
||||
if (strtolower($property) == strtolower($relation->getPluralName())) {
|
||||
return new TypeGuess('model', array(
|
||||
'class' => $relation->getLocalTable()->getClassName(),
|
||||
'multiple' => true,
|
||||
), Guess::HIGH_CONFIDENCE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$column = $this->getColumn($class, $property)) {
|
||||
return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
|
||||
}
|
||||
|
||||
switch ($column->getType()) {
|
||||
case \PropelColumnTypes::BOOLEAN:
|
||||
case \PropelColumnTypes::BOOLEAN_EMU:
|
||||
return new TypeGuess('checkbox', array(), Guess::HIGH_CONFIDENCE);
|
||||
case \PropelColumnTypes::TIMESTAMP:
|
||||
case \PropelColumnTypes::BU_TIMESTAMP:
|
||||
return new TypeGuess('datetime', array(), Guess::HIGH_CONFIDENCE);
|
||||
case \PropelColumnTypes::DATE:
|
||||
case \PropelColumnTypes::BU_DATE:
|
||||
return new TypeGuess('date', array(), Guess::HIGH_CONFIDENCE);
|
||||
case \PropelColumnTypes::TIME:
|
||||
return new TypeGuess('time', array(), Guess::HIGH_CONFIDENCE);
|
||||
case \PropelColumnTypes::FLOAT:
|
||||
case \PropelColumnTypes::REAL:
|
||||
case \PropelColumnTypes::DOUBLE:
|
||||
case \PropelColumnTypes::DECIMAL:
|
||||
return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE);
|
||||
case \PropelColumnTypes::TINYINT:
|
||||
case \PropelColumnTypes::SMALLINT:
|
||||
case \PropelColumnTypes::INTEGER:
|
||||
case \PropelColumnTypes::BIGINT:
|
||||
case \PropelColumnTypes::NUMERIC:
|
||||
return new TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE);
|
||||
case \PropelColumnTypes::ENUM:
|
||||
case \PropelColumnTypes::CHAR:
|
||||
if ($column->getValueSet()) {
|
||||
//check if this is mysql enum
|
||||
$choices = $column->getValueSet();
|
||||
$labels = array_map('ucfirst', $choices);
|
||||
|
||||
return new TypeGuess('choice', array('choices' => array_combine($choices, $labels)), Guess::MEDIUM_CONFIDENCE);
|
||||
}
|
||||
case \PropelColumnTypes::VARCHAR:
|
||||
return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE);
|
||||
case \PropelColumnTypes::LONGVARCHAR:
|
||||
case \PropelColumnTypes::BLOB:
|
||||
case \PropelColumnTypes::CLOB:
|
||||
case \PropelColumnTypes::CLOB_EMU:
|
||||
return new TypeGuess('textarea', array(), Guess::MEDIUM_CONFIDENCE);
|
||||
default:
|
||||
return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function guessRequired($class, $property)
|
||||
{
|
||||
if ($column = $this->getColumn($class, $property)) {
|
||||
return new ValueGuess($column->isNotNull(), Guess::HIGH_CONFIDENCE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function guessMaxLength($class, $property)
|
||||
{
|
||||
if ($column = $this->getColumn($class, $property)) {
|
||||
if ($column->isText()) {
|
||||
return new ValueGuess($column->getSize(), Guess::HIGH_CONFIDENCE);
|
||||
}
|
||||
switch ($column->getType()) {
|
||||
case \PropelColumnTypes::FLOAT:
|
||||
case \PropelColumnTypes::REAL:
|
||||
case \PropelColumnTypes::DOUBLE:
|
||||
case \PropelColumnTypes::DECIMAL:
|
||||
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function guessPattern($class, $property)
|
||||
{
|
||||
if ($column = $this->getColumn($class, $property)) {
|
||||
switch ($column->getType()) {
|
||||
case \PropelColumnTypes::FLOAT:
|
||||
case \PropelColumnTypes::REAL:
|
||||
case \PropelColumnTypes::DOUBLE:
|
||||
case \PropelColumnTypes::DECIMAL:
|
||||
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getTable($class)
|
||||
{
|
||||
if (isset($this->cache[$class])) {
|
||||
return $this->cache[$class];
|
||||
}
|
||||
|
||||
if (class_exists($queryClass = $class.'Query')) {
|
||||
$query = new $queryClass();
|
||||
|
||||
return $this->cache[$class] = $query->getTableMap();
|
||||
}
|
||||
}
|
||||
|
||||
protected function getColumn($class, $property)
|
||||
{
|
||||
if (isset($this->cache[$class.'::'.$property])) {
|
||||
return $this->cache[$class.'::'.$property];
|
||||
}
|
||||
|
||||
$table = $this->getTable($class);
|
||||
|
||||
if ($table && $table->hasColumn($property)) {
|
||||
return $this->cache[$class.'::'.$property] = $table->getColumn($property);
|
||||
}
|
||||
|
||||
if ($table && $table->hasColumnByInsensitiveCase($property)) {
|
||||
return $this->cache[$class.'::'.$property] = $table->getColumnByInsensitiveCase($property);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,128 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form\Type;
|
||||
|
||||
use Symfony\Bridge\Propel1\Form\ChoiceList\ModelChoiceList;
|
||||
use Symfony\Bridge\Propel1\Form\DataTransformer\CollectionToArrayTransformer;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\Options;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\PropertyAccess\PropertyAccess;
|
||||
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
|
||||
|
||||
/**
|
||||
* ModelType class.
|
||||
*
|
||||
* @author William Durand <william.durand1@gmail.com>
|
||||
* @author Toni Uebernickel <tuebernickel@gmail.com>
|
||||
*
|
||||
* Example using the preferred_choices option.
|
||||
*
|
||||
* <code>
|
||||
* public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
* {
|
||||
* $builder
|
||||
* ->add('product', 'model', array(
|
||||
* 'class' => 'Model\Product',
|
||||
* 'query' => ProductQuery::create()
|
||||
* ->filterIsActive(true)
|
||||
* ->useI18nQuery($options['locale'])
|
||||
* ->orderByName()
|
||||
* ->endUse()
|
||||
* ,
|
||||
* 'preferred_choices' => ProductQuery::create()
|
||||
* ->filterByIsTopProduct(true)
|
||||
* ,
|
||||
* ))
|
||||
* ;
|
||||
* }
|
||||
* </code>
|
||||
*/
|
||||
class ModelType extends AbstractType
|
||||
{
|
||||
/**
|
||||
* @var PropertyAccessorInterface
|
||||
*/
|
||||
private $propertyAccessor;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param PropertyAccessorInterface|null $propertyAccessor
|
||||
*/
|
||||
public function __construct(PropertyAccessorInterface $propertyAccessor = null)
|
||||
{
|
||||
$this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
if ($options['multiple']) {
|
||||
$builder->addViewTransformer(new CollectionToArrayTransformer(), true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$propertyAccessor = $this->propertyAccessor;
|
||||
|
||||
$choiceList = function (Options $options) use ($propertyAccessor) {
|
||||
return new ModelChoiceList(
|
||||
$options['class'],
|
||||
$options['property'],
|
||||
$options['choices'],
|
||||
$options['query'],
|
||||
$options['group_by'],
|
||||
$options['preferred_choices'],
|
||||
$propertyAccessor,
|
||||
$options['index_property']
|
||||
);
|
||||
};
|
||||
|
||||
$resolver->setDefaults(array(
|
||||
'template' => 'choice',
|
||||
'multiple' => false,
|
||||
'expanded' => false,
|
||||
'class' => null,
|
||||
'property' => null,
|
||||
'query' => null,
|
||||
'choices' => null,
|
||||
'choice_list' => $choiceList,
|
||||
'group_by' => null,
|
||||
'by_reference' => false,
|
||||
'index_property' => null,
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return 'choice';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'model';
|
||||
}
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form\Type;
|
||||
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\OptionsResolver\Exception\MissingOptionsException;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Bridge\Propel1\Form\EventListener\TranslationCollectionFormListener;
|
||||
|
||||
/**
|
||||
* form type for i18n-columns in propel.
|
||||
*
|
||||
* @author Patrick Kaufmann
|
||||
*/
|
||||
class TranslationCollectionType extends AbstractType
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
if (!isset($options['options']['data_class']) || null === $options['options']['data_class']) {
|
||||
throw new MissingOptionsException('data_class must be set');
|
||||
}
|
||||
if (!isset($options['options']['columns']) || null === $options['options']['columns']) {
|
||||
throw new MissingOptionsException('columns must be set');
|
||||
}
|
||||
|
||||
$listener = new TranslationCollectionFormListener($options['languages'], $options['options']['data_class']);
|
||||
$builder->addEventSubscriber($listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return 'collection';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'propel1_translation_collection';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setRequired(array(
|
||||
'languages',
|
||||
));
|
||||
|
||||
$resolver->setDefaults(array(
|
||||
'type' => 'propel1_translation',
|
||||
'allow_add' => false,
|
||||
'allow_delete' => false,
|
||||
'options' => array(
|
||||
'data_class' => null,
|
||||
'columns' => null,
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Form\Type;
|
||||
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Bridge\Propel1\Form\EventListener\TranslationFormListener;
|
||||
|
||||
/**
|
||||
* Translation type class.
|
||||
*
|
||||
* @author Patrick Kaufmann
|
||||
*/
|
||||
class TranslationType extends AbstractType
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder->addEventSubscriber(
|
||||
new TranslationFormListener($options['columns'], $options['data_class'])
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'propel1_translation';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setRequired(array(
|
||||
'data_class',
|
||||
'columns',
|
||||
));
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
Copyright (c) 2004-2015 Fabien Potencier
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
@ -1,177 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Logger;
|
||||
|
||||
use Symfony\Component\Stopwatch\Stopwatch;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
/**
|
||||
* PropelLogger.
|
||||
*
|
||||
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
||||
* @author William Durand <william.durand1@gmail.com>
|
||||
*/
|
||||
class PropelLogger implements \BasicLogger
|
||||
{
|
||||
/**
|
||||
* @var LoggerInterface
|
||||
*/
|
||||
protected $logger;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $queries = array();
|
||||
|
||||
/**
|
||||
* @var Stopwatch
|
||||
*/
|
||||
protected $stopwatch;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $isPrepared = false;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param LoggerInterface $logger A LoggerInterface instance
|
||||
* @param Stopwatch $stopwatch A Stopwatch instance
|
||||
*/
|
||||
public function __construct(LoggerInterface $logger = null, Stopwatch $stopwatch = null)
|
||||
{
|
||||
$this->logger = $logger;
|
||||
$this->stopwatch = $stopwatch;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function alert($message)
|
||||
{
|
||||
$this->log($message, 'alert');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function crit($message)
|
||||
{
|
||||
$this->log($message, 'crit');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function err($message)
|
||||
{
|
||||
$this->log($message, 'err');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function warning($message)
|
||||
{
|
||||
$this->log($message, 'warning');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function notice($message)
|
||||
{
|
||||
$this->log($message, 'notice');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function info($message)
|
||||
{
|
||||
$this->log($message, 'info');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function debug($message)
|
||||
{
|
||||
$add = true;
|
||||
|
||||
if (null !== $this->stopwatch) {
|
||||
$trace = debug_backtrace();
|
||||
$method = $trace[2]['args'][2];
|
||||
|
||||
$watch = 'Propel Query '.(count($this->queries)+1);
|
||||
if ('PropelPDO::prepare' === $method) {
|
||||
$this->isPrepared = true;
|
||||
$this->stopwatch->start($watch, 'propel');
|
||||
|
||||
$add = false;
|
||||
} elseif ($this->isPrepared) {
|
||||
$this->isPrepared = false;
|
||||
$this->stopwatch->stop($watch);
|
||||
}
|
||||
}
|
||||
|
||||
if ($add) {
|
||||
$this->queries[] = $message;
|
||||
$this->log($message, 'debug');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function log($message, $severity = null)
|
||||
{
|
||||
if (null !== $this->logger) {
|
||||
$message = is_string($message) ? $message : var_export($message, true);
|
||||
|
||||
switch ($severity) {
|
||||
case 'alert':
|
||||
$this->logger->alert($message);
|
||||
break;
|
||||
case 'crit':
|
||||
$this->logger->critical($message);
|
||||
break;
|
||||
case 'err':
|
||||
$this->logger->error($message);
|
||||
break;
|
||||
case 'warning':
|
||||
$this->logger->warning($message);
|
||||
break;
|
||||
case 'notice':
|
||||
$this->logger->notice($message);
|
||||
break;
|
||||
case 'info':
|
||||
$this->logger->info($message);
|
||||
break;
|
||||
case 'debug':
|
||||
default:
|
||||
$this->logger->debug($message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns queries.
|
||||
*
|
||||
* @return array Queries
|
||||
*/
|
||||
public function getQueries()
|
||||
{
|
||||
return $this->queries;
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
Propel Bridge
|
||||
=============
|
||||
|
||||
Provides integration for Propel with various Symfony components.
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
||||
You can run the unit tests with the following command:
|
||||
|
||||
$ cd path/to/Symfony/Bridge/Propel1/
|
||||
$ composer install
|
||||
$ phpunit
|
@ -1,103 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Security\User;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
use Symfony\Component\Security\Core\User\UserProviderInterface;
|
||||
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
|
||||
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
|
||||
|
||||
/**
|
||||
* Provides easy to use provisioning for Propel model users.
|
||||
*
|
||||
* @author William DURAND <william.durand1@gmail.com>
|
||||
*/
|
||||
class PropelUserProvider implements UserProviderInterface
|
||||
{
|
||||
/**
|
||||
* A Model class name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $class;
|
||||
|
||||
/**
|
||||
* A Query class name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $queryClass;
|
||||
|
||||
/**
|
||||
* A property to use to retrieve the user.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $property;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*
|
||||
* @param string $class The User model class.
|
||||
* @param string|null $property The property to use to retrieve a user.
|
||||
*/
|
||||
public function __construct($class, $property = null)
|
||||
{
|
||||
$this->class = $class;
|
||||
$this->queryClass = $class.'Query';
|
||||
$this->property = $property;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function loadUserByUsername($username)
|
||||
{
|
||||
$queryClass = $this->queryClass;
|
||||
$query = $queryClass::create();
|
||||
|
||||
if (null !== $this->property) {
|
||||
$filter = 'filterBy'.ucfirst($this->property);
|
||||
$query->$filter($username);
|
||||
} else {
|
||||
$query->filterByUsername($username);
|
||||
}
|
||||
|
||||
if (null === $user = $query->findOne()) {
|
||||
throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function refreshUser(UserInterface $user)
|
||||
{
|
||||
if (!$user instanceof $this->class) {
|
||||
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
|
||||
}
|
||||
|
||||
$queryClass = $this->queryClass;
|
||||
|
||||
return $queryClass::create()->findPk($user->getPrimaryKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function supportsClass($class)
|
||||
{
|
||||
return $class === $this->class;
|
||||
}
|
||||
}
|
@ -1,104 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\DataCollector;
|
||||
|
||||
use Symfony\Bridge\Propel1\DataCollector\PropelDataCollector;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Bridge\Propel1\Tests\Propel1TestCase;
|
||||
|
||||
class PropelDataCollectorTest extends Propel1TestCase
|
||||
{
|
||||
public function testCollectWithoutData()
|
||||
{
|
||||
$c = $this->createCollector(array());
|
||||
$c->collect(new Request(), new Response());
|
||||
|
||||
$this->assertEquals(array(), $c->getQueries());
|
||||
$this->assertEquals(0, $c->getQueryCount());
|
||||
}
|
||||
|
||||
public function testCollectWithData()
|
||||
{
|
||||
$queries = array(
|
||||
"time: 0.000 sec | mem: 1.4 MB | connection: default | SET NAMES 'utf8'",
|
||||
);
|
||||
|
||||
$c = $this->createCollector($queries);
|
||||
$c->collect(new Request(), new Response());
|
||||
|
||||
$this->assertEquals(array(
|
||||
array(
|
||||
'sql' => "SET NAMES 'utf8'",
|
||||
'time' => '0.000 sec',
|
||||
'connection' => 'default',
|
||||
'memory' => '1.4 MB',
|
||||
),
|
||||
), $c->getQueries());
|
||||
$this->assertEquals(1, $c->getQueryCount());
|
||||
}
|
||||
|
||||
public function testCollectWithMultipleData()
|
||||
{
|
||||
$queries = array(
|
||||
"time: 0.000 sec | mem: 1.4 MB | connection: default | SET NAMES 'utf8'",
|
||||
"time: 0.012 sec | mem: 2.4 MB | connection: default | SELECT tags.NAME, image.FILENAME FROM tags LEFT JOIN image ON tags.IMAGEID = image.ID WHERE image.ID = 12",
|
||||
"time: 0.012 sec | mem: 2.4 MB | connection: default | INSERT INTO `table` (`some_array`) VALUES ('| 1 | 2 | 3 |')",
|
||||
);
|
||||
|
||||
$c = $this->createCollector($queries);
|
||||
$c->collect(new Request(), new Response());
|
||||
|
||||
$this->assertEquals(array(
|
||||
array(
|
||||
'sql' => "SET NAMES 'utf8'",
|
||||
'time' => '0.000 sec',
|
||||
'connection' => 'default',
|
||||
'memory' => '1.4 MB',
|
||||
),
|
||||
array(
|
||||
'sql' => "SELECT tags.NAME, image.FILENAME FROM tags LEFT JOIN image ON tags.IMAGEID = image.ID WHERE image.ID = 12",
|
||||
'time' => '0.012 sec',
|
||||
'connection' => 'default',
|
||||
'memory' => '2.4 MB',
|
||||
),
|
||||
array(
|
||||
'sql' => "INSERT INTO `table` (`some_array`) VALUES ('| 1 | 2 | 3 |')",
|
||||
'time' => '0.012 sec',
|
||||
'connection' => 'default',
|
||||
'memory' => '2.4 MB',
|
||||
),
|
||||
), $c->getQueries());
|
||||
$this->assertEquals(3, $c->getQueryCount());
|
||||
$this->assertEquals(0.024, $c->getTime());
|
||||
}
|
||||
|
||||
private function createCollector($queries)
|
||||
{
|
||||
$config = $this->getMock('\PropelConfiguration');
|
||||
|
||||
$config
|
||||
->expects($this->any())
|
||||
->method('getParameter')
|
||||
->will($this->returnArgument(1))
|
||||
;
|
||||
|
||||
$logger = $this->getMock('\Symfony\Bridge\Propel1\Logger\PropelLogger');
|
||||
$logger
|
||||
->expects($this->any())
|
||||
->method('getQueries')
|
||||
->will($this->returnValue($queries))
|
||||
;
|
||||
|
||||
return new PropelDataCollector($logger, $config);
|
||||
}
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Fixtures;
|
||||
|
||||
class Column extends \ColumnMap
|
||||
{
|
||||
private $name;
|
||||
protected $type;
|
||||
|
||||
public function __construct($name, $type)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->type = $type;
|
||||
$this->phpName = ucfirst($name);
|
||||
}
|
||||
|
||||
public function isText()
|
||||
{
|
||||
if (!$this->type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch ($this->type) {
|
||||
case \PropelColumnTypes::CHAR:
|
||||
case \PropelColumnTypes::VARCHAR:
|
||||
case \PropelColumnTypes::LONGVARCHAR:
|
||||
case \PropelColumnTypes::BLOB:
|
||||
case \PropelColumnTypes::CLOB:
|
||||
case \PropelColumnTypes::CLOB_EMU:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getSize()
|
||||
{
|
||||
return $this->isText() ? 255 : 0;
|
||||
}
|
||||
|
||||
public function isNotNull()
|
||||
{
|
||||
return 'id' === $this->name;
|
||||
}
|
||||
}
|
@ -1,111 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Fixtures;
|
||||
|
||||
class Item implements \Persistent
|
||||
{
|
||||
private $id;
|
||||
private $value;
|
||||
private $groupName;
|
||||
private $price;
|
||||
|
||||
private $slug;
|
||||
|
||||
public function __construct($id = null, $value = null, $groupName = null, $price = null, $slug = null)
|
||||
{
|
||||
$this->id = $id;
|
||||
$this->value = $value;
|
||||
$this->groupName = $groupName;
|
||||
$this->price = $price;
|
||||
$this->slug = $slug;
|
||||
}
|
||||
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function setId($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function getValue()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public function getGroupName()
|
||||
{
|
||||
return $this->groupName;
|
||||
}
|
||||
|
||||
public function getPrice()
|
||||
{
|
||||
return $this->price;
|
||||
}
|
||||
|
||||
public function getSlug()
|
||||
{
|
||||
return $this->slug;
|
||||
}
|
||||
|
||||
public function getPrimaryKey()
|
||||
{
|
||||
return $this->getId();
|
||||
}
|
||||
|
||||
public function setPrimaryKey($primaryKey)
|
||||
{
|
||||
$this->setId($primaryKey);
|
||||
}
|
||||
|
||||
public function isModified()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isColumnModified($col)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isNew()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setNew($b)
|
||||
{
|
||||
}
|
||||
|
||||
public function resetModified()
|
||||
{
|
||||
}
|
||||
|
||||
public function isDeleted()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setDeleted($b)
|
||||
{
|
||||
}
|
||||
|
||||
public function delete(\PropelPDO $con = null)
|
||||
{
|
||||
}
|
||||
|
||||
public function save(\PropelPDO $con = null)
|
||||
{
|
||||
}
|
||||
}
|
@ -1,130 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Fixtures;
|
||||
|
||||
class ItemQuery
|
||||
{
|
||||
private $map = array(
|
||||
'id' => \PropelColumnTypes::INTEGER,
|
||||
'value' => \PropelColumnTypes::VARCHAR,
|
||||
'price' => \PropelColumnTypes::FLOAT,
|
||||
'is_active' => \PropelColumnTypes::BOOLEAN,
|
||||
'slug' => \PropelColumnTypes::VARCHAR,
|
||||
'enabled' => \PropelColumnTypes::BOOLEAN_EMU,
|
||||
'updated_at' => \PropelColumnTypes::TIMESTAMP,
|
||||
);
|
||||
|
||||
private $caseInsensitiveMap = array(
|
||||
'isactive' => 'is_active',
|
||||
'updatedat' => 'updated_at',
|
||||
);
|
||||
|
||||
public static $result = array();
|
||||
|
||||
public function find()
|
||||
{
|
||||
return self::$result;
|
||||
}
|
||||
|
||||
public function filterById($id)
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getTableMap()
|
||||
{
|
||||
// Allows to define methods in this class
|
||||
// to avoid a lot of mock classes
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPrimaryKeys()
|
||||
{
|
||||
$cm = new \ColumnMap('id', new \TableMap());
|
||||
$cm->setType('INTEGER');
|
||||
$cm->setPhpName('Id');
|
||||
|
||||
return array('id' => $cm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method from the TableMap API.
|
||||
*/
|
||||
public function hasColumn($column)
|
||||
{
|
||||
return in_array($column, array_keys($this->map));
|
||||
}
|
||||
|
||||
/**
|
||||
* Method from the TableMap API.
|
||||
*/
|
||||
public function getColumn($column)
|
||||
{
|
||||
if ($this->hasColumn($column)) {
|
||||
return new Column($column, $this->map[$column]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method from the TableMap API.
|
||||
*/
|
||||
public function hasColumnByInsensitiveCase($column)
|
||||
{
|
||||
$column = strtolower($column);
|
||||
|
||||
return in_array($column, array_keys($this->caseInsensitiveMap));
|
||||
}
|
||||
|
||||
/**
|
||||
* Method from the TableMap API
|
||||
*/
|
||||
public function getColumnByInsensitiveCase($column)
|
||||
{
|
||||
$column = strtolower($column);
|
||||
|
||||
if (isset($this->caseInsensitiveMap[$column])) {
|
||||
return $this->getColumn($this->caseInsensitiveMap[$column]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method from the TableMap API
|
||||
*/
|
||||
public function getRelations()
|
||||
{
|
||||
// table maps
|
||||
$authorTable = new \TableMap();
|
||||
$authorTable->setClassName('\Foo\Author');
|
||||
|
||||
$resellerTable = new \TableMap();
|
||||
$resellerTable->setClassName('\Foo\Reseller');
|
||||
|
||||
// relations
|
||||
$mainAuthorRelation = new \RelationMap('MainAuthor');
|
||||
$mainAuthorRelation->setType(\RelationMap::MANY_TO_ONE);
|
||||
$mainAuthorRelation->setForeignTable($authorTable);
|
||||
|
||||
$authorRelation = new \RelationMap('Author');
|
||||
$authorRelation->setType(\RelationMap::ONE_TO_MANY);
|
||||
$authorRelation->setForeignTable($authorTable);
|
||||
|
||||
$resellerRelation = new \RelationMap('Reseller');
|
||||
$resellerRelation->setType(\RelationMap::MANY_TO_MANY);
|
||||
$resellerRelation->setLocalTable($resellerTable);
|
||||
|
||||
return array(
|
||||
$mainAuthorRelation,
|
||||
$authorRelation,
|
||||
$resellerRelation,
|
||||
);
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Fixtures;
|
||||
|
||||
class ReadOnlyItem extends \BaseObject
|
||||
{
|
||||
public function getName()
|
||||
{
|
||||
return 'Marvin';
|
||||
}
|
||||
|
||||
public function getPrimaryKey()
|
||||
{
|
||||
return 42;
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Fixtures;
|
||||
|
||||
class ReadOnlyItemQuery
|
||||
{
|
||||
public function getTableMap()
|
||||
{
|
||||
// Allows to define methods in this class
|
||||
// to avoid a lot of mock classes
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPrimaryKeys()
|
||||
{
|
||||
$cm = new \ColumnMap('id', new \TableMap());
|
||||
$cm->setType('INTEGER');
|
||||
|
||||
return array('id' => $cm);
|
||||
}
|
||||
}
|
@ -1,125 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Fixtures;
|
||||
|
||||
class TranslatableItem implements \Persistent
|
||||
{
|
||||
private $id;
|
||||
private $currentTranslations;
|
||||
private $groupName;
|
||||
private $price;
|
||||
|
||||
public function __construct($id = null, $translations = array())
|
||||
{
|
||||
$this->id = $id;
|
||||
$this->currentTranslations = $translations;
|
||||
}
|
||||
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function setId($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function getGroupName()
|
||||
{
|
||||
return $this->groupName;
|
||||
}
|
||||
|
||||
public function getPrice()
|
||||
{
|
||||
return $this->price;
|
||||
}
|
||||
|
||||
public function getPrimaryKey()
|
||||
{
|
||||
return $this->getId();
|
||||
}
|
||||
|
||||
public function setPrimaryKey($primaryKey)
|
||||
{
|
||||
$this->setId($primaryKey);
|
||||
}
|
||||
|
||||
public function isModified()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isColumnModified($col)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isNew()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setNew($b)
|
||||
{
|
||||
}
|
||||
|
||||
public function resetModified()
|
||||
{
|
||||
}
|
||||
|
||||
public function isDeleted()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setDeleted($b)
|
||||
{
|
||||
}
|
||||
|
||||
public function delete(\PropelPDO $con = null)
|
||||
{
|
||||
}
|
||||
|
||||
public function save(\PropelPDO $con = null)
|
||||
{
|
||||
}
|
||||
|
||||
public function getTranslation($locale = 'de', \PropelPDO $con = null)
|
||||
{
|
||||
if (!isset($this->currentTranslations[$locale])) {
|
||||
$translation = new TranslatableItemI18n();
|
||||
$translation->setLocale($locale);
|
||||
$this->currentTranslations[$locale] = $translation;
|
||||
}
|
||||
|
||||
return $this->currentTranslations[$locale];
|
||||
}
|
||||
|
||||
public function addTranslatableItemI18n(TranslatableItemI18n $i)
|
||||
{
|
||||
if (!in_array($i, $this->currentTranslations)) {
|
||||
$this->currentTranslations[$i->getLocale()] = $i;
|
||||
$i->setItem($this);
|
||||
}
|
||||
}
|
||||
|
||||
public function removeTranslatableItemI18n(TranslatableItemI18n $i)
|
||||
{
|
||||
unset($this->currentTranslations[$i->getLocale()]);
|
||||
}
|
||||
|
||||
public function getTranslatableItemI18ns()
|
||||
{
|
||||
return $this->currentTranslations;
|
||||
}
|
||||
}
|
@ -1,128 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Fixtures;
|
||||
|
||||
class TranslatableItemI18n implements \Persistent
|
||||
{
|
||||
private $id;
|
||||
private $locale;
|
||||
private $value;
|
||||
private $value2;
|
||||
private $item;
|
||||
|
||||
public function __construct($id = null, $locale = null, $value = null)
|
||||
{
|
||||
$this->id = $id;
|
||||
$this->locale = $locale;
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function setId($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function getPrimaryKey()
|
||||
{
|
||||
return $this->getId();
|
||||
}
|
||||
|
||||
public function setPrimaryKey($primaryKey)
|
||||
{
|
||||
$this->setId($primaryKey);
|
||||
}
|
||||
|
||||
public function isModified()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isColumnModified($col)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isNew()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setNew($b)
|
||||
{
|
||||
}
|
||||
|
||||
public function resetModified()
|
||||
{
|
||||
}
|
||||
|
||||
public function isDeleted()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setDeleted($b)
|
||||
{
|
||||
}
|
||||
|
||||
public function delete(\PropelPDO $con = null)
|
||||
{
|
||||
}
|
||||
|
||||
public function save(\PropelPDO $con = null)
|
||||
{
|
||||
}
|
||||
|
||||
public function setLocale($locale)
|
||||
{
|
||||
$this->locale = $locale;
|
||||
}
|
||||
|
||||
public function getLocale()
|
||||
{
|
||||
return $this->locale;
|
||||
}
|
||||
|
||||
public function getItem()
|
||||
{
|
||||
return $this->item;
|
||||
}
|
||||
|
||||
public function setItem($item)
|
||||
{
|
||||
$this->item = $item;
|
||||
}
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
public function getValue()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public function setValue2($value2)
|
||||
{
|
||||
$this->value2 = $value2;
|
||||
}
|
||||
|
||||
public function getValue2()
|
||||
{
|
||||
return $this->value2;
|
||||
}
|
||||
}
|
@ -1,118 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Form\ChoiceList;
|
||||
|
||||
use Symfony\Bridge\Propel1\Form\ChoiceList\ModelChoiceList;
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\Item;
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\ItemQuery;
|
||||
use Symfony\Component\Form\Tests\Extension\Core\ChoiceList\AbstractChoiceListTest;
|
||||
|
||||
class CompatModelChoiceListTest extends AbstractChoiceListTest
|
||||
{
|
||||
const ITEM_CLASS = '\Symfony\Bridge\Propel1\Tests\Fixtures\Item';
|
||||
|
||||
/**
|
||||
* @var \PHPUnit_Framework_MockObject_MockObject|\Symfony\Bridge\Propel1\Tests\Fixtures\ItemQuery
|
||||
*/
|
||||
protected $query;
|
||||
|
||||
protected $item1;
|
||||
protected $item2;
|
||||
protected $item3;
|
||||
protected $item4;
|
||||
|
||||
public function testGetChoicesForValues()
|
||||
{
|
||||
$this->query
|
||||
->expects($this->once())
|
||||
->method('filterById')
|
||||
->with(array(1, 2))
|
||||
->will($this->returnSelf())
|
||||
;
|
||||
|
||||
ItemQuery::$result = array(
|
||||
$this->item2,
|
||||
$this->item1,
|
||||
);
|
||||
|
||||
parent::testGetChoicesForValues();
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->query = $this->getMock('Symfony\Bridge\Propel1\Tests\Fixtures\ItemQuery', array(
|
||||
'filterById',
|
||||
), array(), '', true, true, true, false, true);
|
||||
|
||||
$this->query
|
||||
->expects($this->any())
|
||||
->method('filterById')
|
||||
->with($this->anything())
|
||||
->will($this->returnSelf())
|
||||
;
|
||||
|
||||
$this->createItems();
|
||||
|
||||
ItemQuery::$result = array(
|
||||
$this->item1,
|
||||
$this->item2,
|
||||
$this->item3,
|
||||
$this->item4,
|
||||
);
|
||||
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
protected function createItems()
|
||||
{
|
||||
$this->item1 = new Item(1, 'Foo');
|
||||
$this->item2 = new Item(2, 'Bar');
|
||||
$this->item3 = new Item(3, 'Baz');
|
||||
$this->item4 = new Item(4, 'Cuz');
|
||||
}
|
||||
|
||||
protected function createChoiceList()
|
||||
{
|
||||
return new ModelChoiceList(self::ITEM_CLASS, 'value', null, $this->query);
|
||||
}
|
||||
|
||||
protected function getChoices()
|
||||
{
|
||||
return array(
|
||||
1 => $this->item1,
|
||||
2 => $this->item2,
|
||||
3 => $this->item3,
|
||||
4 => $this->item4,
|
||||
);
|
||||
}
|
||||
|
||||
protected function getLabels()
|
||||
{
|
||||
return array(
|
||||
1 => 'Foo',
|
||||
2 => 'Bar',
|
||||
3 => 'Baz',
|
||||
4 => 'Cuz',
|
||||
);
|
||||
}
|
||||
|
||||
protected function getValues()
|
||||
{
|
||||
return array(
|
||||
1 => '1',
|
||||
2 => '2',
|
||||
3 => '3',
|
||||
4 => '4',
|
||||
);
|
||||
}
|
||||
|
||||
protected function getIndices()
|
||||
{
|
||||
return array(
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
);
|
||||
}
|
||||
}
|
@ -1,316 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Form\ChoiceList;
|
||||
|
||||
use Symfony\Bridge\Propel1\Form\ChoiceList\ModelChoiceList;
|
||||
use Symfony\Bridge\Propel1\Tests\Propel1TestCase;
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\Item;
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\ItemQuery;
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\ReadOnlyItem;
|
||||
use Symfony\Component\Form\Extension\Core\View\ChoiceView;
|
||||
|
||||
class ModelChoiceListTest extends Propel1TestCase
|
||||
{
|
||||
const ITEM_CLASS = '\Symfony\Bridge\Propel1\Tests\Fixtures\Item';
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
ItemQuery::$result = array();
|
||||
}
|
||||
|
||||
public function testEmptyChoicesReturnsEmpty()
|
||||
{
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array()
|
||||
);
|
||||
|
||||
$this->assertSame(array(), $choiceList->getChoices());
|
||||
}
|
||||
|
||||
public function testReadOnlyIsValidChoice()
|
||||
{
|
||||
$item = new ReadOnlyItem();
|
||||
$choiceList = new ModelChoiceList(
|
||||
'\Symfony\Bridge\Propel1\Tests\Fixtures\ReadOnlyItem',
|
||||
'name',
|
||||
array(
|
||||
$item,
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertSame(array(42 => $item), $choiceList->getChoices());
|
||||
}
|
||||
|
||||
public function testFlattenedChoices()
|
||||
{
|
||||
$item1 = new Item(1, 'Foo');
|
||||
$item2 = new Item(2, 'Bar');
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array(
|
||||
$item1,
|
||||
$item2,
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertSame(array(1 => $item1, 2 => $item2), $choiceList->getChoices());
|
||||
}
|
||||
|
||||
public function testFlattenedPreferredChoices()
|
||||
{
|
||||
$item1 = new Item(1, 'Foo');
|
||||
$item2 = new Item(2, 'Bar');
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array(
|
||||
$item1,
|
||||
$item2,
|
||||
),
|
||||
null,
|
||||
null,
|
||||
array(
|
||||
$item1,
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertSame(array(1 => $item1, 2 => $item2), $choiceList->getChoices());
|
||||
$this->assertEquals(array(1 => new ChoiceView($item1, '1', 'Foo')), $choiceList->getPreferredViews());
|
||||
}
|
||||
|
||||
public function testNestedChoices()
|
||||
{
|
||||
$item1 = new Item(1, 'Foo');
|
||||
$item2 = new Item(2, 'Bar');
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array(
|
||||
'group1' => array($item1),
|
||||
'group2' => array($item2),
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertSame(array(1 => $item1, 2 => $item2), $choiceList->getChoices());
|
||||
$this->assertEquals(array(
|
||||
'group1' => array(1 => new ChoiceView($item1, '1', 'Foo')),
|
||||
'group2' => array(2 => new ChoiceView($item2, '2', 'Bar')),
|
||||
), $choiceList->getRemainingViews());
|
||||
}
|
||||
|
||||
public function testGroupBySupportsString()
|
||||
{
|
||||
$item1 = new Item(1, 'Foo', 'Group1');
|
||||
$item2 = new Item(2, 'Bar', 'Group1');
|
||||
$item3 = new Item(3, 'Baz', 'Group2');
|
||||
$item4 = new Item(4, 'Boo!', null);
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array(
|
||||
$item1,
|
||||
$item2,
|
||||
$item3,
|
||||
$item4,
|
||||
),
|
||||
null,
|
||||
'groupName'
|
||||
);
|
||||
|
||||
$this->assertEquals(array(1 => $item1, 2 => $item2, 3 => $item3, 4 => $item4), $choiceList->getChoices());
|
||||
$this->assertEquals(array(
|
||||
'Group1' => array(1 => new ChoiceView($item1, '1', 'Foo'), 2 => new ChoiceView($item2, '2', 'Bar')),
|
||||
'Group2' => array(3 => new ChoiceView($item3, '3', 'Baz')),
|
||||
4 => new ChoiceView($item4, '4', 'Boo!'),
|
||||
), $choiceList->getRemainingViews());
|
||||
}
|
||||
|
||||
public function testGroupByInvalidPropertyPathReturnsFlatChoices()
|
||||
{
|
||||
$item1 = new Item(1, 'Foo', 'Group1');
|
||||
$item2 = new Item(2, 'Bar', 'Group1');
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array(
|
||||
$item1,
|
||||
$item2,
|
||||
),
|
||||
null,
|
||||
'child.that.does.not.exist'
|
||||
);
|
||||
|
||||
$this->assertEquals(array(
|
||||
1 => $item1,
|
||||
2 => $item2,
|
||||
), $choiceList->getChoices());
|
||||
}
|
||||
|
||||
public function testGetValuesForChoices()
|
||||
{
|
||||
$item1 = new Item(1, 'Foo');
|
||||
$item2 = new Item(2, 'Bar');
|
||||
|
||||
ItemQuery::$result = array(
|
||||
$item1,
|
||||
$item2,
|
||||
);
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
$this->assertEquals(array(1, 2), $choiceList->getValuesForChoices(array($item1, $item2)));
|
||||
}
|
||||
|
||||
public function testDifferentEqualObjectsAreChoosen()
|
||||
{
|
||||
$item = new Item(1, 'Foo');
|
||||
|
||||
ItemQuery::$result = array(
|
||||
$item,
|
||||
);
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array($item)
|
||||
);
|
||||
|
||||
$choosenItem = new Item(1, 'Foo');
|
||||
|
||||
$this->assertEquals(array('1'), $choiceList->getValuesForChoices(array($choosenItem)));
|
||||
}
|
||||
|
||||
public function testLegacygetIndicesForChoices()
|
||||
{
|
||||
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
|
||||
|
||||
$item1 = new Item(1, 'Foo');
|
||||
$item2 = new Item(2, 'Bar');
|
||||
|
||||
ItemQuery::$result = array(
|
||||
$item1,
|
||||
$item2,
|
||||
);
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
$this->assertEquals(array(1, 2), $choiceList->getIndicesForChoices(array($item1, $item2)));
|
||||
}
|
||||
|
||||
public function testLegacyDifferentEqualObjectsAreChoosen()
|
||||
{
|
||||
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
|
||||
|
||||
$item = new Item(1, 'Foo');
|
||||
|
||||
ItemQuery::$result = array(
|
||||
$item,
|
||||
);
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array($item)
|
||||
);
|
||||
|
||||
$choosenItem = new Item(1, 'Foo');
|
||||
|
||||
$this->assertEquals(array(1), $choiceList->getIndicesForChoices(array($choosenItem)));
|
||||
}
|
||||
|
||||
public function testLegacyGetIndicesForNullChoices()
|
||||
{
|
||||
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
|
||||
|
||||
$item = new Item(1, 'Foo');
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array($item)
|
||||
);
|
||||
|
||||
$this->assertEquals(array(), $choiceList->getIndicesForChoices(array(null)));
|
||||
}
|
||||
|
||||
public function testDontAllowInvalidChoiceValues()
|
||||
{
|
||||
$item = new Item(1, 'Foo');
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array($item)
|
||||
);
|
||||
|
||||
$this->assertEquals(array(), $choiceList->getValuesForChoices(array(new Item(2, 'Bar'))));
|
||||
$this->assertEquals(array(), $choiceList->getChoicesForValues(array(2)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\OptionsResolver\Exception\MissingOptionsException
|
||||
*/
|
||||
public function testEmptyClass()
|
||||
{
|
||||
new ModelChoiceList('');
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
|
||||
*/
|
||||
public function testInvalidClass()
|
||||
{
|
||||
new ModelChoiceList('Foo\Bar\DoesNotExistClass');
|
||||
}
|
||||
|
||||
public function testCustomIdentifier()
|
||||
{
|
||||
$item1 = new Item(1, 'Foo', null, null, 'slug');
|
||||
$item2 = new Item(2, 'Bar', null, null, 'slug2');
|
||||
|
||||
$choiceList = new ModelChoiceList(
|
||||
self::ITEM_CLASS,
|
||||
'value',
|
||||
array(
|
||||
$item1,
|
||||
$item2,
|
||||
),
|
||||
null,
|
||||
null,
|
||||
array(),
|
||||
null,
|
||||
'slug'
|
||||
);
|
||||
|
||||
$this->assertSame(array('slug' => $item1, 'slug2' => $item2), $choiceList->getChoices());
|
||||
}
|
||||
}
|
@ -1,106 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Form\DataTransformer;
|
||||
|
||||
use Symfony\Bridge\Propel1\Form\DataTransformer\CollectionToArrayTransformer;
|
||||
use Symfony\Bridge\Propel1\Tests\Propel1TestCase;
|
||||
|
||||
class CollectionToArrayTransformerTest extends Propel1TestCase
|
||||
{
|
||||
private $transformer;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->transformer = new CollectionToArrayTransformer();
|
||||
}
|
||||
|
||||
public function testTransform()
|
||||
{
|
||||
$result = $this->transformer->transform(new \PropelObjectCollection());
|
||||
|
||||
$this->assertTrue(is_array($result));
|
||||
$this->assertCount(0, $result);
|
||||
}
|
||||
|
||||
public function testTransformWithNull()
|
||||
{
|
||||
$result = $this->transformer->transform(null);
|
||||
|
||||
$this->assertTrue(is_array($result));
|
||||
$this->assertCount(0, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
|
||||
*/
|
||||
public function testTransformThrowsExceptionIfNotPropelObjectCollection()
|
||||
{
|
||||
$this->transformer->transform(new DummyObject());
|
||||
}
|
||||
|
||||
public function testTransformWithData()
|
||||
{
|
||||
$coll = new \PropelObjectCollection();
|
||||
$coll->setData(array('foo', 'bar'));
|
||||
|
||||
$result = $this->transformer->transform($coll);
|
||||
|
||||
$this->assertTrue(is_array($result));
|
||||
$this->assertCount(2, $result);
|
||||
$this->assertEquals('foo', $result[0]);
|
||||
$this->assertEquals('bar', $result[1]);
|
||||
}
|
||||
|
||||
public function testReverseTransformWithNull()
|
||||
{
|
||||
$result = $this->transformer->reverseTransform(null);
|
||||
|
||||
$this->assertInstanceOf('\PropelObjectCollection', $result);
|
||||
$this->assertCount(0, $result->getData());
|
||||
}
|
||||
|
||||
public function testReverseTransformWithEmptyString()
|
||||
{
|
||||
$result = $this->transformer->reverseTransform('');
|
||||
|
||||
$this->assertInstanceOf('\PropelObjectCollection', $result);
|
||||
$this->assertCount(0, $result->getData());
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
|
||||
*/
|
||||
public function testReverseTransformThrowsExceptionIfNotArray()
|
||||
{
|
||||
$this->transformer->reverseTransform(new DummyObject());
|
||||
}
|
||||
|
||||
public function testReverseTransformWithData()
|
||||
{
|
||||
$inputData = array('foo', 'bar');
|
||||
|
||||
$result = $this->transformer->reverseTransform($inputData);
|
||||
$data = $result->getData();
|
||||
|
||||
$this->assertInstanceOf('\PropelObjectCollection', $result);
|
||||
|
||||
$this->assertTrue(is_array($data));
|
||||
$this->assertCount(2, $data);
|
||||
$this->assertEquals('foo', $data[0]);
|
||||
$this->assertEquals('bar', $data[1]);
|
||||
$this->assertsame($inputData, $data);
|
||||
}
|
||||
}
|
||||
|
||||
class DummyObject
|
||||
{
|
||||
}
|
@ -1,136 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Form;
|
||||
|
||||
use Symfony\Bridge\Propel1\Form\PropelTypeGuesser;
|
||||
use Symfony\Bridge\Propel1\Tests\Propel1TestCase;
|
||||
use Symfony\Component\Form\Guess\Guess;
|
||||
|
||||
class PropelTypeGuesserTest extends Propel1TestCase
|
||||
{
|
||||
const CLASS_NAME = 'Symfony\Bridge\Propel1\Tests\Fixtures\Item';
|
||||
const UNKNOWN_CLASS_NAME = 'Symfony\Bridge\Propel1\Tests\Fixtures\UnknownItem';
|
||||
|
||||
private $guesser;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->guesser = new PropelTypeGuesser();
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->guesser = null;
|
||||
}
|
||||
|
||||
public function testGuessMaxLengthWithText()
|
||||
{
|
||||
$value = $this->guesser->guessMaxLength(self::CLASS_NAME, 'value');
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertEquals(255, $value->getValue());
|
||||
}
|
||||
|
||||
public function testGuessMaxLengthWithFloat()
|
||||
{
|
||||
$value = $this->guesser->guessMaxLength(self::CLASS_NAME, 'price');
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertNull($value->getValue());
|
||||
}
|
||||
|
||||
public function testGuessMinLengthWithText()
|
||||
{
|
||||
$value = $this->guesser->guessPattern(self::CLASS_NAME, 'value');
|
||||
|
||||
$this->assertNull($value);
|
||||
}
|
||||
|
||||
public function testGuessMinLengthWithFloat()
|
||||
{
|
||||
$value = $this->guesser->guessPattern(self::CLASS_NAME, 'price');
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertNull($value->getValue());
|
||||
}
|
||||
|
||||
public function testGuessRequired()
|
||||
{
|
||||
$value = $this->guesser->guessRequired(self::CLASS_NAME, 'id');
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertTrue($value->getValue());
|
||||
}
|
||||
|
||||
public function testGuessRequiredWithNullableColumn()
|
||||
{
|
||||
$value = $this->guesser->guessRequired(self::CLASS_NAME, 'value');
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertFalse($value->getValue());
|
||||
}
|
||||
|
||||
public function testGuessTypeWithoutTable()
|
||||
{
|
||||
$value = $this->guesser->guessType(self::UNKNOWN_CLASS_NAME, 'property');
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertEquals('text', $value->getType());
|
||||
$this->assertEquals(Guess::LOW_CONFIDENCE, $value->getConfidence());
|
||||
}
|
||||
|
||||
public function testGuessTypeWithoutColumn()
|
||||
{
|
||||
$value = $this->guesser->guessType(self::CLASS_NAME, 'property');
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertEquals('text', $value->getType());
|
||||
$this->assertEquals(Guess::LOW_CONFIDENCE, $value->getConfidence());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderForGuessType
|
||||
*/
|
||||
public function testGuessType($property, $type, $confidence, $multiple = null)
|
||||
{
|
||||
$value = $this->guesser->guessType(self::CLASS_NAME, $property);
|
||||
|
||||
$this->assertNotNull($value);
|
||||
$this->assertEquals($type, $value->getType());
|
||||
$this->assertEquals($confidence, $value->getConfidence());
|
||||
|
||||
if ($type === 'model') {
|
||||
$options = $value->getOptions();
|
||||
|
||||
$this->assertSame($multiple, $options['multiple']);
|
||||
}
|
||||
}
|
||||
|
||||
public static function dataProviderForGuessType()
|
||||
{
|
||||
return array(
|
||||
array('is_active', 'checkbox', Guess::HIGH_CONFIDENCE),
|
||||
array('enabled', 'checkbox', Guess::HIGH_CONFIDENCE),
|
||||
array('id', 'integer', Guess::MEDIUM_CONFIDENCE),
|
||||
array('value', 'text', Guess::MEDIUM_CONFIDENCE),
|
||||
array('price', 'number', Guess::MEDIUM_CONFIDENCE),
|
||||
array('updated_at', 'datetime', Guess::HIGH_CONFIDENCE),
|
||||
|
||||
array('isActive', 'checkbox', Guess::HIGH_CONFIDENCE),
|
||||
array('updatedAt', 'datetime', Guess::HIGH_CONFIDENCE),
|
||||
|
||||
array('Authors', 'model', Guess::HIGH_CONFIDENCE, true),
|
||||
array('Resellers', 'model', Guess::HIGH_CONFIDENCE, true),
|
||||
array('MainAuthor', 'model', Guess::HIGH_CONFIDENCE, false),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,151 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests\Form\Type;
|
||||
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\Item;
|
||||
use Symfony\Bridge\Propel1\Form\PropelExtension;
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\TranslatableItemI18n;
|
||||
use Symfony\Bridge\Propel1\Tests\Fixtures\TranslatableItem;
|
||||
use Symfony\Component\Form\Test\TypeTestCase;
|
||||
|
||||
class TranslationCollectionTypeTest extends TypeTestCase
|
||||
{
|
||||
const TRANSLATION_CLASS = 'Symfony\Bridge\Propel1\Tests\Fixtures\TranslatableItem';
|
||||
const TRANSLATABLE_I18N_CLASS = 'Symfony\Bridge\Propel1\Tests\Fixtures\TranslatableItemI18n';
|
||||
const NON_TRANSLATION_CLASS = 'Symfony\Bridge\Propel1\Tests\Fixtures\Item';
|
||||
|
||||
protected function getExtensions()
|
||||
{
|
||||
return array(new PropelExtension());
|
||||
}
|
||||
|
||||
public function testTranslationsAdded()
|
||||
{
|
||||
$item = new TranslatableItem();
|
||||
$item->addTranslatableItemI18n(new TranslatableItemI18n(1, 'fr', 'val1'));
|
||||
$item->addTranslatableItemI18n(new TranslatableItemI18n(2, 'en', 'val2'));
|
||||
|
||||
$builder = $this->factory->createBuilder('form', null, array(
|
||||
'data_class' => self::TRANSLATION_CLASS,
|
||||
));
|
||||
|
||||
$builder->add('translatableItemI18ns', 'propel1_translation_collection', array(
|
||||
'languages' => array('en', 'fr'),
|
||||
'options' => array(
|
||||
'data_class' => self::TRANSLATABLE_I18N_CLASS,
|
||||
'columns' => array('value', 'value2' => array('label' => 'Label', 'type' => 'textarea')),
|
||||
),
|
||||
));
|
||||
$form = $builder->getForm();
|
||||
$form->setData($item);
|
||||
$translations = $form->get('translatableItemI18ns');
|
||||
|
||||
$this->assertCount(2, $translations);
|
||||
$this->assertInstanceOf('Symfony\Component\Form\Form', $translations['en']);
|
||||
$this->assertInstanceOf('Symfony\Component\Form\Form', $translations['fr']);
|
||||
|
||||
$this->assertInstanceOf(self::TRANSLATABLE_I18N_CLASS, $translations['en']->getData());
|
||||
$this->assertInstanceOf(self::TRANSLATABLE_I18N_CLASS, $translations['fr']->getData());
|
||||
|
||||
$this->assertEquals($item->getTranslation('en'), $translations['en']->getData());
|
||||
$this->assertEquals($item->getTranslation('fr'), $translations['fr']->getData());
|
||||
|
||||
$columnOptions = $translations['fr']->getConfig()->getOption('columns');
|
||||
$this->assertEquals('value', $columnOptions[0]);
|
||||
$this->assertEquals('textarea', $columnOptions['value2']['type']);
|
||||
$this->assertEquals('Label', $columnOptions['value2']['label']);
|
||||
}
|
||||
|
||||
public function testNotPresentTranslationsAdded()
|
||||
{
|
||||
$item = new TranslatableItem();
|
||||
|
||||
$this->assertCount(0, $item->getTranslatableItemI18ns());
|
||||
|
||||
$builder = $this->factory->createBuilder('form', null, array(
|
||||
'data_class' => self::TRANSLATION_CLASS,
|
||||
));
|
||||
$builder->add('translatableItemI18ns', 'propel1_translation_collection', array(
|
||||
'languages' => array('en', 'fr'),
|
||||
'options' => array(
|
||||
'data_class' => self::TRANSLATABLE_I18N_CLASS,
|
||||
'columns' => array('value', 'value2' => array('label' => 'Label', 'type' => 'textarea')),
|
||||
),
|
||||
));
|
||||
|
||||
$form = $builder->getForm();
|
||||
$form->setData($item);
|
||||
|
||||
$this->assertCount(2, $item->getTranslatableItemI18ns());
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
|
||||
*/
|
||||
public function testNoArrayGiven()
|
||||
{
|
||||
$item = new Item(null, 'val');
|
||||
|
||||
$builder = $this->factory->createBuilder('form', null, array(
|
||||
'data_class' => self::NON_TRANSLATION_CLASS,
|
||||
));
|
||||
$builder->add('value', 'propel1_translation_collection', array(
|
||||
'languages' => array('en', 'fr'),
|
||||
'options' => array(
|
||||
'data_class' => self::TRANSLATABLE_I18N_CLASS,
|
||||
'columns' => array('value', 'value2' => array('label' => 'Label', 'type' => 'textarea')),
|
||||
),
|
||||
));
|
||||
|
||||
$form = $builder->getForm();
|
||||
$form->setData($item);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\OptionsResolver\Exception\MissingOptionsException
|
||||
*/
|
||||
public function testNoDataClassAdded()
|
||||
{
|
||||
$this->factory->createNamed('itemI18ns', 'propel1_translation_collection', null, array(
|
||||
'languages' => array('en', 'fr'),
|
||||
'options' => array(
|
||||
'columns' => array('value', 'value2'),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\OptionsResolver\Exception\MissingOptionsException
|
||||
*/
|
||||
public function testNoLanguagesAdded()
|
||||
{
|
||||
$this->factory->createNamed('itemI18ns', 'propel1_translation_collection', null, array(
|
||||
'options' => array(
|
||||
'data_class' => self::TRANSLATABLE_I18N_CLASS,
|
||||
'columns' => array('value', 'value2'),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\OptionsResolver\Exception\MissingOptionsException
|
||||
*/
|
||||
public function testNoColumnsAdded()
|
||||
{
|
||||
$this->factory->createNamed('itemI18ns', 'propel1_translation_collection', null, array(
|
||||
'languages' => array('en', 'fr'),
|
||||
'options' => array(
|
||||
'data_class' => self::TRANSLATABLE_I18N_CLASS,
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bridge\Propel1\Tests;
|
||||
|
||||
abstract class Propel1TestCase extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
{
|
||||
"name": "symfony/propel1-bridge",
|
||||
"type": "symfony-bridge",
|
||||
"description": "Symfony Propel1 Bridge",
|
||||
"keywords": [],
|
||||
"homepage": "http://symfony.com",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Fabien Potencier",
|
||||
"email": "fabien@symfony.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "http://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.3.9",
|
||||
"symfony/http-foundation": "~2.0,>=2.0.5|~3.0.0",
|
||||
"symfony/http-kernel": "~2.0,>=2.0.5|~3.0.0",
|
||||
"symfony/form": "~2.7|~3.0.0",
|
||||
"symfony/property-access": "~2.3|~3.0.0",
|
||||
"propel/propel1": "~1.6,>=1.6.5"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/stopwatch": "~2.2|~3.0.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": { "Symfony\\Bridge\\Propel1\\": "" }
|
||||
},
|
||||
"target-dir": "Symfony/Bridge/Propel1",
|
||||
"minimum-stability": "dev",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.7-dev"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
|
||||
backupGlobals="false"
|
||||
colors="true"
|
||||
bootstrap="vendor/autoload.php"
|
||||
>
|
||||
<php>
|
||||
<!-- Disable E_USER_DEPRECATED until 3.0 -->
|
||||
<!-- php -r 'echo -1 & ~E_USER_DEPRECATED;' -->
|
||||
<ini name="error_reporting" value="-16385"/>
|
||||
</php>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="Symfony Propel1 Bridge Test Suite">
|
||||
<directory>./Tests/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory>./</directory>
|
||||
<exclude>
|
||||
<directory>./Resources</directory>
|
||||
<directory>./Tests</directory>
|
||||
</exclude>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
Reference in New Issue
Block a user