IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Variables non lues dans le fichiers routes.xml


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Variables non lues dans le fichiers routes.xml
    Salut tout le monde !

    En fait, je développe une application mais je n'arrive pas à lire les variables présentes dans mon fichiers routes.xml.
    Pourtant, comme c'est ma première application en POO grâce au tuto sur OC, je ne trouve pas d'où vient l'erreur.

    C'est bizarre car la condition renvoi toujours 'TRUE'...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public function getController(){
    	$router = new \Library\Router;
    	$xml = new \DOMDocument;
    	$xml->load(__DIR__.'/../Applications/'.$this->getName().'/Config/routes.xml');
    	$routes = $xml->getElementsByTagName('route');
    	// On parcourt les routes du fichier XML.
    	foreach ($routes as $route){
    		$vars = array();
    		// On regarde si des variables sont présentes dans l'URL.
    		if ($route->hasAttribute('vars')){
    			echo 'TRUE';
    			$vars = explode(',', $route->getAttribute('vars'));
    		}
    		// On ajoute la route au routeur.
    		$router->addRoute(new Route($route->getAttribute('url'), $route->getAttribute('module'), $route->getAttribute('action'), $vars));
    	}
    	echo '<br /><pre>';
    	var_dump($vars);
    	echo '</pre>';
    	try{
    		// On récupère la route correspondante à l'URL.
    		$matchedRoute = $router->getRoute($this->httpRequest->getURI());
    	}
    	catch (\RuntimeException $e){
    		if ($e->getCode() == \Library\Router::NO_ROUTE){
    			// Si aucune route ne correspond, c'est que la page demandée n'existe pas.
    			$this->httpResponse->redirect404();
    		}
    	}
    	// On ajoute les variables de l'URL au tableau $_GET.
    	$_GET = array_merge($_GET, $matchedRoute->getVars());
    	// On instancie le contrôleur.
    	$controllerClass = 'Applications\\'.$this->name.'\\Modules\\'.$matchedRoute->getModule().'\\'.$matchedRoute->getModule().'Controller';
    	return new $controllerClass($this, $matchedRoute->getModule(), $matchedRoute->getAction());
    }
    Vous pouvez télécharger le projet ici : http://mralexan14.hostingsiteforfree.com : SiteSylvainPOO.zip

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Essaie de nous en dire plus. Quel est le problème exactement? Le routing ne fonctionne pas? Tu as des messages d'erreurs? lesquelles?

    Quelle est la valeur de $routes? Et celle de $router une fois qu'il est rempli?

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Les erreurs
    Salut.

    Si tu télécharge mon projet et que tu essayes de lire un billet, on obtient cette erreur :
    TRUE

    array(0) {
    }


    Fatal error: Call to a member function getName() on a non-object in C:\wamp\www\SiteSylvainPOO\Applications\Frontend\Modules\Blog\BlogController.class.php on line 44

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Hello,

    J'ai téléchargé les fichiers mais je ne suis pas allé jusqu'à le tester.

    Le fichier BlogController.class.php que j'ai (issu de SiteSylvainPOO.zip) s'arrête à la ligne 33, donc je ne vois pas d'où vient ton erreur qui se réfère à la ligne 44.

    Ton erreur veut dire aussi que le problème n'est pas dans ta méthode getController, puisque le controlleur est bien appelé. Poste ici (dans un message, pas dans un fichier zip stp) le contenu de BlogController.class.php.

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut $vars : la clé existe !
    Salut !

    En ajoutant la ligne echo $route->getAttribut('vars'), il m'affiche bien "id" ^^

  6. #6
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
    namespace Applications\Frontend\Modules\Blog;
     
    class BlogController extends \Library\BackController
    {
    	public function executeIndex(\Library\HTTPRequest $request)
    	{
    		$billetsNumber = $this->getApp()->getConfig()->get('billets_number');
    		$caractersNumber = $this->getApp()->getConfig()->get('caracters_number');
    		$serverName = $this->getApp()->getConfig()->get('server_name');
    		$serverIp = $this->getApp()->getConfig()->get('server_ip');
     
    		$this->getPage()->addVar('name', 'Liste des ' .$billetsNumber.' derniers billets');
     
    		$manager = $this->managers->getManagerOf('Blog');
     
    		$billetsList = $manager->getList(0, $billetsNumber);
     
    		foreach ($billetsList as $billet)
    		{
    			if (strlen($billet->getContent()) > $caractersNumber)
    			{
    				$begin = substr($billet->getContent(), 0, $caractersNumber);
    				$begin = substr($begin, 0, strrpos($begin, ' ')) . '...';
     
    				$billet->setContent($begin);
    			}
    		}
     
    		$this->getPage()->addVar('billetsList', $billetsList);
    		$this->getPage()->addVar('serverIp', $serverIp);
    		$this->getPage()->addVar('serverName', $serverName);
    	}
     
    	public function executeShow(\Library\HTTPRequest $request)
    	{
    		$billet = $this->managers->getManagerOf('Blog')->getUnique($request->getData('id'));
     
    		if(empty($billet))
    		{
    			echo $request->getData('id');
    		}
     
    		$this->getPage()->addVar('name', $billet->getName());
    		$this->getPage()->addVar('billet', $billet);
    	}
    }
    Voici le contenu de BlogController.class.php

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Ok, ça veut dire que l'id n'est pas transmis au contrôleur dans executeShow
    - première question bête, tu mets bien un id numérique dans l'url?
    - Il faudrait voir si la valeur est bien transmise. Est-ce que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(empty($billet)) {
    			echo $request->getData('id');
    	}
    est appelée ? Sinon, remplace-la par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(!$billet instanceof Library\Entities\Billets) {
       var_dump($billet);
    exit;
    }
    Ça permettra de voir quelle valeur $billet prend.

  8. #8
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Bien vu. Le premier code n'est pas appelé.

    Avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(!$billet instanceof Library\Entities\Billets)
    {
    	echo 'TRUE';
    	var_dump($billet);
    	exit;
    }
    mon application n'affiche rien.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Si, c'est bon signe.

    Ça veut dire qu'un objet billet est correctement créé. Le tout est de savoir maintenant pourquoi getName() ne fonctionne pas. Fais un autre var_dump() de $billet, mais sans la condition cette fois-ci.

  10. #10
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    ^^
    En fait, si, l'application affiche . J'avais juste lancé la mauvaise page.

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Ok.

    donne l'url que tu utilises et var_dumpe $request.

    Ensuite, J'ai l'impression qu'il manque quelque chose dans mon fichier Managers.class.php, $this->managers n'est initialisé nulle part. Peux-tu montrer le contenu de ton fichier?

  12. #12
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Voici l'URL : http://skyzz.fr/billets-2.html
    Le var_dump de $request (en fait, voici toute la page pour que tu ais tout):
    N'existe pas : IDTRUE

    object(Library\HTTPRequest)#2 (1)
    {
    ["application":protected]=> object(Applications\Frontend\FrontendApplication)#1 (5)
    {
    ["httpRequest":protected]=>
    *RECURSION*
    ["httpResponse":protected]=>
    object(Library\HTTPResponse)#3 (2)
    {
    ["page":"Library\HTTPResponse":private]=>
    NULL
    ["application":protected]=>
    *RECURSION*
    }
    ["name":protected]=>
    string(8) "Frontend"
    ["user":protected]=>
    object(Library\User)#4 (1)
    {
    ["application":protected]=>
    *RECURSION*
    }
    ["config":protected]=>
    object(Library\Config)#5 (2)
    {
    ["vars":protected]=>
    array(0)
    {
    }
    ["application":protected]=>
    *RECURSION*
    }
    }
    }

    NULL
    Comme tu peux le voir, le tableau vars est vide ^^

    J'ai mis à jour l'archive. C'est bon ? Sinon, je vais poster le code ^^

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    J'ai pas le temps de tester ton code maintenant (je le ferais demain si ton problème n'est pas réglé), maos ça veut dire que l'id du billet n'est pas transmis du tout au controleur, il n'est même pas ajouté à l'objet requête.

    J'imagine que dans l'url billets-2.html, 2 représente l'id du billet et qu'il y a de l'url rewriting via htaccess derrière pour transformer billets-2.html en billets?id=2 (ou quelque chose de ce genre).

    Le problème vient de là à mon avis: cette transformation n'est pas faite ou est mal faite.

  14. #14
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    En fait, dans le fichier routes.xml, il y a une regex pour la route billet. Et je ne vois pas où ni comment je peux passer cette regex dans la variable id (tout est dans le fichier routes.xml).

    Merci ^_^

  15. #15
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    foreach ($routes as $route)
    {
    	$vars = array();
    	// On regarde si des variables sont présentes dans l'URL.
    	if ($route->hasAttribute('vars'))
    	{
    		echo 'TRUE<br />';
    		echo $route->getAttribute('vars<br />');
    		$vars = explode(',', $route->getAttribute('vars'));
     
    		foreach($vars as $key => $element)
    		{
    			$element[$key] = 'Test';
    		}
    	}
     
    	// On ajoute la route au routeur.
    	$router->addRoute(new Route($route->getAttribute('url'), $route->getAttribute('module'), $route->getAttribute('action'), $vars));
    }
    Voila le code que j'ai modifié dans Application.class.php et pourtant, le var_dump($vars) me renvoie un Array() ! Vide !

    Merci de m'aider. Car dès que ça marchera, j'aurai (je pense) réglé le problème

  16. #16
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Euh...
    C'est pas normal ça. Si ?

    EDIT : Vous n'auriez pas une idée pour qu'au lieu d'avoir la clé ['0'], j'ai la clé ['<nom de la variable>'] ?
    EDIT 2 : Bon, j'ai ajouté la fonction array_flip(); Voici le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    foreach ($routes as $route)
    {
        // On regarde si des variables sont présentes dans l'URL.
        if ($route->hasAttribute('vars'))
        {
            echo 'TRUE<br />';
            echo $route->getAttribute('vars');
            $vars = explode(',', $route->getAttribute('vars'));
     
            $vars = array_flip($vars);
     
            echo '<pre>';
            var_dump($vars);
            echo '</pre>';
     
            foreach($vars as $key => $var)
            {
                $var = 'f';
     
                echo $var;
            }
     
            echo '<pre>';
            var_dump($vars);
            echo '</pre>';                    
        }
     
        // On ajoute la route au routeur.
        $router->addRoute(new Route($route->getAttribute('url'), $route->getAttribute('module'), $route->getAttribute('action'), $vars));
    }
    echo '<br /><pre>';
    var_dump($vars);
    echo '</pre>';
    Mais je n'arrive pas à attribuer à $var[$key] la valeur de la regex. Ni aucune autre valeur d'ailleurs ^^
    En effet, si j'essaye de lui assigner une string, ça ne marche pas... J'ai l'impression qu'en plus c'est tout simple ^^

    EDIT 3 : Voila déjà une chose de faite : je peux assigner la valeur à $vars[$key]. Voici le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    foreach ($routes as $route)
    {
        // On regarde si des variables sont présentes dans l'URL.
        if ($route->hasAttribute('vars'))
        {
            echo 'TRUE<br />';
            echo $route->getAttribute('vars');
            $vars = explode(',', $route->getAttribute('vars'));
     
            $vars = array_flip($vars);
     
            foreach($vars as $key => $var)
            {
                $vars[$key] = $route->getAttribute('url');
            }                
        }
     
        // On ajoute la route au routeur.
        $router->addRoute(new Route($route->getAttribute('url'), $route->getAttribute('module'), $route->getAttribute('action'), $vars));
    }
    echo '<br /><pre>';
    var_dump($vars);
    echo '</pre>';
    Maintenant, le var_dump($vars) affiche :
    array(1)
    {
    ["id"]=>
    string(23) "/billets-([0-9]+)\.html"
    }
    Sauf que j'aimerais prendre seulement la regex. Et preg_match renvoi un bool ^^ Et je me demandais si preg_grep pouvais faire l'affaire ^^.
    Merci

    EDIT 4 : J'ai toujours un problème avec le fait que $billet n'est pas une instance de Billet ^^

    Merci de voir ce que tu peux trouver ^^

    Déjà, j'ai trouvé que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if($billet = $query->fetch())
    {
    	$billet->setCreationDate(new \DateTime($billet->getCreationDate()));
    	$billet->setModificationDate(new \DateTime($billet->getModificationDate()));
     
    	echo '$billet = $query->fetch();';
     
    	return $billet;
    }
    ne se valide pas --". Donc ça retourne null;

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/10/2012, 11h42
  2. Assigner a une variable une valeur lue dans un fichier texte
    Par mapotam dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 22/12/2009, 14h46
  3. PHP non interprété dans un fichier XML
    Par Peyothe dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 03/06/2009, 20h43
  4. [Properties] Mise a jour de variable de config dans un fichier
    Par tripop dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 03/02/2005, 11h28
  5. [Servlet] Erreur dans le fichier web.xml
    Par Crazyblinkgirl dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 05/07/2004, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo