PHP Twig

Résolu/Fermé
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 - 17 avril 2018 à 11:45
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 - 18 avril 2018 à 18:16
Bonjour,
Je suis en train de tester Twig, dans l'ensemble cela marche, cependant
j'ai un souci avec l'affichage d'une fonction à l'intérieur d'une classe PHP.
1 - Source de la classe Month :
<?php

namespace Calendrier;

class Month extends Date
{
public $year;
public $month;
public function __construct(?int $year = null)
{
if ($year === null) {
$year = intval(date('Y'));
}
$this->year = $year;
}
public function getFirstSemDays()
{
$year = $this->year;
$toDay = date('Ymd');
$result = '';
for ($mo = 1; $mo <= 1; $mo++) {
$result .= '<div class="month">';
$result .= '<div class="month__head">';
$result .= '<i class="fa fa-calendar"></i>';
$result .= '<span class="month__head-month">';
$result .= $this->rtvMonthName($mo);
$result .= '</span>';
$result .= '<span class="month__head-day">jour</span>';
$result .= '<span class="month__head-sem">sem</span>';
$result .= '</div><!-- /.month__head-->';
for ($i = 1; $i <= $this->getNumDays($mo); $i++) {
$x = ($i < 10 ? '0' : '') . $i;
$mois = ($mo < 10 ? '0': '') . $mo;
$date = $year . $mois . $x;
$j = date('j',strtotime($date));
$n = date('N',strtotime($date));
$w = intval(date('W',strtotime($date)));
$doy = intval(strftime("%j",strtotime($date)));
$day = $this->days[$n];
if (in_array($date,$this->getFeries())) {
$result .= '<div class="days green">';
} elseif ($date == $toDay) {
$result .= '<div class="days yellow">';
} else {
$result .= '<div class="days">';
}
$result .= '<span class="day">' . $day . '</span>';
$result .= '<span class="nday">' . $j . '</span>';
$result .= '<span class="jour">' . $doy . '</span>';
$result .= '<span class="sem">' . $w . '</span>';
$result .= '</div><!-- /.days -->';
}
$result .= '</div><!-- /.month -->';

return $result;

2 - Source index.php:
<?php
// Autoloading
require './src/bootstrap.php';

// Initialisations
// Dates
$date = new Calendrier\Date();
$today = $date->getDate();
$sem = $date->getWeek();
$day = $date->getDayNum();
$reste = $date->reste();

// Mois
$month = new Calendrier\Month($_GET['year'] ?? null);
$year = $_GET['year'] ?? date('Y');
$dref = $year . '0630';

$semestre1 = $month->getFirstSemDays();

//$sem2 = $month->getSecondSemDays();

$previous = $month->previousYear();
$next = $month->nextYear();

$title = 'Calendrier';
$titre = $title . '' . $year;

// URL
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$url = sprintf("%s%s%s","http://",$host,$uri);
$http = explode('/',$url);
$url = $http[0] . '//' . $http[2] . '/' . $http[3];

// Routing
$page = 'home';
if (isset($_GET['p'])) {
$page = $_GET['p'];
}

// Rendu du template
$loader = new Twig_Loader_Filesystem(__DIR__ . '/templates');
$twig = new Twig_Environment($loader, [
'cache' => false //__DIR__ . '/tmp'
]);

if ($page === 'home') {
echo $twig->render('home.twig', [
'date' => $today,
'sem' => '(Semaine: ' . $sem . ')',
'day' => ' (Jour : ' . $day . ')',
'reste' => ' (' . $reste . ')',
'titre' => $titre,
'title' => $title,
'url' => $url,
'previous' => $previous,
'next' => $next,
'semestre1' => $semestre1
]);

L'affichage retourné :

Alors que j'aurias aimé voir ceci :


Merci de votre aide

Cordialement
A voir également:

1 réponse

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
17 avril 2018 à 11:55
Bonjour,

Déjà ... sans voir ton template... difficile de te répondre.

Ensuite... l'interret de Twig .. c'est de séparer la partie PHP du html ... donc générer du html dans ton PHP... ce n'est pas la bonne pratique ( mais alors.. pas du tout !!)
Normalement, tu ne devrais retourner qu'un array ... et dans ton template Twig utiliser les "boucles" et les "blocks" pour générer le contenu.

0
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 15
17 avril 2018 à 13:27
Bonjour,
Voilà mes templates :
1 - layout.twig
<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    {% block head %}{% endblock %}
    <!-- Typographie -->
    <link href="https://fonts.googleapis.com/css?family=Open+Sans|Lato:300,400,700|Roboto:100,300,400,500,700" rel="stylesheet">
    <!-- Icones -->
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
    <!-- Favicon -->
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">    
    <!-- Styles CSS -->
    <link rel="stylesheet" href="css/normalize.min.css">
    <link rel="stylesheet" href="css/calendrier.css">
    <!-- Scripts -->
    {% block javascripts %}{% endblock %}
    
  </head>
  <body>

  {% block content %}{% endblock %}

  {% block semestre1 %}{% endblock %}

  {% block foot %} {% endblock %}

2 - home.twig :
{% extends 'layout.twig' %}
{%  block javascripts %}
  <script src="{{ ('js/date.js') }}"></script>
{% endblock %}

{% block head %}
   <title>{{ title }}</title>
{% endblock %}

{% block content%}
   <div class="container">
      <header class="header">
      <div class="header__top">
         <div class="header__top-date">
         {{ date }} <br>
         {{ sem ~ day ~ reste }}
         </div><!-- /.header__top-date -->
         <div class="header__top-titre text-center">
            <a href="/"><i class="fa fa-calendar"></i> {{ titre }} </a>
         </div><!-- /.header__top-titre -->
         <div class="header__top-time">
            <i class="fa fa-clock-o"></i> <span id="time"><script>window.onload=dspTime('time')</script></span>
         </div><!-- /.header__top-time -->
      </div><!-- /.header__top -->
      </header><!-- /header -->
      <nav class="nav">
         <div class="previous__year">
            <a href="{{ url }}/?year={{ previous }}"><Précédent></a>
         </div><!-- /.previous__year -->
         <ul class="menu">
            <li class="active"><a href="#sem1" id="sema">Semestre 1</a></li>
            <li><a href="#sem2" id="semb">Semestre 2</a></li>
            <li><a href="#feries" id="fera">Jours fériés</a></li>
         </ul><!-- /.menu -->
         <div class="next__year">
            <a href="{{ url }}/?year={{ next }}"><Suivant></a>
         </div><!-- /.previous__year -->
      </nav><!-- /.nav -->
    <section id="sem1" class="section">
     <h1 class="text-center">Premier Semestre</h1>
     <hr class="hr">
     {% extends 'layout.twig' %}
{%  block javascripts %}
  <script src="{{ ('js/date.js') }}"></script>
{% endblock %}

{% block head %}
   <title>{{ title }}</title>
{% endblock %}

{% block content%}
   <div class="container">
      <header class="header">
      <div class="header__top">
         <div class="header__top-date">
         {{ date }} <br>
         {{ sem ~ day ~ reste }}
         </div><!-- /.header__top-date -->
         <div class="header__top-titre text-center">
            <a href="/"><i class="fa fa-calendar"></i> {{ titre }} </a>
         </div><!-- /.header__top-titre -->
         <div class="header__top-time">
            <i class="fa fa-clock-o"></i> <span id="time"><script>window.onload=dspTime('time')</script></span>
         </div><!-- /.header__top-time -->
      </div><!-- /.header__top -->
      </header><!-- /header -->
      <nav class="nav">
         <div class="previous__year">
            <a href="{{ url }}/?year={{ previous }}"><Précédent></a>
         </div><!-- /.previous__year -->
         <ul class="menu">
            <li class="active"><a href="#sem1" id="sema">Semestre 1</a></li>
            <li><a href="#sem2" id="semb">Semestre 2</a></li>
            <li><a href="#feries" id="fera">Jours fériés</a></li>
         </ul><!-- /.menu -->
         <div class="next__year">
            <a href="{{ url }}/?year={{ next }}"><Suivant></a>
         </div><!-- /.previous__year -->
      </nav><!-- /.nav -->
    <section id="sem1" class="section">
     <h1 class="text-center">Premier Semestre</h1>
     <hr class="hr">
     <div class="mois">
       {{ semestre1 }}
     </div><!-- /.mois -->
   </section><!-- /#sem1 /.section -->
   <section id="sem2" class="section">
     <h1 class="text-center">Deuxième Semestre</h1>
     <hr class="hr">
     <div class="mois">

     </div><!-- /.mois -->
   </section><!-- /#sem1 /.section -->
{% endblock %}
{% block foot %}
        <footer class="footer text-center">
          <p>© Copyright. <a href="{{ url }}">{{ title }} {{ "now" | date('Y') }}</a>. Tous Droits Réservés.</p>
        </footer><!-- /footer -->
      </div><!-- /.container -->
      <!-- Scripts -->
      <script src="js/jquery-3.2.1.min.js"></script>
      <script src="js/calend.js"></script>
   </body>
</html>
{% endblock %} 
   </section><!-- /#sem1 /.section -->
   <section id="sem2" class="section">
     <h1 class="text-center">Deuxième Semestre</h1>
     <hr class="hr">
     <div class="mois">

     </div><!-- /.mois -->
   </section><!-- /#sem1 /.section -->
{% endblock %}
{% block foot %}
        <footer class="footer text-center">
          <p>© Copyright. <a href="{{ url }}">{{ title }} {{ "now" | date('Y') }}</a>. Tous Droits Réservés.</p>
        </footer><!-- /footer -->
      </div><!-- /.container -->
      <!-- Scripts -->
      <script src="js/jquery-3.2.1.min.js"></script>
      <script src="js/calend.js"></script>
   </body>
</html>
{% endblock %} 

Le code incriminé se trouve au niveau de :
<div class="mois">
       {{ semestre1 }}
     </div><!-- /.mois -->

Merci de ton aide.
Cordialement
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
17 avril 2018 à 14:18
Comme je te l'ai dit :

Normalement, tu ne devrais retourner qu'un array ... et dans ton template Twig utiliser les "boucles" et les "blocks" pour générer le contenu.
0
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 15
17 avril 2018 à 16:43
Merci pour tout,
J'ai trouvé la solution, mais je la trouve un peu lourde.
Je te la donne
1 - Fichier index.php
<?php 
// Autoloading
require './src/bootstrap.php';

// Initialisations
// Dates
$date  = new Calendrier\Date();
$today = $date->getDate();
$sem   = $date->getWeek();
$day   = $date->getDayNum();
$reste = $date->reste();

// Mois
$month     = new Calendrier\Month($_GET['year'] ?? null);
$year      = $_GET['year'] ?? date('Y');
$dref      = $year . '0630';

$mois1  = $month->getFirstSemDays(1);
$mois2  = $month->getFirstSemDays(2);
$mois3  = $month->getFirstSemDays(3);
$mois4  = $month->getFirstSemDays(4);
$mois5  = $month->getFirstSemDays(5);
$mois6  = $month->getFirstSemDays(6);

$mois7  = $month->getFirstSemDays(7);
$mois8  = $month->getFirstSemDays(8);
$mois9  = $month->getFirstSemDays(9);
$mois10 = $month->getFirstSemDays(10);
$mois11 = $month->getFirstSemDays(11);
$mois12 = $month->getFirstSemDays(12);

$debut  = $month->rtvFullDate($month->cendres($year));
$fin    = $month->rtvFullDate($month->paques($year));

//$sem2    = $month->getSecondSemDays();

$previous  = $month->previousYear();
$next      = $month->nextYear();

$title     = 'Calendrier';
$titre     = $title . ' ' . $year;

// URL
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$url = sprintf("%s%s%s", "http://", $host, $uri);
$http = explode('/', $url);
$url = $http[0] . '//' . $http[2] . '/' . $http[3];

// Routing
$page = 'home';
if (isset($_GET['p'])) {
   $page = $_GET['p'];
}

// Rendu du template
$loader = new Twig_Loader_Filesystem(__DIR__ . '/templates');
$twig   = new Twig_Environment($loader, [
   'cache' => false //__DIR__ . '/tmp'
]);

if ($page === 'home') {
   echo $twig->render('home.twig', [
      'date'     => $today,
      'sem'      => '(Semaine: ' . $sem . ')',
      'day'      => ' (Jour  : ' . $day . ')',
      'reste'    => ' (' . $reste . ')',
      'titre'    => $titre,
      'title'    => $title,
      'url'      => $url,
      'previous' => $previous,
      'next'     => $next,
      'mois1'    => $mois1,
      'mois2'    => $mois2,
      'mois3'    => $mois3,
      'mois4'    => $mois4,
      'mois5'    => $mois5,
      'mois6'    => $mois6,
      'mois7'    => $mois7,
      'mois8'    => $mois8,
      'mois9'    => $mois9,
      'mois10'   => $mois10,
      'mois11'   => $mois11,
      'mois12'   => $mois12,
      'ferie1'   => $month->dspFeries(0),
      'ferie2'   => $month->dspFeries(1),
      'ferie3'   => $month->dspFeries(2),
      'ferie4'   => $month->dspFeries(3),
      'ferie5'   => $month->dspFeries(4),
      'ferie6'   => $month->dspFeries(5),
      'ferie7'   => $month->dspFeries(6),
      'ferie8'   => $month->dspFeries(7),
      'ferie9'   => $month->dspFeries(8),
      'ferie10'  => $month->dspFeries(9),
      'ferie11'  => $month->dspFeries(10),
      'catho1'   => $month->dspCatho(0),
      'catho2'   => $month->dspCatho(1),
      'catho3'   => $month->dspCatho(2),
      'catho4'   => $month->dspCatho(3),
      'catho5'   => $month->dspCatho(4),
      'catho6'   => $month->dspCatho(5),
      'catho7'   => $month->dspCatho(6),
      'catho8'   => $month->dspCatho(7),
      'catho9'   => $month->dspCatho(8),
      'catho10'  => $month->dspCatho(9),
      'catho11'  => $month->dspCatho(10),
      'debut'    => $debut,
      'fin'      => $fin,
   ]);
}

2 - Fichier home.twig
{% extends 'layout.twig' %}
{%  block javascripts %}
  <script src="{{ ('js/date.js') }}"></script>
{% endblock %}

{% block head %}
   <title>{{ title }}</title>
{% endblock %}

{% block content%}
   <div class="container">
      <header class="header">
      <div class="header__top">
         <div class="header__top-date">
         {{ date }} <br>
         {{ sem ~ day ~ reste }}
         </div><!-- /.header__top-date -->
         <div class="header__top-titre text-center">
            <a href="/"><i class="fa fa-calendar"></i> {{ titre }} </a>
         </div><!-- /.header__top-titre -->
         <div class="header__top-time">
            <i class="fa fa-clock-o"></i> <span id="time"><script>window.onload=dspTime('time')</script></span>
         </div><!-- /.header__top-time -->
      </div><!-- /.header__top -->
      </header><!-- /header -->
      <nav class="nav">
         <div class="previous__year">
            <a href="{{ url }}/?year={{ previous }}"><Précédent></a>
         </div><!-- /.previous__year -->
         <ul class="menu">
            <li class="active"><a href="#sem1" id="sema">Semestre 1</a></li>
            <li><a href="#sem2" id="semb">Semestre 2</a></li>
            <li><a href="#feries" id="fera">Jours fériés</a></li>
         </ul><!-- /.menu -->
         <div class="next__year">
            <a href="{{ url }}/?year={{ next }}"><Suivant></a>
         </div><!-- /.previous__year -->
      </nav><!-- /.nav -->
    <section id="sem1" class="section">
     <h1 class="text-center">Premier Semestre</h1>
     <hr class="hr">
     <div class="mois">
      {{ mois1 | raw }}
      {{ mois2 | raw }}
      {{ mois3 | raw }}
      {{ mois4 | raw }}
      {{ mois5 | raw }}
      {{ mois6 | raw }}
   </div><!-- /.mois -->
   </section><!-- /#sem1 /.section -->
   <section id="sem2" class="section">
     <h1 class="text-center">Deuxième Semestre</h1>
     <hr class="hr">
     <div class="mois">
      {{ mois7 | raw }}
      {{ mois8 | raw }}
      {{ mois9 | raw }}
      {{ mois10 | raw }}
      {{ mois11 | raw }}
      {{ mois12 | raw }}
     </div><!-- /.mois -->
   </section><!-- /#sem1 /.section -->
   <section id="feries" class="section">
     <h1 class="text-center">Jours fériés et Fêtes catholiques</h1>
     <hr class="hr">
     <div class="feries__catho">
       <div class="feries">
         <div class="feries__top text-center">
           Jours fériés
         </div><!-- /.feries__top text-center -->
         {{ ferie1 | raw }} 
         {{ ferie2 | raw }} 
         {{ ferie3 | raw }} 
         {{ ferie4 | raw }} 
         {{ ferie5 | raw }} 
         {{ ferie6 | raw }} 
         {{ ferie7 | raw }} 
         {{ ferie8 | raw }} 
         {{ ferie9 | raw }} 
         {{ ferie10 | raw }} 
         {{ ferie11 | raw }} 
       </div><!-- /.feries -->
       <div class="catho">
         <div class="catho__top text-center">
           Fêtes catholiques
         </div><!-- /.catho__top -->
         {{ catho1 | raw }} 
         {{ catho2 | raw }} 
         {{ catho3 | raw }} 
         {{ catho4 | raw }} 
         {{ catho5 | raw }} 
         {{ catho6 | raw }} 
         {{ catho7 | raw }} 
         {{ catho8 | raw }} 
         {{ catho9 | raw }} 
         {{ catho10 | raw }} 
         {{ catho11 | raw }} 
       </div><!-- /.catho -->
     </div><!-- /.feries__catho -->
     <div class="careme text-center">
       Le carême commence le <span class="ivory">{{ debut }}</span> et finit le <span class="ivory">{{ fin }}</span>
     </div><!-- /.careme text-center -->
   </section><!-- /#feries /.section -->
{% endblock %}
{% block foot %}
        <footer class="footer text-center">
          <p>© Copyright. <a href="{{ url }}">{{ title }} {{ "now" | date('Y') }}</a>. Tous Droits Réservés.</p>
        </footer><!-- /footer -->
      </div><!-- /.container -->
      <!-- Scripts -->
      <script src="js/jquery-3.2.1.min.js"></script>
      <script src="js/calend.js"></script>
   </body>
</html>
{% endblock %} 


Cordialement
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
17 avril 2018 à 17:37
C'est l'idée.
Mais.. tu ne connais pas les boucles en php ?
0
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 15
18 avril 2018 à 08:14
Evidemment, j'ai essayé des boucles, mais cela ne marche pas dans Twig.
Aurais-tu une idée d'une boucle pour formater, sachant qu'il faut injecter toutes ces lignes
au moment d'appeler home.twig
$mois1  = $month->getFirstSemDays(1);
$mois2  = $month->getFirstSemDays(2);
$mois3  = $month->getFirstSemDays(3);
$mois4  = $month->getFirstSemDays(4);
$mois5  = $month->getFirstSemDays(5);
$mois6  = $month->getFirstSemDays(6);

$mois7  = $month->getFirstSemDays(7);
$mois8  = $month->getFirstSemDays(8);
$mois9  = $month->getFirstSemDays(9);
$mois10 = $month->getFirstSemDays(10);
$mois11 = $month->getFirstSemDays(11);
$mois12 = $month->getFirstSemDays(12);

Cordialement
0