7 @moRtenDk - - PowerPoint PPT Presentation
7 @moRtenDk - - PowerPoint PPT Presentation
7 @moRtenDk #drUpaltWIG DRUpAl 8 tH e mI n g DRUpALCoN BaRCElONA 2015 @moRtenDk #drUpaltWIG sLidEs SLIdES aRE oNLInE
tHemIng
DRUpALCoN BaRCElONA 2015 DRUpAl 8
SLIdES aRE oNLInE In 60 MInUTEs
sLidEs
@morTenDk
CLAsSy MAInTAInER GEEk RÖYALe THE ANGrY THEmER TaG1 CONsULTiNG
@MOrTENdK
#DRuPALtWiG
sOrry
Rc 1
bOoOOooOo
LET THE ANGeR OuT
sTocKhoLm sYndRome
DRUpAL7 MARkUP
“IT’S A FEAtUrE”
dIviTis
<DIV><DIV><DIV><DIV><DIV><DIV><DIV><DI V><DIV><DIV><DIV><DIV><DIV><DIV><DIV>< DIV><DIV><DIV><DIV><DIV><DIV><DIV><DIV ><DIV><DIV><DIV><DIV><DIV><DIV><DIV> </DIV></DIV></DIV></DIV></DIV></DIV></ DIV></DIV></DIV></DIV></DIV></DIV>5000
LINeS Of PHpTEMpLATe.PHp
TotAllY oK
<div class=“foo bar baz foo-more-more bar- more-yet another one”>
fEatUre
THE CLAsS SoUP IS AnOTHeR
nO mOre
aAaaRgh!
nEw
tHemE eNgiNe
GOOd-BYe PHPtEMPlAtE
HELlO TwIG
tHemE fUncTioNs dEad!
tWig tEmpLatEs
EVErYTHiNG iS
BLOcK.HtML.tWiG MARk.HTmL.TwIG TABlE.HtML.tWiG PAGe.HTmL.TwIG NODe.HTmL.TwIG VIEw.HTmL.TwIG FIElD.HtML.tWiG IMAgE-WiDGEt.HTmL.TwIGtHemE iS iN cOntRol
ThE OF mARKuP & CSs
uNleArn pHptEmpLa te
<? pHP dIe(‘PHPtEMPlAtE’) ?>
REAdY?
tWig
DRUpAl 8
IS a “MODeRN” TEmPLAtE LaNGUaGe
- > sYMPhONY
USEd BY OTHeR SySTEmS + It’S EaSY tO LeARN :)
tWig
{{ var }} {# comment #} {% functionality %}
{ # %
{{ data.is.here }} {{ also.this[#hashtags] }}
vAr DriLliNg
$yo[‘drupal_where ’]->is[‘und’][0]->my_data 7{{ var|makemepretty(‘now’) }}
fUncTion
PIPe TWIg FUnCTIoN VaR
{{ username|uppercase }} MORTENDK
fUncTion
(mortendk)
{{ ‘Copenhagen’|t }} {% trans %} by {{ user }} date {{ date }} {% endtrans %}
tRanSlaTe
{% if person=“mortendk” %} <h1>Loves Drupal8</h1> {% endif %}
cOntRol
{{ sushi|raw}}
aUtoEscApe
SECuRITy IS SOMeTHInG DEVeLOPeRS LIKe
cReaTe Var
cLasSy
THE DRUpAl 8 BAsE ThEmE
7
corE claSsy<HTmL> .CSs CLAsS=“FoO” <HTmL> .CSs CLAsS=“FoO”
bAseTheMe
corE claSsy my ThemE?
barTik sevEn$VArS
bAseTheMe
<div> {{ foo }} </div>
corE claSsy“MY tHEMe”
NO bASEtHEMe DEfINEd
bAseTheMe
<div class=“node node—article”> {{ foo }} </div>
corE claSsy“MY tHEMe”
BASe THeME: CLAsSY
tEmpLatEs
CORe/THeME/cLASsY/*
MODuLES/[MODuLENaME]/*
7
aniMatiOn eXplaIninG how we MoveD shIt- utTa cOre And Into claSsy
dRupAl8 teMplAtes
CORe/THeMES/CLAsSy/
dEfiNe BasEthEme
base theme: classy
[THEmENAmE].iNFO.YmL
yOu DecIde!
corE claSsyCLEaN As COrE CLAsSES YOU CAN TRUsT
corE claSsy
7
ZeN MOThERShIP
wAitAmiNutE!
MORtENDk JOHn ALbIN corE claSsy
7
ZeN MOThERShIP MAInTAInERS ?
sEtup
SETtING UP a THeME
[ROOt]/ThEMEs/[THEmENAmE] I LiVE wHERe NOw ?
tHemE cOnfIg FilEs
*.InFO.yMl *.LiBRArIES.YML *.BrEAKpOINtS.YmL *.ThEmE
*.inFo.Yml
THEmE CoNFIgURAtION, CSs & jS
BASiC INFo REGiOnS LIBrARIeS REMoVE cSS
*.liBraRieS.yMl
ADDiNG jS & CSs TO THE THEmE
FOO.INFo.YAmL FOO.LIBrARIeS.YaML SLIdER.cSS SLIdER.jS SLIdER FOO.CsS BAR.JS AWEsOmE
NAMe DEPeNDEnCIEs CSS FILeS
*.liBraRieS.yMl
JS fILEs
cSs OrgAniZing
BASe LAYoUt COMpONEnT STAtE THEmE
[*].BreAkpOinTs.Yml
RESpONSiVE iMAGeS
*.BrEAKpOINtS.YmL
*.BrEAKpOINtS.YmL
[*].TheMe WAS PHPtEMPlATE.PhP
.TheMe
.LIbRARiES.yML .THeME
tOols
HOW TO fIND STUfF & DEbUg
sEttIngS.pHp
if (file_exists(__DIR__ . '/settings.local.php')) { include __DIR__ . '/settings.local.php'; }COPy: SiTES/EXAmPLE.SETtINGs.LOcAL.pHP TO: SITeS/DeFAUlT/SeTTInGS.lOCAl.PHp UNCoMMEnT In SEtTINgS.PhP
DOWnLOAd DEvEL mODUlE INStALL DEVeL + KINt INStALL DRUsH DRUsH En KInT DOCs.DRuSH.oRG/eN/MaSTEr/INsTALl/
dEvel
dIsaBle csS cAche
THEmE DeBUG FTW! SERvICEs.YMl
FILe NAmE SuGGEsTIOnS FILe NAmE SuGGEsTIOnS
PATh TO ACTiVE tEMPlAtE
kInt
{{ kint( foo ) }} KRUmO FoR DrUPAl 8 {{ content.field_image }}
screenshot af kint fra videoSITeS/AlL/DeFAUlT/SeRVIcES.yMl DRUsH Cr {{ KInT(FoO) }}
tWig deBug:
tEmpLatE sTruCtuRe
EVErYTHiNG iS A TEMpLATe FIlE
125 TemPlaTes
WE nUKEd THe THeME fUNCtIONs* TURnED iT AlL INTo A mETRiC FUCkTON OF tEMPlATEs
gRouPs
do we really need this here ?tEmpLatE gRouPs
LAYoUT FIElD DATaSeT VIEwS BLOcK CONtENT-EDIt CONtEnT MISc USEr NAViGATiON FORmhTml
HTMl.HTmL.TwIG CSS + Js HEAdERpAge
PAGe.HTmL.TwIGrEgiOn's
PAGe.HTmL.TwIGcOntEnt
BLOcK.HtML.tWiG NODe.HTmL.TwIG VIEw.HTmL.TwIG REGiON.hTML.TWIgnOde
FIElD.HtML.tWiG NODe.HTmL.TwIG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD-—IMAgE.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiGaLl The fiElds
FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiG FIElD.HtML.tWiGWE’RE gONNa TAlK AbOUT FIElDS lATEr
lAyoUt
THE MAGiC Of WItHOUt
{{ content|without(‘field’) }}
wIthOut fuNctIon
PIPe NAMe TWIg FUnCTIoN VaR
NODe.HTmL.TwIG
conTeNt imaGe tagS
wIthOut
{{ coNtenT }} {{ imAge }}
{{ content }}
{{ teXt }} {{ taGs }}
{{ coNtenT | WithOut(*) }} {{ imAge }}
{{ content|without(‘image’) }}
{{ content.image }} {{ teXt }} {{ taGs }}
{{ coNtenT | WithOut(**) }} {{ imAge }}
{{ content|without(‘image’,‘tags’) }}
{{ content.image }} {{ teXt }} {{ taGs }} {{ content.tags }}
{{ coNtenT | WithOut(**) }} {{ imAge }}
{{ content|without(‘image’,‘tags’) }}
{{ content.image }} {{ teXt }} {{ taGs }} {{ content.tags }} {{ neW }}
NEW FIElD
CONtEnT
nOde.htMl.Twig
CONtENT.FIElD_ImAgE
CONtENT.FIElD_TaGS
fIeld
THE HEArT Of DRuPaL
HOW MANy <DiV>S DOEs IT TAKe TO MAKe A “SINgLE fIELd WItH OnE VaLuE” NO lABEl?
Yo!
Yo!
<div class=“field-items”> </div> <div class=“field field-name-field-single field-type-text field-label-hidden”> </div> </div> <div class=“field-item even”> 7Yo!
<div class=“field field--name-field-single field--type-string field--label-hidden field__items”> </div>CLAsSY
Yo!
<div> </div>Yo!
<div> </div>ONE DIV ZERo CLaSSEs 100% DrUPAl
Yo!
<div class=“yolo”> </div>ONE DIV ZERo CLaSSEs 100% DrUPAl
sIngLe nAked
WHAt DO I UsE A
<DIv>
dUde grEat
WHAtEVEr
YOU
WANt IT TO
fIelD mArkUp
fIeld
LABeL VALuE
SINgLE MULtIPLe LABeL LABeL
} }
FIElD.HtML.tWiG
SINgLE MULtIPLe SINgLE + LAbEL MULtIPLe + lABEl
LABeL DiSPLaY
mAnaGe DisPlay
“INLiNE” “VISuALLy HIDdEN” “ABOvE”
FIElD.HtML.tWiG
NO lABEl LABeL
aTtrIbuTes
PURe CLaSS
<div {{ attributes }}>
class=“foo” data-drupal-foo aria-hidden=“true”aTtrIbuTes
CLAsSY
<DIv CLaSs=“FOO FOO-BAR FOO-BAR-BaZ”>
*.TpL.PhP THEmE FuNCTiOnS PREpROCeSS$VArS
DRUpAL7
7
aDdcLass
rEmoVe ClaSs
CLAsSY
MODuLE CORe <DIv CLaSs=“CORe”> ESSeNTIaL ClASSeS Ex: “IS-vISIbLE”
CLAsSY
MODuLE CORe <DIv CLaSs=“CORe MOdUlE”>
$vaR[‘attRibuTes’]->AddCLass(‘modUle’)
CLAsSY
MODuLE CORe <DIv CLaSs=“CORe MOdULE THEmE”> {{ ATtRIBuTES.ADDcLASs(‘THEmE’) }}
CLAsSY
MODuLE CORe <DIv CLaSs=“CORe THeME”> {{ ATtRIBuTES.REMoVe(‘MODuLE’) }}
CLAsSY
MODuLE CORe <DIv CLaSs=“THEmE”> {{ ATtRIBuTES.REMoVe(‘MODuLE’,’CORe’) }}
jS- PreFix
<DIv CLaSs=“JS-fOO fOO”>…
$(.jS-FoO) .FOo{…}
aTtrIbuTes
fIelD & atTriButEs
KISsING IN a TReEEEeEEEeEEEeE
LABeL VALuE
.field__item .field__label .fieldFIX THE MARkUP
ADD & REmOVE CLAsSES
CHAnGE sTUFf WHeN 8
cSs FilEs In TemPlaTe
tWigBloCk
MORe COoLNEsS FrOM tWiG
datA (pAge.Html.twiG)
PAGe.HTmL.TwIG
D8datA (pAge.Html.twiG)
datA (pAge.Html.twiG)
{% block foo %} {% endblock %}
PAGe.HTmL.TwIG
D8datA (pAge.Html.twiG)
datA (pAge.Html.twiG) (paGe-—froNt.hTml.Twig)
{% extends "page.html.twig" %}
PAGe.HTmL.TwIG
D8datA (pAge.Html.twiG)
PAGe.HTmL.TwIG PAGe—FROnT.HtML.tWiG
PAGe.HTmL.TwIG PAGe—FROnT.HtML.tWiG
hAppY ?
ARE YOU NOT ENTeRTAiNED ?
SCReENShOt 2.0
mEnu
pAgeRs
ONLy 1 (OnE) tEMPlATE FILe MENu.HTmL.TwIG
pAger
FUN FOR EVErYBOdY ? PAGeR.HtML.tWiG
8 thIngS cHanGed
T L ; D L TOO LONg - DIDn'T lISTeN!
- 1. iE sUppOrt?
NO mORE SUPpORT FOR IE6, Ie7 & iE8
- 2. mArkUp CleAnup
HTMl5 CSS IS sMACsS & BEm BAsEd “MODeRN” PRaCTIcE #iD ReMOVeD SEVeN Is REsPONsIvE
jS sEpeRatIon
SEPaRATeD JAVaSCRiPT’S FuNCTiONAlITY CSS STYlING IS sEPArATEd .JS-FOObAR{ …} .FOoBaR{ COlOR: BLUe}
dIviTis
90%
OF tHE mARKuP Is GOnE
jQueRy DepEndEncy
DONt WAnT 32K Of LOvE ? … THeN DoN’T
cLasSy!
CLAsSY SEPaRATeD ThE MaRKUp FROm COrE
sAluTe!
FOR THOsE ThAT rOCKeD ThE TwIG WE sALUtE YoU!
i loOovE uUu
COTtSeR JOEl LEWiS EMMa LAUrII #FReERUbEN DAViD HeRNAnDeZ JOHn ALbIN WIM LEErS JEN LAMpToN FABiAN
DRUpAl 7
DRUpAL.oRG/tHEMe-GUiDe/8 DRUpAL.oRG/cODInG-StANDaRDS/CSS SMAcSS.cOM TWIg.SEnSIOlABS.ORG/DOCuMENtATIoN
lInks
dOwnLoaD d8
BUIlD StUFF NOW! DRUpAL.oRG/dRUPaL8
WEEkLY mEETiNG’S THUrSDAy 17:00 CEt
#DruPalTwig
USE TWItTER #DRuPALtWIG QUEsTIOnS, cOMMeNTS & FEeDBAcK @MOrTENdK
qUesTioNs
sEssIons
DRUpALCoN
FROnTENd UNiTED BELuGAM
BOF ROOm XXx FROnTENd UNiTeD
ALL WEEk ! DRUpAL fRONtEND SPRiNt
CODeR LoUNGe SPRiNT lEADeRs: (FRoNTEnD UnITEd)
FONtS: DAFt BRuSH, BRUsH Up, BiTTEr ICOnS: SMAlL IcONS 2
cRedIts