From 19c91f1f70c34e0ab366c90f80a2238eb2c0f837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Lorenzo=20Rodr=C3=ADguez?= Date: Tue, 10 Nov 2009 01:08:07 -0430 Subject: [PATCH] Initial implementation of model virtual fields --- cake/libs/model/datasources/dbo_source.php | 43 ++++++++++++++++++- .../cases/libs/model/model_read.test.php | 16 +++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/cake/libs/model/datasources/dbo_source.php b/cake/libs/model/datasources/dbo_source.php index dcaf899809b..1c49445b650 100644 --- a/cake/libs/model/datasources/dbo_source.php +++ b/cake/libs/model/datasources/dbo_source.php @@ -366,9 +366,11 @@ function fetchAll($sql, $cache = true, $modelName = null) { $first = $this->fetchRow(); if ($first != null) { + $this->fetchVirtualField($first); $out[] = $first; } while ($this->hasResult() && $item = $this->fetchResult()) { + $this->fetchVirtualField($item); $out[] = $item; } @@ -386,6 +388,29 @@ function fetchAll($sql, $cache = true, $modelName = null) { } } + function fetchVirtualField(&$result) { + if (isset($result[0]) && is_array($result[0])) { + foreach ($result[0] as $field => $value) { + if (strpos($field,'__') === false) { + continue; + } + list($alias,$virtual) = explode('__',$field); + + if (!ClassRegistry::isKeySet($alias)) { + retrun; + } + $model = ClassRegistry::getObject($alias); + if (isset($model->virtualFields[$virtual])) { + $result[$alias][$virtual] = $value; + unset($result[0][$field]); + } + } + if (empty($result[0])) { + unset($result[0]); + } + } + } + /** * Returns a single field of the first of query results for a given SQL query, or false if empty. * @@ -1733,6 +1758,14 @@ function __scrubQueryData($data) { return $data; } + function _constructVirtualFields(&$model,$fields) { + $virtual = array(); + foreach ($fields as $name => $expression) { + $virtual[] = $expression . " {$this->alias} {$model->alias}__{$name}"; + } + return $virtual; + } + /** * Generates the fields list of an SQL query. * @@ -1746,7 +1779,8 @@ function fields(&$model, $alias = null, $fields = array(), $quote = true) { if (empty($alias)) { $alias = $model->alias; } - if (empty($fields)) { + $allFields = empty($fields); + if ($allFields) { $fields = array_keys($model->schema()); } elseif (!is_array($fields)) { $fields = String::tokenize($fields); @@ -1813,6 +1847,13 @@ function fields(&$model, $alias = null, $fields = array(), $quote = true) { } } } + + if (!empty($model->virtualFields)) { + if ($allFields) { + $fields = array_merge($fields,$this->_constructVirtualFields($model,$model->virtualFields)); + } else { + } + } return array_unique($fields); } diff --git a/cake/tests/cases/libs/model/model_read.test.php b/cake/tests/cases/libs/model/model_read.test.php index 86b855900ac..2fd4978a716 100644 --- a/cake/tests/cases/libs/model/model_read.test.php +++ b/cake/tests/cases/libs/model/model_read.test.php @@ -26,6 +26,22 @@ */ class ModelReadTest extends BaseModelTest { + function testVirtualFields() { + $this->loadFixtures('Post'); + $Post = ClassRegistry::init('Post'); + $Post->virtualFields = array('two' => "1 + 1"); + $expected = array( + 'author_id' => 1, + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + ); + debug($Post->find('first')); + exit; + } + /** * testFetchingNonUniqueFKJoinTableRecords() *