Merge branch '2.0' into 2.0-console

This commit is contained in:
mark_story 2010-10-17 23:32:38 -04:00
commit 84a8dbd85a
3 changed files with 58 additions and 25 deletions

View file

@ -831,8 +831,13 @@ class Model extends Object {
return;
}
if (is_object($one)) {
if ($one instanceof SimpleXMLElement || $one instanceof DOMNode) {
App::import('Core', 'Xml');
$one = $this->_normalizeXmlData(Xml::toArray($one));
} else {
$one = Set::reverse($one);
}
}
if (is_array($one)) {
$data = $one;
@ -868,6 +873,26 @@ class Model extends Object {
return $data;
}
/**
* Normalize Xml::toArray() to use in Model::save()
*
* @param array $xml XML as array
* @return array
*/
protected function _normalizeXmlData(array $xml) {
$return = array();
foreach ($xml as $key => $value) {
if (is_array($value)) {
$return[Inflector::camelize($key)] = $this->_normalizeXmlData($value);
} elseif ($key[0] === '@') {
$return[substr($key, 1)] = $value;
} else {
$return[$key] = $value;
}
}
return $return;
}
/**
* Deconstructs a complex data type (array or object) into a single field value.
*

View file

@ -1019,12 +1019,20 @@ class ModelWriteTest extends BaseModelTest {
App::import('Core', 'Xml');
$Article = new Article();
$Article->save(new Xml('<article title="test xml" user_id="5" />'));
$result = $Article->save(new Xml('<article title="test xml" user_id="5" />'));
$result = $Article->save(Xml::build('<article title="test xml" user_id="5" />'));
$this->assertFalse(empty($result));
$results = $Article->find(array('Article.title' => 'test xml'));
$this->assertFalse(empty($results));
$result = $Article->save(Xml::build('<article><title>testing</title><user_id>6</user_id></article>'));
$this->assertFalse(empty($result));
$results = $Article->find(array('Article.title' => 'testing'));
$this->assertFalse(empty($results));
$result = $Article->save(Xml::build('<article><title>testing with DOMDocument</title><user_id>7</user_id></article>', array('return' => 'domdocument')));
$this->assertFalse(empty($result));
$results = $Article->find(array('Article.title' => 'testing with DOMDocument'));
$this->assertFalse(empty($results));
}
/**

View file

@ -2731,7 +2731,7 @@ class SetTest extends CakeTestCase {
$xml = Xml::build($string);
$result = Set::reverse($xml);
$expected = array('rss' => array(
'version' => '2.0',
'@version' => '2.0',
'channel' => array(
'title' => 'Cake PHP Google Group',
'link' => 'http://groups.google.com/group/cake-php',
@ -2742,7 +2742,7 @@ class SetTest extends CakeTestCase {
'title' => 'constructng result array when using findall',
'link' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f',
'description' => "i'm using cakephp to construct a logical data model array that will be <br> passed to a flex app. I have the following model association: <br> ServiceDay-&gt;(hasMany)ServiceTi me-&gt;(hasMany)ServiceTimePrice. So what <br> the current output from my findall is something like this example: <br> <p>Array( <br> [0] =&gt; Array(",
'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'),
'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'),
'author' => 'bmil...@gmail.com(bpscrugs)',
'pubDate' => 'Fri, 28 Dec 2007 00:44:14 UT',
),
@ -2750,7 +2750,7 @@ class SetTest extends CakeTestCase {
'title' => 'Re: share views between actions?',
'link' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8',
'description' => 'Then perhaps you might do us all a favour and refrain from replying to <br> things you do not understand. That goes especially for asinine comments. <br> Indeed. <br> To sum up: <br> No comment. <br> In my day, a simple &quot;RTFM&quot; would suffice. I\'ll keep in mind to ignore any <br> further responses from you. <br> You (and I) were referring to the *online documentation*, not other',
'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'),
'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'),
'author' => 'subtropolis.z...@gmail.com(subtropolis zijn)',
'pubDate' => 'Fri, 28 Dec 2007 00:45:01 UT'
)
@ -2762,7 +2762,7 @@ class SetTest extends CakeTestCase {
$xml = Xml::build($string);
$result = Set::reverse($xml);
$expected = array('data' => array('post' => array('title' => 'Title of this post', 'description' => 'cool')));
$expected = array('data' => array('post' => array('@title' => 'Title of this post', '@description' => 'cool')));
$this->assertEqual($result, $expected);
$xml = Xml::build('<example><item><title>An example of a correctly reversed SimpleXMLElement</title><desc/></item></example>');
@ -2782,7 +2782,7 @@ class SetTest extends CakeTestCase {
$expected =
array('example' => array(
'item' => array(
'attr' => '123',
'@attr' => '123',
'titles' => array(
'title' => array('title1', 'title2')
)
@ -2795,11 +2795,11 @@ class SetTest extends CakeTestCase {
$result = Set::reverse($xml);
$expected =
array('example' => array(
'attr' => 'ex_attr',
'@attr' => 'ex_attr',
'item' => array(
'attr' => '123',
'@attr' => '123',
'titles' => 'list',
'value' => 'textforitems'
'@' => 'textforitems'
)
)
);
@ -2841,7 +2841,7 @@ class SetTest extends CakeTestCase {
$result = Set::reverse($xml);
$expected = array('rss' => array(
'version' => '2.0',
'@version' => '2.0',
'channel' => array(
'title' => 'Cake PHP Google Group',
'link' => 'http://groups.google.com/group/cake-php',
@ -2852,9 +2852,9 @@ class SetTest extends CakeTestCase {
'title' => 'constructng result array when using findall',
'link' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f',
'description' => "i'm using cakephp to construct a logical data model array that will be <br> passed to a flex app. I have the following model association: <br> ServiceDay-&gt;(hasMany)ServiceTi me-&gt;(hasMany)ServiceTimePrice. So what <br> the current output from my findall is something like this example: <br> <p>Array( <br> [0] =&gt; Array(",
'creator' => 'cakephp',
'dc:creator' => 'cakephp',
'category' => array('cakephp', 'model'),
'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'),
'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'),
'author' => 'bmil...@gmail.com(bpscrugs)',
'pubDate' => 'Fri, 28 Dec 2007 00:44:14 UT',
),
@ -2862,9 +2862,9 @@ class SetTest extends CakeTestCase {
'title' => 'Re: share views between actions?',
'link' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8',
'description' => 'Then perhaps you might do us all a favour and refrain from replying to <br> things you do not understand. That goes especially for asinine comments. <br> Indeed. <br> To sum up: <br> No comment. <br> In my day, a simple &quot;RTFM&quot; would suffice. I\'ll keep in mind to ignore any <br> further responses from you. <br> You (and I) were referring to the *online documentation*, not other',
'creator' => 'cakephp',
'dc:creator' => 'cakephp',
'category' => array('cakephp', 'model'),
'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'),
'guid' => array('@isPermaLink' => 'true', '@' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'),
'author' => 'subtropolis.z...@gmail.com(subtropolis zijn)',
'pubDate' => 'Fri, 28 Dec 2007 00:45:01 UT'
)
@ -2901,8 +2901,8 @@ class SetTest extends CakeTestCase {
$expected = array('XRDS' => array(
'XRD' => array(
array(
'id' => 'oauth',
'version' => '2.0',
'@xml:id' => 'oauth',
'@version' => '2.0',
'Type' => 'xri://$xrds*simple',
'Expires' => '2008-04-13T07:34:58Z',
'Service' => array(
@ -2913,21 +2913,21 @@ class SetTest extends CakeTestCase {
),
'URI' => array(
array(
'value' => 'https://ma.gnolia.com/oauth/authorize',
'priority' => '10',
'@' => 'https://ma.gnolia.com/oauth/authorize',
'@priority' => '10',
),
array(
'value' => 'http://ma.gnolia.com/oauth/authorize',
'priority' => '20'
'@' => 'http://ma.gnolia.com/oauth/authorize',
'@priority' => '20'
)
)
)
),
array(
'version' => '2.0',
'@version' => '2.0',
'Type' => 'xri://$xrds*simple',
'Service' => array(
'priority' => '10',
'@priority' => '10',
'Type' => 'http://oauth.net/discovery/1.0',
'URI' => '#oauth'
)