Bonjour tout le monde,

J'ai suivi le superbe tuto concernant la création d'un calendrier en PHP tout fonctionne sauf une chose....
Déja lorsque je lance depuis wamp en localhost cela ne me renvoie pas à mon projet fini mais à mes sous dossier auquel je peux accéder par la suite. C'est à dire que lorsque je clique sur Mes projet je vois apparaître:

Index of /Nouveau dossier

[ICO] Name Last modified Size Description

[PARENTDIR] Parent Directory -

[DIR] public/ 2018-05-12 18:14 -

[DIR] src/ 2018-05-11 21:05 -
s
Apache/2.4.33 (Win32) PHP/7.2.4 Server at localhost Port 80

Et de même lorsque je clique sur mes liens qui sont censés me rammener au mois suivant je me retrouve sur le localhost....

12 réponses


Salut,
les fichiers de ton projet ils sont placés directement dans le dossier www ou ils sont placés dans un sous-dossier de ce dernier ?

Dans mon répertoire il y a un dossier qui contient alors deux sous dossiers qui contiennent eux mes programmes :)
J'ai essayé de mettre mes sous dossiers directement dans le www mais cela ne fonctionne pas

Salut,

lorsque je lance depuis wamp en localhost cela ne me renvoie pas à mon projet fini mais à mes sous dossier auquel je peux accéder par la >suite.

Oui, en fait ce comportement est normal.
wamp est ton serveur local, et tu peux créer plein de sites différents, il faut bien un moyen de pouvoir aller dans le dossier de celui que tu veux.

Si tu veux un lien direct vers un de tes sites,
tu y vas une fois "à la main" (comme tu fais), et tu créer un lien direct dans ta "barre personnelle" de ton navigateur.

Et de même lorsque je clique sur mes liens qui sont censés me rammener au mois suivant je me retrouve sur le localhost....

Ça par contre effectivement c'est ennuyeux...

Par contre sans le code, on ne peut évidemment pas comprendre le problème.
Du coup je te propose de créer une constate dans ton fichier "index.php", qui te servira pour écrire tous tes liens.

1) Tu te créer un nouveau dossier, spécialement pour tous tes sites (par exemple "my_projects", ou "work", ou autres...), à cet emplacement là :
C:\wamp64\www\work
Attention au chemin, change-le s'il faut, je ne suis pas sûr que ce soit exactement ça (notemment pour 32/64 bits).

2) Dans ton fichier index.php, tu créer 1 constante (qui te servira pour écrire tes liens), comme ceci :

<?php
define('BASE_URL', '/work/mon_site/'); 
?>

("work", ou "my_projects" ou autres...
et remplace "mon_site" par le nom de ton site)

3) Dans tes pages où tu écris des liens, tu les écris comme ceci :

<?php
// pour un lien qui irai vers le mois suivant, quelque chose dans ce genre :
echo '<a href="' . BASE_URL . 'Calendrier?mois=suivant">Mois suivant</a>';
?>

Je vais essayer de faire ça merci :)
Mon code se résume à ça :

index.php dans C:\wamp\www\Index\public\index.php

<?php 

require'..\src\Date\Month.php';
try // on va essayer de récupérer le mois
{
    $month = new App\Date\Month($_GET['month']?? null,$_GET['year']?? null); // si valeur défini alors cela prendra la valeur [] sinon cela prendra la valeur nulle
    $start =$month->getStartingDay()->modify('last monday'); // on récupère le premier jour, le premier avril or on cherche le premier lundi, on utilse donc le modify
}

catch(\Exception $e) // si on ne rentre pas le bon mois
{
    $month= new App\Date\Month();   // cela passe par défaut à la date d'aujourdh'hui si la peronne rentre un mois faux
}
?>

<div class="d-flex flex-row align-items-center justify-content-between mx-sm-3">

<h1><?=$month->toString();?></h1> <!-- Nous retourne alors le mois en chaine de caractère grâce à toSting -->

    <div class="flèche">

        <a href="/index.php?month=<?= $month->previousMonth()->month;?>&year=<? $month->previousMonth()->year;?>"class"btn btn-primary">&lt;</a>
        <a href="/index.php?month=<?=$month->nextMonth()->month;?>&year=<?$month->nextMonth()->year;?>""class"btn btn-primary">&gt;</a>

    </div>

</div>

<table class="calendar__table calendar__table--<?$month->getWeeks();?>weeks"> <!-- tableau à 7 colonne pour les jour mais avec des lignes qui varient car des mois ont 5 semaines et d'autres 6 -->
    <?php for ($i=0; $i<$month->getWeeks(); $i++): ?><!-- pour i allant de 0 à i strictement inférieur au nombre de semaine-->
        <tr>
            <?php 
            foreach($month->days as $k => $day):
                $date=(clone$start)->modify("+".($k+$i*7). "days")
            ?> <!--les différents jour de la semaine qui vont s'afficher-->
            <td class="<?=$month->withinMonth($date)? '':'calendar__othermonth';?>">
                <div class="calendar__weekday"><?=$day;?></div> <!-- on utilise des div pour mieux utilser-->

                <div class="calendar__day"><?=$date->format('d');?></div> <!-- nous donne le numéros du jour-->

            </td>
            <?php endforeach;?>
        </tr>
    <?php endfor;?>

</table>
</body>
</html> 

Month.php dans C:\wamp\www\Index\src\Date\Month.php

<?php

namespace App\Date;

class Month
{
    //public accessible depuis l'extérieur du programme et non les  propriétés privées
    public  $days= ['Lundi','Mardi','Mecredi','Jeudi','Vendredi','Samedi','Dimache'];
    private $months = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novemebre','Décembre']; //tableau pour connaître l'ensemble des mois en français
    public $month; //déclare les variables
    public $year;

    public function __construct ($month=null,$year=null) //On définit le constructeur, ce qui permet de construire notre objet, ici le moi dans () on définit les paramètres, un entier mois et un entier l'année
    {
        if ($month===null||$month<1||$month>12)
        {
            $month=intval(date('m')); // je viens alors lui donner une valeur par défaut ici le mois
        }
        if ($year==null)
        {
            $year=intval(date('Y')); // je viens alors lui donner une valeur par défaut ici je lui demande l'année à 4 chiffres
        }
    // On travail après avec des entiers c'est pour cela que l'on va convertir avec intval() les mois et dates qui étaient en chaine de caractères

        if ($month <1 || $month>12)
        {
            throw new \Exception("le mois $month n'est pas valide"); // pour ne pas avoir d'erreur
        }   
        if($year<1970)
        {
            throw new \Exception("l'année est inférieur à 1970");
        }   
        $this->month=$month;//accède à la propriété mois et elle prend la valeur qui étais passée au niveau du conducteur et du coup son bien défini en dehors de la boucle
        $this->year=$year;
    }
    public function getStartingDay() // retourne qqc de type Datetime, renvoie le premier jour du mois 
    {
        return new \Datetime("{$this->year}-{$this->month}-01");// on créer une nouvelle date qui sera notre début du mois, avec l'année, le mois qui commence tjrs par 1
    }

    public function toString() // retourne le mois en tt lettre, chaîne de caractère
    //si je veux mettre ça en chaîne de caractère j'ai besoin de savoir le mois et l'anné du mois
    {
        return $this->months[$this->month-1].''.$this->year;     // mois 1 est en fait l'indice 0
    }   

    public function getWeeks () // on créer une méthode qui vient récupérer les semaines
    {
        $start=$this->getStartingDay();
        $end=(clone $start)->modify('+1 month -1 day'); // la date de fin on récupère la date de début que l'on clone sinon on va la modifier et on lui rajoute un mois et on lui enlève un jour pour aller au dernier jour du mois en cours
        $weeks=intval($end->format('W'))- intval($start->format('W'))+1; // intval car cela retourne des chaîne de caractère, nous retourne le nuéros de la semaine de fin

        if($weeks<0) // permet de débuger si au mois de janvier la semaine ne commence pas par un lundi 
        {
            $weeks=intval($end->format('W')); 
        }   
        return $weeks; // nous retourne alors le nombre de semaine du mois
    }
    // on met un antislash avant car c'est une classe de php et non une classe se situant dans notre namespace

    public function withinMonth(\DateTime $date) // prend en paramètre une date et nous retourne un booléen --> es ce que le jour est dans le mois en cours
    {
        //on compare le mois et l'année de notre date au mois et à l'année que l'on a  au moment ou on retoune une date avec les autres fonctions
        return $this->getStartingDay()->format('Y-m')===$date->format('Y-m'); // on récupère le getStarting day et on le formate en année et mois puis on la compare à notre date et on regarde si il y a correspondance
    }
    public function nextMonth() // retourne un mois après lorsque l'on change 
    {
        $month=$this->month+1;
        $year=$this->year;
        if($month>12)
        {
            $month=1;
            $year+=1;
        }
        return new Month($month,$year);
    }
    public function previousMonth() // retourne un mois avant lorsque l'on change 
        {
            $month=$this->month-1;
            $year=$this->year;
            if($month<1)
            {
                $month=12;
                $year-=1;
            }
            return new Month($month,$year);
        }
}

et efin mon css

.calendar__table
{
    width:100%;
    height: calc(100vh - 128px);

}

.calendar__table td
{
    padding: 10px;
    border:1px solid #CCC;
    vertical-align:top;
    width:14.29%;
    height:20%;

}

.calendar__table--6weeks td
{
    height: 16,6666667%;
}
.calendar__weekday
{
    font-weight:bold;
    color:#545454;
    font-size:0.7em;
}

.calendar__othermonth .calendar__day
{
    opacity: 0.3;

}   

.calendar__day
{
    background: #ccc;
}
.date-today 
{
    color: grey;
}   

Du coup je ne trouve pas comment faire .... je suppose que mes liens ne marches pas ou qqc dans le genre.

  • Est-ce que tu peux essayer de redire ce que tu voudrais faire, et ce qui se passe ?
  • Le code associé au calendrier, il est écrit dans le fichier "index.php" ?
  • Tu utilise un système de routeur ou pas ? (je voudrai comprendre comment fonctionne tes liens)
  • Est-ce que tu as des liens qui ne vont PAS vers localhost ? (Ou ils y vont tous ?)
  • Est-ce que tu peux montrer la "structure des dossiers du site" ? (au moins les fichiers index.php, et 1 ou 2 autres qui te semblent pertinents)

Alors du coup le problème principal sont mes deux liens à la ligne 16 et 17. Ils sont sous forme de flèche et sont censés, lorsque je clique, me rammener au mois précédent ou prochain. Le problème est que ces liens me rammène au menu du local Host.....
Oui le code associé au calendrier est dans index.php, de plus il ne me semble pas utiliser de routeur.
Je n'ai que trois liens dans mon calendrier dont les 2 qui posent problèmes. L'autre est un lien qui ne me renvoie à rien et qui reste sur la page.

<nav class="navbar navbar-dark bg-primary mb-3"><!-- On creer une balise nav avec ç l'interieur différente classes -->
    <a href="" class="navbar-brand">Mon calendrier</a> <!-- Lien pour avoir le titre de notre ite -->

</nav>

Mon dossier dans le répertoire s'appelle work, dedans on a deux dossiers, un se nommant public et un aurtre src. Public contient mon index.php ainsi qu'un autre sous dossier CSS contenant mon calendar.css. Enfin dans src on trouve un dossier Date contenant le Month.php
Je ne comprend pas ce que vous voulez dans ''Structure des dossiers du site"

apache fonctionne avec des vhosts.

si tu met tes projets dans le dossier www, le localhost correspond a ton vhost principal et si tu veux accéder a tes projets c'est localhost/projet1/index.php.

il est tout a fait normal que quand tu appel href="/" tu soit rediriger vers localhost/

il faut t'interesser aux vhost pour pouvoir avoir plusieur "localhost" (meme si c'est pas vraiment le terme)

ainsi tu pourra dire que projet1.localhost.fr correspond a ton dossier www/projet1 dans wamp. dans ton vhost tu lui dit d'ecouter cette adresse et tu indique dans ton fichier hosts (sous windows : C:/windows/system32/etc/drivers/hosts) la ligne suivant :

127.0.0.1 projet1.localhost.fr

ce qui veut dire "renvoit projet1.localhost.fr sur localhost"

ton href="/" te redirigeras bien comme il faut sur ton projet

sinon tu peux aussi dire : <a href="projet1/index.php" mais le jour ou tu va vouloir le mettre en prod, il va falloir repasser sur toussssssssss tes liens...

Je ne comprend pas ce que vous voulez dans ''Structure des dossiers du site"

Je pense que j'aurai du dire : "Arborrescence du site".
Mais ça va tu as bien répondu à ma question ^^

mais le jour ou tu va vouloir le mettre en prod, il va falloir repasser sur toussssssssss tes liens...

C'est pour ça que j'avais proposé de définir une constante "BASE_URL" dans "index.php".
Comme ça le jour où il passe en prod, il suffira de modifier cette constante.
Mais on peut aussi, bien sûr, passer par les vhost.
La solution "vhost" est plus "propre".
La solution "BASE_URL" est moins "compliqué" à mettre en oeuvre quand on débute.

Bon alors, Kimi-Chan,
si tu laisse tes 2 dossiers "public", et "src" dans le dossier "www", c'est à dire :
C:\wamp\www\work\public\..., et
C:\wamp\www\work\src\...
et si tu définit une constante "BASE_URL" dans "index.php",
alors, il faut la définir de cette façon :

// index.php
define('BASE_URL', '/work/'); 

Et l'utiliser de cette façon :

<?php
// pour un lien qui irai vers le mois suivant, quelque chose dans ce genre :
echo '<a href="' . BASE_URL . 'public/index.php?mois=suivant">Mois suivant</a>';
?>

Est-ce que tu comprends ?

Par contre,
comme je disais, c'est "mieux" (voir bien trop important pour ne pas le faire) de regrouper tes 2 dossiers "public" et "src", dans un seul dossier (qui porte le nom de ton site).
Si tu fais ça, alors on aura plutôt :
C:\wamp\www\work\mon_site\public\..., et
C:\wamp\www\work\mon_site\src\...
du coup :

<?php
// index.php
define('BASE_URL', '/work/mon_site/'); 
?>

Et l'utiliser de cette façon (de la même façon en fait, d'où l'intérêt de cette constante "BASE_URL". Elle restera la même façon de l'utiliser même en production) :

<?php
// pour un lien qui irai vers le mois suivant, quelque chose dans ce genre :
echo '<a href="' . BASE_URL . 'public/index.php?mois=suivant">Mois suivant</a>';
?>

(Bien sûr, change "mon_site", par le nom qui te convient).
Tu vois comment ça fonctionne ?

Pourquoi regrouper "public" et "src" dans un dossier qui porte le nom du site ?
Parce-que :
1) Quand tu aura plusieurs sites différents sur ta machine, c'est comme ça que tu les séparent.
2) Quand tu déploiera ton site en ligne, tu veux pouvoir déplacer ton site en un seul dossier (sinon tu va probablement avoir des problèmes de liens et/ou d'accès fichiers, c'est la galère !)

Mais,
puisque le code du calendrier est dans ...\public\index.php,
qu'est-ce qu'il y a dans ...\src\Date\Month.php ??
Ça me semble étrange.

Oui j'avais déjà créer un dossier qui s'appelait Index dans work et qui regroupait tout mes fichiers.
Du coup dans le src il y a juste un dossier Date qui contient mon Month.php et c'est tt, c'est le dossier qui contient toutes mes fonctions.

Par contre je n'arrive pas à mettre ma balise PHP au niveau des deux liens.... si je met une balise <?php il prend le -> pour la fin du <a> .... et du coup je ne peux pas insérer ma balise echo pour tester ce que tu me conseilles

Zut, je n'ai rien compris.