[Solucionado] Botón Que Ejecuta Una Acción De Controlador

Tengo una aplicación que genera documentos donde se rellenan campos a partir de los valores almacenados en la BD.

Un controlador Modelo es el que se encarga de generar los documentos a partir de un fichero .rtf.

Mi problema surge cuando quiero hacer un botón en la página index de ese controlador para generar los documentos. Según como lo escriba, se ejecuta el action cuando se carga la página, no al pulsar el botón (que es cuando debería). O bien, si no se ejecuta al cargarse la página, me da un error al pulsar el botón.

La cabecera de la función es esta:

                   public function actionGeneraDoc($solicitud, $documento, $rutaPlantilla, $fsalida)

Con este código se ejecuta el action al cargarse la página (es lo mismo en diferentes pruebas):





                                <?php echo CHtml::submitButton('Generar Documento "Resolucion Inadmision Fuera Plazo"', array(

                                            $this->actionGeneraDoc($id, 'ResolucionInadmisionFueraPlazo', '/opt/lampp/htdocs/sacatic/documentos/', $fsalida),

                                )); ?>




                                <?php $this->widget('zii.widgets.jui.CJuiButton', array(

                                    'buttonType'=>'link',

                                    'name'=>'btnClick',

                                    'caption'=>'Generar Documento "Notificacion Resolucion Inadmision"',

                                    'url'=>array($this->actionGeneraDoc($id, "NotifResolInadmis", "/opt/lampp/htdocs/sacatic/documentos/", $fsalida)),

                                )); ?>

                            

                            

                                <?php echo CHtml::button('Generar Documento "Notificacion Resolucion Inadmision"', array(

                                            'onclick'=>$this->actionGeneraDoc($id, "NotifResolInadmis", "/opt/lampp/htdocs/sacatic/documentos/", $fsalida))); ?>




Si el parámetro del action lo entrecomillo, no se ejecuta al cargar la página, pero da problemas al pulsar el botón:





                                <?php echo CHtml::submitButton('Generar Documento "Resolucion Inadmision Fuera Plazo"', array(

                                            '$this->actionGeneraDoc($id, "ResolucionInadmisionFueraPlazo", "/opt/lampp/htdocs/sacatic/documentos/", $fsalida'),

                                )); ?>




                                <?php $this->widget('zii.widgets.jui.CJuiButton', array(

                                    'buttonType'=>'link',

                                    'name'=>'btnClick',

                                    'caption'=>'Generar Documento "Notificacion Resolucion Inadmision"',

                                    'url'=>array('$this->actionGeneraDoc($id, "NotifResolInadmis", "/opt/lampp/htdocs/sacatic/documentos/", $fsalida)'),

                                )); ?>

                            

                            

                                <?php echo CHtml::button('Generar Documento "Notificacion Resolucion Inadmision"', array(

                                            'onclick'=>'$this->actionGeneraDoc($id, "NotifResolInadmis", "/opt/lampp/htdocs/sacatic/documentos/", $fsalida)')); ?>




Error:

Error 404

No es posible resolver la solicitud "$this->actionGeneraDoc($id, "NotifResolInadmis", "/opt/lampp/htdocs/sacatic/documentos/", $fsalida)"

Estas entendiendo mal la forma en que se llaman a los action de los controladores.

$this->actionGeneraDoc(… ejecuta el action no genera una url, asi que no puedes pasarlo como parametro al botón porque el botón te pide una url.

Para crear la url usas Yii::app()->createUrl(‘modelo/generaDoc’,array(‘solicitud’=>$id, ‘documento’=>‘ResolucionInadmisionFueraPlazo’,‘rutaPlantilla’=>’/opt/lampp/htdocs/sacatic/documentos/’,‘fsalida’=>$fsalida))

Entonces tu código quedaria




<?php 

    echo CHtml::linkButton('Generar Documento "Resolucion Inadmision Fuera Plazo"', array(

            'href'=>Yii::app()->createUrl('modelo/generarDoc',array(

                'solicitud'=>$id, 

                'documento'=>'ResolucionInadmisionFueraPlazo', 

                'rutaPlantilla'=>'/opt/lampp/htdocs/sacatic/documentos/', 

                'fsalida'=>$fsalida

            )

         )); 

?>

En los botones no puedes usar onClick porque el onClick es para ejecutar codigo javascript no para ejecutar actions (aunque podrias usar Ajax para llamar al action), los botones submit son para enviar formularios, si no usas formularios puedes usar linkButton como en el ejemplo.

Muchas gracias. Lo has explicado muy bien. Efectivamente, estaba mezclando los conceptos. Yo he llegado también a la misma conclusión. La solución que he utilizado ha sido con un link, añadiéndole un estilo CSS para que aparezca como un botón:


<?php echo CHtml::link('Generar Documento "Comunicar Numero Expediente"', 

              array('generaDoc', 'solicitud'=>$id,'documento'=>'ComunicaNumExpte',

                    'rutaPlantilla'=>'/opt/lampp/htdocs/sacatic/documentos/')

              ,array("style"=>"-webkit-border-radius: 4px;

                               -moz-border-radius: 4px;

                               border-radius: 4px;

                               border: solid 1px #20538D;

                               text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4);

                               -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 1px rgba(0, 0, 0, 0.2);

                               -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 1px rgba(0, 0, 0, 0.2);

                               box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 1px rgba(0, 0, 0, 0.2);

                               background: #4479BA;

                               color: #FFF;

                               padding: 4px 8px;

                               text-decoration: none;")); ?>