PHP Twig
Résolu
chabinot
Messages postés
391
Statut
Membre
-
chabinot Messages postés 391 Statut Membre -
chabinot Messages postés 391 Statut Membre -
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 :
2 - Source index.php:
L'affichage retourné :

Alors que j'aurias aimé voir ceci :

Merci de votre aide
Cordialement
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:
- PHP Twig
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour a la ligne php - Forum Webmastering
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
1 réponse
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.
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.
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
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
Mais.. tu ne connais pas les boucles en php ?
Aurais-tu une idée d'une boucle pour formater, sachant qu'il faut injecter toutes ces lignes
au moment d'appeler home.twig
Cordialement