Bonsoir à tous, je m'appelle Dan et je suis nouveau sur le forum.
Je cherche à appeler une classe spécifique contenant les informations de mon panier depuis un script Paypal extérieur.
J'ai donc suivi le tutoriel de Grafikart sur l'autoloader de composer mais j'ai rencontré une erreur.
(A noter : j'ai également téléchargé l'extension "PHP Namespace Resolver" mais il ne trouve pas mes class et me renvoie "The class is not found"

Voici mon code composer.json

{
    "name": "dan/shop",
    "description": "pour shop",
    "authors": [
        {
            "name": "dan",
            "email": "daniel@gmail.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "App\\": "pages/"
        }
    },
    "require": {}
}

Voici un extrait mon script panier.php au niveau de la classe Panier

<?php
namespace App;
require_once("../include/header.php");
require_once("../include/functions_panier.php");

class Panier{

  public $nbProduits;
  public $total;
  public $totaltva;
  public $shipping;

  public function myshop(){

    $nbProduits = count($_SESSION['panier']['libelleProduit']);

    if($nbProduits <= 0){
?>
        <li class="list-group-item d-flex justify-content-between lh-condensed">
        <div>
            <h6 class="my-0" style="color:Red;">Oups, panier vide !</h6>
        </div>
        </li>
<?php
    }else{

            $total = MontantGlobal();
            $totaltva = MontantGlobalTVA();
            $shipping = CalculFraisPorts();

            for($i = 0; $i<$nbProduits; $i++){
?>
                <li class="list-group-item d-flex justify-content-between lh-condensed">
                <div>
                  <h6 class="my-0"><?php echo $_SESSION['panier']['libelleProduit'][$i]; ?></h6>
                  <small class="text-muted"><b><i>Quantité: <?php echo $_SESSION['panier']['qteProduit'][$i]; ?></i></b></small>
                  <a href="panier.php<?php echo "?id=".$_SESSION['id']; ?>&action=suppression&amp;l=<?php echo rawurlencode($_SESSION['panier']['libelleProduit'][$i]); ?>"><small class="text-warning">Supprimer l'article</small></a>
                </div>
                <span class="text-muted"><?php echo $_SESSION['panier']['prixProduit'][$i]." $"; ?></span>
                </li>

<?php 
        }
?>
            <li class="list-group-item d-flex justify-content-between lh-condensed">
            <div>
                <h6 class="my-0">Total :</h6>
            </div>
            <span class="text-muted"><?php echo $total." $"; ?></span>
            </li>
            <li class="list-group-item d-flex justify-content-between lh-condensed">
            <div>
                <h6 class="my-0">Calcul des frais de port :</h6>
            </div>
            <span class="text-muted"><?php echo $shipping." $"; ?></span>
            </li>
            <li class="list-group-item d-flex justify-content-between">
            <span>Total avec TVA (USD)</span>
            <strong><?php echo $totaltva." $"; ?></strong>
            </li>
            <li class="list-group-item d-flex justify-content-between bg-light">
            <div class="text-success">
                <h6 class="my-0">Promo code</h6>
                <small>EXAMPLECODE</small>
            </div>
            <span class="text-success">-5$</span>
            </li>
        </ul>

        <form class="card p-2">
            <li class="list-group-item d-flex justify-content-between">
            <span>TVA</span>
            <strong><?php echo $_SESSION['panier']['tva']."%"; ?></strong>
            </li>
        </form>
    </br>
    <form class="card p-2">
        <div class="input-group">
        <input type="text" class="form-control" placeholder="Promo code">
        <div class="input-group-append">
            <button type="submit" class="btn btn-secondary">Redeem</button>
        </div>
        </div>
    </form>
    </br>
    <form class="card p-2">
            <li class="list-group-item d-flex justify-content-between">
            <span></span>
            <a href="panier.php<?php echo "?id=".$_SESSION['id']; ?>&deletepanier=true"><span class="text-danger"><strong>Supprimer le panier</strong></span></a>
            </li>
    </form>
<?php
    }
}

public function info(){
$nbProduits = count($_SESSION['panier']['libelleProduit']);
$total = MontantGlobal();
$totaltva = MontantGlobalTVA();
$shipping = CalculFraisPorts();
}
}
?>

Voici un extrait du script paiement.php depuis lequel j'appelle la classe Panier

<?php
require __DIR__  . '/pay/vendor/autoload.php';
require __DIR__  . '/functions_panier.php';
$ids = require ('fonction_api.php');
require 'vendor/autoload.php';

use App\Panier;

$valeur = new Panier();
?>

Et enfin voici les deux erreurs que je reçois

 Warning: require_once(../include/header.php): failed to open stream: No such file or directory in C:\wamp64\www\vinted_africain\pages\panier.php on line 3

 Fatal error: require_once(): Failed opening required '../include/header.php' (include_path='.;C:\php\pear') in C:\wamp64\www\vinted_africain\pages\panier.php on line 3

Je pense que normalement je n'aurais pas dû avoir d'erreur et au moins avoir un page blanche de redirection puisque cette classe ne sert qu'à relever des valeurs stockées dans des variables via la public function info().

Merci d'avance pour vos réponses !

5 réponses


DyceNoman
Réponse acceptée

Bonjour,

Assez rapidement, j'ai pas tout saisi sur le chemin de tes fichiers, mais tout d'abord, pour plus de clarté met l'autoloader (vendor/autoload.php) en première ligne, ensuite pour que composer comprenne que tu te sert de namespace custom, il te faut taper dans ton terminal de ton projet : composer dump-autoload -o.
Fait déjà cela et on en reparle après.

Seivall
Auteur

Merci pour votre réponse lolo3129
Justement jusqu'à lors, le script fonctionne sans erreurs alors je ne sais pas trop pourquoi il y'a celle-ci. Je pense peut-être qu'il s'agirait d'un problème de variable de Session, sinon qu'n pensez-vous ?
Voici la partie PHP du code header.php

<?php
session_start();
try{
    $bdd =  new PDO('mysql:host=127.0.0.1;dbname=vinted_membre;charset=utf8', 'root', '');
    $bdd->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); //Les noms des champs seront en caractères minuscules
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Les erreurs lanceront des exceptions
}
catch(Exception $e){
    die('Une erreur est survenue');
}

if(isset($_GET['id']) AND $_GET['id'] > 0)
{
    $getid = intval($_GET['id']);
    $requser = $bdd->prepare('SELECT * FROM users WHERE id= ?');
    $requser->execute(array($getid));
    $userinfo = $requser->fetch();
}
?>

La partie HTML est juste celle d'une en-tête normale et ne peut donc pas générer d'erreur.
En revanche vers la fin du code header.php j'ai une dernière fois recours au PHP pour rediriger un utilisateur extérieur n'ayant pas d'id.

<?php
    if(isset($_SESSION['id']) AND $userinfo['id'] == $_SESSION['id'])
    {
?>
                <ul class="nav navbar-nav navbar-right">
                            <li><a class="nav-link" href="../admin/user.php<?php echo "?id=".$_SESSION['id']?>"><span class="glyphicon glyphicon-user"> <?php echo $userinfo['pseudo'] ?> </a></span></li>
                </ul>
<?php
    }
    else
    {
?>
                <ul class="nav navbar-nav navbar-right">
                            <li><a class="nav-link" href="../admin/inscription.php"><span class="glyphicon glyphicon-user"> S'inscrire</a></span></li>
                            <li><a class="nav-link" href="../admin/login.php"><span class="glyphicon glyphicon-log-in"> Se connecter</a></span></li>
                </ul>
<?php
    }
?>

Alors je ne comprends toujours pas pourquoi la déclaration de la variable $valeur dans le script paiement.php déclare cette erreur.
Merci d'avance et bonne soirée.

Seivall
Auteur

Bonsoir DyceNoman merci de votre réponse je viens de la voir et je ferai ce que vous m'avez dis !

Seivall
Auteur

Merci beaucoup DyceNoman vous venez de régler mon soucis avec composer. J'ai créé un fichier test.php pour tester l'appelle de la classe

<?php
namespace App;

class A{

    public function Affiche(){
        echo'Jai faim';
    }
}

?>

Et je l'ai appellé dans le script paiement.php

<?php
require 'vendor/autoload.php';
require __DIR__  . '/pay/vendor/autoload.php';
require __DIR__  . '/functions_panier.php';
$ids = require ('fonction_api.php');

use App\A;

$valeur = new A();

Cependant, lorsque j'ai essayé avec la classe de mon Panier j'ai obtenu la même erreur que dans le premier message et cela m'amène à dire que lolo3129 a raison. Pouvez-vous s'il vous plaît m'aider avec cette erreur ? Le problème viendrait-il du fait que j'ai mis un système de session dans le header.php pour détecter les utilisateurs ? Merci d'avance !

Bonjour Seivall, je n'avais pas reçu les notifications, so pour répondre à ta problématique d'appel de classe, tu dis avoir créer un fichier du nom de test.php mais est ce qu'il se trouve bien dans le dossier pages ?
Après possible que lolo3129 est raison, mais encore une fois, je n'est pas connaissance de la hiérachie de ton projet, tape la commande tree (si tu a le package) ou find . -type d | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"