Navigation Menu

Skip to content

Commit

Permalink
Refactored EntityContext so that any inspection can be done to any deep
Browse files Browse the repository at this point in the history
property and not only those having a value present in the context
  • Loading branch information
lorenzo committed Feb 28, 2014
1 parent dc6a1b9 commit d20cefc
Showing 1 changed file with 38 additions and 46 deletions.
84 changes: 38 additions & 46 deletions src/View/Form/EntityContext.php
Expand Up @@ -158,14 +158,7 @@ public function primaryKey() {
*/
public function isPrimaryKey($field) {
$parts = explode('.', $field);

if ($parts['0'] === $this->_rootName) {
$parts = array_slice($parts, 1);
}

list(, $prop) = $this->_getEntity($parts);
$table = $this->_getTable($prop);

$table = $this->_getTable($parts);
$primaryKey = (array)$table->primaryKey();
return in_array(array_pop($parts), $primaryKey);
}
Expand Down Expand Up @@ -205,7 +198,7 @@ public function val($field) {
return null;
}
$parts = explode('.', $field);
list($entity) = $this->_getEntity($parts);
$entity = $this->_getEntity($parts);
if ($entity instanceof Entity) {
return $entity->get(array_pop($parts));
}
Expand All @@ -219,22 +212,20 @@ public function val($field) {
* entity. If the path does not contain a leaf entity false
* will be returned.
*
* @param array $path The path to traverse to find the leaf entity.
* @return array
* @param array $path Each one of the parts in a path for a field name
* @return \Cake\DataSource\EntityInterface|boolean
* @throws \RuntimeException When properties cannot be read.
*/
protected function _getEntity($path) {
$oneElement = count($path) === 1;
if ($oneElement && $this->_isCollection) {
return [false, false];
return false;
}
$entity = $this->_context['entity'];
if ($oneElement) {
return [$entity, $this->_rootName];
return $entity;
}

$lastProp = $this->_rootName;

if ($path[0] === $this->_rootName) {
$path = array_slice($path, 1);
}
Expand All @@ -246,10 +237,7 @@ protected function _getEntity($path) {
!($next instanceof Traversable) &&
!($next instanceof Entity)
) {
return [$entity, $lastProp];
}
if (!is_numeric($prop)) {
$lastProp = $prop;
return $entity;
}
$entity = $next;
}
Expand Down Expand Up @@ -294,14 +282,14 @@ public function isRequired($field) {
return false;
}
$parts = explode('.', $field);
list($entity, $prop) = $this->_getEntity($parts);
$entity = $this->_getEntity($parts);

$isNew = true;
if ($entity instanceof Entity) {
$isNew = $entity->isNew();
}

$validator = $this->_getValidator($prop);
$validator = $this->_getValidator($parts);
$field = array_pop($parts);
if (!$validator->hasField($field)) {
return false;
Expand All @@ -314,11 +302,11 @@ public function isRequired($field) {
* Get the validator associated to an entity based on naming
* conventions.
*
* @param string $entity The entity name to get a validator for.
* @param array $parts Each one of the parts in a path for a field name
* @return Validator
*/
protected function _getValidator($entity) {
$table = $this->_getTable($entity);
protected function _getValidator($parts) {
$table = $this->_getTable($parts);
$alias = $table->alias();

$method = 'default';
Expand All @@ -331,27 +319,34 @@ protected function _getValidator($entity) {
}

/**
* Get the table instance
* Get the table instance from a property path
*
* @param string $prop The property name to get a table for.
* @return \Cake\ORM\Table The table instance.
* @param array $parts Each one of the parts in a path for a field name
* @return array containing the table instance in the first position and the
* property name in the second position
*/
protected function _getTable($prop) {
if (isset($this->_tables[$prop])) {
return $this->_tables[$prop];
protected function _getTable($parts) {
if ($parts[0] === $this->_rootName) {
$parts = array_slice($parts, 1);
}
$root = $this->_tables[$this->_rootName];
$assoc = $root->associations()->getByProperty($prop);

// No assoc, use the default table to prevent
// downstream failures.
if (!$assoc) {
return $root;
$table = $this->_tables[$this->_rootName];

$normalized = array_filter()
foreach ($parts as $part) {
if (is_numeric($part)) {
continue;
}

$assoc = $table->associations()->getByProperty($part);
if (!$assoc) {
break;
}

$table = $assoc->target();
}

$target = $assoc->target();
$this->_tables[$prop] = $target;
return $target;
return $table;
}

/**
Expand All @@ -363,10 +358,8 @@ protected function _getTable($prop) {
*/
public function type($field) {
$parts = explode('.', $field);
list($entity, $prop) = $this->_getEntity($parts);
$table = $this->_getTable($prop);
$column = array_pop($parts);
return $table->schema()->columnType($column);
$table = $this->_getTable($parts);
return $table->schema()->columnType(array_pop($parts));
}

/**
Expand All @@ -377,8 +370,7 @@ public function type($field) {
*/
public function attributes($field) {
$parts = explode('.', $field);
list($entity, $prop) = $this->_getEntity($parts);
$table = $this->_getTable($prop);
$table = $this->_getTable($parts);
$column = (array)$table->schema()->column(array_pop($parts));
$whitelist = ['length' => null, 'precision' => null];
return array_intersect_key($column, $whitelist);
Expand All @@ -402,7 +394,7 @@ public function hasError($field) {
*/
public function error($field) {
$parts = explode('.', $field);
list($entity, $prop) = $this->_getEntity($parts);
$entity= $this->_getEntity($parts);

if ($entity instanceof Entity) {
return $entity->errors(array_pop($parts));
Expand Down

0 comments on commit d20cefc

Please sign in to comment.