For the benefit of anyone else reading this, you can format the result
of a call to $this->Model->find('all) with the following function:

/** function _get_xml_array
   *
   *  This function takes in an input from $this->Model->find() and
reutrns an array
   *  that is properly strucutred so that CakePHP's Xml Utility can
format it.
   *
   *  @author Will Simpson
   *  @access private
   *  @param $input -- An array from $this->Model->find()
   *  @return $output -- An array in the following format:
   *                  array(
   *                       'tags' => array(
   *                           'tag' => array(
   *                                array(
   *                                   'id' => '1',
   *                                   'name' => 'defect'
   *                               ),
   *                               array(
   *                                   'id' => '2',
   *                                   'name' => 'enhancement'
   *                               )
   *                           )
   *                       )
   *                   );
   *
   */
  private function _get_xml_array($input,$plural=NULL,$singular=NULL)
{
    $output = array();

    if(count($input) == 0)
      return $output;

    if($plural == NULL)
      $plural = $this->name;

    if($singular == NULL)
      $singular = key($input[0]);


    foreach($input as $i){
      $output[] = $i[$singular];
    }
    $output = array($plural=>array($singular=>$output));
    return $output;
  }

Basically, the Xml Utility is expecting an array with one element that
contains another array of one element that contains an array of many
elements.  Using my Employee model as an example, the correct
structure would be:

Array
(
    [Employees] => Array
        (
            [Employee] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [emp_name] => Will Simpson
                            [emp_job] => Web Developer
                        )

                    [1] => Array
                        (
                            [id] => 2
                            [emp_name] => Joey Vickers
                            [emp_job] => Random Guy
                        )

                )

        )

)

If you use this structure, you don't need to be any "plural" tags in
your xml view like to book describes.  The view would simply be:

<?php

  $xml = Xml::build($employees_xml);
  echo $xml->saveXML();
?>


With no additional tags around it.  Also make sure that you have the
latest version of CakePHP (2.0.3).  I think there is a hiccup in the
RequestHandler in earlier versions that is causing the top-level xml
tag to be repeated.

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
cake-php+unsubscr...@googlegroups.com For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to