Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire

Deuxième SOS, Je solliciite votre aide.

J'ai suivi lu tuto créer un site de A à Z et j'essaye d'aller un peu plus loin. Je bute actuellement sur l'upload de l'icone d'un fichier pdf avec le tinymce. L'upload du fichier se passe bien et celui-ci est bien chargé dans son répertoire de destination, mais l'icone chargée est transparente. Après analyse, je pense que le problème vient de la balise img qui se trouve dans ma vue. Faute de solution alternative, je me suis orienté vers le chargement de l'icone pdf dans un repertoire images dans le webroot créé à cet effet pour ensuite faire un lien vers le fichier. Après avoir intégré dans le répertoire images différents types d'icone (dont pdf), j'ai fait un switch(strtolower($image->type)) au niveau de ma vue. Mais je n'arrive pas à intégrer correctement ce type de code. Mes compétences sont insuffisantes et j'ai un message d'erreur. Voici ma vue:

Entourez votre code pour bien le mettre en forme
`<table>
    <head>
        <tr>
            <th>Images</th>
            <th>Titre</th>
            <th>Actions</th>
        </tr>
    </head>
    <body>
    <?php echo debug($images); ?>
        <?php foreach ($images as $k => $v): ?>
            <tr>
                <td>
                <?php switch($images->type){
                    case "pdf": ?>
                    <a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
                        <img src = "<?php echo Router::webroot('images/icone_pdf'); ?>" height="60">
                    </a> ; <?php break;
                    case "image": ?>
                    <a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
                        <img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
                    </a> ; <?php break; ?>
                    }
                </td>
                <td><?php echo $v->name; ?></td>
                <td>
                    <a onclick = "return confirm('Voulez vous vraiment supprimer cette image?');
                    "href = "<?php echo Router::url('admin/medias/delete/'.$v->id);?>">Supprimer</a>
                </td>
            </tr>
        <?php endforeach ?>
    </body>
</table>

### Ce que je veux

Décrivez ici ce que vous cherchez à obtenir
J'ai procédé à une modification du code pour essayer,dans un premier temps, de charger autre chose que des images.
### Ce que j'obtiens

Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(
Voici mon erreur:
Parse error: syntax error, unexpected 'endforeach' (T_ENDFOREACH) in C:\wamp\www\test\view\medias\admin_index.php on line 31

11 réponses


tikoum
Auteur

Alors personne pour m'aider ou est ce un problème insoluble ???

Hello,

L'erreur parle d'elle même : tu n'as pas mis de ; après ton endforeach, du coup PHP te dit que c'est bizarre ton truc endforeach tout seul ;)

tikoum
Auteur

Bonjour Guique,

J'ai essayé, mais c'est pas ça.
En fait, ma solution est plutôt boiteuse faute d'alternative. Ce que j'aimerai, c'est de pouvoir afficher les pdf. Actuellement, ils sont bien chargés vers le répertoire de destination mais ne s'affiche pas alors que les images oui.
J'ai beaucoup analysé le problème et je crois que le problème vient de la vue et notamment ce bout de code :

<tr>
                <td>
                    <a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
                        <img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
                    </a>
                </td>
                <td><?php echo $v->name; ?></td>
                <td>

D'une part la balise img pourrait être non incompatible avec un doc pdf. Par contre pour le retour (la ligne avec le Filebrowser). Le problème vient peut-être du tinymce.

tikoum
Auteur

Salut Anthony,
J'ai revu le code, je n'ai pas trouvé la différence avec celui que tu as posté. Peux tu m'apporter des précisions.

<?php break; } ?>

Tu fermes ton switch en dehors de ta balise PHP.
Je ne comprend pas ton problème. Tu postes du code avec des erreurs et tu nous poses une toute autre question..

A noter que tu as aussi un ; qui se balade après la fermeture de ta balise </a>. Je pense qu'il n'a rien à faire la.
Bref : passe en revu tout ton code, réindente le proprement et corrige ces erreurs. Ensuite reposte nous le résultat si tu as toujours des erreurs ;)

tikoum
Auteur

Voici la nouvelle erreur suite à la modif

Notice: Trying to get property of non-object in C:\wamp\www\test\view\medias\admin_index.php on line 14

Je crois que ma solution est boiteuse ou du moins compliqué à appliquer.
C'est vrai que j'aurai préféré une solution où le pdf s'affiche après l'upload (qui s'effectue bien d'ailleurs). Mais je crois que le tinymce ne veut pas afficher autre chose que des images.

tikoum
Auteur

J'ai fait un var_dump($images) juste au dessus du foreach, voici ce que j'obtiens (pour un fichier pdf):

array (size=1)
  0 => 
    object(stdClass)[10]
      public 'id' => string '61' (length=2)
      public 'name' => string '' (length=0)
      public 'file' => string '2017-07/facture_FR17949661.pdf' (length=30)
      public 'post_id' => string '7' (length=1)
      public 'posts_id' => string '0' (length=1)
      public 'type' => string 'pdf' (length=3)

Tu dois avoir une erreur quelque part mais on va avoir besoin de ton code actuel, bien indenté, pour pouvoir t'aider.

tikoum
Auteur

Merci Guique pour ton message. Je crois que j'ai atteins mes limites techniques sur ce framework que je me suis amusé à écrire avec l'aide de grafikart. Ca devient trop complexe pour moi. A la base et je voulais charger et afficher plusieurs type de format de fichierpar le biais d'un tinymce, ça marche bien pour les images mais pas pour les pdf (notamment l'affichage). Je poste ci-après mon MediaController et ma vue mais je crois que cette affaire est sans salut.
Mon contrioller:

<?php
    class MediasController extends controller{

        function admin_index($id){

            $this->loadModel('Media');
            if($this->request->data && !empty($_FILES['file']['name'])){
            //  $upload = strtolower(substr(strrchr($_FILES['file']['name'],'.')));
                if (substr(strtolower($_FILES["file"]['name']),-3)=="jpg")  {$type= "image"; }
                if (substr(strtolower($_FILES["file"]['name']),-3)=="JPG")  {$type= "image"; }
                if (substr(strtolower($_FILES["file"]['name']),-3)=="pdf")  {$type= "pdf"; }
                if (substr(strtolower($_FILES["file"]['name']),-3)=="PDF")  {$type= "PDF"; }

                $extension=substr(strtolower($_FILES["file"]['name']),-3);

                var_dump($_FILES);

                if(strpos($_FILES['file']['type'], $type) !== false){
                    $dir = WEBROOT.DS.'img'.DS.date('Y-m');
                    if(!file_exists($dir)) mkdir($dir, 0777);// si le fichier n'existe pas, on le crée
                    move_uploaded_file($_FILES['file']['tmp_name'],$dir.DS.$_FILES['file']['name']);
                    $this->Media->save(array(//sauvegarde
                        'name' => $this->request->data->name,//nom de l'image
                        'file' => date('Y-m').'/'.$_FILES['file']['name'],//nom du dossier et du fichier
                        'post_id' => $id,
                        'type' => $type
                    ));
                    $this->Session->setFlash("L'image a bien été uploadé");
                }else{
                    $this->Form->errors['file'] = " Format refusé";
                }
            }
            //debug($_FILES);
            $this->layout = 'modal';
            $d['images'] = $this->Media->find(array(
                'conditions' => array('post_id' => $id
                )));
            $d['post_id'] = $id;
            $this->set($d);
        }

        function admin_delete($id){
            $this->loadModel('Media');//on charge la table medias
            $media = $this->Media->findFirst(array(
                'conditions' => array('id'=>$id//l'id correspond à l'id qui a été envoyé
                )));
            unlink(WEBROOT.DS.'img'.DS.$media->file);
            $this->Media->delete($id);
            $this->Session->setFlash("Le média a bien été supprimé");
            $this->redirect('admin/medias/index/'.$media->post_id);

        }
    }

et ma vue:

<table>
    <head>
        <tr>
            <th>Images</th>
            <th>Titre</th>
            <th>Actions</th>
        </tr>
    </head>
    <body>
    <?php var_dump($images); ?>
        <?php foreach ($images as $k => $v): ?>
            <tr>
                <td>
                    <a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
                        <img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
                    </a>
                </td>
                <td><?php echo $v->name; ?></td>
                <td>
                    <a onclick = "return confirm('Voulez vous vraiment supprimer cette image?');
                    "href = "<?php echo Router::url('admin/medias/delete/'.$v->id);?>">Supprimer</a>
                </td>
            </tr>
        <?php endforeach ?>
    </body>
</table>

<div class ="page-header">
    <h1>Ajouter une image</h1>
</div>

<form action="<?php echo Router::url('admin/medias/index/'.$post_id); ?>" method="post" enctype="multipart/form-data">
    <?php echo $this->Form->input('file','Image',array('type'=>'file'));//nom, label et type ?>
    <?php echo $this->Form->input('name','Titre');//nom et Titre ?>
    <br/>
    <div class="actions">
        <input type="submit" class="btn btn-primary" value="Envoyer">
    </div>
</form>

<script type="text/javascript"  src="<?php echo Router::webroot('js/tinymce/tiny_mce_popup.js'); ?>"></script>

<script type="text/javascript">
// permet de récupérer les variables et de les injecter dans la popups
var FileBrowserDialogue = {
    init : function () {
        // Here goes your code for setting your custom things onLoad.
    },
    sendURL : function (URL) {
        var win = tinyMCEPopup.getWindowArg("window");

        // insert information now
        win.document.getElementById(tinyMCEPopup.getWindowArg("input")).value = URL;

        // are we an image browser
        if (typeof(win.ImageDialog) != "undefined") {
            // we are, so update image dimensions...
            if (win.ImageDialog.getImageData)
                win.ImageDialog.getImageData();

            // ... and preview if necessary
            if (win.ImageDialog.showPreviewImage)
                win.ImageDialog.showPreviewImage(URL);
        }

        // close popup window
        tinyMCEPopup.close();
    }
}

tinyMCEPopup.onInit.add(FileBrowserDialogue.init, FileBrowserDialogue);
</script>

Bonjour.
Tu dois utiliser $v->type et non $images->type, car ta variable images est un tableau (array) et non un objet.

tikoum
Auteur

Bonjour Lartak. En effet, cela fonctionne avec $v->type. L'emploi de ce code n'était pas exactement ce que je voulais, mais , j'affiche une icone pdf et en bidouillant un peu je créé un lien vers le fichier qui a été chargé au préalable. Je poste le code de la vue avec le switch($v->type) au cas ou cela pourrait un jour servir à un novice comme moi.

<table>
    <head>
        <tr>
            <th>Images</th>
            <th>Titre</th>
            <th>Actions</th>
        </tr>
    </head>
    <body>
    <?php debug ($images); ?>
        <?php foreach ($images as $k => $v): ?>
            <tr>
                <td>
                     <?php switch($v->type){
                    case "pdf": ?>
                    <a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('images/icone_pdf.jpg'); ?>')">
                        <img src = "<?php echo Router::webroot('images/icone_pdf.jpg'); ?>" height="60">
                    </a> ; <?php break;
                    case "image": ?>
                    <a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
                        <img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
                    </a> ; <?php break; } ?>

                </td>
                <td><?php echo $v->name; ?></td>
                <td>
                    <a onclick = "return confirm('Voulez vous vraiment supprimer cette image?');
                    "href = "<?php echo Router::url('admin/medias/delete/'.$v->id);?>">Supprimer</a>
                </td>
            </tr>
        <?php endforeach ?>
    </body>
</table>

<div class ="page-header">
    <h1>Ajouter une image</h1>
</div>

<form action="<?php echo Router::url('admin/medias/index/'.$post_id); ?>" method="post" enctype="multipart/form-data">
    <?php echo $this->Form->input('file','Image',array('type'=>'file'));//nom, label et type ?>
    <?php echo $this->Form->input('name','Titre');//nom et Titre ?>
    <br/>
    <div class="actions">
        <input type="submit" class="btn btn-primary" value="Envoyer">
    </div>
</form>

<script type="text/javascript"  src="<?php echo Router::webroot('js/tinymce/tiny_mce_popup.js'); ?>"></script>

<script type="text/javascript">
// permet de récupérer les variables et de les injecter dans la popups
var FileBrowserDialogue = {
    init : function () {
        // Here goes your code for setting your custom things onLoad.
    },
    sendURL : function (URL) {
        var win = tinyMCEPopup.getWindowArg("window");

        // insert information now
        win.document.getElementById(tinyMCEPopup.getWindowArg("input")).value = URL;

        // are we an image browser
        if (typeof(win.ImageDialog) != "undefined") {
            // we are, so update image dimensions...
            if (win.ImageDialog.getImageData)
                win.ImageDialog.getImageData();

            // ... and preview if necessary
            if (win.ImageDialog.showPreviewImage)
                win.ImageDialog.showPreviewImage(URL);
        }

        // close popup window
        tinyMCEPopup.close();
    }
}

tinyMCEPopup.onInit.add(FileBrowserDialogue.init, FileBrowserDialogue);
</script>