SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
TWIG
L. Gustavo A.
TWIG
Gustavo Almeida
$whoami
Porque aprender mais uma linguagem ?
1. Ajuda a separar dados e apresentação (MVC).
2. Fim das short open tags do PHP7 (<% …).
3. Contemplado por : Symfony, Drupal8, eZPublish, phpBB, Piwik, OroCRM,Slim,
Yii, Laravel, Codeigniter and Kohana.
4. Pre-req : PHP7 para a versao 2
Do fabricante (Symfony) :
● Fast: Twig compiles templates down to plain optimized PHP code. The
overhead compared to regular PHP code was reduced to the very
minimum.
● Secure: Twig has a sandbox mode to evaluate untrusted template code.
This allows Twig to be used as a template language for applications where
users may modify the template design.
● Flexible: Twig is powered by a flexible lexer and parser. This allows the
developer to define their own custom tags and filters, and to create their
own DSL.
Na prática - Imagine trocar isto
Por isso
MYSQL
Metodologia MVC TWIG
Model (BD)
Controller
(.php)
View (echo)
$_GET
$_POST
http://www.site.com.br/index.php
foreach ($produtos as $p){
echo $p[‘nome’];
}
model/produtos.php
model/categs.php
model/usuarios.php
detalhes.php
carrinho.php
listagem.php
<?php
● composer e inicialização (twig, pdo, etc)
● busque no servidor oq eu preciso
● se for o caso analisar $_POST, $_GET
● faça as contas necessárias
● jogue o valor nas variáveis
extends ‘principal.twig’
{% for … %}
{{ dados }}
{% endfor %}
use aqui as tags html sem medo de ser feliz
echo $twig->render(‘listagem.twig’, [
‘produtos’=>$produtos,
...
]);
MYSQL
Metodologia MVC TWIG
Instalando via Composer
composer require "twig/twig"
Twig_Autoloader::register();
Ex. prático : Estrutura de diretorios
Banco de dados
CREATE TABLE `categorias` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(40) NOT NULL
PRIMARY KEY (`id`)
)
CREATE TABLE `produtos` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(80) NOT NULL,
`preco` FLOAT NOT NULL,
`estoque` INT(11) NOT NULL,
`categ_id` INT(11) NOT NULL
PRIMARY KEY (`id`)
)
CREATE TABLE `usuarios` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`email` VARCHAR(80) NOT NULL,
`senha` FLOAT NOT NULL,
`nome` INT(11) NOT NULL
PRIMARY KEY (`id`)
)
Hello World com TWIG
sintaxe
{{ printar coisas }}
{% fazer coisas %}
{# comentários #}
if e for
{% for produto in produtos %}
{{ produto.nome }} por R$ {{ produto.preco }}
{% if produto.estoque > 0 %}
pronta-entrega
{% endif %}
{% endfor %}
variáveis
{% set total=0 %}
{{ total }}
{% set nome=”Gustavo Almeida” %}
{{ nome }}
{% set items=[‘fogao’,’geladeira’,’tv’] %}
{{ items.1 }}
block, include e extends
Com block eu defino no bloco pai, o trecho que vai ser herdado dos filhos.
{% block conteúdo %}{% endblock %}
Com extends eu defino qual será o bloco pai.
{% extends “main.html” %}
Exemplo - usar include para incluir o menu de categs.
{% include ‘categs.html’ %}
css e js de cada página modularizado
{% block css %}
<style>
</style>
{% endblock %}
{% block js %}
<script>
<script>
{% endblock %}
block, include e extends
PAGINA MODELO
includes ‘menu.twig’
block conteudo
PAGINA FILHA
endblock
extends ‘modelo.twig’
block, include e extends
global (carrinho, login)
categs
global
include
conteudo dinamico
{% block content %}
{% endblock %}
main.twig
global
$twig->addGlobal(‘carrinho’,$_SESSION[‘carrinho’]);
$twig->addGlobal(‘login’,$_SESSION[‘login’]);
Usando as variáveis global :
{% if login %} Estou logado {% else %} fazer login {% endif %}
Se for um array posso inclusive obter o nome do usuario
{{ login.nome }} ou {{ login.imagem }}
macro
{% macro input(name,value,type,size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}">
{% endmacro %}
usando as macros :
{% import 'forms.twig' as forms %}
Login : {{ forms.input('login') }}
filters
{{ nome|upper }}
{{ idade|default(30) }}
{{ 9800.333|number_format(2, '.', ',') }}
{{ [1, 2, 3]|join('|') }}
Muitas funções do PHP migram para os filtros
url_encode, trim, sort, splitround, slice ...
index.php com TWIG
require __DIR__.'/../../vendor/autoload.php';
require 'init.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('views');
$twig = new Twig_Environment($loader);
require 'model/produto_model.php';
#globals.php
$produtos = getProductsByRand(12);
echo $twig->render('index.twig', array('produtos' => $produtos));
$cn->close();
index.twig
{% extends main.twig %}
{% block content %}
{% for produto in produtos %}
<p>{{ produto.nome }}></p>
<h5>R$ {{ produto.preco }}</h5>
{% endfor %}
{% endblock %}
categ.twig
<ul class="nav list-group">
{% for categoria in categorias %}
<li>
<a href="listagem.php?id={{categoria.id}}"> {{categoria.nome}} </a>
</li>
{% endfor %}
</ul>
{% includes “categ.twig” %}
detalhes.php
include 'twig.php';
include 'model/produtos_model.php';
$id = (int) $_GET['id'];
$produtos = getProdutoById($id);
echo $twig->render('detalhes.twig', array('produto' => $produto));
detalhes.twig
{% extends "main.twig" %}
{% block content %}
{% if produto %}
<div class="col-md-12">
<div class="card">
<img src="http://lorempixel.com/450/450/sports/5" class="img-fluid rounded">
<h1>{{ produto.nome }}</h1>
<h5>R$ {{ produto.preco }} - {{ produto.disponib }}</h5>
</div>
</div>
{% else %}
<h1>Produto Indisponivel ou com erro.</h1>
{% endif %}
{% endblock %}
cart.php
<?php
if(!isset($_SESSION[‘cart’])){
$_SESSION[‘cart’]=[];
}
if(isset($_REQUEST[‘action’])){
$id=$_GET[‘id’];
switch $_REQUEST[‘action’]{
case ‘add’:
$item = getProductById($id);
$item[‘qtd’]=1;
$_SESSION[‘cart’][$id]=$item;
break;
case ‘del’:
unset($_SESSION[‘cart’][$id]);
break;
}
}
echo $twig->render(‘cart.twig’,[ ‘cart’=>$_SESSION[‘cart’] ]);
$twig->addGlobal(‘cart’,$_SESSION[‘cart’);
# ……
{% for item in cart %}
{{ item.qtd }} {{ item.nome }} - R$ {{ item.preco }} <a
href=#>X</a><br>
{% else %}
Vazio
{% endfor %}
carrinho.twig
{% extends "main.twig" %}
{% block content %}
<table class="table table-striped table-hover table-bordered table-condensed">
<tr>
<th>ID</th> ...
<th>Total</th>
<th>Del</th>
</tr>
{% set subtotal=0 %}
{% set frete=12 %}
{% for index,item in carrinho %}
<tr> <td>{{ item.id }}</td>
<td>{{ item.preco }}</td>
<td>X</td>
</tr>
{# subtotal = subtotal + (item.qtd*item.preco) #}
{% else %}
<h1>Carrinho vazio</h1>
{% endfor %}
{% set total = subtotal + frete %}
<tr class="warning">
<td colspan="4">SubTotal</td>
<td colspan="2">{{ subtotal }}</td>
</tr>
<tr>
{% endblock %}
LOOP
Cabeçalho tabela
Totais
admin.php (CRUD)
<?php
if(isset($_REQUEST[‘action’])){
switch $_REQUEST[‘action’]{
case ‘add’:
$set = parseParamsPost($_POST);
$q = sprintf(“INSERT CATEGS SET %s”,$set);
$cn->exec($q);
break;
case ‘del’:
$q = sprintf(“DELETE FROM CATEGS WHERE id=%d”,$id);
break;
case ‘upd’:
$q = sprintf(“UPDATE CATEGS SET %s WHERE id=%d,$set,$id)”;
break;
}
}
echo $twig->render(‘admin.twig’,[ ‘categs’=>$categs ]);
function parseParamsPost(array $post){
$set = “”;
foreach($post as $k=>$v){
$set .= “$k= ‘$v’”;
}
return $set;
}
admin.twig
{% extends 'main.twig' %}
{% block content %}
<table class="table table-striped table-hover table-bordered table-condensed">
<tr> <th>id</th> <th>nome</th> <th>upd</th> <th>del</th> </tr>
<tr class="table-info">
<form method=post action="?a=add">
<td>X</td>
<td><input name="nome"></td>
<td colspan=2><button class="btn btn-success">ADD</button></td>
</form>
</tr>
{% for index,categ in categs %}
<tr>
<form method=post action=”?a=upd”>
<td><input type=hidden name='id' value="{{categ.id}}">{{categ.id}}</td>
<td><input name='nome' class='form-control' value="{{categ.nome}}"></td>
<td><button class='btn btn-info'>UPD</button></td></form>
<td>X</td>
</tr>
{% else %}
<tr><td colspan=4>Sem registros</td></tr>
{% endfor %}
</table>
{% endblock %}
LOOP
REG. NOVO
login.php
<?php
if($_SERVER[‘REQUEST_METHOD’]===’POST’){
$erros=[];
if(!isset($_POST[‘login’])){
$erros[‘login’]=”login nao informado”;
break;
}
if(!$_POST[‘login’]===’adm’){
$erros[‘login’]=”login nao encontrado”;
}
if(!$_POST[‘senha’]===’123’){
$erros[‘senha’]=”senha invalida/inconsistente”;
}
$_SESSION[‘logado’]= empty($erros)? ’sim’ : null;
redirect(‘cadastro.php’);
}
echo $twig->render(‘login.twig’,[ ‘erros’=>$erros ]);
$twig->addGlobal(‘logado’,$_SESSION[‘logado’);
# ……
{% if logado == “sim” %}
Ola, {{ logado.user }}
<a href=#>Logout</a>
{% else %}
<a href=#>Login</a>
{% endif %}
login.twig
{% extends "main.twig" %}
{% block content %}
{% import 'macros.twig' as forms %}
<form method="POST" name="login" action="?a=login">
<legend>Ja sou Cliente</legend>
{{ forms.input('login') }}
{{ forms.input('senha') }}
<button class="btn btn-lg btn-success-outline">Login</button>
</form>
<form method="POST" name="novo" action="?a=novo">
<legend>Não sou Cliente</legend>
<input class="form-control" name="login" placeholder="Email">
<input name="cep" class="form-control" placeholder="CEP">
<button class="btn btn-lg btn-success-outline">Cadastrar</button>
</form>
{% endblock %}
Certificação em twig
github: lga37
slideshare: lga33
br.linkedin.com/in/lga37

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

PHP Security
PHP SecurityPHP Security
PHP Security
 
Apache Server Tutorial
Apache Server TutorialApache Server Tutorial
Apache Server Tutorial
 
Explain that explain
Explain that explainExplain that explain
Explain that explain
 
Flutter A year of creativity!
Flutter A year of creativity!Flutter A year of creativity!
Flutter A year of creativity!
 
Arquitetura limpa
Arquitetura limpaArquitetura limpa
Arquitetura limpa
 
SQL Injection
SQL Injection SQL Injection
SQL Injection
 
Citrix StoreFront - Implementation Guide
Citrix StoreFront - Implementation GuideCitrix StoreFront - Implementation Guide
Citrix StoreFront - Implementation Guide
 
PHP Project PPT
PHP Project PPTPHP Project PPT
PHP Project PPT
 
Php and MySQL
Php and MySQLPhp and MySQL
Php and MySQL
 
Json web token
Json web tokenJson web token
Json web token
 
Java/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBCJava/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBC
 
Java Servlets
Java ServletsJava Servlets
Java Servlets
 
Webauthn Tutorial
Webauthn TutorialWebauthn Tutorial
Webauthn Tutorial
 
JDBC ppt
JDBC pptJDBC ppt
JDBC ppt
 
C++ project on police station software
C++ project on police station softwareC++ project on police station software
C++ project on police station software
 
Java basic
Java basicJava basic
Java basic
 
Jsp ppt
Jsp pptJsp ppt
Jsp ppt
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
 
A must Sql notes for beginners
A must Sql notes for beginnersA must Sql notes for beginners
A must Sql notes for beginners
 
Android SDK Tutorial | Edureka
Android SDK Tutorial | EdurekaAndroid SDK Tutorial | Edureka
Android SDK Tutorial | Edureka
 

Semelhante a Mini Curso PHP Twig - PHP Conference 2017

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicosponto hacker
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureVitor Ciaramella
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Angular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & DesktopAngular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & DesktopGDGFoz
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoVinicius Rocha
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHPigorpimentel
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Introdução ao Smarty
Introdução ao SmartyIntrodução ao Smarty
Introdução ao SmartyNelson Gomes
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...iMasters
 

Semelhante a Mini Curso PHP Twig - PHP Conference 2017 (20)

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicos
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Relatório
RelatórioRelatório
Relatório
 
Tutorial.yii
Tutorial.yiiTutorial.yii
Tutorial.yii
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Angular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & DesktopAngular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & Desktop
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHP
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Introdução ao Smarty
Introdução ao SmartyIntrodução ao Smarty
Introdução ao Smarty
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
 

Mais de Luis Gustavo Almeida

Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesLuis Gustavo Almeida
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingLuis Gustavo Almeida
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPLuis Gustavo Almeida
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 

Mais de Luis Gustavo Almeida (9)

Curso de HTML5 CSS3 e JS
Curso de HTML5 CSS3 e JSCurso de HTML5 CSS3 e JS
Curso de HTML5 CSS3 e JS
 
Php curl - Coleta de dados na web
Php curl - Coleta de dados na webPhp curl - Coleta de dados na web
Php curl - Coleta de dados na web
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e Routes
 
Criando uma blockchain com PHP
Criando uma blockchain com PHPCriando uma blockchain com PHP
Criando uma blockchain com PHP
 
Php criptomoedas e blockchain
Php criptomoedas e blockchainPhp criptomoedas e blockchain
Php criptomoedas e blockchain
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - Hacking
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Migrando para PHP7 - Novidades
Migrando para PHP7 - NovidadesMigrando para PHP7 - Novidades
Migrando para PHP7 - Novidades
 

Mini Curso PHP Twig - PHP Conference 2017

  • 3. Porque aprender mais uma linguagem ? 1. Ajuda a separar dados e apresentação (MVC). 2. Fim das short open tags do PHP7 (<% …). 3. Contemplado por : Symfony, Drupal8, eZPublish, phpBB, Piwik, OroCRM,Slim, Yii, Laravel, Codeigniter and Kohana. 4. Pre-req : PHP7 para a versao 2 Do fabricante (Symfony) : ● Fast: Twig compiles templates down to plain optimized PHP code. The overhead compared to regular PHP code was reduced to the very minimum. ● Secure: Twig has a sandbox mode to evaluate untrusted template code. This allows Twig to be used as a template language for applications where users may modify the template design. ● Flexible: Twig is powered by a flexible lexer and parser. This allows the developer to define their own custom tags and filters, and to create their own DSL.
  • 4. Na prática - Imagine trocar isto
  • 6. MYSQL Metodologia MVC TWIG Model (BD) Controller (.php) View (echo) $_GET $_POST http://www.site.com.br/index.php foreach ($produtos as $p){ echo $p[‘nome’]; } model/produtos.php model/categs.php model/usuarios.php detalhes.php carrinho.php listagem.php
  • 7. <?php ● composer e inicialização (twig, pdo, etc) ● busque no servidor oq eu preciso ● se for o caso analisar $_POST, $_GET ● faça as contas necessárias ● jogue o valor nas variáveis extends ‘principal.twig’ {% for … %} {{ dados }} {% endfor %} use aqui as tags html sem medo de ser feliz echo $twig->render(‘listagem.twig’, [ ‘produtos’=>$produtos, ... ]); MYSQL Metodologia MVC TWIG
  • 8. Instalando via Composer composer require "twig/twig"
  • 10. Ex. prático : Estrutura de diretorios
  • 11. Banco de dados CREATE TABLE `categorias` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `nome` VARCHAR(40) NOT NULL PRIMARY KEY (`id`) ) CREATE TABLE `produtos` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `nome` VARCHAR(80) NOT NULL, `preco` FLOAT NOT NULL, `estoque` INT(11) NOT NULL, `categ_id` INT(11) NOT NULL PRIMARY KEY (`id`) ) CREATE TABLE `usuarios` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `email` VARCHAR(80) NOT NULL, `senha` FLOAT NOT NULL, `nome` INT(11) NOT NULL PRIMARY KEY (`id`) )
  • 13. sintaxe {{ printar coisas }} {% fazer coisas %} {# comentários #}
  • 14. if e for {% for produto in produtos %} {{ produto.nome }} por R$ {{ produto.preco }} {% if produto.estoque > 0 %} pronta-entrega {% endif %} {% endfor %}
  • 15. variáveis {% set total=0 %} {{ total }} {% set nome=”Gustavo Almeida” %} {{ nome }} {% set items=[‘fogao’,’geladeira’,’tv’] %} {{ items.1 }}
  • 16. block, include e extends Com block eu defino no bloco pai, o trecho que vai ser herdado dos filhos. {% block conteúdo %}{% endblock %} Com extends eu defino qual será o bloco pai. {% extends “main.html” %} Exemplo - usar include para incluir o menu de categs. {% include ‘categs.html’ %}
  • 17. css e js de cada página modularizado {% block css %} <style> </style> {% endblock %} {% block js %} <script> <script> {% endblock %}
  • 18. block, include e extends PAGINA MODELO includes ‘menu.twig’ block conteudo PAGINA FILHA endblock extends ‘modelo.twig’
  • 19. block, include e extends global (carrinho, login) categs global include conteudo dinamico {% block content %} {% endblock %} main.twig
  • 20. global $twig->addGlobal(‘carrinho’,$_SESSION[‘carrinho’]); $twig->addGlobal(‘login’,$_SESSION[‘login’]); Usando as variáveis global : {% if login %} Estou logado {% else %} fazer login {% endif %} Se for um array posso inclusive obter o nome do usuario {{ login.nome }} ou {{ login.imagem }}
  • 21. macro {% macro input(name,value,type,size) %} <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}"> {% endmacro %} usando as macros : {% import 'forms.twig' as forms %} Login : {{ forms.input('login') }}
  • 22. filters {{ nome|upper }} {{ idade|default(30) }} {{ 9800.333|number_format(2, '.', ',') }} {{ [1, 2, 3]|join('|') }} Muitas funções do PHP migram para os filtros url_encode, trim, sort, splitround, slice ...
  • 23. index.php com TWIG require __DIR__.'/../../vendor/autoload.php'; require 'init.php'; Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem('views'); $twig = new Twig_Environment($loader); require 'model/produto_model.php'; #globals.php $produtos = getProductsByRand(12); echo $twig->render('index.twig', array('produtos' => $produtos)); $cn->close();
  • 24. index.twig {% extends main.twig %} {% block content %} {% for produto in produtos %} <p>{{ produto.nome }}></p> <h5>R$ {{ produto.preco }}</h5> {% endfor %} {% endblock %}
  • 25. categ.twig <ul class="nav list-group"> {% for categoria in categorias %} <li> <a href="listagem.php?id={{categoria.id}}"> {{categoria.nome}} </a> </li> {% endfor %} </ul> {% includes “categ.twig” %}
  • 26. detalhes.php include 'twig.php'; include 'model/produtos_model.php'; $id = (int) $_GET['id']; $produtos = getProdutoById($id); echo $twig->render('detalhes.twig', array('produto' => $produto));
  • 27. detalhes.twig {% extends "main.twig" %} {% block content %} {% if produto %} <div class="col-md-12"> <div class="card"> <img src="http://lorempixel.com/450/450/sports/5" class="img-fluid rounded"> <h1>{{ produto.nome }}</h1> <h5>R$ {{ produto.preco }} - {{ produto.disponib }}</h5> </div> </div> {% else %} <h1>Produto Indisponivel ou com erro.</h1> {% endif %} {% endblock %}
  • 28. cart.php <?php if(!isset($_SESSION[‘cart’])){ $_SESSION[‘cart’]=[]; } if(isset($_REQUEST[‘action’])){ $id=$_GET[‘id’]; switch $_REQUEST[‘action’]{ case ‘add’: $item = getProductById($id); $item[‘qtd’]=1; $_SESSION[‘cart’][$id]=$item; break; case ‘del’: unset($_SESSION[‘cart’][$id]); break; } } echo $twig->render(‘cart.twig’,[ ‘cart’=>$_SESSION[‘cart’] ]); $twig->addGlobal(‘cart’,$_SESSION[‘cart’); # …… {% for item in cart %} {{ item.qtd }} {{ item.nome }} - R$ {{ item.preco }} <a href=#>X</a><br> {% else %} Vazio {% endfor %}
  • 29. carrinho.twig {% extends "main.twig" %} {% block content %} <table class="table table-striped table-hover table-bordered table-condensed"> <tr> <th>ID</th> ... <th>Total</th> <th>Del</th> </tr> {% set subtotal=0 %} {% set frete=12 %} {% for index,item in carrinho %} <tr> <td>{{ item.id }}</td> <td>{{ item.preco }}</td> <td>X</td> </tr> {# subtotal = subtotal + (item.qtd*item.preco) #} {% else %} <h1>Carrinho vazio</h1> {% endfor %} {% set total = subtotal + frete %} <tr class="warning"> <td colspan="4">SubTotal</td> <td colspan="2">{{ subtotal }}</td> </tr> <tr> {% endblock %} LOOP Cabeçalho tabela Totais
  • 30. admin.php (CRUD) <?php if(isset($_REQUEST[‘action’])){ switch $_REQUEST[‘action’]{ case ‘add’: $set = parseParamsPost($_POST); $q = sprintf(“INSERT CATEGS SET %s”,$set); $cn->exec($q); break; case ‘del’: $q = sprintf(“DELETE FROM CATEGS WHERE id=%d”,$id); break; case ‘upd’: $q = sprintf(“UPDATE CATEGS SET %s WHERE id=%d,$set,$id)”; break; } } echo $twig->render(‘admin.twig’,[ ‘categs’=>$categs ]); function parseParamsPost(array $post){ $set = “”; foreach($post as $k=>$v){ $set .= “$k= ‘$v’”; } return $set; }
  • 31. admin.twig {% extends 'main.twig' %} {% block content %} <table class="table table-striped table-hover table-bordered table-condensed"> <tr> <th>id</th> <th>nome</th> <th>upd</th> <th>del</th> </tr> <tr class="table-info"> <form method=post action="?a=add"> <td>X</td> <td><input name="nome"></td> <td colspan=2><button class="btn btn-success">ADD</button></td> </form> </tr> {% for index,categ in categs %} <tr> <form method=post action=”?a=upd”> <td><input type=hidden name='id' value="{{categ.id}}">{{categ.id}}</td> <td><input name='nome' class='form-control' value="{{categ.nome}}"></td> <td><button class='btn btn-info'>UPD</button></td></form> <td>X</td> </tr> {% else %} <tr><td colspan=4>Sem registros</td></tr> {% endfor %} </table> {% endblock %} LOOP REG. NOVO
  • 32. login.php <?php if($_SERVER[‘REQUEST_METHOD’]===’POST’){ $erros=[]; if(!isset($_POST[‘login’])){ $erros[‘login’]=”login nao informado”; break; } if(!$_POST[‘login’]===’adm’){ $erros[‘login’]=”login nao encontrado”; } if(!$_POST[‘senha’]===’123’){ $erros[‘senha’]=”senha invalida/inconsistente”; } $_SESSION[‘logado’]= empty($erros)? ’sim’ : null; redirect(‘cadastro.php’); } echo $twig->render(‘login.twig’,[ ‘erros’=>$erros ]); $twig->addGlobal(‘logado’,$_SESSION[‘logado’); # …… {% if logado == “sim” %} Ola, {{ logado.user }} <a href=#>Logout</a> {% else %} <a href=#>Login</a> {% endif %}
  • 33. login.twig {% extends "main.twig" %} {% block content %} {% import 'macros.twig' as forms %} <form method="POST" name="login" action="?a=login"> <legend>Ja sou Cliente</legend> {{ forms.input('login') }} {{ forms.input('senha') }} <button class="btn btn-lg btn-success-outline">Login</button> </form> <form method="POST" name="novo" action="?a=novo"> <legend>Não sou Cliente</legend> <input class="form-control" name="login" placeholder="Email"> <input name="cep" class="form-control" placeholder="CEP"> <button class="btn btn-lg btn-success-outline">Cadastrar</button> </form> {% endblock %}
  • 35.