Bonjour, voila j'ai suivis le tuto sur comment crée un MVC je suis au jous 3, tous se passe bien j'arrive a récupéré mes informations de Ma BDD, mais la je rencontre un probleme je bloque, dans mon site j'ai mis un lien pour telechargement d'un pdf voila la structure
dans le fichier view

<td>Programm
<td><a href=<?php echo '"../../download/'.$page->type.DS.$page->annee.DS.$page->programme.'" ';?> target="_blank" ><img src="../../images/images-css/PDF.png"></a></td>

j'explique le pdf se trouve dans: download/regionale($page->type/2014($page->annee)->/programme_2014.pdf,
j'usqu'ici rien de trés sorcier j'ai juste construit mon arboresence sachant que : download se trouve dans webroot jai larboresence suivante
webroot/download/regional/2014/desfichiersPDF
dans la racine de mon site jai les dossiers suivant :
config
controller
core
model
view
webroot
ce que je voudrais c'est que quant je click sur l'icone du pdf il m'ouvre le pdf directement (un href normal quoi ) bin c'est le petit gros probleme il le lien construit dans le href et le fait passé dans le ROUTER.php et lance la fonction loadcontroler voila le code de mon DISPATCHER et du Router

class Dispatcher
{
    var $request; //variable
    function __construct()
    {

        $this->request = new Request();
        Router::parse($this->request->url,$this->request);

        //print_r($this->request );

        //intialisation du controller 
        $controller = $this->loadController();

        if(!in_array($this->request->action,get_class_methods($controller))){
            $this->error('Le controller : '.$this->request->controller.' n\'a pas de méthode nomé :'.$this->request->action); //message d'erreur
        }
        //dynamiser lappel du controller 
        call_user_func_array(array($controller,$this->request->action),$this->request->params);
        //autorender
        $controller->render($this->request->action);
    }

        function error($message){
            $controller = new Controller($this->request);
            $controller->e404($message);
        }

    function loadController()
        {
            $name = ucfirst($this->request->controller).'Controller'; //convention d'ecriture nomController
            $file = ROOT.DS.'controller'.DS.$name.'.php';
            require $file;
            return new $name($this->request);

        }
<?php
 /**
 * pour traité les url recuperer 
 */
 class Router 
 {  
    /**
    *   permet de parser une url 
     *  @param $url Url à parser
     *  @return tableau contenant les paramétres
    **/
    static function parse($url,$request)
        {
            $url = trim($url,'/');//supression des / avec la fonction trim
            $params = explode('/',$url); //exploser l'url
            print_r($params);
        // la structure de l'url controlleur /action r et le tableau qui les contiendra
            $request->controller    = $params[0];
            $request->action        = isset($params[1]) ? $params[1] : 'index'; 
            $request->params        = array_slice($params, 2);
            return true;

        }
 }

voila le lien
http://localhost/MonSite/download/regionale/2014/programme_2014.pdf
voila un print_r(params)

Array ( [0] => download [1] => regionale [2] => 2014 [3] => programme_2014.pdf )
et le die($url) donne
"download/regionale/2014/programme_2014.pdf"

resultas des courses quand je clic sur l'image du pdf jai cette affichage :

Warning: require(/var/www/html/MonSite/controller/DownloadController.php): failed to open stream: No such file or directory in /var/www/html/MonSite/core/Dispatcher.php on line 39

Fatal error: require(): Failed opening required '/var/www/html/MonSite/controller/DownloadController.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/html/MonSite/core/Dispatcher.php on line 39

j'espére ne pas m'etre trop etaler et que c'est claire, Ma question c'est comment faire pour savoir si on se rederige vers une page qui necessite un controller et une vue et une autre ou c'est juste un lien vers un document qu'on veut mettre en telechargement.psk j'ai remarque que sans le dossier 2014 je recuper le pdf normalement il s'affiche sans aucun problém mais desque je rajoute le dossier 2014 le lien et conciderer comme ci c'été controller/action/param1/param2
Mercii

12 réponses


Couss
Réponse acceptée

donc ton htaccess est correct

Par contre peut tu nous faire voir le code HTML de ton lien a mon avis soit il y a une erreur au niveau de l'arboresence soit le fichier existe pas

Couss
Réponse acceptée

Ah tu n'as pas de vhost normalement
essai ca :

<a href="<?= '/MonSite/download/'.$page->type.DS.$page->annee.DS.$page->programme; ?>" target="_blank"><img src="/MonSite/images/images-css/PDF.png"></a>

Mais si tu déplois sur ton serveur cela ne fonctionnera plus

Bonjour,

Si j'ai bien compris tu souhaite afficher le fichier PDF ou en forcé le téléchargement.

Sil essai de passé par le dispatcher c'est que ton lien n'est pas bon car normalement tu a ces lignes dans le fichier .htaccess contenu dans webroot :

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

Cela bloque la réécriture et accès donc au fichier demandé

Pourrais-tu nous copier le code html du lien généré stp

Merci de ta réponse alors je cherche à afficher le PDF dans un nouvel onglet jai le htaccess voila sont contenu
ccelui qui est sur la racine du site

RewriteEngine On
RewriteRule (.*) webroot/$1

et celui a l'interieur du webroot

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/$1 [L]

jai pas bien compris le lien qui affiche les warnig

<?php $title_for_layout = $page->titre ; //** se met dans title?>
<div id="posts">
            <div class="post">              
             <!-- <div class="post_infos">
                Poster par <a class="autheur" href="#">staff</a> le <span class="date">08/08/2013</span>
              </div>-->
              <h2 class="post_title"><?php echo $page->titre; ?></h2>              

              <img src= <?php echo (!empty($page->affiche_detail))?'"../../images/'.$page->type.DS.$page->annee.DS.'article'.DS.$page->affiche_detail.'" '.'style="margin-left:3px"':'"../../images/'.$page->type.DS.$page->annee.DS.'affiches'.DS.$page->affiche.'" '.'style="margin-left:250px"';?> /> </img>

              <table>
                  <tr>
                      <td colspan="3" style="padding-left:200px">11 émes Congrés d'Allergologie de <br> du <?php echo $page->date_debut; ?> au <?php echo $page->date_fin; ?>- <?php echo $page->lieu; ?> - ALGER</td>
                  </tr>
                  <tr>
                      <td>1</td>
                      <td>Programme</td>
                      <td><a href=<?php echo '"../../download/'.$page->type.DS.$page->annee.DS.$page->programme.'" ';?> target="_blank" ><img src="../../images/images-css/PDF.png"></a></td>
                  </tr>
              </table>
            </div>
          </div>

          <div id="side_bar">
            <div id="Categories">
              <h3>CATEGORIES</h3>
              <p>discription ...................</p>
              <ul>
                <li><a href="#"><strong>Categorie deux</strong><span>>></span></a></li>
                <li><a href="#"><strong>Categorie deux</strong><span>>></span></a></li>
                <li><a href="#"><strong>Categorie deux</strong><span>>></span></a></li>
                <li><a href="#"><strong>Categorie deux</strong><span>>></span></a></li>
              </ul>
            </div>
          </div>

voila le contenu de ma vue je suis dans le ficheir view/page/view.php

Alors Mr Couss Merci infiniment tu avais raison y'avais une petite changement dans le nom de fichier sur la base de données c'été p miniscule et au niveu du dossier cété P majuscule Merci infiniment

j'aurais une autre question pour les lien c'est pas trés propre de faire des "../.. " y'aurait il une solution pour y remedier et que sa fasse propre

Normalement ton dossier webroot est à la racine alors ces liens devraient suffir :

<a href="<?= '/download/'.$page->type.DS.$page->annee.DS.$page->programme; ?>" target="_blank"><img src="/images/images-css/PDF.png"></a>

ce lien me met directement sur :http://localhost/download/regionale/2014/Programme_2014.pdf

il sort complètement du répertoire

justement , c'est ma plus grande crainte j'ai jammais fait cella aupart avant esque il y'a une certaine maniere de faire quand on fait passé un site du devlopement à la production

Bonjour Bonjour,
jaurais une autre petite question toujours avec les liens maitnenant je remquer une chose c'est que mes effets jquery fancybox ne s'excute que sur une page pour les autre pages rien du tous je vois qu'il me charge les fichier mais quan je clic rien ne se passe petite precision,
j'utilise le méme model pour toutes mes pages dans la page default.php j ai integré le head avec toutes mes importations link et script
ma question est ec que dnas chaque view je met mes link et mes script psk avec cette methode tous s'execute normalement

dans mon controler

public function render($view){

                if($this->rendered ) {return false;}
                extract($this->vars);

                if(strpos($view,'/')===0)
                    {$view = ROOT.DS.'view'.$view.'.php';}

                    else {$view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view. '.php';}

                ob_start();
                require($view);
                $content_for_layout = ob_get_clean();           
                require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';//recuperation du them par defaut
                $this->rendered = true;                 
            }
/**
    *Permet de charger un model 
    *@param $name nom du model
    * require_once pour charger une foi le model
    **/

    function loadModel($name) {

        //recuper le nom du ficheir $name et chercher le ficher 
        $file = ROOT.DS.'model'.DS.$name.'.php';
        require_once($file);        
        if(!isset($this->$name)){
                $this->$name = new $name();
            } 

    }

dans mon PageControler

class PageController extends Controller
    { // commence par cree une fonction loadmodel 

        function index() //function view correspon a une page php dan le fichier view avec le nom view
        {
            $this->loadmodel('Congre'); //le fichier qui se trouve dans le dossier model
            $this->render('index');

        }

     function view($id) //function view correspon a une page php dan le fichier view avec le nom view
        {
            $this->loadmodel('Congre'); //le fichier qui se trouve dans le dossier model
            $d['page'] = $this->Congre->findFirst(array(
                    'conditions' => array('id'=>$id)
            )); //this->nomModel->action on la met dans posts
            //envois a la vue le contenu du premir element 
            if(empty($d['page']))
                { $this->e404('Page introuvable');

            } else{
                    $this->set($d); //congre c'est la variable par la quelle on recuper le contenu de la base 
                }

        }

        function archives() //function view correspon a une page php dan le fichier view avec le nom view
        {
            $this->loadmodel('Congre'); //le fichier qui se trouve dans le dossier model
            $this->render('archives');

        }

Regarde dans la console du navigateur s'il y a une erreur javascript