From 60ddc8424e6994066fb267785038258dd3065d5b Mon Sep 17 00:00:00 2001 From: Mark Story Date: Tue, 24 Mar 2015 21:02:24 -0400 Subject: [PATCH] Exclude foriegn keys from validation rules. When generating validation rules, we can use the associations to exclude foreign key columns from the generated rules. These columns will already have RulesChecker rules created. Refs #61 --- src/Shell/Task/ModelTask.php | 15 +++++++++++--- tests/TestCase/Shell/Task/ModelTaskTest.php | 23 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/Shell/Task/ModelTask.php b/src/Shell/Task/ModelTask.php index 2073d68be..cae9d6480 100644 --- a/src/Shell/Task/ModelTask.php +++ b/src/Shell/Task/ModelTask.php @@ -112,7 +112,7 @@ public function bake($name) $primaryKey = $this->getPrimaryKey($model); $displayField = $this->getDisplayField($model); $fields = $this->getFields($model); - $validation = $this->getValidation($model); + $validation = $this->getValidation($model, $associations); $rulesChecker = $this->getRules($model, $associations); $behaviors = $this->getBehaviors($model); @@ -444,9 +444,10 @@ public function getHiddenFields($model) * Generate default validation rules. * * @param \Cake\ORM\Table $model The model to introspect. + * @param array $associations The associations list. * @return array The validation rules. */ - public function getValidation($model) + public function getValidation($model, $associations = []) { if (!empty($this->params['no-validation'])) { return []; @@ -459,8 +460,16 @@ public function getValidation($model) $validate = []; $primaryKey = (array)$schema->primaryKey(); - + $foreignKeys = []; + if (isset($associations['belongsTo'])) { + foreach ($associations['belongsTo'] as $assoc) { + $foreignKeys[] = $assoc['foreignKey']; + } + } foreach ($fields as $fieldName) { + if (in_array($fieldName, $foreignKeys)) { + continue; + } $field = $schema->column($fieldName); $validation = $this->fieldValidation($fieldName, $field, $primaryKey); if (!empty($validation)) { diff --git a/tests/TestCase/Shell/Task/ModelTaskTest.php b/tests/TestCase/Shell/Task/ModelTaskTest.php index ed1c076f2..0f54ea666 100644 --- a/tests/TestCase/Shell/Task/ModelTaskTest.php +++ b/tests/TestCase/Shell/Task/ModelTaskTest.php @@ -660,6 +660,29 @@ public function testGetValidation() $this->assertEquals($expected, $result); } + /** + * test getting validation rules and exempting foreign keys + * + * @return void + */ + public function testGetValidationExcludeForeignKeys() + { + $model = TableRegistry::get('BakeArticles'); + $associations = [ + 'belongsTo' => [ + 'BakeUsers' => ['foreignKey' => 'bake_user_id'], + ] + ]; + $result = $this->Task->getValidation($model, $associations); + $expected = [ + 'title' => ['valid' => ['rule' => false, 'allowEmpty' => false]], + 'body' => ['valid' => ['rule' => false, 'allowEmpty' => true]], + 'published' => ['valid' => ['rule' => 'boolean', 'allowEmpty' => true]], + 'id' => ['valid' => ['rule' => 'numeric', 'allowEmpty' => 'create']] + ]; + $this->assertEquals($expected, $result); + } + /** * test getting validation rules with the no-rules param. *