Nuevo en Yii, problema con PDF

Hola soy nuevo con Yii Framework y tengo un problema, con la aplicación ya creada, intento crear una serie de pdf’s (uso mPDF) de un listado, (en mi caso de empresas), y de sus datos, cuando le doy al botón generar PDF me indica que no lo encuentra


Not Found (#404)

Unable to resolve the request: empresa/pdf

The above error occurred while the Web server was processing your request.


Please contact us if you think this is a server error. Thank you.

Me gustaría saber donde tengo que colocar el archivo pdf.php (en mi caso, ahora esta en views) y que tendría que modificar, porque estoy perdido con este ide, y llevo varios días intentandolo pero no soy capaz.

Un saludo

Deberias mostrar el codigo del action en tu controller, para saber como es que estas generando los pdf’s, quizas asi pueda ayudarte, yo tembien estoy trabajando con mPDF y me ha salido todo muy bien, si me explicas mas el probelma y me muestras el codigo, quizas pueda ayudar.

hola en yii2 yo quiero exportar a pdf lo que esté almacenado en el grid en ese momento, exportar en pdf no es problema, pero como puedo capturar esa informacion para gestionarla posteriormente?

aqui pongo el codigo de mi controler


<?php


namespace app\controllers;


use Yii;

use app\models\Empresa;

use app\models\EmpresaSearch;

use yii\web\Controller;

use yii\web\NotFoundHttpException;

use yii\filters\VerbFilter;


/**

 * EmpresaController implements the CRUD actions for Empresa model.

 */

class EmpresaController extends Controller

{

    public function behaviors()

    {

        return [

            'verbs' => [

                'class' => VerbFilter::className(),

                'actions' => [

                    'delete' => ['post'],

                ],

            ],

        ];

    }


    /**

     * Lists all Empresa models.

     * @return mixed

     */

    public function actionIndex()

    {

        $searchModel = new EmpresaSearch();

        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);


        return $this->render('index', [

            'searchModel' => $searchModel,

            'dataProvider' => $dataProvider,

        ]);

    }


    /**

     * Displays a single Empresa model.

     * @param string $id

     * @return mixed

     */

    public function actionView($id)

    {

        return $this->render('view', [

            'model' => $this->findModel($id),

        ]);

    }


    /**

     * Creates a new Empresa model.

     * If creation is successful, the browser will be redirected to the 'view' page.

     * @return mixed

     */

    public function actionCreate()

    {

        $model = new Empresa();


        if ($model->load(Yii::$app->request->post()) && $model->save()) {

            return $this->redirect(['view', 'id' => $model->Cif]);

        } else {

            return $this->render('create', [

                'model' => $model,

            ]);

        }

    }


    /**

     * Updates an existing Empresa model.

     * If update is successful, the browser will be redirected to the 'view' page.

     * @param string $id

     * @return mixed

     */


    public function actionUpdate($id)

    {

        $model = $this->findModel($id);


        if ($model->load(Yii::$app->request->post()) && $model->save()) {

            return $this->redirect(['view', 'id' => $model->Cif]);

        } else {

            return $this->render('update', [

                'model' => $model,

            ]);

        }

    }


    /**

     * Deletes an existing Empresa model.

     * If deletion is successful, the browser will be redirected to the 'index' page.

     * @param string $id

     * @return mixed

     */

    public function actionDelete($id)

    {

        $this->findModel($id)->delete();


        return $this->redirect(['index']);

    }


    /**

     * Finds the Empresa model based on its primary key value.

     * If the model is not found, a 404 HTTP exception will be thrown.

     * @param string $id

     * @return Empresa the loaded model

     * @throws NotFoundHttpException if the model cannot be found

     */

    protected function findModel($id)

    {

        if (($model = Empresa::findOne($id)) !== null) {

            return $model;

        } else {

            throw new NotFoundHttpException('The requested page does not exist.');

        }

    }

	public function actionCrearPdf($id){

	$mPDF1 = Yii::app()->ePdf->mpdf();

	$mPDF1->WriteHTML(

		$this->render('pdf',array(

			'model'=>$this->loadModel($id), true

		))

	);

	$mPDF1->Output();

}

	

	

	

}



mira, exportarlo es facil, pon esto en la controladora




 public function actionPdf()

    {

        $this->renderPartial('nombre-de-tu-vista');

    }



en la carpeta vista correspondiente a tu controladora incluyes la que quieres exportar a pdf, pones algo asi




<?php

   $html='<table width="200" border="1">

  <tr>

    <td>&nbsp;</td>

    <td>&nbsp;</td>

    <td>&nbsp;</td>

  </tr>

  <tr>

    <td>&nbsp;</td>

    <td>&nbsp;</td>

    <td>&nbsp;</td>

  </tr>

  <tr>

    <td>&nbsp;</td>

    <td>&nbsp;</td>

    <td>&nbsp;</td>

  </tr>

   </table>';

}  

$mpdf = new mPDF;

$mpdf->WriteHTML($html);

$mpdf->Output();

exit;



luego crea un boton para llamar a la funcion y listo, espero que te sirva

yo lo que necesito ahora es ver como poder obtener los datos que se encuentran en el grid y no se como mostrarlos en mi vista personalizada que es la que voy a exportar a pdf

Cuando hago la llamada a la pagina ahora me sale el siguiente error


Call to undefined method Yii::createComponent()

la linea donde hago la llamada al componente es


$pdf = Yii::createComponent('application.extensions.MPDF.mpdf');

y la carpeta con mpdf la tengo en protected/extensions dentro de la carpeta de la aplicación

que yii usas el 1 o el 2?

yii 1

en el controller




public function actionDinamico()

        {

            $this->render('tu vista');

        }



y lo agregas a los permisos

en la vista que creas para mostrar(esta es la mia, tu la adaptas luego)




<?php $pdf = Yii::createComponent('application.vendors.mpdf.mpdf');

$dataProvider = $_SESSION['Anexo1']->getData();

$contador=count($dataProvider);


//$i=0;




$html.='

<table align="center"><tr>

<td align="center"> <b>prueba</b></td></tr>

<tr></tr>

<tr>

<td align="center"> <b>prueba</br></b></td></tr>


</tr></table>

Total Resultados: '.$contador.' 

<p>=======================================================================================</p>    

     <table class="detail-view2" repeat_header="1" cellpadding="1" cellspacing="1"

width="100%" border="0">

     <tr>

               <td width="66" rowspan="18" class="style3">Organismo</td>

               <td width="119" height="15" rowspan="2"><span class="style3">No. HC</span></td>

               <td width="167" rowspan="30" class="style3">Nombre Entidad </td>

               <td width="125" rowspan="20" class="style3">Provincia</td>

               <td width="152" rowspan="20" class="style3">Municipio</td>

               <td width="85" rowspan="10"><span class="style3">Fecha Reg.</span> </td>

               <td width="90" rowspan="10" class="style3">Fecha Ocu. </td>

               <td width="89" rowspan="10" class="style3">Fecha det. </td>

               <td height="49" colspan="15" class="style3">Cant. Implicados </td>

               <td width="107" rowspan="12" class="style3">Cant. Colateral </td>

               <td width="81" rowspan="12" class="style3">Afect. MLC </td>

               <td width="72" rowspan="12" class="style3">Afect. CUP </td>

               <td width="97" rowspan="15" class="style3">Fuente Det. </td>

               

     </tr>

     <tr>

               <td width="34" height="25"><div align="center" class="style3">T</div></td>

               <td width="37"><div align="center" class="style3">E</div></td>

               <td width="40"><div align="center" class="style3">O</div></td>

     </tr>

         <tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				<div align="center">===============================================================================================================================================================================================================</div></td>

               


         </tr>

';

    $afectacionmlc=0;

    $afectacionmn=0;

    //$recuperadomlc=0;

    //$recuperadomn=0;

    $imptotal=0;

    $imppertenece=0;

    $impnopertenece=0;

            

      $i=0;

      

      $sql='SELECT * FROM implicado INNER JOIN anexo1 ON (implicado.anexo1_fk = anexo1.id) WHERE anexo1_fk='.$dataProvider[$i]["id"];

$sql1='SELECT * FROM colateral INNER JOIN anexo1 ON (colateral.anexo1_fk = anexo1.id) WHERE anexo1_fk='.$dataProvider[$i]["id"];

$sql2='SELECT count(implicado.anexo1_fk) FROM anexo1 inner JOIN implicado ON (anexo1.id = implicado.anexo1_fk) WHERE anexo1_fk='.$dataProvider[$i]["id"].' AND imp_pert_entidad="No"';

$sql3='SELECT count(implicado.anexo1_fk) FROM anexo1 inner JOIN implicado ON (anexo1.id = implicado.anexo1_fk) WHERE anexo1_fk='.$dataProvider[$i]["id"].' AND imp_pert_entidad="Si"';







$lista1= Implicado::model()->with('anexo1Fk')->findAllBySql($sql);

$lista2=  Colateral::model()->with('anexo1Fk')->findAllBySql($sql1);


$sql4="SELECT * FROM anexo1 WHERE anexo1.id =".$dataProvider[$i]["id"];

$anexo= Anexo1::model()->findBySql($sql4);

$usuario=$anexo->registrado_por;


$sql5= "select * from tbl_user where username='".$usuario."'";

$usuario1= User::model()->findBySql($sql5);

$cargo=$usuario1->cargo;


$contador1= Implicado::model()->with('anexo1Fk')->count('anexo1_fk='.$dataProvider[$i]["id"]);

if ($contador1==null)

{

    $contador1= 0; 

}


$contador2= Colateral::model()->with('anexo1Fk')->count('anexo1_fk='.$dataProvider[$i]["id"]);

if ($contador2==null){

$contador2=0;  

}

 

$nopertenece= Implicado::model()->with('anexo1Fk')->countBySql($sql2);

if ($nopertenece==null){

$nopertenece=0;

}

 

$pertenece= Implicado::model()->with('anexo1Fk')->countBySql($sql3);

if ($pertenece==null){

    $pertenece=0;

}


      

      $val=count($dataProvider);

      while($i<$val){

    $html.='

        

         <tr class="odd">

               <td height="43">&nbsp;'.$dataProvider[$i]["entidadhcFk"]["orgaFk"]["orga_siglas"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["no_hc_a1"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["entidadhcFk"]["enthc_nombre"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["entidadhcFk"]["provinciaFk"]["prov_siglas"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["entidadhcFk"]["municipioFk"]["mun_desc"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["fecha_reg_a1"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["fecha_ocu_a1"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["fecha_det_a1"].'</td>

               <td>&nbsp;'.$contador1.'</td>

               <td>&nbsp;'.$pertenece.'</td>

               <td>&nbsp;'.$nopertenece.'</td>

               <td>&nbsp;'.$contador2.'</td>

               <td>&nbsp;'.$dataProvider[$i]["afect_mlc"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["afect_mn"].'</td>

               <td>&nbsp;'.$dataProvider[$i]["fuenteDetFk"]["fuente_det_siglas"].'</td>            

        </tr>

            

                                    

                            

            

            ';

$html.='</tr>

     <tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				<div align="center">-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>

               


         </tr>    

'; 




    

    

   $afectacionmlc+=$dataProvider[$i]["afect_mlc"];

   $afectacionmn+=$dataProvider[$i]["afect_mn"];

   $imptotal+=$contador1;

   $imppertenece+=$pertenece;

   $impnopertenece+=$nopertenece;

   





$i++;


}


$html.='<table>

<tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				

               


         </tr> 

$html.=</table>';

$html.='</table>

 <td align="center" class="principal" width="12%"><strong>&nbsp;Afectación MLC total:'.$afectacionmlc.'</strong></td>

    <tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				

               


         </tr>  

 <td align="center" class="principal" width="12%"><strong>&nbsp;Afectación MN total:'.$afectacionmn.'</strong></td>

     <tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				

               


         </tr> 

 <td align="center" class="principal" width="12%"><strong>&nbsp;Implicados total:'.$imptotal.'</strong></td>

     <tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				

               


         </tr> 

 <td align="center" class="principal" width="12%"><strong>&nbsp;Pertenecen Entidad total:'.$imppertenece.'</strong></td>

     <tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				

               


         </tr> 

 <td align="center" class="principal" width="12%"><strong>&nbsp;No pertenecen entidad:'.$impnopertenece.'</strong></td>';

$html.='</table>';


$html.='<table>

<tr class="principal">

         

                <td colspan="13"  class="principal" width="12%">

				

               


         </tr> 

$html.=</table>';





$mpdf=new mPDF('', 'LETTER-L', '12','TAHOMA','','','','','','','L');

$mpdf->WriteHTML($html);

$mpdf->Output('Reporte.pdf','D');

exit; ?>



creas un boton para llamar la funcion, la mia esta en el admin y la hice asi:




array('label'=>'Listado', 'url'=>array('tu vista')),



espero que te sirva

Saludos.

Una pregunta, ya puedes exportar lo del Cgridview al pdf?, por que si ya puedes hacer esto ya en el controlador podrias manipular esa información de acuerdo a tus necesidades.

en yii 1 no tuve ningun problema para hacer eso, ahora en yii2 me gustaria poder hacer lo mismo, ahora no se como tratar el dataprovider como arreglo para poderlo utilizar en la vista, porque lo que quiero es exportar a pdf el resultado de las busquedas en el gridview, en el post anterior fue como lo hice en yii1 ahora quisiera que me iluminaran para hacer lo mismo en yii2 y respondiendo a tu pregunta, no, en yii2 no lo he podido hacer aun, o mejor dicho, ya se como mostrarlos todos pero ese no es el objetivo, sino mostrar los que esten en el gridview ya que hasta ahora si le pongo ‘pagination’=>false me coge todos los datos pero si le pongo true solo me muestra los de esa pagina y no es lo ke necesito, yo quiero el resultado del filtro. gracias

Lo siento actualmente trabajo con Yii 1,15; y no he explorado Yii2, pero si quizas puedes hacer un var_dump o un print_r de tu dataprovider puedes ver como esta estructurado este y puedas encontrar la forma de recorrer e imprimir los datos. o en su defecto hacer la transicion a un array que ya puedas recorrer a tu gusto.

Hola a todos, perdonen por entrar en el debate.

Yo estoy usando Yii 1.1, cuando hago el

$mpdf->Output(‘Reporte.pdf’,‘D’);

me sale bien pero si cambio a

$mpdf->Output(‘Reporte.pdf’,‘I’);

Me dice que no puede cargar el PDF, es un error de acceso pero no se que más derecho dar, no donde.

Estoy en mi servidor local con WAMP.

Gracias y saludos.

Debes revisar la version de tu navegador, o probar en varios en ocaciones chrome da problemas, y estos son los parametros que puedes usar segun tus necesidades.




I: enviar el archivo en línea para el navegador. El plug-in se utiliza si está disponible. El nombre dado por nombre de archivo se utiliza cuando se selecciona la opción "Guardar como" opción en el enlace que genera el PDF

D:. Enviar al navegador y forzar una descarga de archivos con el nombre dado por nombre de archivo

F:. Ahorrar en un archivo local con el nombre dado por nombre de archivo (puede incluir una ruta)

S:. devolver el documento como una cadena. nombre se ignora.