Bonjour à tous.

J'essai de faire fonctionner cette librairie afin d'obtenir des graph dans mes PDF généré par laravel. Mais avant cela, encore faudrait'il que j'arrive à faire marcher correctement.

la documentation donne ca : https://jpgraph.net/features/src/show-example.php?target=new_pie1.php

J'ai installé la librairie avec composer. Dans le controller c'est déclarer comme ceci :

        $pie = new JpGraph\JpGraph();
        $pie->module('pie');
        // Bizarrement si je supprime cette déclaration ca plante plus bas, alors que les variables ne sont pas utilisées

        $data = array(40,21,17,14,23);

        $zerzer = new \PieGraph(350,350);
        $zerzer->title->Set("A Simple Pie Plot");
        $zerzer->SetBox(true);

        $p1 = new \PiePlot($data);
        $zerzer->Add($p1);

        $p1->ShowBorder();
        $p1->SetColor('black');
        $p1->SetSliceColors(array('#1E90FF','#2E8B57','#ADFF2F','#DC143C','#BA55D3'));
        $p1->SetLegends('test');

        $zerzer->Stroke();
        //La méthode qui fait tout planter

Si j'enleve la méthode Stroke le controller ne plante pas. Mais il semblerais que ce soit celle ci qui génére l'affichage. Le message d'erreur est le suivant :

        $sum=0;
        for($i=0; $i < $n; ++$i)
            $sum += $this->data[$i];

        // Bail out with error if the sum is 0
        if( $sum==0 )
        JpGraphError::RaiseL(15009);//("Illegal pie plot. Sum of all data is zero for Pie!");

        // Make sure we don't plot more values than data points
        // (in case the user added more legends than data points)
        $n = min(count($this->legends),count($this->data));
        if( $this->legends != "" ) {
            $this->legends = array_reverse(array_slice($this->legends,0,$n));
        }
        for( $i=$n-1; $i >= 0; --$i ) {
            $l = $this->legends[$i];
            // Replace possible format with actual values
            if( count($this->csimalts) > $i ) {
                $fmt = $this->csimalts[$i];
            }
            else {
                $fmt = "%d"; // Deafult Alt if no other has been specified
            }
            if( $this->labeltype==0 ) {
                $l = sprintf($l,100*$this->data[$i]/$sum);
                $alt = sprintf($fmt,$this->data[$i]);

            }
            elseif( $this->labeltype == 1)  {
                $l = sprintf($l,$this->data[$i]);
                $alt = sprintf($fmt,$this->data[$i]);
Arguments
**"count(): Parameter must be an array or an object that implements Countable"**

Je n'arrive pas à savoir si c'est du à Laravel, à une erreur d'intégration ou d'usage du plugin.

Merci

7 réponses


Si tu utilises php 7.2, il y a maintenant un avertissement si le paramètre passé à count n'est pas 'dénombrable"
le paramètre csimalts vaut null si non renseigné (voir ici ligne 78)

Salut, Effectivement c'est bien un php 7.2 sur mon serveur de test. je vais essayer de comprendre à quoi sert ce parametre.
J'ai essayer avec des valeurs bidons grace à la méthode associé mais ca ne marche pas.

Je pense que c'est le SetLegends qui attend un tableau avec autant de valeurs qu'il y a de couleurs

$p1->SetLegends(['test1','test2','test3','test4','test5']);

Bien vue ca avance, mais ca plante un plus loin.
count(): Parameter must be an array or an object that implements Countable

if( count($this->csimalts) > $i ) {

Il y'a bien une méthode pour renseigner cet attribut

function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
        $this->csimtargets=array_reverse($aTargets);
        if( is_array($aWinTargets) )
        $this->csimwintargets=array_reverse($aWinTargets);
        if( is_array($aAlts) )
        $this->csimalts=array_reverse($aAlts);
    }

Mais je vois pas bien ce qu'il attend comme tableau. Cela dis, la longueur des tableaux attendu correspond a celle de la variable data et donc legends, car dans le cas contraire y'a une erreur d'ofset sur le tableau. On mettant des données au pif, il n'y as plus d'erreur, mais ca affiche des caractères non interpretés

 �PNG  IHDR^^BI�M  pHYs���+wIDATx���}\T��/��AEP�%!A�S���s|�)�r~��ĬNd�(�y4�cI���1.�•��SjH>ܟV��JQ����$�C��03������8O�q}�/_�p��f��������p����F��!����@40g����}��ԣx@n��Ad��G�Cr�zlٱc���ۗ,Y2a��jkk�n�ZUU������FDDB6o�,�HX�|yee%!D��>���/���СCRG��k��������4f �*..�4i���;z����===�lٲs��3f�ڵK��ud���G�ݳgOhh�ʕ+�ܹ#�y@�5�������k���=����~���=�֭[uuu��龾���#F�1�h����&M�4i!$%%eذa���555~~~K�,9{��޽{�޽;nܸ��/III5j�w�}w��倀�������}�{����斖����2��룏>���===��8p�ܹs111�Cr�<�ݹs'++���ӄ��#GΛ7�k׮o���ŋׯ_�~��A�I8�b f �9x�`bb���[||���~j���ݻ����>�p�B[[��S������k�qxx�믿~�ڵm۶eee���~��Ƨ����v튋�[�|��?�lv�w�y���n�ƍ;w�|��V�Z�؏�����hnn������jhhX�n!������,Yr��Q�h "�y�fMMM\\!dʔ)%%%��߷|چ z��nݺ����8q�z�iӦ���h��?��O���)))]�v�ӧOdd�K��O�2e�СC===���|}}KJJLO���XRR�x�b������ʕ+����۶m���4h�穯���o�ϟߣG�^�z���VTTܼy���PP�����ƍ'N4����-�j�����������#G��^�zÆ ��:��N�:=��#Z���[���ݻ��� �'�~�:!$))���O?�l��>��O>�D���^��{��B��ƍ��X�Bz��A@t��:t(''��_��믷o�n����限��w�޳g����7���5~mV����sWPPЭ[7��>}�����ѣ�:����^�ohh�ի!������q��3�ˡ�CEE��`0�;:�ʕ+f�����+V|������---EEE���f�n�}

Je viens de tester en initialisant csimalts à un tableau vide plutôt qu'à null;

class PiePlot {
    public $posx=0.5,$posy=0.5;
    public $is_using_plot_theme = false;
    public $theme="earth";
    protected $use_plot_theme_colors = false;
    protected $radius=0.3;
    protected $explode_radius=array(),$explode_all=false,$explode_r=20;
    protected $labels=null, $legends=null;
    protected $csimtargets=null,$csimwintargets=null;  // Array of targets for CSIM
    protected $csimareas='';  // Generated CSIM text
    protected $csimalts=array();  // ALT tags for corresponding target  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ICI
    ...

ça fonctionne chez moi en php7.2.7

Salut,

Merci beaucoup pour ton aide, maintenant ca marche. Je vais essayer avec tes derniers ajustement. Cela dis, le réglage risque de sauté en faisant une update des dépendances ?

Pour ceux que ca interessent :

1/ Installation de Jpgraph/JpGraph via composer.

2/ Créer une route qui renvera vers la méthode du controller

Route::get('/projet/{project_id?}/graph.php',['as' => 'graph','uses'=>'ProjectsController@graph']);

3/ Dans le controller, générer le graph

public function graph($project_id){

        $pie = new JpGraph\JpGraph();
        $pie->module('pie');

        $data = array(40,21,17,14,23);

        $zerzer = new \PieGraph(350,350);
        $zerzer->title->Set("A Simple Pie Plot");
        $zerzer->SetBox(true);

        $p1 = new \PiePlot($data);
        $zerzer->Add($p1);

        $p1->ShowBorder();
        $p1->SetColor('black');
        $p1->SetSliceColors(array('#1E90FF','#2E8B57','#ADFF2F','#DC143C','#BA55D3'));
        $p1->SetLegends(['test1','test2','test3','test4','test5']);

        $p1->SetCSIMTargets(array(40,21,17,14,23),array(40,21,17,14,23));

        $zerzer->Stroke();

    }

4/ Dans la vue ou l'ont veux le graph faire simplement ceci :

<img src="{{ route('graph',[$project->id])}}">

Note, il serait peut être judicieux de passer à la route toute les valeurs que l'ont veux faire apparaitre dans le graph, cela permettrait d'avoir une méthode générique indépendante pour la création des graph sans lien avec la page qui l'affiche.

Je me suis enflammé trop vite ! Ca marche en Html mais pas quand je génére un fichier PDF (avec barryvdh/laravel-dompdf ). Il faut que je regarde si on peut enregistrer le fichier dans un repertoire temp le temps de l'intégration du pdf.

A la place du graph j'ai un beau

Image not found or type unknown