Bonjour,
Voila je rencontre un petit problème avec mon code.
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
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 ;)
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.
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 ;)
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.
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.
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.
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>