Gráficos com pChart

Boa tarde amigos,

Alguém já fez a integração com pCharts versão 2.0?

Minha imagem do gráfico está gerando quebrada.

Alguém sabe o que pode ser? Existe alguma forma de debugar os erros da biblioteca?

Também não sei se no Controller é o correto, se puderem me dar uma direção, agradeço.

Meu Controller:





public function actionView($id)

    {

    	// Importa classes geradoras do gráfico

    	require_once('pChart/class/pData.class.php');

    	require_once('pChart/class/pDraw.class.php');

    	require_once('pChart/class/pImage.class.php');    	

    	

    	/* Create your dataset object */

    	$myData = new pData();

    	

    	/* Add data in your dataset */

    	$myData->addPoints(array(VOID,3,4,3,5));

    	

    	/* Create a pChart object and associate your dataset */

    	$myPicture = new pImage(700,230,$myData);

    	

    	/* Choose a nice font */

    	$myPicture->setFontProperties(array("FontName"=>dirname(__FILE__)."/../vendors/pChart/fonts/Forgotte.ttf","FontSize"=>11));

    	

    	/* Define the boundaries of the graph area */

    	$myPicture->setGraphArea(60,40,670,190);

    	

    	/* Draw the scale, keep everything automatic */

    	$myPicture->drawScale();

    	

    	/* Draw the scale, keep everything automatic */

    	$myPicture->drawSplineChart();

    	

    	/* Build the PNG file and send it to the web browser */

    	$diretorioGraficos = dirname(__FILE__)."/../../images/graficos/";

    	//$myPicture->Render("basic.png"); // Força o salvamento da imagem   	

    	//$myPicture->autoOutput();

    	$myPicture->Stroke(); //Apresenta na tela

    	

    	$this->render('view');

    }



Obrigado…

Kleber,

Pelo que vi, você está usando o método stroke() para gerar o gráfico e em seguida o render() do Yii.

O correto é você em uma determinada view chamar uma imagem que na verdade será um action que gera o gráfico.

Algo como:

public function actionView($id)

{


    $this->render('view');


}

public function actionGrafico($id)

{


    // Importa classes geradoras do gráfico


    require_once('pChart/class/pData.class.php');


    require_once('pChart/class/pDraw.class.php');


    require_once('pChart/class/pImage.class.php');          


    


    /* Create your dataset object */


    $myData = new pData();


    


    /* Add data in your dataset */


    $myData->addPoints(array(VOID,3,4,3,5));


    


    /* Create a pChart object and associate your dataset */


    $myPicture = new pImage(700,230,$myData);


    


    /* Choose a nice font */


    $myPicture->setFontProperties(array("FontName"=>dirname(__FILE__)."/../vendors/pChart/fonts/Forgotte.ttf","FontSize"=>11));


    


    /* Define the boundaries of the graph area */


    $myPicture->setGraphArea(60,40,670,190);


    


    /* Draw the scale, keep everything automatic */


    $myPicture->drawScale();


    


    /* Draw the scale, keep everything automatic */


    $myPicture->drawSplineChart();


    


    /* Build the PNG file and send it to the web browser */


    $diretorioGraficos = dirname(__FILE__)."/../../images/graficos/";


    //$myPicture->Render("basic.png"); // Força o salvamento da imagem      


    //$myPicture->autoOutput();


    $myPicture->Stroke(); //Apresenta na tela


}

E na view você teria algo como:

<?php echo CHtml::image($this->createUrl(‘grafico’)); ?>

Obrigado pela ajuda, andredelorme…

Fiz conforme sua indicação, que achei bem mais lógico…rs

No entanto, se eu renderizo somente com o:


 $myPicture->Stroke(); //Apresenta na tela 

ele não exibe o gráfico…

Aí, utilizei isto para testar:




        $diretorioGraficos = dirname(__FILE__)."/../../images/graficos/";

    	$myPicture->Render($diretorioGraficos.'basic.png'); // Força o salvamento da imagem



e é gerado corretamente o arquivo na pasta, mas também não exibe.

Já tentei usar o "$myPicture->ReportWarnings();" para tentar debugar e apresenta o erro: PHP Fatal error: Call to undefined method pImage::ReportWarnings(), parece que só funciona utilizando o $myPicture->autoOutput(); em conjunto… Não entendi direito…

Tentei usar também o $myPicture->autoOutput(); e nada…

O que pode ser? Onde será que estou errando?

Obrigado mais uma vez.

Kleber,

Fiz um teste aqui exatamente com a sua action, só ajustei os caminhos da biblioteca. E funcionou.

Um detalhe é que eu retirei o parametro $id da action pois não estava passando-o, ou você pode definir um valor padrão para ele.

Para testar você pode chamar diretamente no browser sua action que gera a imagem para no caso de dar erro você vê-lo.

andredelorme,

Testei novamente, mesmo chamando a action diretamente, e sem o id, mostra uma img quebrada e não apresenta na tela. Se eu usar o Render, desta forma:

$diretorioGraficos = dirname(FILE)."/../../images/graficos/";

$myPicture->render($diretorioGraficos.‘grafico_painel.png’);

consigo gerar a imagem corretamente na pasta.

O que eu fiz é gerar a imagem, desta forma acima e na view, busco esta imagem como:

<?php echo CHtml::image($caminhoImagem.‘grafico_painel.png’); ?>

Apesar de funcionar de acordo com a necessidade, não é o que eu queria, e acho que não é muito correto… Mas, como estou com o prazo estourado acho que vou usar desta forma mesmo.

Obrigado, tudo de bom, sempre.

Kleber,

Você consegue disponibilizar o seu código exato dessa parte da aplicação que está dando erro? Colocando a aplicação disponível num endereço na web ou anexando o código?

Andredelorme,

Publicar em algum lugar neste momento é um pouco trabalhoso mas se os códigos não ajudarem podemos ver isso na sequência.

http://pastebin.com/wjQf8uxz - Controller

http://pastebin.com/5AMRERJm - View

Obrigado.

Kleber,

Funcionou aqui.

O que fiz:

Baixei o seu código, baixei o pChart 2.1.3, coloquei o pChart no diretório protected/vendors/pChart, no controller apenas comentei a linha do accessFilter, antes dos require_once do pChart adicionei:

Yii::import(‘application.vendors.*’);

// Importa classes geradoras do gráfico

require_once(‘pChart/class/pData.class.php’);

Comentei a linha:

$myPicture->render($diretorioGraficos.‘grafico_painel_’.$id.’.png’);

e descomentei a linha:

$myPicture->Stroke();

E acessei no browser:

index.php?r=graficos/grafico

Andredelorme

Eu to achando que é macumba isso ae…rsss

Não funcionaaa…Olhe a situação.

Estou com a versao pChart 2.1.3.

A biblioteca está no mesmo caminho que mencionou (protected/vendors/pChart).

Comentei a linha do AccessFilter

Adicionei a linha Yii::import(‘application.vendors.*’); antes dos requires…

Limpei as pastas assets e runtime.

A unica coisa de diferente é que uso URLRewrite e acesso o gráfico desta maneira:

http://localhost:8080/nomeaplicacao/graficos/1 (onde atualmente o 1 não interfere em nada pois não estou pegando o id na action, está fixo conforme testes anteriores)…

Seria tao mais fácil se esta biblioteca possuísse algo para depurar e apresentasse o erro na tela… (Lembrando que já tentei usar o $myPicture->ReportWarnings();) com o render funciona, com o stroke não…

Agradeço imensamente a paciência.

Se quiser fazer como eu e desistir, esteja a vontade hehehe Por enquanto contornei usando aquela forma que comentei, utilizando o render.

Abraço

Já olhou o log do Apache/PHP?

Você acessa a URL do gráfico diretamente e nada aparece? Aparece uma imagem quebrada?

Olhe as propriedades da página no browser? Aqui vejo:

Tipo: image/png

Codificação: ISO-8859-1

Tamanho: 15,28KB (15.649 bytes)

700×230 pixels

Se o que aparece aí é uma imagem quebrada, salve ela e abra num editor de texto, pois se não é uma imagem válida, no editor de textos você vai ver o que está sendo gerado no lugar.

Como faço para ver estas propriedades? Não sei se estou no lugar certo mas cliquei com o botão direito em cima da imagem e fui em propriedades… Aqui aparece Tipo de arquivo: HyperText Transfer Protocol.

Quanto ao log, utilizo o IIS. E não apresenta nenhuma outra informação de erro, somente os acessos realizados.

A imagem aparece quebrada sim… Salvei e abri como txt aparece uns caracteres codificados… e mais abaixo um mini log com caminhos da imagem… aparentemente meus logs do próprio Yii… sem nenhuma informação relevante.

Kleber,

Eu não uso esta extensão, mais vou dá uma dica.

Tem como você mudar do IIS para Apache? Acho eu que o PHP se comportar melhor, caso não consiga vai outras dicas.

Habilita o error_reporting(0) no index.php do seu projeto, para mostrar todos os tipos de erro possível.

Se a extensão tiver alguma função de debugar ou mostar erro, coloca um exit() depois ou abaixo para ver se ele vai mostar o erro, assim você interrompe o render da aplicação.




...

$myPicture->ReportWarnings();

exit();

...



Newerton,

Sempre utilizei e gostaria muitooo de continuar utilizando o Apache / MySQL, mas desta vez foi uma solicitação da empresa. Apache e SQL Server. Eu tinha liberdade na escolha do Framework e escolhi o Yii, o qual não largarei mais…rs

Quanto ao exit(), o que acontece eh que se eu utilizo o render pra mostrar o gráfico, o debug ($myPicture->ReportWarnings();) funciona. Com o Stroke não…

Testei utilizando o error_reporting(0), error_reporting(E_ALL), logs do Yii… Nada apresenta informação relevante…

Meu problema é que preciso criar um gráfico de dispersão e em cima deste gráfico criar duas linhas X e Y com uma média em determinado ponto do gráfico.

Aí, vi que é possível com esta biblioteca mas, se souber de algo parecido com outra biblioteca adoraria saber…

Abraçooo

Kleber,

Se você precisa apenas apresentar gráficos um opção é o Google Chart Tools (https://developers.google.com/chart/) o único porém dele é que o usuário visualiza o gráfico mas não consegue salvá-lo como uma imagem. Se o seu projeto não tem essa demanda é uma boa alternativa.

Voltando a isso que você mencionou, aqui está o seu problema. Uma imagem é um arquivo binário, por isso quando você abre num bloco de notas aprecem os "caracteres codificados", faça o teste com outras imagens. Se na imagem que o pChart está gerando além do código binário está aparecendo texto, a imagem fica corrompida.

Experimente, pegar uma imagem, abrir com o editor de textos colar algum texto adional nela, e voltar a abrí-la, ela estará corrompida.

Quais eram essas informações "não relevantes" que estavam na imagem gerada? Você está usando o CWebLogRoute ou dando echo de algo durante o processamento? Em ambos os casos sua imagem gerada ficaria corrompida.

Entao andredelorme,

Preciso que o usuário salve a imagem e que não seja nada em flash.

Uso o CWebLogRoute e a informação que aparece além da codificação é a info abaixo:

[size=2]Ý[/size][size=2][/size][size=2]ûÏ[/size][size=2][/size][size=2]þóà[/size][size=2]q0i\[/size]nomeapp [size=2]\index.php(14)</pre></td>[/size]

[size=2] </tr> <trstyle="background:#FFFFFF">[/size]

[size=2] <tdalign="center">16:48:56.327562</td>[/size]

[size=2] <td>trace</td>[/size]

[size=2] <td>system.CModule</td>[/size]

[size=2] <td><pre>Loading&quot;urlManager&quot; application component[/size]

[size=2]inC:\inetpub\wwwroot\[/size]nomeapp [size=2]\index.php(14)</pre></td>[/size]

[size=2] </tr> <trstyle="background:#F5F5F5">[/size]

[size=2] <tdalign="center">16:48:56.332474</td>[/size]

[size=2] <td>trace</td>[/size]

[size=2] <td>system.CModule</td>[/size]

[size=2] <td><pre>Loading&quot;user&quot; application component[/size]

[size=2]in[/size]

[size=2]C:\inetpub\wwwroot\[/size]nomeapp [size=2]\protected\components\Controller.php[/size]

size=2[/size]

[size=2]inC:\inetpub\wwwroot\[/size]nomeapp [size=2]\index.php(14)</pre></td>[/size]

[size=2] </tr> <trstyle="background:#FFFFFF">[/size]

[size=2] <tdalign="center">16:48:56.334053</td>[/size]

[size=2] <td>trace</td>[/size]

[size=2] <td>system.CModule</td>[/size]

[size=2] <td><pre>Loading&quot;session&quot; application component[/size]

[size=2]in[/size]

[size=2]C:\inetpub\wwwroot\[/size]nomeapp [size=2]\protected\components\Controller.php[/size]

size=2[/size]

[size=2]in C:\inetpub\wwwroot\nomeapp\index.php(14)</pre></td>[/size]

[size=2] </tr></table>[/size]

[size=2]<!-- end of log messages -->[/size][size=2][/size]

Desligou o CWebLogRoute e passou a funcionar?!?

Eu gostaria muito…rs Mas, somente sumiu os logs quando abro o png como texto…

É, realmente estou quase desistindo, não tem nenhum echo, print_r etc, que você tenha colocado no código? Se um espaço em branco ou ENTER for adicionado na saida da imagem já corrompe.

Você consegue, salvar a imagem gerada com stroke() e a com render() e ver se encontra diferenças nelas num editor de textos, ou melhor usando uma ferramenta como WinMerge ou meldmerge.

Kleber,

Se aceitar outra sugestão, essa extensão é a que eu utilizo na minhas aplicações e não tenho do que reclamar pela dinâmica do gráfico.

http://www.yiiframework.com/extension/highcharts

Vou tentar analisar isso … tentar confrontar os arquivos… Mas acho que vai ter que ser mais pra frente.

Cara, agradeço muito mesmo a ajuda e tentativa de resolução. Realmente, você foi muito paciente…rss