[Solucionado] Web Service con CWebServiceAction

Estoy tratando de crear un Web Service siguiendo este tutorial y googleando un poco. El objetivo es que el servicio me devuelva registros de una tabla "Visitas".

Suponiendo que la tabla Visitas tiene los campos id, nombre y direccion, tengo el siguiente código, que funciona bien pero no me devuelve todos los campos de la tabla:




<?php

class WsController extends CController

{


    public function actions()

    {

        return array(

            'visitas'=>array(

                'class'=>'CWebServiceAction',

                'classMap'=>array(

                    'Visitas'=>'Visitas',

                    ),

                ),

            );

    }


    /**

    * @return Visitas[]

    * @soap

    */


    public function getVisits()

    {

        return Visitas::model()->findAll();

    }

}




class Visitas extends CActiveRecord

{

    /**

    * @var integer

    * @soap

    */

    public $id;


    /**

    * @var string

    * @soap

    */

    public $title;


    public function tableName(){

        return 'visitas';

    }


    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }

}



Si consumo el servicio, la respuesta que me da es:




Array

(

    [0] => stdClass Object

        (

            [id] => 1

            [title] => 

        )


    [1] => stdClass Object

        (

            [id] => 2

            [title] => 

        )

)



Claramente, id lo saca de la tabla. Como no tengo el campo title en la tabla, intento quitarlo, pero me da


SOAP-ERROR: Encoding: object has no 'title' property

Ahora, si intento agregarle los campos que faltan, los omite, y me sigue arrojando el mismo resultado:


    /**

    * @var string

    * @soap

    */

    public $nombre;

Estuve buscando y casi no hay ejemplos de esto. ¿Alguien ha hecho algo similar?

Cualquier pista se agradece.

Saludos.

Solucionado! Estaba formateando mal la salida.

Después de cabecearme un día competo, dejo el código acá por si a alguien le sirve.




<?php


ini_set ('soap.wsdl_cache_enabled',0); // Previene caché


class WsController extends CController

{

    public function actions()

    {

        return array(

            'visitas'=>array(

                'class'=>'CWebServiceAction',

            ),

        );

    }


    /**

    * @param string $desde

    * @param string $hasta

    * @return VisitaWS[]

    * @soap

    */


    public function getVisitas($desde='',$hasta='')

    {

        $command = Yii::app()->db->createCommand()

            ->select('id, nombre, direccion')

            ->from('visitas');

   

        if(!empty($desde) AND !empty($hasta))

                $command->where('DATE(creado) BETWEEN :from AND :to', array(':from'=>date('Y-m-d', strtotime($desde)), ':to'=>date('Y-m-d', strtotime($hasta))));

            

        $command->order('id asc');


        $visitas = $command->queryAll();


        $rows = array();


        foreach($visitas as $visita){

            $row = new VisitaWS(

                $visita['id'],

                $visita['nombre'],

                $visita['direccion']

            );


            $rows[] = $row;

        }

        return $rows;

    }

}




class VisitaWS{

    /**

    * @var integer

    * @soap

    */

    public $id;

    /**

    * @var string

    * @soap

    */

    public $nombre;

    /**

    * @var string

    * @soap

    */

    public $direccion;


    public function __construct($id=null, $nombre=null, $direccion=null) 

    {

        $this->id               = $id;

        $this->nombre           = $nombre;

        $this->direccion        = $direccion;

    }

}

?>



Para consumirlo:


$cliente = new SoapClient('http://www.miweb.com/ws/visitas', array('cache_wsdl' => WSDL_CACHE_NONE));

$visitas = $cliente->getVisitas();


print_r($visitas);

Retorna:


Array

(

    [0] => stdClass Object

        (

            [id] => 29

            [nombre] => Juan Pérez

            [direccion] => Avenida algo numero tanto


        )


    [1] => stdClass Object

        (

            [id] => 30

            [nombre] => Pedro Arenas

            [direccion] => Calle Uno #82


        )

)

Saludos!