PHP - Extraño resultado en ciclo for.

   
Vista:

Extraño resultado en ciclo for.

Publicado por adan (25 intervenciones) el 07/07/2016 00:46:52
Hola jovenes.

Tengo una funcion llamada actionRegion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function actionRegion($id){
	$mun=\app\models\Municipio::findOne($id);
	$region=$mun->region_id;
	$muns_region=\app\models\Municipio::find()->select("id")->where(["region_id"=>$region])->asArray()->all();
	foreach($muns_region as $k =>$v){
		foreach($v as $t)
		$aux[] = $t;
	}
	$muns_region=array_map( create_function('$value', 'return (int)$value;'), $aux);
	for ($i=0; $i <count($muns_region) ; $i++) {
		$this->actionConsultar($muns_region[$i]);
		var_dump($muns_region[$i]);
	return;
}


que obtiene este array

1
array(18) { [0]=> int(9) [1]=> int(13) [2]=> int(14) [3]=> int(22) [4]=> int(34) [5]=> int(49) [6]=> int(60) [7]=> int(61) [8]=> int(62) [9]=> int(63) [10]=> int(68) [11]=> int(83) [12]=> int(84) [13]=> int(88) [14]=> int(91) [15]=> int(98) [16]=> int(103) [17]=> int(112) }

Y dentro hay un ciclo for que llama la funcion actionConsultar por cada valor del array.

actionConsultar genera y descarga archivos.

Pero extrañamente solo obtengo el archivo correspondiente al identificador correspondiente al primer valor del array (en este caso 9)... es decir como si el ciclo for no incrementara y por tanto no recorre el array

1
$i++

Alguo de uds sabe que podria estar pasando.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Extraño resultado en ciclo for.

Publicado por adan (25 intervenciones) el 07/07/2016 01:50:33
Ya probe los valores que se toman en el ciclo for. Aparentemente todo esta bien.

Pero sigo sin entender porque pareciera que la funcion
1
$this->actionConsultar($muns_region[$i]);
se ejecutara solo con el primer valor del ciclo for.

Solo de descarga un archivo en lugar de los 18 que deberian descragarse.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Extraño resultado en ciclo for.

Publicado por kip (562 intervenciones) el 07/07/2016 02:18:05
Hola, creo que el problema se encuentra en esta parte:

1
2
$muns_region=array_map( create_function('$value', 'return (int)$value;'), $aux);
		for ($i=0; $i <count($muns_region) ; $i++) {

Prueba haciendo un echo del count del array $muns_region a ver que numero te da, en el ciclo for veo todo bien excepto que antes del return deberia cerrarse, ademas porque colocar aquel return si no estas retornando nada.

Nos cuentas como te fue.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Extraño resultado en ciclo for.

Publicado por mauro (25 intervenciones) el 07/07/2016 20:26:26
En mi codigo si tengo Cerrado el ciclo for. Al copiarlo aqui debi omitir una llave.
1
2
3
for ($i=0; $i <count($muns_region) ; $i++) {
			$this->actionConsultar($muns_region[$i]);
		}

Quite el return que no tenia ningun uso.

El conteo de $muns_region da 18.

En el llamado de la funcion actionConsultar acciona un proceso que llama varias funciones... El flujo es este.

actionRegion->actionConsultar->actionGenerar->write->downloadFile.

actionRegion teoricamente deberia crear un array de id's y accionar el proceso apartir de actionConsultar para cada uno de los id's

actionConsultar obtiene datos de una BD.

actionGenerar crea el la presentacion con los datos obtenidos en actionConsulta.

write gurda el archivo temporal en el servidor bajo el nombre export.pptx.

downloadFile descraga el archivo temporal bajo otro nombre.

Esta es la funcion downloadFile en la cual el proceso ternina, para luego reiniciar en actionConsulta con el siguiente valor del array de actionRegion.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private function downloadFile($dir,$file,$alias)
	{
 
		$path=$dir.$file;
		$name=$alias.".pptx";
	  	$size = filesize($path);
	  	header("Content-Type: application/force-download");
	    header("Content-Disposition: attachment; filename=$name");
	    header("Content-Transfer-Encoding: BINARY");
	    header("Content-Length: " . $size);
	    // Descargar archivo
	   ob_end_clean();
	    flush();
	    readfile($path);
	}


Teóricamente si si me descarga el primer archivo es porque el 1er ciclo for se cumplió... Pero que hay de los otros 17.

Lo intente incluso con firefox y chrome. Todo igual.

Sera a que existe alguna limitante en cuanto a la creación consecutiva y descarga de los archivos.

Utilicé un impresor para ver los valores que toma
1
$muns_region[$i]
dentro del ciclo for.... y todo parece bien con el único detalle de que lo hice comentando la sentencia
1
$this->actionConsultar($muns_region[$i]);
. Porque si esta sentencia se ejecuta no cambia la vista el navegador. Es decir se ejecuta en un segundo plano invisible para el usuario. En cambio si comento la sentencia y no se ejecuta, en el navegador me muestra un pantalla en blanco con las impresiones de prnt_r y var_dump.

Entonces como puedo probar (imprimir) los valores del ciclo for y sin comentar
1
$this->actionConsultar($muns_region[$i]);
.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Extraño resultado en ciclo for.

Publicado por kip (562 intervenciones) el 07/07/2016 21:00:02
Entiendo, por lo pronto prueba haciendo una condicion file_exists y como caso contrario que te devuelva un mensaje a ver si es algun problema de ficheros.

1
2
3
4
if (file_exists($path)) { //codigo...
} else {
//casocontrario
}

Prueba y nos cuentas que sucede.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Extraño resultado en ciclo for.

Publicado por mauro (25 intervenciones) el 07/07/2016 21:31:26
El archivo temporal siempre existe en el servidor. Se llama export.pptx, cada que se llama la funcion solo se sobre escribe con nuevos datos. Pero nunca se elimina.

Osea que si uso file_exists siempre sera positiva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Extraño resultado en ciclo for.

Publicado por kip (562 intervenciones) el 07/07/2016 22:00:49
Bueno, entonces podrias colocar el codigo de las funciones que se concatenan, estas de aca:

1
actionRegion->actionConsultar->actionGenerar->write->downloadFile.

Aunque downloadFile ya la colocaste, seria mejor si colocases asi mismo el contenido de las otras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Extraño resultado en ciclo for.

Publicado por mauro (25 intervenciones) el 07/07/2016 23:15:39
La arquitectura de mi web app es MCV uso yii2 framework. las siguientes funciones estan contenidas en ExportarController.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function actionRegion($id){
		$mun=\app\models\Municipio::findOne($id);
		$region=$mun->region_id;
		$muns_region=\app\models\Municipio::find()->select("id")->where(["region_id"=>$region])->asArray()->all();
		foreach($muns_region as $k =>$v){
	        foreach($v as $t)
	            $aux[] = $t;
	    }
	    $muns_region=array_map( create_function('$value', 'return (int)$value;'), $aux);
		$impresor="<br></br>";
		$conteo=count($muns_region) ;
		for ($i=0; $i <count($muns_region) ; $i++) {
			$this->actionConsultar($muns_region[$i]);
		}
	}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public function actionConsultar($id=null)
    {
        $model = new Incidencia();
        $mname=null;
        $val=$id;
        $mname=  \app\models\Municipio::findOne($val);
        $mname=$mname->municipiog;
        $mes=date("n")-1;
         //arreglos auxiliares para recorrer los diferens de delitos
        $arr=array('in','v', 'h', 'n', 's', 'rc', 'rn', 'rt', 'rv',);
        $arrmes=array('ENE', 'FEB', 'MAR', 'ABR', 'MAY', 'JUN', 'JUL', 'AGO', 'SEP', 'OCT', 'NOV', 'DIC',);
        $mes_string=$arrmes[$mes-1];
 
        $sqlpd='select modalidad.modalidad, tipo.tipo, subtipo.subTipo, sum('.strtolower($mes_string).') as '.strtolower($mes_string).' from seisp.incidencia INNER JOIN seisp.modalidad ON incidencia.modalidad_id=modalidad.id INNER JOIN seisp.tipo ON incidencia.tipo_id=tipo.id INNER JOIN seisp.subtipo ON incidencia.subtipo_id=subtipo.id where municipio_id=:munchen and  anio_id=6 and '.strtolower($mes_string).'>0 group by subtipo ORDER BY '.strtolower($mes_string).' ASC';
 
        $sql='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and  anio_id>2  group by anio_id asc';
 
        $sqlvio='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and modalidad_id=2 and  anio_id>2   group by anio_id asc';
        $sqlhd='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and modalidad_id=3 and tipo_id=10 and  anio_id>2    group by anio_id asc';
 
        $sqlnm='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.narcomenudeo where municipio_id=:munchen and anio_id>2    group by anio_id asc';
 
        $sqlsec='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and modalidad_id=6  and  anio_id>2    group by anio_id asc';
 
        $sqlrch='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and subtipo_id=6 and  anio_id>2    group by anio_id asc';
 
        $sqlran='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and subtipo_id=8  and  anio_id>2    group by anio_id asc';
 
        $sqlrat='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and subtipo_id=9 and  anio_id>2    group by anio_id asc';
 
        $sqlrdv='select anio_id, SUM(ene) as ENE ,sum(feb) as FEB, sum(mar) as MAR,sum(abr) as ABR, sum(may) as MAY, sum(jun) as JUN, sum(jul) as JUL, sum(ago) as AGO, sum(sep) as SEP, sum(oct) as OCT, sum(nov) as NOV, sum(dic) as DIC from seisp.incidencia where municipio_id=:munchen and subtipo_id=19 and anio_id>2 group by anio_id asc';
 
        $in=Incidencia::findBySql($sql,[':munchen'=>$val])->asArray()->all();
        $v=Incidencia::findBySql($sqlvio,[':munchen'=>$val])->asArray()->all();
        $h=Incidencia::findBySql($sqlhd,[':munchen'=>$val])->asArray()->all();
        $n=\app\models\Narcomenudeo::findBySql($sqlnm,[':munchen'=>$val])->asArray()->all();
        $s=Incidencia::findBySql($sqlsec,[':munchen'=>$val])->asArray()->all();
        $rc=Incidencia::findBySql($sqlrch,[':munchen'=>$val])->asArray()->all();
        $rn=Incidencia::findBySql($sqlran,[':munchen'=>$val])->asArray()->all();
        $rt=Incidencia::findBySql($sqlrat,[':munchen'=>$val])->asArray()->all();
        $rv=Incidencia::findBySql($sqlrdv,[':munchen'=>$val])->asArray()->all();
 
		for ($x=0; $x < count($arr) ; $x++) {
            $daux=$arr[$x];
            for ($i=0; $i < count(${$daux}); $i++) {
                unset(${$daux}[$i]['anio_id']);
                if ($i==3) {
                    for ($y=$mes; $y <count($arrmes); $y++) {
                        $maux=$arrmes[$y];
                        unset(${$daux}[3][$maux]);
                    }
                }
                ${$daux.$i}= array_map( create_function('$value', 'return (int)$value;'), ${$daux}[$i]);
                ${'sum'.$daux.$i}=0;
                for ($y=0; $y < $mes ; $y++) {
                    $maux=$arrmes[$y];
                    ${'sum'.$daux.$i}+=${$daux.$i}[$maux];
                }
            }
            ${'dif'.$daux}=${'sum'.$daux.'3'}-${'sum'.$daux.'2'};
        }
 
        $array_periodo=array('ENE', 'ENE-FEB', 'ENE-MAR', 'ENE-ABR', 'ENE-MAY', 'ENE-JUN', 'ENE-JUL', 'ENE-AGO', 'ENE-SEP', 'ENE-OCT', 'ENE-NOV', 'ENE-DIC',);
        $periodo=$array_periodo[$mes-1];
 
        return $this -> actionGenerar($mname, $mes,
        	$periodo, $in0, $in1, $in2, $in3, $v0, $v1, $v2, $v3,$h0, $h1, $h2, $h3, $n0, $n1, $n2, $n3, $s0, $s1, $s2,  $s3, $rc0, $rc1, $rc2, $rc3, $rn0, $rn1, $rn2, $rn3, $rt0, $rt1, $rt2, $rt3, $rv0, $rv1, $rv2, $rv3, $sumin2, $sumin3, $sumv2, $sumv3,  $sumh2, $sumh3, $sumn2, $sumn3, $sums2, $sums3,  $sumrc2, $sumrc3,  $sumrn2, $sumrn3, $sumrt2, $sumrt3, $sumrv2, $sumrv3, $difin, $difv, $difh, $difn, $difs, $difrc, $difrn, $difrt, $difrv);
    }

1
2
3
4
public function writers(){
		$writers = array('PowerPoint2007' => 'pptx');
		return $writers;
    }

La siguiente funcion recibe mas valiables de las que usa porque es solo una fraccion del codigo. ActionGenerar genera unicamente una diapositiva para cuestiones de test. La mayor parte de esta funcion no ha sido cambiada y permanece similar al codigo original de ejemplo que muestra la libreria phppresentation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
public function actionGenerar($mname , $mes, $periodo, $in2013, $in2014, $in2015, $in2016, $v2013, $v2014, $v2015, $v2016, $h2013, $h2014, $h2015, $h2016, $n2013, $n2014, $n2015, $n2016, $s2013, $s2014, $s2015, $s2016, $rc2013, $rc2014, $rc2015, $rc2016, $rn2013, $rn2014, $rn2015, $rn2016, $rt2013,  $rt2014,  $rt2015, $rt2016, $rv2013, $rv2014, $rv2015, $rv2016, $sumin2015, $sumin2016, $sumv2015, $sumv2016, $sumh2015, $sumh2016, $sumn2015, $sumn2016, $sums2015, $sums2016, $sumrc2015, $sumrc2016, $sumrn2015, $sumrn2016, $sumrt2015, $sumrt2016, $sumrv2015, $sumrv2016, $difin, $difv, $difh, $difn, $difs, $difrc, $difrn, $difrt, $difrv){
 
    	$colorBlack = new Color( 'FF000000' );
		$colorBlue = new Color ('0070C0');
		$colorOrange = new Color ('E46C0A');
		$colorGray = new Color ('595959');
		$colorRed = new Color ('FF0000');
		$colorGreen = new Color ('77933C');
		$colorDarkGreen = new Color('4F6228');
 
		$objPHPPresentation = new PhpPresentation();
 
		// Set properties		
		$objPHPPresentation->getProperties()->setCreator('PHPOffice')
		                                  ->setLastModifiedBy('Departamento de estadistica y sistemas')
		                                  ->setTitle('Reporte de incidencia delictiva')
		                                  ->setSubject('Reporte')
		                                  ->setDescription('Reporte por mes por municipio')
		                                  ->setKeywords('')
		                                  ->setCategory('');
		// Remove first slide	
		$objPHPPresentation->removeSlideByIndex(0);
 
 
		//en su lugar tengo lo siguente
		$currentSlide=$objPHPPresentation->createSlide();
 
		// Create a line chart (that should be inserted in a shape)		
		$lineChart = new Line();
		$a = new Series('2013', $in2013);
		$b = new Series('2014', $in2014);
		$c = new Series('2015', $in2015);
		$d = new Series('2016', $in2016);
		$lineChart->addSeries($a);
		$lineChart->addSeries($b);
		$lineChart->addSeries($c);
		$lineChart->addSeries($d);
 
		// Create a shape (chart)
		$shape = $currentSlide->createChartShape();
		$shape->setName('PHPPresentation Monthly Downloads')
				->setResizeProportional(false)
				->setHeight(363)
				->setWidth(884)
				->setOffsetX(35)
				->setOffsetY(210)
				->setIncludeSpreadsheet(true);
		$shape->getTitle()->setText('prueba')->getAlignment()->setHorizontal( Alignment::HORIZONTAL_CENTER );
		$shape->getTitle()->getFont()->setItalic(true);
		$shape->getPlotArea()->getAxisX()->setTitle('Month');
		$shape->getPlotArea()->getAxisY()->setTitle('Downloads');
		$shape->getPlotArea()->setType($lineChart);
		$shape->getView3D()->setRightAngleAxes(true);
		$shape->getView3D()->setRotationX(20);
		$shape->getView3D()->setRotationY(20);
		$shape->getLegend()->getBorder()->setLineStyle(Border::LINE_SINGLE);
		$shape->getLegend()->getFont()->setItalic(true);
 
		// CREAR FORMA TABLA
		$shape = $currentSlide->createTableShape(2);
		$shape->setHeight(91);
		$shape->setWidth(225);
		$shape->setOffsetX(582);
		$shape->setOffsetY(586);
 
		// AÑADIR FILA		
		$row = $shape->createRow();
		$cellA1 = $row->nextCell();
		$cellA1->setWidth(150);
		$cellA1->createTextRun($periodo.' '.'2015')->getFont()->setSize(14);
		$cellA1->getBorders()->getTop()->setLineWidth(0);
		$cellA1->getBorders()->getLeft()->setLineWidth(0);
		$cellB1= $row->nextCell();
		$cellB1->setWidth(75);
		$cellB1->createTextRun($sumin2015)->getFont()->setSize(14);
		$cellB1->getBorders()->getTop()->setLineWidth(0);
		$cellB1->getBorders()->getRight()->setLineWidth(0);
 
		// AÑADIR FILA		
		$row = $shape->createRow();
 
		$cellA2 = $row->nextCell();
		$cellA2->createTextRun($periodo.' '.'2016')->getFont()->setSize(14);
		$cellA2->getBorders()->getBottom()->setLineWidth(0);
		$cellA2->getBorders()->getLeft()->setLineWidth(0);
		$cellB2= $row->nextCell();
		$cellB2->createTextRun($sumin2016)->getFont()->setSize(14);
		$cellB2->getBorders()->getBottom()->setLineWidth(0);
		$cellB2->getBorders()->getRight()->setLineWidth(0);
 
		// CREAR CUADRO DE TEXTO - INDICADOR DE DIFERENCIA DELICTIVA
		$shape = $currentSlide->createRichTextShape();
		$shape->setHeight(39)
		      ->setWidth(78)
		      ->setOffsetX(859)
		      ->setOffsetY(605);
		$shape->getActiveParagraph()->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
 
		if ($difin==0) {
		  $textRun = $shape->createTextRun($sumin2016.'='.$sumin2015);
		  $textRun->getFont()->setBold(true)
		                   ->setSize(16)
		                   ->setColor($colorDarkGreen);
		    $shape = $currentSlide->createDrawingShape();
		  $shape->setName('Alto impacto')
		    ->setDescription('Alto impacto')
		    ->setPath('C:\xampp\htdocs\seisp\src\img\igual.png')
		    ->setHeight(18)
		    ->setOffsetX(929)
		    ->setOffsetY(615);
		}
		elseif ($difin>=1) {
		  $textRun = $shape->createTextRun('+'.$difin);
		  $textRun->getFont()->setBold(true)
		                   ->setSize(16)
		                   ->setColor($colorRed);
		  $shape = $currentSlide->createDrawingShape();
		  $shape->setName('Alto impacto')
		    ->setDescription('Alto impacto')
		    ->setPath('C:\xampp\htdocs\seisp\src\img\incremento.png')
		    ->setHeight(18)
		    ->setOffsetX(929)
		    ->setOffsetY(615);
		}
		elseif ($difin<=-1) {
		  $textRun = $shape->createTextRun($difin);
		  $textRun->getFont()->setBold(true)
		                   ->setSize(16)
		                   ->setColor($colorDarkGreen);
		  $shape = $currentSlide->createDrawingShape();
		  $shape->setName('Alto impacto')
		    ->setDescription('Alto impacto')
		    ->setPath('C:\xampp\htdocs\seisp\src\img\decremento.png')
		    ->setHeight(18)
		    ->setOffsetX(929)
		    ->setOffsetY(615);
		}
 
		// Save file
		echo $this->write($objPHPPresentation, basename('export','.php'), $this->writers(), $mname);
	}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
function write($phpPresentation, $filename, $writers, $alias)
	{
	    $result = '';
 
	    // Write documents
	    foreach ($writers as $writer => $extension) {
	        if (!is_null($extension)) {
	            $xmlWriter = IOFactory::createWriter($phpPresentation, $writer);
	            $xmlWriter->save(__DIR__ . "/{$filename}.{$extension}");
	            rename(__DIR__ . "/{$filename}.{$extension}", __DIR__ . "/results/{$filename}.{$extension}");
	        }
	    }
		$this->downloadFile(__DIR__."/results/", "{$filename}.{$extension}", $alias);
	}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private function downloadFile($dir,$file,$alias)
	{
 
		$path=$dir.$file;
		$name=$alias.".pptx";
	  	$size = filesize($path);
	  	header("Content-Type: application/force-download");
	    header("Content-Disposition: attachment; filename=$name");
	    header("Content-Transfer-Encoding: BINARY");
	    header("Content-Length: " . $size);
	    // Descargar archivo
	    /*ob_end_clean();
	    flush();*/
	    readfile($path);
	}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Extraño resultado en ciclo for.

Publicado por kip (562 intervenciones) el 07/07/2016 23:56:31
Entiendo, te parece si intentas probar dos cosas que te colocare a ver si te funciona, la primera es hacer un retardo ya sea de seg o de microseg, algo asi:

1
2
3
4
5
6
7
8
for ($i=0; $i <count($muns_region) ; $i++) {
                        if($i==0){
                             $this->actionConsultar($muns_region[$i]);
                        } else {
			    $this->actionConsultar($muns_region[$i]);
                            usleep(200000); // retardo en microseg
                        }
		}

Si ello no te sirve, intenta colocarlo en la funcion final que seria downloadFile.

Lo segundo que te propongo es que uses ob_flush() en lugar de ob_end_clean(), en la misma doc de PHP recomiendan el uso de ambas funciones juntas:

flush() podría no sobreescribir el esquema del almacenamiento en búfer del servidor web, por lo que no tiene efecto sobre ningún búfer en el lado del cliente del navegador. Tampoco afecta al mecanismo del búfer de salida del espacio de usuario de PHP. Esto significa que se ha de llamar tanto a ob_flush() como a flush() para volcar los búferes de salida si se están usando aquellos.

Bueno, de todas formas nos cuentas si te funciono o si hallaste la solucion.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Extraño resultado en ciclo for.

Publicado por mauro (25 intervenciones) el 08/07/2016 02:11:15
OB_END_CLEAN() es necesario porque de otro modo al tratar de abrir los archivos da error archivo dañado. Ese problema se relaciona con
Añadir algún espacio en blanco antes de <?php o después de ?>
El BOM (Byte Order Mark) de UTF-8

Use el debugger propio de la libreia YII2 y al parecer el problema esta relacionado con los headers.

1
exception 'yii\base\ErrorException' with message 'Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\seisp\controllers\ExportarController.php:395)' in C:\xampp\htdocs\seisp\controllers\ExportarController.php:389

Parece que El ciclo for es un solo proceso en que los headers se pueden enviar una sola vez. Al accionar el proceso de creacion de archivos con el segundo valor del ciclo for todo funciona bien... hasta que llega a downloadFile y se intenta mandar de nuevo los headers.

En fin saben como arreglar
1
Cannot modify header information - headers already sent
.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Extraño resultado en ciclo for.

Publicado por kip (562 intervenciones) el 08/07/2016 03:47:40
Activando el output buffering
PHP permite guardar todos los contenidos a medida que se genera la página para enviarlos después todos a la vez al usuario. Esta técnica se llama output buffering y deberías utilizarla siempre porque además mejora el rendimiento de la aplicación. Para ello, configura la opción output_buffering en tu archivo de configuración php.ini.

Comprobando si se han enviado las cabeceras HTTP
1
2
3
4
5
6
if (headers_sent()) {
    // las cabeceras ya se han enviado, no intentar añadir una nueva
}
else {
    // es posible añadir nuevas cabeceras HTTP
}

Son dos soluciones que puedes probar, siento mucho si las anteriores respuestas no te han funcionado.

Ademas de eso visita el siguiente link, hay info muy detallada de otras opciones que puedes solucionar.

http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Extraño resultado en ciclo for.

Publicado por mauro (25 intervenciones) el 26/07/2016 02:05:10
No encontré una solución para el problema, pero si otro camino para hacer las cosas.

Al final modifiqué un poco el flujo del proceso, para que creara todos los archivos, después comprimirlos, y por ultimo descargar el archivo comprimido.

Después de todo era la solución mas adecuada, puesto que no he visto jamas algún navegador que haga descargas simultaneas continuas. En su lugar, cuando se requiere de la descarga de varios archivos siempre es en algún formato comprimido.

Gracias a todos por su ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Víctor

Extraño resultado en ciclo for.

Publicado por Víctor (169 intervenciones) el 07/07/2016 07:33:40
Hola:

Creo que se te ha olvidado cerrar el for antes de return. Si el programa encuentra un return sale de ella de forma inmediata, así que el ciclo for sólo se ejecuta una vez.

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar