1116 lines
307 KiB
HTML
1116 lines
307 KiB
HTML
<!DOCTYPE html>
|
|
<html class="js supports no-touchevents cssfilters" prefix="og: http://ogp.me/ns#" style="" lang="fr"><head>
|
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><script type="text/javascript" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/300lo.json"></script><script type="text/javascript" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/_ate.config_resp"></script>
|
|
<title>Utilisation de Twig, un moteur de templates !</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
|
|
<meta charset="utf-8"><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/2080865.js" type="text/javascript" id="messages-2080865"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/rules-p-d1D4hSPec1QW4.js"></script><script type="text/javascript" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/90dc06697a"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/linkid.js"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/quant.js"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/2080865_002.js" id="hs-analytics"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/gtm.js"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/analytics.js"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/identity.js" async=""></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/1570554156513134.js" async=""></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/fbevents.js"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/track.js" id="cio-tracker" data-site-id="46e8e9c18365c4bba6c1"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/blueshift.js"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/bat.js"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/amplitude-3.js"></script><script type="text/javascript" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/conversion_async.js"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/nr-1026.js"></script><script type="text/javascript" id="analytics-js" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/analytics_002.js"></script><script type="text/javascript">(window.NREUM||(NREUM={})).loader_config={xpid:"VQQOUlNSCRACVFJSBQAHUQ=="};window.NREUM||(NREUM={}),__nr_require=function(t,n,e){function r(e){if(!n[e]){var o=n[e]={exports:{}};t[e][0].call(o.exports,function(n){var o=t[e][1][n];return r(o||n)},o,o.exports)}return n[e].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<e.length;o++)r(e[o]);return r}({1:[function(t,n,e){function r(t){try{s.console&&console.log(t)}catch(n){}}var o,i=t("ee"),a=t(15),s={};try{o=localStorage.getItem("__nr_flags").split(","),console&&"function"==typeof console.log&&(s.console=!0,o.indexOf("dev")!==-1&&(s.dev=!0),o.indexOf("nr_dev")!==-1&&(s.nrDev=!0))}catch(c){}s.nrDev&&i.on("internal-error",function(t){r(t.stack)}),s.dev&&i.on("fn-err",function(t,n,e){r(e.stack)}),s.dev&&(r("NR AGENT IN DEVELOPMENT MODE"),r("flags: "+a(s,function(t,n){return t}).join(", ")))},{}],2:[function(t,n,e){function r(t,n,e,r,o){try{d?d-=1:i("err",[o||new UncaughtException(t,n,e)])}catch(s){try{i("ierr",[s,c.now(),!0])}catch(u){}}return"function"==typeof f&&f.apply(this,a(arguments))}function UncaughtException(t,n,e){this.message=t||"Uncaught error with no additional information",this.sourceURL=n,this.line=e}function o(t){i("err",[t,c.now()])}var i=t("handle"),a=t(16),s=t("ee"),c=t("loader"),f=window.onerror,u=!1,d=0;c.features.err=!0,t(1),window.onerror=r;try{throw new Error}catch(l){"stack"in l&&(t(8),t(7),"addEventListener"in window&&t(5),c.xhrWrappable&&t(9),u=!0)}s.on("fn-start",function(t,n,e){u&&(d+=1)}),s.on("fn-err",function(t,n,e){u&&(this.thrown=!0,o(e))}),s.on("fn-end",function(){u&&!this.thrown&&d>0&&(d-=1)}),s.on("internal-error",function(t){i("ierr",[t,c.now(),!0])})},{}],3:[function(t,n,e){t("loader").features.ins=!0},{}],4:[function(t,n,e){function r(t){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var o=t("ee"),i=t("handle"),a=t(8),s=t(7),c="learResourceTimings",f="addEventListener",u="resourcetimingbufferfull",d="bstResource",l="resource",p="-start",h="-end",m="fn"+p,w="fn"+h,v="bstTimer",y="pushState",g=t("loader");g.features.stn=!0,t(6);var b=NREUM.o.EV;o.on(m,function(t,n){var e=t[0];e instanceof b&&(this.bstStart=g.now())}),o.on(w,function(t,n){var e=t[0];e instanceof b&&i("bst",[e,n,this.bstStart,g.now()])}),a.on(m,function(t,n,e){this.bstStart=g.now(),this.bstType=e}),a.on(w,function(t,n){i(v,[n,this.bstStart,g.now(),this.bstType])}),s.on(m,function(){this.bstStart=g.now()}),s.on(w,function(t,n){i(v,[n,this.bstStart,g.now(),"requestAnimationFrame"])}),o.on(y+p,function(t){this.time=g.now(),this.startPath=location.pathname+location.hash}),o.on(y+h,function(t){i("bstHist",[location.pathname+location.hash,this.startPath,this.time])}),f in window.performance&&(window.performance["c"+c]?window.performance[f](u,function(t){i(d,[window.performance.getEntriesByType(l)]),window.performance["c"+c]()},!1):window.performance[f]("webkit"+u,function(t){i(d,[window.performance.getEntriesByType(l)]),window.performance["webkitC"+c]()},!1)),document[f]("scroll",r,{passive:!0}),document[f]("keypress",r,!1),document[f]("click",r,!1)}},{}],5:[function(t,n,e){function r(t){for(var n=t;n&&!n.hasOwnProperty(u);)n=Object.getPrototypeOf(n);n&&o(n)}function o(t){s.inPlace(t,[u,d],"-",i)}function i(t,n){return t[1]}var a=t("ee").get("events"),s=t(18)(a,!0),c=t("gos"),f=XMLHttpRequest,u="addEventListener",d="removeEventListener";n.exports=a,"getPrototypeOf"in Object?(r(document),r(window),r(f.prototype)):f.prototype.hasOwnProperty(u)&&(o(window),o(f.prototype)),a.on(u+"-start",function(t,n){var e=t[1],r=c(e,"nr@wrapped",function(){function t(){if("function"==typeof e.handleEvent)return e.handleEvent.apply(e,arguments)}var n={object:t,"function":e}[typeof e];return n?s(n,"fn-",null,n.name||"anonymous"):e});this.wrapped=t[1]=r}),a.on(d+"-start",function(t){t[1]=this.wrapped||t[1]})},{}],6:[function(t,n,e){var r=t("ee").get("history"),o=t(18)(r);n.exports=r,o.inPlace(window.history,["pushState","replaceState"],"-")},{}],7:[function(t,n,e){var r=t("ee").get("raf"),o=t(18)(r),i="equestAnimationFrame";n.exports=r,o.inPlace(window,["r"+i,"mozR"+i,"webkitR"+i,"msR"+i],"raf-"),r.on("raf-start",function(t){t[0]=o(t[0],"fn-")})},{}],8:[function(t,n,e){function r(t,n,e){t[0]=a(t[0],"fn-",null,e)}function o(t,n,e){this.method=e,this.timerDuration="number"==typeof t[1]?t[1]:0,t[0]=a(t[0],"fn-",this,e)}var i=t("ee").get("timer"),a=t(18)(i),s="setTimeout",c="setInterval",f="clearTimeout",u="-start",d="-";n.exports=i,a.inPlace(window,[s,"setImmediate"],s+d),a.inPlace(window,[c],c+d),a.inPlace(window,[f,"clearImmediate"],f+d),i.on(c+u,r),i.on(s+u,o)},{}],9:[function(t,n,e){function r(t,n){d.inPlace(n,["onreadystatechange"],"fn-",s)}function o(){var t=this,n=u.context(t);t.readyState>3&&!n.resolved&&(n.resolved=!0,u.emit("xhr-resolved",[],t)),d.inPlace(t,w,"fn-",s)}function i(t){v.push(t),h&&(g=-g,b.data=g)}function a(){for(var t=0;t<v.length;t++)r([],v[t]);v.length&&(v=[])}function s(t,n){return n}function c(t,n){for(var e in t)n[e]=t[e];return n}t(5);var f=t("ee"),u=f.get("xhr"),d=t(18)(u),l=NREUM.o,p=l.XHR,h=l.MO,m="readystatechange",w=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],v=[];n.exports=u;var y=window.XMLHttpRequest=function(t){var n=new p(t);try{u.emit("new-xhr",[n],n),n.addEventListener(m,o,!1)}catch(e){try{u.emit("internal-error",[e])}catch(r){}}return n};if(c(p,y),y.prototype=p.prototype,d.inPlace(y.prototype,["open","send"],"-xhr-",s),u.on("send-xhr-start",function(t,n){r(t,n),i(n)}),u.on("open-xhr-start",r),h){var g=1,b=document.createTextNode(g);new h(a).observe(b,{characterData:!0})}else f.on("fn-end",function(t){t[0]&&t[0].type===m||a()})},{}],10:[function(t,n,e){function r(t){var n=this.params,e=this.metrics;if(!this.ended){this.ended=!0;for(var r=0;r<d;r++)t.removeEventListener(u[r],this.listener,!1);if(!n.aborted){if(e.duration=a.now()-this.startTime,4===t.readyState){n.status=t.status;var i=o(t,this.lastSize);if(i&&(e.rxSize=i),this.sameOrigin){var c=t.getResponseHeader("X-NewRelic-App-Data");c&&(n.cat=c.split(", ").pop())}}else n.status=0;e.cbTime=this.cbTime,f.emit("xhr-done",[t],t),s("xhr",[n,e,this.startTime])}}}function o(t,n){var e=t.responseType;if("json"===e&&null!==n)return n;var r="arraybuffer"===e||"blob"===e||"json"===e?t.response:t.responseText;return h(r)}function i(t,n){var e=c(n),r=t.params;r.host=e.hostname+":"+e.port,r.pathname=e.pathname,t.sameOrigin=e.sameOrigin}var a=t("loader");if(a.xhrWrappable){var s=t("handle"),c=t(11),f=t("ee"),u=["load","error","abort","timeout"],d=u.length,l=t("id"),p=t(14),h=t(13),m=window.XMLHttpRequest;a.features.xhr=!0,t(9),f.on("new-xhr",function(t){var n=this;n.totalCbs=0,n.called=0,n.cbTime=0,n.end=r,n.ended=!1,n.xhrGuids={},n.lastSize=null,p&&(p>34||p<10)||window.opera||t.addEventListener("progress",function(t){n.lastSize=t.loaded},!1)}),f.on("open-xhr-start",function(t){this.params={method:t[0]},i(this,t[1]),this.metrics={}}),f.on("open-xhr-end",function(t,n){"loader_config"in NREUM&&"xpid"in NREUM.loader_config&&this.sameOrigin&&n.setRequestHeader("X-NewRelic-ID",NREUM.loader_config.xpid)}),f.on("send-xhr-start",function(t,n){var e=this.metrics,r=t[0],o=this;if(e&&r){var i=h(r);i&&(e.txSize=i)}this.startTime=a.now(),this.listener=function(t){try{"abort"===t.type&&(o.params.aborted=!0),("load"!==t.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof n.onload))&&o.end(n)}catch(e){try{f.emit("internal-error",[e])}catch(r){}}};for(var s=0;s<d;s++)n.addEventListener(u[s],this.listener,!1)}),f.on("xhr-cb-time",function(t,n,e){this.cbTime+=t,n?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof e.onload||this.end(e)}),f.on("xhr-load-added",function(t,n){var e=""+l(t)+!!n;this.xhrGuids&&!this.xhrGuids[e]&&(this.xhrGuids[e]=!0,this.totalCbs+=1)}),f.on("xhr-load-removed",function(t,n){var e=""+l(t)+!!n;this.xhrGuids&&this.xhrGuids[e]&&(delete this.xhrGuids[e],this.totalCbs-=1)}),f.on("addEventListener-end",function(t,n){n instanceof m&&"load"===t[0]&&f.emit("xhr-load-added",[t[1],t[2]],n)}),f.on("removeEventListener-end",function(t,n){n instanceof m&&"load"===t[0]&&f.emit("xhr-load-removed",[t[1],t[2]],n)}),f.on("fn-start",function(t,n,e){n instanceof m&&("onload"===e&&(this.onload=!0),("load"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=a.now()))}),f.on("fn-end",function(t,n){this.xhrCbStart&&f.emit("xhr-cb-time",[a.now()-this.xhrCbStart,this.onload,n],n)})}},{}],11:[function(t,n,e){n.exports=function(t){var n=document.createElement("a"),e=window.location,r={};n.href=t,r.port=n.port;var o=n.href.split("://");!r.port&&o[1]&&(r.port=o[1].split("/")[0].split("@").pop().split(":")[1]),r.port&&"0"!==r.port||(r.port="https"===o[0]?"443":"80"),r.hostname=n.hostname||e.hostname,r.pathname=n.pathname,r.protocol=o[0],"/"!==r.pathname.charAt(0)&&(r.pathname="/"+r.pathname);var i=!n.protocol||":"===n.protocol||n.protocol===e.protocol,a=n.hostname===document.domain&&n.port===e.port;return r.sameOrigin=i&&(!n.hostname||a),r}},{}],12:[function(t,n,e){function r(){}function o(t,n,e){return function(){return i(t,[f.now()].concat(s(arguments)),n?null:this,e),n?void 0:this}}var i=t("handle"),a=t(15),s=t(16),c=t("ee").get("tracer"),f=t("loader"),u=NREUM;"undefined"==typeof window.newrelic&&(newrelic=u);var d=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit","addRelease"],l="api-",p=l+"ixn-";a(d,function(t,n){u[n]=o(l+n,!0,"api")}),u.addPageAction=o(l+"addPageAction",!0),u.setCurrentRouteName=o(l+"routeName",!0),n.exports=newrelic,u.interaction=function(){return(new r).get()};var h=r.prototype={createTracer:function(t,n){var e={},r=this,o="function"==typeof n;return i(p+"tracer",[f.now(),t,e],r),function(){if(c.emit((o?"":"no-")+"fn-start",[f.now(),r,o],e),o)try{return n.apply(this,arguments)}finally{c.emit("fn-end",[f.now()],e)}}}};a("setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(t,n){h[n]=o(p+n)}),newrelic.noticeError=function(t){"string"==typeof t&&(t=new Error(t)),i("err",[t,f.now()])}},{}],13:[function(t,n,e){n.exports=function(t){if("string"==typeof t&&t.length)return t.length;if("object"==typeof t){if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if("undefined"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!("undefined"!=typeof FormData&&t instanceof FormData))try{return JSON.stringify(t).length}catch(n){return}}}},{}],14:[function(t,n,e){var r=0,o=navigator.userAgent.match(/Firefox[\/\s](\d+\.\d+)/);o&&(r=+o[1]),n.exports=r},{}],15:[function(t,n,e){function r(t,n){var e=[],r="",i=0;for(r in t)o.call(t,r)&&(e[i]=n(r,t[r]),i+=1);return e}var o=Object.prototype.hasOwnProperty;n.exports=r},{}],16:[function(t,n,e){function r(t,n,e){n||(n=0),"undefined"==typeof e&&(e=t?t.length:0);for(var r=-1,o=e-n||0,i=Array(o<0?0:o);++r<o;)i[r]=t[n+r];return i}n.exports=r},{}],17:[function(t,n,e){n.exports={exists:"undefined"!=typeof window.performance&&window.performance.timing&&"undefined"!=typeof window.performance.timing.navigationStart}},{}],18:[function(t,n,e){function r(t){return!(t&&t instanceof Function&&t.apply&&!t[a])}var o=t("ee"),i=t(16),a="nr@original",s=Object.prototype.hasOwnProperty,c=!1;n.exports=function(t,n){function e(t,n,e,o){function nrWrapper(){var r,a,s,c;try{a=this,r=i(arguments),s="function"==typeof e?e(r,a):e||{}}catch(f){l([f,"",[r,a,o],s])}u(n+"start",[r,a,o],s);try{return c=t.apply(a,r)}catch(d){throw u(n+"err",[r,a,d],s),d}finally{u(n+"end",[r,a,c],s)}}return r(t)?t:(n||(n=""),nrWrapper[a]=t,d(t,nrWrapper),nrWrapper)}function f(t,n,o,i){o||(o="");var a,s,c,f="-"===o.charAt(0);for(c=0;c<n.length;c++)s=n[c],a=t[s],r(a)||(t[s]=e(a,f?s+o:o,i,s))}function u(e,r,o){if(!c||n){var i=c;c=!0;try{t.emit(e,r,o,n)}catch(a){l([a,e,r,o])}c=i}}function d(t,n){if(Object.defineProperty&&Object.keys)try{var e=Object.keys(t);return e.forEach(function(e){Object.defineProperty(n,e,{get:function(){return t[e]},set:function(n){return t[e]=n,n}})}),n}catch(r){l([r])}for(var o in t)s.call(t,o)&&(n[o]=t[o]);return n}function l(n){try{t.emit("internal-error",n)}catch(e){}}return t||(t=o),e.inPlace=f,e.flag=a,e}},{}],ee:[function(t,n,e){function r(){}function o(t){function n(t){return t&&t instanceof r?t:t?c(t,s,i):i()}function e(e,r,o,i){if(!l.aborted||i){t&&t(e,r,o);for(var a=n(o),s=h(e),c=s.length,f=0;f<c;f++)s[f].apply(a,r);var d=u[y[e]];return d&&d.push([g,e,r,a]),a}}function p(t,n){v[t]=h(t).concat(n)}function h(t){return v[t]||[]}function m(t){return d[t]=d[t]||o(e)}function w(t,n){f(t,function(t,e){n=n||"feature",y[e]=n,n in u||(u[n]=[])})}var v={},y={},g={on:p,emit:e,get:m,listeners:h,context:n,buffer:w,abort:a,aborted:!1};return g}function i(){return new r}function a(){(u.api||u.feature)&&(l.aborted=!0,u=l.backlog={})}var s="nr@context",c=t("gos"),f=t(15),u={},d={},l=n.exports=o();l.backlog=u},{}],gos:[function(t,n,e){function r(t,n,e){if(o.call(t,n))return t[n];var r=e();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,n,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return t[n]=r,r}var o=Object.prototype.hasOwnProperty;n.exports=r},{}],handle:[function(t,n,e){function r(t,n,e,r){o.buffer([t],r),o.emit(t,n,e)}var o=t("ee").get("handle");n.exports=r,r.ee=o},{}],id:[function(t,n,e){function r(t){var n=typeof t;return!t||"object"!==n&&"function"!==n?-1:t===window?0:a(t,i,function(){return o++})}var o=1,i="nr@id",a=t("gos");n.exports=r},{}],loader:[function(t,n,e){function r(){if(!x++){var t=b.info=NREUM.info,n=l.getElementsByTagName("script")[0];if(setTimeout(u.abort,3e4),!(t&&t.licenseKey&&t.applicationID&&n))return u.abort();f(y,function(n,e){t[n]||(t[n]=e)}),c("mark",["onload",a()+b.offset],null,"api");var e=l.createElement("script");e.src="https://"+t.agent,n.parentNode.insertBefore(e,n)}}function o(){"complete"===l.readyState&&i()}function i(){c("mark",["domContent",a()+b.offset],null,"api")}function a(){return E.exists&&performance.now?Math.round(performance.now()):(s=Math.max((new Date).getTime(),s))-b.offset}var s=(new Date).getTime(),c=t("handle"),f=t(15),u=t("ee"),d=window,l=d.document,p="addEventListener",h="attachEvent",m=d.XMLHttpRequest,w=m&&m.prototype;NREUM.o={ST:setTimeout,CT:clearTimeout,XHR:m,REQ:d.Request,EV:d.Event,PR:d.Promise,MO:d.MutationObserver};var v=""+location,y={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-1026.min.js"},g=m&&w&&w[p]&&!/CriOS/.test(navigator.userAgent),b=n.exports={offset:s,now:a,origin:v,features:{},xhrWrappable:g};t(12),l[p]?(l[p]("DOMContentLoaded",i,!1),d[p]("load",r,!1)):(l[h]("onreadystatechange",o),d[h]("onload",r)),c("mark",["firstbyte",s],null,"api");var x=0,E=t(17)},{}]},{},["loader",2,10,4,3]);</script>
|
|
<meta name="application-name" content="OpenClassrooms">
|
|
<meta name="msapplication-TileColor" content="#e95325">
|
|
<meta name="msapplication-TileImage" content="/fav-icon.png?v=1">
|
|
<meta name="theme-color" content="#E95325">
|
|
<link rel="icon" sizes="144x144" href="https://openclassrooms.com/fav-icon.png?v=1">
|
|
<link rel="apple-touch-icon" href="https://openclassrooms.com/apple-touch-icon.png">
|
|
<link rel="apple-touch-icon" href="https://openclassrooms.com/apple-touch-icon-iphone.png">
|
|
<link rel="apple-touch-icon" sizes="72x72" href="https://openclassrooms.com/apple-touch-icon-ipad.png">
|
|
<link rel="apple-touch-icon" sizes="114x114" href="https://openclassrooms.com/apple-touch-icon-iphone-retina-display.png">
|
|
<link rel="apple-touch-icon" sizes="144x144" href="https://openclassrooms.com/apple-touch-icon-ipad-retina-display.png">
|
|
<link rel="apple-touch-icon-precomposed" href="https://openclassrooms.com/apple-touch-icon-precomposed.png">
|
|
<link rel="shortcut icon" href="https://openclassrooms.com/favicon.ico?55e135e">
|
|
<link href="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/master-50071247.css" type="text/css" rel="stylesheet" media="all">
|
|
<link href="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/main-49192b3f.css" type="text/css" rel="stylesheet" media="all">
|
|
<script>
|
|
/*! modernizr 3.3.1 (Custom Build) | MIT *
|
|
* https://modernizr.com/download/?-cssfilters-touchevents-setclasses !*/
|
|
!function(e,n,t){function o(e,n){return typeof e===n}function r(){var e,n,t,r,s,i,a;for(var l in C)if(C.hasOwnProperty(l)){if(e=[],n=C[l],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(r=o(n.fn,"function")?n.fn():n.fn,s=0;s<e.length;s++)i=e[s],a=i.split("."),1===a.length?Modernizr[a[0]]=r:(!Modernizr[a[0]]||Modernizr[a[0]]instanceof Boolean||(Modernizr[a[0]]=new Boolean(Modernizr[a[0]])),Modernizr[a[0]][a[1]]=r),g.push((r?"":"no-")+a.join("-"))}}function s(e){var n=w.className,t=Modernizr._config.classPrefix||"";if(x&&(n=n.baseVal),Modernizr._config.enableJSClass){var o=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(o,"$1"+t+"js$2")}Modernizr._config.enableClasses&&(n+=" "+t+e.join(" "+t),x?w.className.baseVal=n:w.className=n)}function i(){return"function"!=typeof n.createElement?n.createElement(arguments[0]):x?n.createElementNS.call(n,"http://www.w3.org/2000/svg",arguments[0]):n.createElement.apply(n,arguments)}function a(){var e=n.body;return e||(e=i(x?"svg":"body"),e.fake=!0),e}function l(e,t,o,r){var s,l,u,f,p="modernizr",c=i("div"),d=a();if(parseInt(o,10))for(;o--;)u=i("div"),u.id=r?r[o]:p+(o+1),c.appendChild(u);return s=i("style"),s.type="text/css",s.id="s"+p,(d.fake?d:c).appendChild(s),d.appendChild(c),s.styleSheet?s.styleSheet.cssText=e:s.appendChild(n.createTextNode(e)),c.id=p,d.fake&&(d.style.background="",d.style.overflow="hidden",f=w.style.overflow,w.style.overflow="hidden",w.appendChild(d)),l=t(c,e),d.fake?(d.parentNode.removeChild(d),w.style.overflow=f,w.offsetHeight):c.parentNode.removeChild(c),!!l}function u(e,n){return!!~(""+e).indexOf(n)}function f(e){return e.replace(/([a-z])-([a-z])/g,function(e,n,t){return n+t.toUpperCase()}).replace(/^-/,"")}function p(e,n){return function(){return e.apply(n,arguments)}}function c(e,n,t){var r;for(var s in e)if(e[s]in n)return t===!1?e[s]:(r=n[e[s]],o(r,"function")?p(r,t||n):r);return!1}function d(e){return e.replace(/([A-Z])/g,function(e,n){return"-"+n.toLowerCase()}).replace(/^ms-/,"-ms-")}function m(n,o){var r=n.length;if("CSS"in e&&"supports"in e.CSS){for(;r--;)if(e.CSS.supports(d(n[r]),o))return!0;return!1}if("CSSSupportsRule"in e){for(var s=[];r--;)s.push("("+d(n[r])+":"+o+")");return s=s.join(" or "),l("@supports ("+s+") { #modernizr { position: absolute; } }",function(e){return"absolute"==getComputedStyle(e,null).position})}return t}function h(e,n,r,s){function a(){p&&(delete k.style,delete k.modElem)}if(s=o(s,"undefined")?!1:s,!o(r,"undefined")){var l=m(e,r);if(!o(l,"undefined"))return l}for(var p,c,d,h,v,y=["modernizr","tspan","samp"];!k.style&&y.length;)p=!0,k.modElem=i(y.shift()),k.style=k.modElem.style;for(d=e.length,c=0;d>c;c++)if(h=e[c],v=k.style[h],u(h,"-")&&(h=f(h)),k.style[h]!==t){if(s||o(r,"undefined"))return a(),"pfx"==n?h:!0;try{k.style[h]=r}catch(g){}if(k.style[h]!=v)return a(),"pfx"==n?h:!0}return a(),!1}function v(e,n,t,r,s){var i=e.charAt(0).toUpperCase()+e.slice(1),a=(e+" "+j.join(i+" ")+i).split(" ");return o(n,"string")||o(n,"undefined")?h(a,n,r,s):(a=(e+" "+E.join(i+" ")+i).split(" "),c(a,n,t))}function y(e,n,o){return v(e,t,t,n,o)}var g=[],C=[],S={_version:"3.3.1",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){C.push({name:e,fn:n,options:t})},addAsyncTest:function(e){C.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=S,Modernizr=new Modernizr;var w=n.documentElement,x="svg"===w.nodeName.toLowerCase(),_=S._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];S._prefixes=_;var b="CSS"in e&&"supports"in e.CSS,T="supportsCSS"in e;Modernizr.addTest("supports",b||T);var z=S.testStyles=l;Modernizr.addTest("touchevents",function(){var t;if("ontouchstart"in e||e.DocumentTouch&&n instanceof DocumentTouch)t=!0;else{var o=["@media (",_.join("touch-enabled),("),"heartz",")","{#modernizr{top:9px;position:absolute}}"].join("");z(o,function(e){t=9===e.offsetTop})}return t});var P="Moz O ms Webkit",j=S._config.usePrefixes?P.split(" "):[];S._cssomPrefixes=j;var E=S._config.usePrefixes?P.toLowerCase().split(" "):[];S._domPrefixes=E;var N={elem:i("modernizr")};Modernizr._q.push(function(){delete N.elem});var k={style:N.elem.style};Modernizr._q.unshift(function(){delete k.style}),S.testAllProps=v,S.testAllProps=y,Modernizr.addTest("cssfilters",function(){if(Modernizr.supports)return y("filter","blur(2px)");var e=i("a");return e.style.cssText=_.join("filter:blur(2px); "),!!e.style.length&&(n.documentMode===t||n.documentMode>9)}),r(),s(g),delete S.addTest,delete S.addAsyncTest;for(var A=0;A<Modernizr._q.length;A++)Modernizr._q[A]();e.Modernizr=Modernizr}(window,document);
|
|
</script>
|
|
<script type="text/javascript">
|
|
var App = {
|
|
startTime: (new Date()).getTime(),
|
|
pageGenerationDate: 1493979845000
|
|
};
|
|
|
|
App.user = {
|
|
|
|
|
|
isPremium: false
|
|
};
|
|
|
|
App.preferences = {
|
|
debug: false,
|
|
assetVersion: '55e135e',
|
|
contactMail: 'hello\x40openclassrooms.com',
|
|
adyenPublicKey: '10001\x7C889EBFD4D434B82683E21DCA26E77C3E20E0EE09A5ECE3830B0ED51F2FA721A2F7E9EC871C6AB9A1E12C4492F4717673047757E02C5256D8E265CD51E413E5EFCCFEAC41B39C662A424ADC13EE187C38C372A7FCCEC1EA5DF841989437D78B252A8EB51008E60BB55B1E55A7A80DE1A9D60D998C128A576BFAE1DDB97D514AF0A073AEDDE84CEE40D1F8F6ECE85D0FFA50C95C06DB274021C1371376C6EB16561FD65C5E2704B570A7504D617D0F3820F176A0609F6162BDF5890533289FDC3DA7DB03B50BB3BD60A613E1FF72060F22987627E8F1A29F0128A94EC4C8FF7CF6B7AB9558D8433BF86D7A388AB927641CD6C02689139CEE3AAC9ACBFFE83806CB',
|
|
cdnImage: true,
|
|
layer: {
|
|
appId: 'layer\x3A\x2F\x2F\x2Fapps\x2Fstaging\x2F7757c53a\x2Db2ba\x2D11e5\x2Db2a6\x2D2584730b1501',
|
|
identityProviderUrl: '\x2Fajax\x2Fconversations\x2Fget\x2Didentity\x2Dtoken'
|
|
},
|
|
algolia: {
|
|
appId: 'JGRXRFVQM0',
|
|
apiKey: 'dfbdea500cb0b5f46e449ad334916c44', indexName: 'prod_v2_COURSES_fr'
|
|
},
|
|
routes: {
|
|
COURSE_EVENT: '/components/courses/:courseId',
|
|
COURSE_PART_EVENT: '/components/courses/:courseId/parts/:partId',
|
|
|
|
ACCEPT_COOKIE: '\x2Fcomponents\x2Fuser\x2Daccept\x2Dconsent\x2Dcookie'
|
|
},
|
|
|
|
};
|
|
|
|
App.preferences.navigationPreference = {
|
|
};
|
|
|
|
App.preferences.modules = {
|
|
'smiley': {
|
|
basePath: '/bundles/common/images/smiley/'
|
|
}
|
|
};
|
|
|
|
App.notifications = {};
|
|
App.scripts = [];
|
|
</script>
|
|
<script>
|
|
App.data = App.data || {};
|
|
App.data.currentCourse = {"courseId":442495,"courseTitle":"Utilisation de Twig, un moteur de templates !","courseSlug":"utilisation-de-twig-un-moteur-de-templates","courseLanguage":"fr","isIntroduction":true,"isCertifying":false};
|
|
App.preferences.modules['view/currentCoursePage'] = App.data.currentCourse;
|
|
</script>
|
|
<script type="application/ld+json">
|
|
{"@context":"http:\/\/schema.org","@type":"Course","name":"Utilisation de Twig, un moteur de templates !","description":"Utilisation de Twig, un moteur de templates !","provider":{"@type":"Organization","name":"OpenClassrooms","sameAs":"https:\/\/openclassrooms.com\/"}}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
<meta property="og:locale" content="fr">
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:title" content="Utilisation de Twig, un moteur de templates ! @OpenClassrooms">
|
|
<meta property="og:url" content="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates">
|
|
<meta property="og:site_name" content="OpenClassrooms">
|
|
<meta property="og:image" content="">
|
|
<meta property="og:description" content="">
|
|
<meta name="twitter:card" content="summary">
|
|
<meta name="twitter:site" content="@OpenClassrooms">
|
|
<meta name="twitter:title" content="Utilisation de Twig, un moteur de templates ! @OpenClassrooms">
|
|
<meta name="twitter:description" content="">
|
|
<style type="text/css">.fancybox-margin{margin-right:17px;}</style><style id="ace_editor.css">.ace_editor {position: relative;overflow: hidden;font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: '';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}
|
|
/*# sourceURL=ace/css/ace_editor.css */</style><style id="ace-tm">.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}
|
|
/*# sourceURL=ace/css/ace-tm */</style><style> .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }</style><style type="text/css">.at-icon{fill:#fff;border:0}.at-icon-wrapper{display:inline-block;overflow:hidden}a .at-icon-wrapper{cursor:pointer}.at-rounded,.at-rounded-element .at-icon-wrapper{border-radius:12%}.at-circular,.at-circular-element .at-icon-wrapper{border-radius:50%}.addthis_32x32_style .at-icon{width:2pc;height:2pc}.addthis_24x24_style .at-icon{width:24px;height:24px}.addthis_20x20_style .at-icon{width:20px;height:20px}.addthis_16x16_style .at-icon{width:1pc;height:1pc}#at16lb{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:1001;background-color:#000;opacity:.001}#at_complete,#at_error,#at_share,#at_success{position:static!important}.at15dn{display:none}#at15s,#at16p,#at16p form input,#at16p label,#at16p textarea,#at_share .at_item{font-family:arial,helvetica,tahoma,verdana,sans-serif!important;font-size:9pt!important;outline-style:none;outline-width:0;line-height:1em}* html #at15s.mmborder{position:absolute!important}#at15s.mmborder{position:fixed!important;width:250px!important}#at15s{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABtJREFUeNpiZGBgaGAgAjAxEAlGFVJHIUCAAQDcngCUgqGMqwAAAABJRU5ErkJggg==);float:none;line-height:1em;margin:0;overflow:visible;padding:5px;text-align:left;position:absolute}#at15s a,#at15s span{outline:0;direction:ltr;text-transform:none}#at15s .at-label{margin-left:5px}#at15s .at-icon-wrapper{width:1pc;height:1pc;vertical-align:middle}#at15s .at-icon{width:1pc;height:1pc}.at4-icon{display:inline-block;background-repeat:no-repeat;background-position:top left;margin:0;overflow:hidden;cursor:pointer}.addthis_16x16_style .at4-icon,.addthis_default_style .at4-icon,.at4-icon,.at-16x16{width:1pc;height:1pc;line-height:1pc;background-size:1pc!important}.addthis_32x32_style .at4-icon,.at-32x32{width:2pc;height:2pc;line-height:2pc;background-size:2pc!important}.addthis_24x24_style .at4-icon,.at-24x24{width:24px;height:24px;line-height:24px;background-size:24px!important}.addthis_20x20_style .at4-icon,.at-20x20{width:20px;height:20px;line-height:20px;background-size:20px!important}.at4-icon.circular,.circular .at4-icon,.circular.aticon{border-radius:50%}.at4-icon.rounded,.rounded .at4-icon{border-radius:4px}.at4-icon-left{float:left}#at15s .at4-icon{text-indent:20px;padding:0;overflow:visible;white-space:nowrap;background-size:1pc;width:1pc;height:1pc;background-position:top left;display:inline-block;line-height:1pc}.addthis_vertical_style .at4-icon,.at4-follow-container .at4-icon{margin-right:5px}html>body #at15s{width:250px!important}#at15s.atm{background:none!important;padding:0!important;width:10pc!important}#at15s_inner{background:#fff;border:1px solid #fff;margin:0}#at15s_head{position:relative;background:#f2f2f2;padding:4px;cursor:default;border-bottom:1px solid #e5e5e5}.at15s_head_success{background:#cafd99!important;border-bottom:1px solid #a9d582!important}.at15s_head_success a,.at15s_head_success span{color:#000!important;text-decoration:none}#at15s_brand,#at15sptx,#at16_brand{position:absolute}#at15s_brand{top:4px;right:4px}.at15s_brandx{right:20px!important}a#at15sptx{top:4px;right:4px;text-decoration:none;color:#4c4c4c;font-weight:700}#at15sptx:hover{text-decoration:underline}#at16_brand{top:5px;right:30px;cursor:default}#at_hover{padding:4px}#at_hover .at_item,#at_share .at_item{background:#fff!important;float:left!important;color:#4c4c4c!important}#at_share .at_item .at-icon-wrapper{margin-right:5px}#at_hover .at_bold{font-weight:700;color:#000!important}#at_hover .at_item{width:7pc!important;padding:2px 3px!important;margin:1px;text-decoration:none!important}#at_hover .at_item.athov,#at_hover .at_item:focus,#at_hover .at_item:hover{margin:0!important}#at_hover .at_item.athov,#at_hover .at_item:focus,#at_hover .at_item:hover,#at_share .at_item.athov,#at_share .at_item:hover{background:#f2f2f2!important;border:1px solid #e5e5e5;color:#000!important;text-decoration:none}.ipad #at_hover .at_item:focus{background:#fff!important;border:1px solid #fff}.at15t{display:block!important;height:1pc!important;line-height:1pc!important;padding-left:20px!important;background-position:0 0;text-align:left}.addthis_button,.at15t{cursor:pointer}.addthis_toolbox a.at300b,.addthis_toolbox a.at300m{width:auto}.addthis_toolbox a{margin-bottom:5px;line-height:initial}.addthis_toolbox.addthis_vertical_style{width:200px}.addthis_button_facebook_like .fb_iframe_widget{line-height:100%}.addthis_button_facebook_like iframe.fb_iframe_widget_lift{max-width:none}.addthis_toolbox a.addthis_button_counter,.addthis_toolbox a.addthis_button_facebook_like,.addthis_toolbox a.addthis_button_facebook_send,.addthis_toolbox a.addthis_button_facebook_share,.addthis_toolbox a.addthis_button_foursquare,.addthis_toolbox a.addthis_button_google_plusone,.addthis_toolbox a.addthis_button_linkedin_counter,.addthis_toolbox a.addthis_button_pinterest_pinit,.addthis_toolbox a.addthis_button_stumbleupon_badge,.addthis_toolbox a.addthis_button_tweet{display:inline-block}.at-share-tbx-element .google_plusone_iframe_widget>span>div{vertical-align:top!important}.addthis_toolbox span.addthis_follow_label{display:none}.addthis_toolbox.addthis_vertical_style span.addthis_follow_label{display:block;white-space:nowrap}.addthis_toolbox.addthis_vertical_style a{display:block}.addthis_toolbox.addthis_vertical_style.addthis_32x32_style a{line-height:2pc;height:2pc}.addthis_toolbox.addthis_vertical_style .at300bs{margin-right:4px;float:left}.addthis_toolbox.addthis_20x20_style span{line-height:20px}.addthis_toolbox.addthis_32x32_style span{line-height:2pc}.addthis_toolbox.addthis_pill_combo_style .addthis_button_compact .at15t_compact,.addthis_toolbox.addthis_pill_combo_style a{float:left}.addthis_toolbox.addthis_pill_combo_style a.addthis_button_tweet{margin-top:-2px}.addthis_toolbox.addthis_pill_combo_style .addthis_button_compact .at15t_compact{margin-right:4px}.addthis_default_style .addthis_separator{margin:0 5px;display:inline}div.atclear{clear:both}.addthis_default_style .addthis_separator,.addthis_default_style .at4-icon,.addthis_default_style .at300b,.addthis_default_style .at300bo,.addthis_default_style .at300bs,.addthis_default_style .at300m{float:left}.at300b img,.at300bo img{border:0}a.at300b .at4-icon,a.at300m .at4-icon{display:block}.addthis_default_style .at300b,.addthis_default_style .at300bo,.addthis_default_style .at300m{padding:0 2px}.at300b,.at300bo,.at300bs,.at300m{cursor:pointer}.addthis_button_facebook_like.at300b:hover,.addthis_button_facebook_like.at300bs:hover,.addthis_button_facebook_send.at300b:hover,.addthis_button_facebook_send.at300bs:hover{opacity:1}.addthis_20x20_style .at15t,.addthis_20x20_style .at300bs{overflow:hidden;display:block;height:20px!important;width:20px!important;line-height:20px!important}.addthis_32x32_style .at15t,.addthis_32x32_style .at300bs{overflow:hidden;display:block;height:2pc!important;width:2pc!important;line-height:2pc!important}.at300bs{overflow:hidden;display:block;background-position:0 0;height:1pc;width:1pc;line-height:1pc!important}.addthis_default_style .at15t_compact,.addthis_default_style .at15t_expanded{margin-right:4px}#at_share .at_item{width:123px!important;padding:4px;margin-right:2px;border:1px solid #fff}#at16p{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABtJREFUeNpiZGBgaGAgAjAxEAlGFVJHIUCAAQDcngCUgqGMqwAAAABJRU5ErkJggg==);z-index:10000001;position:absolute;top:50%;left:50%;width:300px;padding:10px;margin:0 auto;margin-top:-185px;margin-left:-155px;font-family:arial,helvetica,tahoma,verdana,sans-serif;font-size:9pt;color:#5e5e5e}#at_share{margin:0;padding:0}#at16pt{position:relative;background:#f2f2f2;height:13px;padding:5px 10px}#at16pt a,#at16pt h4{font-weight:700}#at16pt h4{display:inline;margin:0;padding:0;font-size:9pt;color:#4c4c4c;cursor:default}#at16pt a{position:absolute;top:5px;right:10px;color:#4c4c4c;text-decoration:none;padding:2px}#at15sptx:focus,#at16pt a:focus{outline:thin dotted}#at15s #at16pf a{top:1px}#_atssh{width:1px!important;height:1px!important;border:0!important}.atm{width:10pc!important;padding:0;margin:0;line-height:9pt;letter-spacing:normal;font-family:arial,helvetica,tahoma,verdana,sans-serif;font-size:9pt;color:#444;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABtJREFUeNpiZGBgaGAgAjAxEAlGFVJHIUCAAQDcngCUgqGMqwAAAABJRU5ErkJggg==);padding:4px}.atm-f{text-align:right;border-top:1px solid #ddd;padding:5px 8px}.atm-i{background:#fff;border:1px solid #d5d6d6;padding:0;margin:0;box-shadow:1px 1px 5px rgba(0,0,0,.15)}.atm-s{margin:0!important;padding:0!important}.atm-s a:focus{border:transparent;outline:0;-webkit-transition:none;transition:none}#at_hover.atm-s a,.atm-s a{display:block;text-decoration:none;padding:4px 10px;color:#235dab!important;font-weight:400;font-style:normal;-webkit-transition:none;transition:none}#at_hover.atm-s .at_bold{color:#235dab!important}#at_hover.atm-s a:hover,.atm-s a:hover{background:#2095f0;text-decoration:none;color:#fff!important}#at_hover.atm-s .at_bold{font-weight:700}#at_hover.atm-s a:hover .at_bold{color:#fff!important}.atm-s a .at-label{vertical-align:middle;margin-left:5px;direction:ltr}.at_PinItButton{display:block;width:40px;height:20px;padding:0;margin:0;background-image:url(//s7.addthis.com/static/t00/pinit00.png);background-repeat:no-repeat}.at_PinItButton:hover{background-position:0 -20px}.addthis_toolbox .addthis_button_pinterest_pinit{position:relative}.at-share-tbx-element .fb_iframe_widget span{vertical-align:baseline!important}#at16pf{height:auto;text-align:right;padding:4px 8px}.at-privacy-info{position:absolute;left:7px;bottom:7px;cursor:pointer;text-decoration:none;font-family:helvetica,arial,sans-serif;font-size:10px;line-height:9pt;letter-spacing:.2px;color:#666}.at-privacy-info:hover{color:#000}.body .wsb-social-share .wsb-social-share-button-vert{padding-top:0;padding-bottom:0}.body .wsb-social-share.addthis_counter_style .addthis_button_tweet.wsb-social-share-button{padding-top:40px}.body .wsb-social-share.addthis_counter_style .addthis_button_google_plusone.wsb-social-share-button{padding-top:0}.body .wsb-social-share.addthis_counter_style .addthis_button_facebook_like.wsb-social-share-button{padding-top:21px}@media print{#at4-follow,#at4-share,#at4-thankyou,#at4-whatsnext,#at4m-mobile,#at15s,.at4,.at4-recommended{display:none!important}}@media screen and (max-width:400px){.at4win{width:100%}}@media screen and (max-height:700px) and (max-width:400px){.at4-thankyou-inner .at4-recommended-container{height:122px;overflow:hidden}.at4-thankyou-inner .at4-recommended .at4-recommended-item:first-child{border-bottom:1px solid #c5c5c5}}</style><style type="text/css">.at-branding-logo{font-family:helvetica,arial,sans-serif;text-decoration:none;font-size:10px;display:inline-block;margin:2px 0;letter-spacing:.2px}.at-branding-logo .at-branding-icon{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRF////+GlNUkcc1QAAAB1JREFUeNpiYIQDBjQmAwMmkwEM0JnY1WIxFyDAABGeAFEudiZsAAAAAElFTkSuQmCC")}.at-branding-logo .at-branding-icon,.at-branding-logo .at-privacy-icon{display:inline-block;height:10px;width:10px;margin-left:4px;margin-right:3px;margin-bottom:-1px;background-repeat:no-repeat}.at-branding-logo .at-privacy-icon{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAKCAMAAABR24SMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABhQTFRF8fr9ot/xXcfn2/P5AKva////////AKTWodjhjAAAAAd0Uk5T////////ABpLA0YAAAA6SURBVHjaJMzBDQAwCAJAQaj7b9xifV0kUKJ9ciWxlzWEWI5gMF65KUTv0VKkjVeTerqE/x7+9BVgAEXbAWI8QDcfAAAAAElFTkSuQmCC")}.at-branding-logo span{text-decoration:none}.at-branding-logo .at-branding-addthis,.at-branding-logo .at-branding-powered-by{color:#666}.at-branding-logo .at-branding-addthis:hover{color:#333}.at-cv-with-image .at-branding-addthis,.at-cv-with-image .at-branding-addthis:hover{color:#fff}a.at-branding-logo:visited{color:initial}.at-branding-info{display:inline-block;padding:0 5px;color:#666;border:1px solid #666;border-radius:50%;font-size:10px;line-height:9pt;opacity:.7;transition:all .3s ease;text-decoration:none}.at-branding-info span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.at-branding-info:before{content:'i';font-family:Times New Roman}.at-branding-info:hover{color:#0780df;border-color:#0780df}</style><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/theme-monokai.js"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/mode-php.js"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/mode-html.js"></script><style id="ace-monokai">.ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}
|
|
/*# sourceURL=ace/css/ace-monokai */</style><style>.ace_static_highlight {font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;font-size: 12px;white-space: pre-wrap}.ace_static_highlight .ace_gutter {width: 2em;text-align: right;padding: 0 3px 0 0;margin-right: 3px;}.ace_static_highlight.ace_show_gutter .ace_line {padding-left: 2.6em;}.ace_static_highlight .ace_line { position: relative; }.ace_static_highlight .ace_gutter-cell {-moz-user-select: -moz-none;-khtml-user-select: none;-webkit-user-select: none;user-select: none;top: 0;bottom: 0;left: 0;position: absolute;}.ace_static_highlight .ace_gutter-cell:before {content: counter(ace_line, decimal);counter-increment: ace_line;}.ace_static_highlight {counter-reset: ace_line;}.ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}</style><script async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/satismeter.js"></script><style type="text/css"></style><script type="text/javascript" charset="utf-8" async="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/layers.js"></script><style type="text/css">.at-share-dock.atss{top:auto;left:0;right:0;bottom:0;width:100%;max-width:100%;z-index:1000200;box-shadow:0 0 1px 1px #e2dfe2}.at-share-dock.at-share-dock-zindex-hide{z-index:-1!important}.at-share-dock.atss-top{bottom:auto;top:0}.at-share-dock a{width:auto;-webkit-transition:none;transition:none;color:#fff;text-decoration:none;box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.at-share-dock a:hover{width:auto}.at-share-dock .at4-count{height:43px;padding:5px 0 0;line-height:20px;background:#fff;font-family:Helvetica neue,arial}.at-share-dock .at4-count span{width:100%}.at-share-dock .at4-count .at4-share-label{color:#848484;font-size:10px;letter-spacing:1px}.at-share-dock .at4-count .at4-counter{top:2px;position:relative;display:block;color:#222;font-size:22px}.at-share-dock.at-shfs-medium .at4-count{height:36px;line-height:1pc;padding-top:4px}.at-share-dock.at-shfs-medium .at4-count .at4-counter{font-size:18px}.at-share-dock.at-shfs-medium .at-share-btn .at-icon-wrapper,.at-share-dock.at-shfs-medium a .at-icon-wrapper{padding:6px 0}.at-share-dock.at-shfs-small .at4-count{height:26px;line-height:1;padding-top:3px}.at-share-dock.at-shfs-small .at4-count .at4-share-label{font-size:8px}.at-share-dock.at-shfs-small .at4-count .at4-counter{font-size:14px}.at-share-dock.at-shfs-small .at-share-btn .at-icon-wrapper,.at-share-dock.at-shfs-small a .at-icon-wrapper{padding:4px 0}</style><style type="text/css">#at4m-mobile-container{z-index:9999999;position:fixed}#at4m-menu{-webkit-transition-timing-function:linear;transition-timing-function:linear}#at4-searchClear{cursor:pointer}#at4m-dock{position:fixed;left:0;width:100%;-o-box-shadow:0 -1px 4px rgba(0,0,0,.15);box-shadow:0 -1px 4px rgba(0,0,0,.15);font-family:helvetica neue,helvetica,arial,sans-serif;font-size:14px;font-weight:300;color:#000}.at4m-dock{background:#ebebeb}.at4m-dock-bottom{top:auto;bottom:0}.at4m-dock-top{top:0;bottom:auto}.at4m-dock a:link,.at4m-dock a:visited{display:block;border:none;margin:0;padding:0;height:45px;line-height:45px;text-align:center;text-decoration:none;text-shadow:none;font-weight:700;color:#555;cursor:pointer;float:left;zoom:1}.at4m-dock a:active,.at4m-dock a:hover,.at4m-dock-toggle a:hover{background-color:#e2e2e2;color:#000;cursor:pointer}.at4m-dock a i{display:inline-block;height:45px;line-height:45px;vertical-align:middle;opacity:.2}.at4m-dock a:active i,.at4m-dock a:hover i{opacity:.9}.at4m-dock a i.at4m-dock-share{background:url(//s7.addthis.com/static/0cdf7a36b49e9150e4ddd7ce01143fdc.png) no-repeat 0 0;background-image:url(//s7.addthis.com/static/c4ee1ef2025cac1d2377de864e802791.svg),none;background-position:0 -2px;width:30px}.at4m-dock a i.at4m-dock-follow{background:url(//s7.addthis.com/static/34c65ab171688e81111b0c5219405376.png) no-repeat 0 0;background-image:url(//s7.addthis.com/static/2f9e800dffd36b9ae492670a4340386e.svg),none;background-position:0 -2px;width:26px}.at4m-dock.at4-ma1 a{display:inline-block;width:86%}.at4m-dock.at4-ma2 a{display:inline-block;width:43%}.at4m-dock.at4-ma2 a:first-child{border-right:1px solid #ccc}.at4m-dock-toggle{position:fixed;left:auto;right:0;width:14%;min-width:40px;height:45px}.at4m-dock-toggle-bottom{top:auto;bottom:0}.at4m-dock-toggle-top{bottom:auto;top:0}.at4m-dock-toggle a{display:block;background:url(//s7.addthis.com/static/6f026d41cd1a08a0f124517f4a4b6381.png) no-repeat center;background-image:url(//s7.addthis.com/static/6ac59ac63a78f7c0ecfe9bbc05ee16af.svg),none;border-left:1px solid #ccc;height:44px;line-height:44px;overflow:hidden;text-indent:-9999em;text-align:center;padding:0;margin:0;opacity:.35}.at4m-dock-toggle a.at4-dock-toggle-active{background:url(//s7.addthis.com/static/edb81de4c71c0bc5e7093002607fb828.png) no-repeat center;background-image:url(//s7.addthis.com/static/958b6ad449d91a582198eaaa1013e4a8.svg),none;background-color:#fff;border-top:1px solid #ccc}.at4m-dock-toggle.ats-dark,.at4m-dock.ats-dark{background:#262b30;border-color:#1b1b1b;color:#fff}.at4m-dock.ats-dark a{color:#f2f2f2}.at4m-dock.ats-dark a i{opacity:.25}.at4m-dock.at4-ma2.ats-dark a:first-child{border-right:1px solid #3e4247}.at4m-dock-toggle.ats-dark a:active,.at4m-dock-toggle.ats-dark a:hover,.at4m-dock.ats-dark a:active,.at4m-dock.ats-dark a:hover{background-color:#1b1e22}.at4m-dock.ats-dark a i.at4m-dock-share{background:url(//s7.addthis.com/static/969412d543656390654b7a1fbad5c052.png) no-repeat left center;background-image:url(//s7.addthis.com/static/d0b50381e6dff723034c9fb045fa5579.svg),none;background-position:0 -2px}.at4m-dock.ats-dark a i.at4m-dock-follow{background:url(//s7.addthis.com/static/031cd90bcb2cf1bc5d0514d6df32e08b.png) no-repeat left center;background-image:url(//s7.addthis.com/static/9b6c210d20bea1e6b56e800331c32bff.svg),none;background-position:0 -2px}.at4m-dock-toggle.ats-dark a{background:url(//s7.addthis.com/static/bd94d63e97308ccebb29a220dcc82c2c.png) no-repeat center;background-image:url(//s7.addthis.com/static/066d11a3dfa049803336eba1abb50292.svg),none;border-color:#676d73}.at4m-dock-toggle.ats-dark a.at4-dock-toggle-active{background:url(//s7.addthis.com/static/6ff05a92b143930d8fcc6a7d47a6859b.png) no-repeat center;background-image:url(//s7.addthis.com/static/fd9202254cfad377dad0ecc0eb38d503.svg),none}.at4m-dock-toggle.top,.at4m-dock.top{top:0;bottom:auto}.at4m-dock-toggle.top a{background:url(//s7.addthis.com/static/edb81de4c71c0bc5e7093002607fb828.png) no-repeat center;background-image:url(//s7.addthis.com/static/958b6ad449d91a582198eaaa1013e4a8.svg),none}.at4m-dock-toggle.top a.at4-dock-toggle-active{background:url(//s7.addthis.com/static/6f026d41cd1a08a0f124517f4a4b6381.png) no-repeat center;background-image:url(//s7.addthis.com/static/6ac59ac63a78f7c0ecfe9bbc05ee16af.svg),none}.at4m-dock-toggle.top.ats-dark a{background:url(//s7.addthis.com/static/6ff05a92b143930d8fcc6a7d47a6859b.png) no-repeat center;background-image:url(//s7.addthis.com/static/fd9202254cfad377dad0ecc0eb38d503.svg),none;border-color:#676d73}.at4m-dock-toggle.top.ats-dark a.at4-dock-toggle-active{background:url(//s7.addthis.com/static/bd94d63e97308ccebb29a220dcc82c2c.png) no-repeat center;background-image:url(//s7.addthis.com/static/066d11a3dfa049803336eba1abb50292.svg),none}.at4m-dock.ats-gray{border-top:1px solid #dbdbdb}.at4m-dock.ats-gray a:first-child{border-right:1px solid #dadada}.at4m-dock.ats-gray a{color:#444}.at4m-dock.ats-gray a i{opacity:.25}.at4m-dock-toggle.ats-gray a{border-color:#b2b2b2}.at4m-dock-toggle.ats-gray a.at4-dock-toggle-active{background-color:#e2e2e2;border-color:#b2b2b2}.at4m-dock-toggle.ats-light a:active,.at4m-dock-toggle.ats-light a:hover,.at4m-dock.ats-light a:active,.at4m-dock.ats-light a:hover{background-color:#f5f5f5}.at4m-dock-toggle.ats-light a.at4-dock-toggle,.at4m-dock-toggle.ats-light a.at4-dock-toggle-active{background-color:#fff;border-color:#dadada}.at4m-menu{position:fixed;background:#fff;top:0;left:0;right:0;bottom:0;font-family:helvetica neue,helvetica,arial,sans-serif;font-size:14px;font-weight:300;display:none;opacity:0}.at4m-menu.abs{position:absolute}.at4m-menu .at4m-menu-inner{position:relative;width:100%;height:100%;overflow:auto}.at4m-menu .at4m-menu-inner .at4m-menu-header{position:fixed;top:0;left:0;right:0;width:100%;background:#fff;-o-box-shadow:0 2px 4px rgba(0,0,0,.1);box-shadow:0 2px 4px rgba(0,0,0,.1);font-family:helvetica neue,helvetica,arial,sans-serif;font-weight:700;color:#444;cursor:default}.at4m-menu .at4m-menu-inner .at4m-menu-header .at4m-menu-header-inner{position:relative;height:44px;text-align:left;line-height:44px;padding:0 44px 0 15px}.at4m-menu .at4m-menu-inner .at4m-menu-header .at4m-menu-header-inner a.at4m-menu-cancel{position:absolute;top:0;right:0;display:block;background:url(//s7.addthis.com/static/56b9cf44789a75f4822ae4677c0809f0.png) no-repeat center center;background-image:url(//s7.addthis.com/static/fc0122e3c71ae79db7be2a7ccfcd419c.svg),none;width:42px;height:44px;overflow:hidden;text-indent:-9999em;opacity:.74}#at4m-menu-body{top:45px;bottom:35px;left:0;overflow-y:scroll}#at4m-menu-body,#at4m-scroller{position:absolute;width:100%}.at4m-hidden-overflow{overflow:hidden}.at4m-scroll-overflow{overflow-y:auto!important}.at4m-menu .at4m-menu-inner .at4m-menu-search{position:relative;background:#f5f5f5;border-bottom:1px solid #e7e9ec;height:44px}.at4m-menu .at4m-menu-inner .at4m-menu-search input[type=text]{position:absolute;top:7px;left:13px;right:15px;width:auto;background:transparent;border:none;height:24px;line-height:1.14em;padding:4px 4px 4px 22px;font-size:1.14em;font-weight:300;outline:0;margin-bottom:0}.at4m-menu .at4m-menu-inner .at4m-menu-search input[type=submit]{position:absolute;top:11px;left:14px;width:1pc;height:1pc;background:url(//s7.addthis.com/static/3fc4b18bbb046f074de86a3cb5398353.svg),none;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1NDQxMjk0RDkzRjIxMUUyODgyNEMyRjRCOUU5QTdDNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1NDQxMjk0RTkzRjIxMUUyODgyNEMyRjRCOUU5QTdDNiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU0NDEyOTRCOTNGMjExRTI4ODI0QzJGNEI5RTlBN0M2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU0NDEyOTRDOTNGMjExRTI4ODI0QzJGNEI5RTlBN0M2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+RlRfxAAAAOhJREFUeNrEU+0NgkAM5YwD4Aa6AUygTuAIwASck8hNAG7CBrKBjIAT4CvpkSb2/Ag/bNL0CH3vXj/OjOMYLbFVtNDW/mCMmWJVVVuEXOS01tpWgqRq4z+IAOALjla5qAFJoRHMJQCcM7iDHwEgSSkpIEVM/mKzAufcHSGG7wAeZBLAN4QEvqF/qgLYlqUOykVXjsmnKTwCzR6+GSMlZZAbK3kZx/4dgeMyak9CEV7jeKDmorw+2EQeYy12oFNqnsYZ3AMxzhNPxDdwL4ibsiyLIEHIhLoOBOnPb4E38UxLpvbgb6/xKcAAtbllO+gwy6kAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:0 0;background-position:center bottom\9;border:none;overflow:hidden;text-indent:-9999em;cursor:pointer;opacity:.22}.at4m-menu .at4m-menu-inner .at4m-menu-search input[type=cancel]{position:absolute;top:9pt;right:20px;width:18px;height:18px;background:url(//s7.addthis.com/static/f048274431eaef1b46f80d94f1c18af6.png) no-repeat center center;background-image:url(//s7.addthis.com/static/666b87d14e4d4e526b57292ab8adc465.svg),none;background-size:18px 18px;border:none;overflow:hidden;text-indent:-9999em;opacity:.14}.at4m-menu .at4m-menu-inner .at4m-menu-footer{position:fixed;bottom:0;left:0;right:0;width:100%;height:30px;background:#fff;text-align:left;line-height:1pc;-o-box-shadow:0 -2px 4px rgba(0,0,0,.1);box-shadow:0 -2px 4px rgba(0,0,0,.1)}.at4m-menu .at4m-menu-inner .at4m-menu-footer .at4m-menu-footer-inner{position:relative;height:26px;padding:5px 15px}.at4m-menu .at4m-menu-inner .at4m-menu-footer .at4m-menu-footer-inner .at4m-menu-footer-logo{background:url(//s7.addthis.com/static/5432e2206e5cb0b11874ad11e5a22186.png);background-image:url(//s7.addthis.com/static/f1a5a53cfb4afc0b8231b342c9e39ece.svg),none;background-repeat:no-repeat;background-position:left 2px;background-size:9px 9px;padding-left:9pt}.at4m-menu .at4m-menu-inner .at4m-menu-footer .at4m-menu-footer-inner .at4m-menu-footer-privacy{position:absolute;top:7px;right:15px;background:url(//s7.addthis.com/static/7450d2e11bef7d7c140b197429765a62.png);background-image:url(//s7.addthis.com/static/d714fde79b61d3f511dd5c11ad366e68.svg),none;background-repeat:no-repeat;background-position:right 3px;background-size:8px 9px;padding-right:13px}.at4m-menu .at4m-menu-inner .at4m-menu-footer .at4m-menu-footer-inner a:link,.at4m-menu .at4m-menu-inner .at4m-menu-footer .at4m-menu-footer-inner a:visited{font-size:.714em;text-decoration:none;color:#666}.at4m-menu.abs{border-top:.5px solid #efefef}.at4m-menu.abs,.at4m-menu.abs .at4m-menu-inner .at4m-menu-footer,.at4m-menu.abs .at4m-menu-inner .at4m-menu-header{position:absolute}.at4m-menu .at4m-menu-content{position:relative;padding:0 0 27px}.at4m-menu .at4m-menu-content ul{margin:0;padding:0}.at4m-menu .at4m-menu-content ul li{background:#fff;list-style:none;margin:0;padding:0;border-bottom:1px solid #e7e9ec;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.at4m-menu .at4m-menu-content ul li:hover{background:#f5f5f5}.at4m-menu .at4m-menu-content ul li a{position:relative;display:block;height:2pc;line-height:2pc;padding:9pt 20px 9pt 14px;text-decoration:none;text-align:left;font-family:helvetica neue,helvetica,arial,sans-serif;font-size:1.07em;font-weight:300;color:#444;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.at4m-menu .at4m-menu-content ul li a:active{background-color:#f9f9f9}.at4m-menu .at4m-menu-content ul li a span.at-icon-wrapper{margin:0 9px 0 0;float:left}.at4m-menu .at4m-menu-content ul li a span.at4-label{display:inline-block;height:2pc;line-height:2pc;margin-left:10px}.at4m-menu .at4m-menu-content ul li a span.at4-label.atservice-preferred{font-weight:700}.at4m-menu .at4m-menu-content ul li a span.at4-arrow{display:inline-block;position:absolute;right:5px;background:url(//s7.addthis.com/static/745bc30b589d20aeba08481e06fae159.png);background-image:url(//s7.addthis.com/static/f4d5547a72831e67681d82122e1d563f.svg),none;background-repeat:no-repeat;background-position:center center;width:2pc;height:2pc;text-indent:-9999em;overflow:hidden;opacity:.22}.at4m-menu.ats-dark .at4m-menu-footer,.at4m-menu.ats-dark .at4m-menu-header{background:#262b30;color:#fff}.at4m-menu.ats-dark .at4m-menu-inner .at4m-menu-header button{background:#000;border-color:#333;color:#fff}.at4m-menu.ats-dark .at4m-menu-inner .at4m-menu-header .at4m-menu-header-inner a.at4m-menu-cancel{background:url(//s7.addthis.com/static/5092b14c9020eaa68c3de74da2219940.png) no-repeat center center;background-image:url(//s7.addthis.com/static/fb08f6d50887bd0caacc86a62bcdcf68.svg),none}.at4m-menu.ats-dark .at4m-menu-inner .at4m-menu-footer .at4m-menu-footer-inner a:link,.at4m-menu.ats-dark .at4m-menu-inner .at4m-menu-footer .at4m-menu-footer-inner a:visited{color:#ccc}#at4m-dock:hover{cursor:pointer}#at4m-dock.ats-dark{background:#262b30;border-color:#1b1b1b;color:#fff}#at4m-dock.ats-light{background:#fff;border-color:#c5c5c5}.at4m-dock.ats-dark a,.at4m-dock.ats-dark a:first-child{color:#fff}.at4m-dock.ats-dark a:active,.at4m-dock.ats-dark a:hover{background:#1b1e22}.at-expandedmenu-component .at4m-dock,.at-expandedmenu-component .at4m-dock-toggle{display:none}</style><style type="text/css">#at4-drawer-outer-container{top:0;width:20pc;position:fixed}#at4-drawer-outer-container.at4-drawer-inline{position:relative}#at4-drawer-outer-container.at4-drawer-inline.at4-drawer-right{float:right;right:0;left:auto}#at4-drawer-outer-container.at4-drawer-inline.at4-drawer-left{float:left;left:0;right:auto}#at4-drawer-outer-container.at4-drawer-shown,#at4-drawer-outer-container.at4-drawer-shown *{z-index:999999}#at4-drawer-outer-container,#at4-drawer-outer-container .at4-drawer-outer,#at-drawer{height:100%;overflow-y:auto;overflow-x:hidden}.at4-drawer-push-content-right-back{position:relative;right:0}.at4-drawer-push-content-right{position:relative;left:20pc!important}.at4-drawer-push-content-left-back{position:relative;left:0}.at4-drawer-push-content-left{position:relative;right:20pc!important}#at4-drawer-outer-container.at4-drawer-right{left:auto;right:-20pc}#at4-drawer-outer-container.at4-drawer-left{right:auto;left:-20pc}#at4-drawer-outer-container.at4-drawer-shown.at4-drawer-right{left:auto;right:0}#at4-drawer-outer-container.at4-drawer-shown.at4-drawer-left{right:auto;left:0}#at-drawer{top:0;z-index:9999999;height:100%;-webkit-animation-duration:.4s;animation-duration:.4s}#at-drawer.drawer-push.at-right{right:-20pc}#at-drawer.drawer-push.at-left{left:-20pc}#at-drawer .at-recommended-label{padding:0 0 0 20px;color:#999;line-height:3pc;font-size:18px;font-weight:300;cursor:default}#at-drawer-arrow{width:30px;height:5pc}#at-drawer-arrow.ats-dark{background:#262b30}#at-drawer-arrow.ats-gray{background:#f2f2f2}#at-drawer-open-arrow{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAABcCAYAAAC1OT8uAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk3ODNCQjdERUQ3QjExRTM5NjFGRUZBODc3MTIwMTNCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk3ODNCQjdFRUQ3QjExRTM5NjFGRUZBODc3MTIwMTNCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTc4M0JCN0JFRDdCMTFFMzk2MUZFRkE4NzcxMjAxM0IiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTc4M0JCN0NFRDdCMTFFMzk2MUZFRkE4NzcxMjAxM0IiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7kstzCAAAB4ElEQVR42uyWv0oDQRDGb9dYimgVjliID2Ca9AGfwtZob2Grja1PIFj7EhGCYK99VPBPOkVMp8X5rc6FeN7dfjOksMjAxwXZ3667OzvfLKRr682l5ZV9aDh+fxsnRHhoDzqGLjFBi4XOoFtoAxowoB893o/w7WpAl/+QgQMBwwRdTPhUC2lAV/wDA7qy5WOgq9psHejqTqkKdLE7KYCv0JZjMgBgB58raBG6mP1K6j2pT099T+qMUOeeOss1wDcEIA1PnQXy576rAUI0oFMoC7VCnn40Gs8Pd4lAiXNUKmJ0lh1mPzGEWiyUCqAGW3Pwv4IvUJsFO9CHgP3Zr6Te0xwgAf3LxaAjS241pbikCRkOg+nSJdV4p8HOPl3vvRYI5dtrgVDvvcWovcWovcWovcWovcWovcWovQChWNywNpqvdAKtQp/QNmPUIQ6kwwqt2Xmsxf6GMPM1Pptsbz45CPmXqKb+15Gz4J/LZcDSNIqBlQlbB0afe1mmUDWiCNKFZRq0VKMeXY1CTDq2sJLWsCmoaBBRqNRR6qBKC6qCaj2rDIqaXBGiXHEaom00h1S+K3fVlr6HNuqgvgCh0+owt21bybQn8+mZ78mcEebcM2e5+T2ZX24ZqCph0qn1vgQYAJ/KDpLQr2tPAAAAAElFTkSuQmCC);background-repeat:no-repeat;width:13px;height:23px;margin:28px 0 0 8px}.at-left #at-drawer-open-arrow{background-position:0 -46px}.ats-dark #at-drawer-open-arrow{background-position:0 -23px}.ats-dark.at-left #at-drawer-open-arrow{background-position:0 -69px}#at-drawer-arrow.at4-drawer-modern-browsers{position:fixed;top:40%;background-repeat:no-repeat;background-position:0 0!important;z-index:9999999}.at4-drawer-inline #at-drawer-arrow{position:absolute}#at-drawer-arrow.at4-drawer-modern-browsers.at-right{right:0}#at-drawer-arrow.at4-drawer-modern-browsers.at-left{left:0}.at4-drawer-push-animation-left{-webkit-transition:left .4s ease-in-out .15s;transition:left .4s ease-in-out .15s}.at4-drawer-push-animation-right{-webkit-transition:right .4s ease-in-out .15s;transition:right .4s ease-in-out .15s}#at-drawer.drawer-push.at4-drawer-push-animation-right{right:0}#at-drawer.drawer-push.at4-drawer-push-animation-right-back{right:-20pc!important}#at-drawer.drawer-push.at4-drawer-push-animation-left{left:0}#at-drawer.drawer-push.at4-drawer-push-animation-left-back{left:-20pc!important}#at-drawer .at4-closebutton.drawer-close{content:'X';color:#999;display:block;position:absolute;margin:0;top:0;right:0;width:3pc;height:45px;line-height:45px;overflow:hidden;opacity:.5}#at-drawer.ats-dark .at4-closebutton.drawer-close{color:#fff}#at-drawer .at4-closebutton.drawer-close:hover{opacity:1}#at-drawer.ats-dark.at4-recommended .at4-logo-container a{color:#666}#at-drawer.at4-recommended .at4-recommended-vertical{padding:0}#at-drawer.at4-recommended .at4-recommended-item .sponsored-label{margin:2px 0 0 21px;color:#ddd}#at-drawer.at4-recommended .at4-recommended-vertical .at4-recommended-item{position:relative;padding:0;width:20pc;height:180px;margin:0}#at-drawer.at4-recommended .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-img a:after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.65);z-index:1000000;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#at-drawer.at4-recommended .at4-recommended-vertical .at4-recommended-item.at-hover .at4-recommended-item-img a:after{background:rgba(0,0,0,.8)}#at-drawer .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-img,#at-drawer .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-img a,#at-drawer .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-img img{width:20pc;height:180px;float:none}#at-drawer .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption{width:100%;position:absolute;bottom:0;left:0;height:70px}#at-drawer .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption .at-h4{color:#fff;position:absolute;height:52px;top:0;left:20px;right:20px;margin:0;padding:0;line-height:25px;font-size:20px;font-weight:600;z-index:1000001;text-decoration:none;text-transform:none}#at-drawer.at4-recommended .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption .at-h4 a:hover{text-decoration:none}#at-drawer.at4-recommended .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption .at-h4 a:link{color:#fff}#at-drawer.at4-recommended .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption small{position:absolute;top:auto;bottom:10px;left:20px;width:auto;color:#ccc}#at-drawer.at4-recommended .at4-logo-container{margin-left:20px}#at-drawer.ats-dark.at4-recommended .at4-logo-container a:hover{color:#fff}#at-drawer.at4-recommended .at-logo{margin:0}</style><style type="text/css">.at4-follow.at-mobile{display:none!important}.at4-follow{position:fixed;top:0;right:0;font-weight:400;color:#666;cursor:default;z-index:10001}.at4-follow .at4-follow-inner{position:relative;padding:10px 24px 10px 15px}.at4-follow-inner,.at-follow-open-control{border:0 solid #c5c5c5;border-width:1px 0 1px 1px;margin-top:-1px}.at4-follow .at4-follow-container{margin-left:9pt}.at4-follow.at4-follow-24 .at4-follow-container{height:24px;line-height:23px;font-size:13px}.at4-follow.at4-follow-32 .at4-follow-container{width:15pc;height:2pc;line-height:2pc;font-size:14px}.at4-follow .at4-follow-container .at-follow-label{display:inline-block;height:24px;line-height:24px;margin-right:10px;padding:0;cursor:default;float:left}.at4-follow .at4-follow-container .at-icon-wrapper{height:24px;width:24px}.at4-follow.ats-transparent .at4-follow-inner,.at-follow-open-control.ats-transparent{border-color:transparent}.at4-follow.ats-dark .at4-follow-inner,.at-follow-open-control.ats-dark{background:#262b30;border-color:#000;color:#fff}.at4-follow.ats-dark .at-follow-close-control{background-color:#262b30}.at4-follow.ats-light .at4-follow-inner{background:#fff;border-color:#c5c5c5}.at4-follow.ats-gray .at4-follow-inner,.at-follow-open-control.ats-gray{background:#f2f2f2;border-color:#c5c5c5}.at4-follow.ats-light .at4-follow-close-control,.at-follow-open-control.ats-light{background:#e5e5e5}.at4-follow .at4-follow-inner .at4-follow-close-control{position:absolute;top:0;bottom:0;left:0;width:20px;cursor:pointer;display:none}.at4-follow .at4-follow-inner .at4-follow-close-control div{display:block;line-height:20px;text-indent:-9999em;margin-top:calc(50% + 1px);overflow:hidden}.at-follow-open-control div.at4-arrow.at-left{background-position:0 -2px}.at-follow-open-control{position:fixed;height:35px;top:0;right:0;padding-top:10px;z-index:10002}.at-follow-btn{margin:0 5px 5px 0;padding:0;outline-offset:-1px;display:inline-block;box-sizing:content-box;transition:all .2s ease-in-out}.at-follow-btn:focus,.at-follow-btn:hover{-webkit-transform:translateY(-4px);transform:translateY(-4px)}.at4-follow-24 .at-follow-btn{height:25px;line-height:0;width:25px}</style><style type="text/css">.at-follow-tbx-element .at300b,.at-follow-tbx-element .at300m{display:inline-block;width:auto;padding:0;margin:0 2px 5px;outline-offset:-1px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.at-follow-tbx-element .at300b:focus,.at-follow-tbx-element .at300b:hover,.at-follow-tbx-element .at300m:focus,.at-follow-tbx-element .at300m:hover{-webkit-transform:translateY(-4px);transform:translateY(-4px)}.at-follow-tbx-element .addthis_vertical_style .at300b,.at-follow-tbx-element .addthis_vertical_style .at300m{display:block}.at-follow-tbx-element .addthis_vertical_style .at300b .addthis_follow_label,.at-follow-tbx-element .addthis_vertical_style .at300b .at-icon-wrapper,.at-follow-tbx-element .addthis_vertical_style .at300m .addthis_follow_label,.at-follow-tbx-element .addthis_vertical_style .at300m .at-icon-wrapper{display:inline-block;vertical-align:middle;margin-right:5px}.at-follow-tbx-element .addthis_vertical_style .at300b:focus,.at-follow-tbx-element .addthis_vertical_style .at300b:hover,.at-follow-tbx-element .addthis_vertical_style .at300m:focus,.at-follow-tbx-element .addthis_vertical_style .at300m:hover{-webkit-transform:none;transform:none}</style><style type="text/css">.at4-jumboshare .at-share-btn{display:inline-block;margin-right:13px;margin-top:13px}.at4-jumboshare .at-share-btn .at-icon{float:left}.at4-jumboshare .at-share-btn .at300bs{display:inline-block;float:left;cursor:pointer}.at4-jumboshare .at4-mobile .at-share-btn .at-icon,.at4-jumboshare .at4-mobile .at-share-btn .at-icon-wrapper{margin:0;padding:0}.at4-jumboshare .at4-mobile .at-share-btn{padding:0}.at4-jumboshare .at4-mobile .at-share-btn .at-label{display:none}.at4-jumboshare .at4-count{font-size:60px;line-height:60px;font-family:Helvetica neue,arial;font-weight:700}.at4-jumboshare .at4-count-container{display:table-cell;text-align:center;min-width:200px;vertical-align:middle;border-right:1px solid #ccc;padding-right:20px}.at4-jumboshare .at4-share-container{display:table-cell;vertical-align:middle;padding-left:20px}.at4-jumboshare .at4-share-container.at-share-tbx-element{padding-top:0}.at4-jumboshare .at4-title{position:relative;font-size:18px;line-height:18px;bottom:2px}.at4-jumboshare .at4-spacer{height:1px;display:block;visibility:hidden;opacity:0}.at4-jumboshare .at-share-btn{display:inline-block;margin:0 2px;line-height:0;padding:0;overflow:hidden;text-decoration:none;text-transform:none;color:#fff;cursor:pointer;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;border:0;background-color:transparent}.at4-jumboshare .at-share-btn:focus,.at4-jumboshare .at-share-btn:hover{-webkit-transform:translateY(-4px);transform:translateY(-4px);color:#fff;text-decoration:none}.at4-jumboshare .at-label{font-family:helvetica neue,helvetica,arial,sans-serif;font-size:9pt;padding:0 15px 0 0;margin:0;height:2pc;line-height:2pc;background:none}.at4-jumboshare .at-share-btn:hover,.at4-jumboshare .at-share-btn:link{text-decoration:none}.at4-jumboshare .at-share-btn::-moz-focus-inner{border:0;padding:0}.at4-jumboshare.at-mobile .at-label{display:none}</style><style type="text/css">div.at-share-close-control.ats-dark,div.at-share-open-control-left.ats-dark,div.at-share-open-control-right.ats-dark{background:#262b30}div.at-share-close-control.ats-light,div.at-share-open-control-left.ats-light,div.at-share-open-control-right.ats-light{background:#fff}div.at-share-close-control.ats-gray,div.at-share-open-control-left.ats-gray,div.at-share-open-control-right.ats-gray{background:#f2f2f2}.atss{position:fixed;top:20%;width:3pc;z-index:100020;background:none}.at-share-close-control{position:relative;width:3pc;overflow:auto}.at-share-open-control-left{position:fixed;top:20%;z-index:100020;left:0;width:22px}.at-share-close-control .at4-arrow.at-left{float:right}.atss-left{left:0;float:left;right:auto}.atss-right{left:auto;float:right;right:0}.atss-right.at-share-close-control .at4-arrow.at-right{position:relative;right:0;overflow:auto}.atss-right.at-share-close-control .at4-arrow{float:left}.at-share-open-control-right{position:fixed;top:20%;z-index:100020;right:0;width:22px;float:right}.atss-right .at-share-close-control .at4-arrow{float:left}.atss.atss-right a{float:right}.atss.atss-right .at4-share-title{float:right;overflow:hidden}.atss .at-share-btn,.atss a{position:relative;display:block;width:3pc;margin:0;outline-offset:-1px;text-align:center;float:left;-webkit-transition:width .15s ease-in-out;transition:width .15s ease-in-out;overflow:hidden;background:#e8e8e8;z-index:100030;cursor:pointer}.at-share-btn::-moz-focus-inner{border:0;padding:0}.atss-right .at-share-btn{float:right}.atss .at-share-btn{border:0;padding:0}.atss .at-share-btn:focus,.atss .at-share-btn:hover,.atss a:focus,.atss a:hover{width:4pc}.atss .at-share-btn .at-icon-wrapper,.atss a .at-icon-wrapper{display:block;padding:8px 0}.atss .at-share-btn:last-child,.atss a:last-child{border:none}.atss .at-share-btn span .at-icon,.atss a span .at-icon{position:relative;top:0;left:0;display:block;background-repeat:no-repeat;background-position:50% 50%;width:2pc;height:2pc;line-height:2pc;border:none;padding:0;margin:0 auto;overflow:hidden;cursor:pointer;cursor:hand}.at4-share .at-custom-sidebar-counter{font-family:Helvetica neue,arial;vertical-align:top;margin-right:4px;display:inline-block;text-align:center}.at4-share .at-custom-sidebar-count{font-size:17px;line-height:1.25em;color:#222}.at4-share .at-custom-sidebar-text{font-size:9px;line-height:1.25em;color:#888;letter-spacing:1px}.at4-share .at4-share-count-container{position:absolute;left:0;right:auto;top:auto;bottom:0;width:100%;color:#fff;background:inherit}.at4-share .at4-share-count,.at4-share .at4-share-count-container{line-height:1pc;font-size:10px}.at4-share .at4-share-count{text-indent:0;font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-weight:200;width:100%;height:1pc}.at4-share .at4-share-count-anchor{padding-bottom:8px;text-decoration:none;-webkit-transition:padding .15s ease-in-out .15s,width .15s ease-in-out;transition:padding .15s ease-in-out .15s,width .15s ease-in-out}</style><style type="text/css">.at4-recommendedbox-outer-container{display:inline}.at4-recommended-outer{position:static}.at4-recommended{top:20%;margin:0;text-align:center;font-weight:400;font-size:13px;line-height:17px;color:#666}.at4-recommended.at-inline .at4-recommended-horizontal{text-align:left}.at4-recommended-recommendedbox{padding:0;z-index:inherit}.at4-recommended-recommended{padding:40px 0}.at4-recommended-horizontal{max-height:340px}.at4-recommended.at-medium .at4-recommended-horizontal{max-height:15pc}.at4-recommended.at4-minimal.at-medium .at4-recommended-horizontal{padding-top:10px;max-height:230px}.at4-recommended-text-only .at4-recommended-horizontal{max-height:130px}.at4-recommended-horizontal{padding-top:5px;overflow-y:hidden}.at4-minimal{background:none;color:#000;border:none!important;box-shadow:none!important}@media screen and (max-width:900px){.at4-recommended-horizontal .at4-recommended-item,.at4-recommended-horizontal .at4-recommended-item .at4-recommended-item-img{width:15pc}}.at4-recommended.at4-minimal .at4-recommended-horizontal .at4-recommended-item .at4-recommended-item-caption{padding:0 0 10px}.at4-recommended.at4-minimal .at4-recommended-horizontal .at4-recommended-item-caption{padding:20px 0 0!important}.addthis-smartlayers .at4-recommended .at-h3.at-recommended-label{margin:0;padding:0;font-weight:300;font-size:18px;line-height:24px;color:#464646;width:100%;display:inline-block;zoom:1}.addthis-smartlayers .at4-recommended.at-inline .at-h3.at-recommended-label{text-align:left}#at4-thankyou .addthis-smartlayers .at4-recommended.at-inline .at-h3.at-recommended-label{text-align:center}.at4-recommended .at4-recommended-item{display:inline-block;zoom:1;position:relative;background:#fff;border:1px solid #c5c5c5;width:200px;margin:10px}.addthis_recommended_horizontal .at4-recommended-item{border:none}.at4-recommended .at4-recommended-item .sponsored-label{color:#666;font-size:9px;position:absolute;top:-20px}.at4-recommended .at4-recommended-item-img .at-tli,.at4-recommended .at4-recommended-item-img a{position:absolute;left:0}.at4-recommended.at-inline .at4-recommended-horizontal .at4-recommended-item{margin:10px 20px 0 0}.at4-recommended.at-medium .at4-recommended-horizontal .at4-recommended-item{margin:10px 10px 0 0}.at4-recommended.at-medium .at4-recommended-item{width:140px;overflow:hidden}.at4-recommended .at4-recommended-item .at4-recommended-item-img{position:relative;text-align:center;width:100%;height:200px;line-height:0;overflow:hidden}.at4-recommended .at4-recommended-item .at4-recommended-item-img a{display:block;width:100%;height:200px}.at4-recommended.at-medium .at4-recommended-item .at4-recommended-item-img,.at4-recommended.at-medium .at4-recommended-item .at4-recommended-item-img a{height:140px}.at4-recommended .at4-recommended-item .at4-recommended-item-img img{position:absolute;top:0;left:0;min-height:0;min-width:0;max-height:none;max-width:none;margin:0;padding:0}.at4-recommended .at4-recommended-item .at4-recommended-item-caption{height:74px;overflow:hidden;padding:20px;text-align:left;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.at4-recommended.at-medium .at4-recommended-item .at4-recommended-item-caption{height:50px;padding:15px}.at4-recommended .at4-recommended-item .at4-recommended-item-caption .at-h4{height:54px;margin:0 0 5px;padding:0;overflow:hidden;word-wrap:break-word;font-size:14px;font-weight:400;line-height:18px;text-align:left}.at4-recommended.at-medium .at4-recommended-item .at4-recommended-item-caption .at-h4{font-size:9pt;line-height:1pc;height:33px}.at4-recommended .at4-recommended-item:hover .at4-recommended-item-caption .at-h4{text-decoration:underline}.at4-recommended a:link,.at4-recommended a:visited{text-decoration:none;color:#464646}.at4-recommended .at4-recommended-item .at4-recommended-item-caption .at-h4 a:hover{text-decoration:underline;color:#000}.at4-recommended .at4-recommended-item .at4-recommended-item-caption small{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:11px;color:#666}.at4-recommended.at-medium .at4-recommended-item .at4-recommended-item-caption small{font-size:9px}.at4-recommended .at4-recommended-vertical{padding:15px 0 0}.at4-recommended .at4-recommended-vertical .at4-recommended-item{display:block;width:auto;max-width:100%;height:60px;border:none;margin:0 0 15px;box-shadow:none;background:none}.at4-recommended-vertical .at4-recommended-item .at4-recommended-item-img,.at4-recommended-vertical .at4-recommended-item .at4-recommended-item-img img{width:60px;height:60px;float:left}.at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption{border-top:none;margin:0;height:60px;padding:3px 5px}.at4-recommended .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption .at-h4{height:38px;margin:0}.at4-recommended .at4-recommended-vertical .at4-recommended-item .at4-recommended-item-caption small{position:absolute;bottom:0}.at4-recommended .at-recommended-label.at-vertical{text-align:left}.at4-no-image-light-recommended,.at4-no-image-minimal-recommended{background-color:#f2f2f2!important}.at4-no-image-gray-recommended{background-color:#e6e6e5!important}.at4-no-image-dark-recommended{background-color:#4e555e!important}.at4-recommended .at4-recommended-item-placeholder-img{background-repeat:no-repeat!important;background-position:center!important;width:100%!important;height:100%!important}.at4-recommended-horizontal .at4-no-image-dark-recommended .at4-recommended-item-placeholder-img{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAfCAYAAACCox+xAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjlFNUUyQTg3MTI0RDExRTM4NzAwREJDRjlCQzAyMUVFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjlFNUUyQTg4MTI0RDExRTM4NzAwREJDRjlCQzAyMUVFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OUU1RTJBODUxMjREMTFFMzg3MDBEQkNGOUJDMDIxRUUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OUU1RTJBODYxMjREMTFFMzg3MDBEQkNGOUJDMDIxRUUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6oCfPiAAABfUlEQVR42uyWTU/DMAyGm3bdBxp062hHe+PC//9HCIkDYpNAO7CPAuWN5Eohyhpno2GHWqq8pO78xHHsiLquH4L/l6cwuBAZaOPKs//YBFIJIR59UiAt7huYi90aE/UQakTDLaL26RUEAAJqiefm93T9Bpj1X4O0bY0OIUXCpYBJvYDAUWyAUCWliHGTcnpqRMaM72ImRAJVknYG+eb4YEDIBeU0zGnsBLK1ODogYSsLhDwIJeVVk18lzfNA4ERGZNXi59UCIQhiYDilpSm/jp4awLxDvWhlf4/nGe8+LLuSt+SZul28ggaHG6gNVhDR+IuRFzOoxGKWwG7vVFm5AAQxgcqYpzrjFjR9zwPH5LSuT7XlNr2MQm5LzqjLpncNNaM+s8M27Y60g3FwhoSMzrtUQllgLtRs5pZ2cB4IhbvQbGRZv1NsrhyS8+SI5Mo9RJWpjAI1xqKL+0iEP180vy214JbeR12AyOgsHI7e0NfFyKv0ID1ID+IqPwIMAOeljGQOryBmAAAAAElFTkSuQmCC)!important}.at4-recommended-vertical .at4-no-image-dark-recommended .at4-recommended-item-placeholder-img{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjAzREMyNTM2MTI0RjExRTM4NzAwREJDRjlCQzAyMUVFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjAzREMyNTM3MTI0RjExRTM4NzAwREJDRjlCQzAyMUVFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDNEQzI1MzQxMjRGMTFFMzg3MDBEQkNGOUJDMDIxRUUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDNEQzI1MzUxMjRGMTFFMzg3MDBEQkNGOUJDMDIxRUUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5GfbtkAAAAxklEQVR42qRSTQvCMAxduk53mEOHKFPP/v8/5cGTiIibivVFUomlG7gFHvloXpKmJefcPhkmNyvGEWj+IOZA6ckPImoxxVwOLvCvXUzkpayNCpRQK64IbOBnAYGAXMeMslNlU+CzrIEdCkxi5DPAoz6BE8ZuVNdKJuL8rS9sv62IXlCHyP0KqKUKZXK9uwkSLVArfwpVR3b225kXwovibcP+jC4jUtfWPZmfqJJnYlkAM128j1z0nHWKSUbIKDL/msHktwADAPptQo+vkZNLAAAAAElFTkSuQmCC)!important}.at4-recommended-horizontal .at4-no-image-gray-recommended .at4-recommended-item-placeholder-img,.at4-recommended-horizontal .at4-no-image-light-recommended .at4-recommended-item-placeholder-img,.at4-recommended-horizontal .at4-no-image-minimal-recommended .at4-recommended-item-placeholder-img{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAfCAYAAACCox+xAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjAzREMyNTMyMTI0RjExRTM4NzAwREJDRjlCQzAyMUVFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjAzREMyNTMzMTI0RjExRTM4NzAwREJDRjlCQzAyMUVFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OUU1RTJBODkxMjREMTFFMzg3MDBEQkNGOUJDMDIxRUUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OUU1RTJBOEExMjREMTFFMzg3MDBEQkNGOUJDMDIxRUUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6dfDQvAAABg0lEQVR42uyWS0vDQBDH82jaKNW0qUltbl68e/Di98eLBz+CCB5EBaWIpUat/4UJLMuame1j7SEDYbqbKfPLvHbDi8ur8+D/5T4K9kR6xrr27D+xgdS3N9d3PilQFmcNzN6mxkbdhxrQcoGofXkFAUAINcVzrG2vsP8KmJdtg7SlxoRQouBywOReQOAosUDoklPEpEU5XDciqeB/iRAig6pIO4P8CHysBBDqg0palrR2Alkwjj5RsDUDoRqhorpq6quifRkInKiIPLf4eWIgQoLoWbq0stXXn10DmDeoR2PsL/E84N0Hk5Wypc70dMkGGhzOoeb4gpjW34K6GEFljFkGu6XTZJUCEMQBVCHs6kI60MycB47FyUmo20oPvYJCzhVnvIsR3zg5ghoRTNpyHKTBBhIJTt6pFsoZ9iLDZswcB5uBULhnho0a66eazaFDca59Hym1e4guQ4rCO4Fu/T4Sw8Gk+c3MghN6H+8CRKVg4tB6fV8XI6/SgXQgHYir/AowAMU5TskhKVUNAAAAAElFTkSuQmCC)!important}.at4-recommended-vertical .at4-no-image-gray-recommended .at4-recommended-item-placeholder-img,.at4-recommended-vertical .at4-no-image-light-recommended .at4-recommended-item-placeholder-img,.at4-recommended-vertical .at4-no-image-minimal-recommended .at4-recommended-item-placeholder-img{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjAzREMyNTNBMTI0RjExRTM4NzAwREJDRjlCQzAyMUVFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjAzREMyNTNCMTI0RjExRTM4NzAwREJDRjlCQzAyMUVFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDNEQzI1MzgxMjRGMTFFMzg3MDBEQkNGOUJDMDIxRUUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDNEQzI1MzkxMjRGMTFFMzg3MDBEQkNGOUJDMDIxRUUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz65Fr9cAAAA0ElEQVR42qRRuQrCQBDd3SSaIgYNosSrtLew8f+xsfAnYmEVRMR4YHwjExjCbsBk4DHHzptjR2+2u7VqJ3efjTNQ/EEMgbgiv46H/QNTDPnhCv/mYiLPI21EIIaaUEVgBj+oETQQypgRtidsXfNJpsACBXo28gWgUd9AjrEL0TXhiSh/XhWudlZI/kCdLPtFUGMRCni9p6kl+kAq/D5UavmzX2fNd87obsCSfztnrOR0rjvTiRImkoyAQQNRyZ2jhjenGNVBOpF1WZatyV8BBgBJ+irgS/KHdAAAAABJRU5ErkJggg==)!important}#at-drawer.ats-dark,.at4-recommended.ats-dark .at4-recommended-horizontal .at4-recommended-item-caption,.at4-recommended.ats-dark .at4-recommended-vertical .at4-recommended-item-caption{background:#262b30}#at-drawer.ats-gray,.at4-recommended.ats-gray .at4-recommended-horizontal .at4-recommended-item-caption{background:#f2f2f2}#at-drawer.ats-light,.at4-recommended.ats-light .at4-recommended-horizontal .at4-recommended-item-caption{background:#fff}.at4-recommended.ats-dark .at4-recommended-vertical .at4-recommended-item{background:none}.at4-recommended.ats-dark .at4-recommended-item .at4-recommended-item-caption a:hover,.at4-recommended.ats-dark .at4-recommended-item .at4-recommended-item-caption a:link,.at4-recommended.ats-dark .at4-recommended-item .at4-recommended-item-caption a:visited,.at4-recommended.ats-dark .at4-recommended-item .at4-recommended-item-caption small,.at4-recommended.ats-dark .at4-recommended-item-caption,.at4-recommended.ats-dark .at-logo a:hover,.at4-recommended.ats-dark .at-recommended-label.at-vertical{color:#fff}.at4-recommended-vertical-logo{padding-top:0;text-align:left}.at4-recommended-vertical-logo .at4-logo-container{line-height:10px}.at4-recommended-horizontal-logo{text-align:center}.at4-recommended.at-inline .at4-recommended-horizontal-logo{text-align:left}#at4-thankyou .at4-recommended.at-inline .at4-recommended-horizontal{text-align:center}.at4-recommended .at-logo{margin:10px 0 0;padding:0;height:25px;overflow:auto;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.at4-recommended.at-inline .at4-recommended-horizontal .at-logo{text-align:left}.at4-recommended .at4-logo-container a.at-sponsored-link{color:#666}.at4-recommended-class .at4-logo-container a:hover,.at4-recommendedbox-outer-container .at4-recommended-recommendedbox .at4-logo-container a:hover{color:#000}</style><style type="text/css">.at-recommendedjumbo-outer-container{margin:0;padding:0;border:0;background:none;color:#000}.at-recommendedjumbo-footer{position:relative;width:100%;height:510px;overflow:hidden;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.at-mobile .at-recommendedjumbo-footer{height:250px}.at-recommendedjumbo-footer #bg-link:after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.75)}.at-recommendedjumbo-footer:hover #bg-link:after{background:rgba(0,0,0,.85)}.at-recommendedjumbo-footer *,.at-recommendedjumbo-footer :after,.at-recommendedjumbo-footer :before{box-sizing:border-box}.at-recommendedjumbo-footer:hover #at-recommendedjumbo-footer-bg{-webkit-animation:atRecommendedJumboAnimatedBackground 1s ease-in-out 1;animation:atRecommendedJumboAnimatedBackground 1s ease-in-out 1;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.at-recommendedjumbo-footer #at-recommendedjumbo-top-holder{position:absolute;top:0;padding:0 40px;width:100%}.at-mobile .at-recommendedjumbo-footer #at-recommendedjumbo-top-holder{padding:0 20px}.at-recommendedjumbo-footer .at-recommendedjumbo-footer-inner{position:relative;text-align:center;font-family:helvetica,arial,sans-serif;z-index:2;width:100%}.at-recommendedjumbo-footer #at-recommendedjumbo-label-holder{margin:40px 0 0;max-height:30px}.at-mobile .at-recommendedjumbo-footer #at-recommendedjumbo-label-holder{margin:20px 0 0;max-height:20px}.at-recommendedjumbo-footer #at-recommendedjumbo-label{font-weight:300;font-size:24px;line-height:24px;color:#fff;margin:0}.at-mobile .at-recommendedjumbo-footer #at-recommendedjumbo-label{font-weight:150;font-size:14px;line-height:14px}.at-recommendedjumbo-footer #at-recommendedjumbo-title-holder{margin:20px 0 0;min-height:3pc;max-height:78pt}.at-mobile .at-recommendedjumbo-footer #at-recommendedjumbo-title-holder{margin:10px 0 0;min-height:24px;max-height:54px}.at-recommendedjumbo-footer #at-recommendedjumbo-content-title{font-size:3pc;line-height:52px;font-weight:700;margin:0}.at-mobile .at-recommendedjumbo-footer #at-recommendedjumbo-content-title{font-size:24px;line-height:27px}.at-recommendedjumbo-footer a{text-decoration:none;color:#fff}.at-recommendedjumbo-footer a:visited{color:#fff}.at-recommendedjumbo-footer small{margin:20px 0 0;display:inline-block;height:2pc;line-height:2pc;font-size:14px;color:#ccc;cursor:default}.at-mobile .at-recommendedjumbo-footer small{margin:10px 0 0;height:14px;line-height:14px;font-size:9pt}.at-recommendedjumbo-footer .at-logo-container{position:absolute;bottom:20px;margin:auto;left:0;right:0}.at-mobile .at-recommendedjumbo-footer .at-logo-container{bottom:10px}.at-recommendedjumbo-footer a.at-sponsored-link{color:#ccc}.at-recommendedjumbo-footer div #at-recommendedjumbo-logo-link{padding:2px 0 0 11px;text-decoration:none;line-height:20px;font-family:helvetica,arial,sans-serif;font-size:9px;color:#ccc}@-webkit-keyframes atRecommendedJumboAnimatedBackground{0%{-webkit-transform:scale(1,1);transform:scale(1,1)}to{-webkit-transform:scale(1.1,1.1);transform:scale(1.1,1.1)}}@keyframes atRecommendedJumboAnimatedBackground{0%{-webkit-transform:scale(1,1);transform:scale(1,1)}to{-webkit-transform:scale(1.1,1.1);transform:scale(1.1,1.1)}}</style><style type="text/css">.at-resp-share-element{position:relative;padding:0;margin:0;font-size:0;line-height:0}.at-resp-share-element:after,.at-resp-share-element:before{content:" ";display:table}.at-resp-share-element.at-mobile .at4-share-count-container,.at-resp-share-element.at-mobile .at-label{display:none}.at-resp-share-element .at-share-btn{display:inline-block;*display:inline;*zoom:1;margin:0 2px 5px;padding:0;overflow:hidden;line-height:0;text-decoration:none;text-transform:none;color:#fff;cursor:pointer;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;border:0;font-family:helvetica neue,helvetica,arial,sans-serif;background-color:transparent}.at-resp-share-element .at-share-btn::-moz-focus-inner{border:0;padding:0}.at-resp-share-element .at-share-btn:focus,.at-resp-share-element .at-share-btn:hover{-webkit-transform:translateY(-4px);transform:translateY(-4px);color:#fff;text-decoration:none}.at-resp-share-element .at-share-btn .at-icon-wrapper{float:left}.at-resp-share-element .at-share-btn.at-share-btn.at-svc-compact:hover{-webkit-transform:none;transform:none}.at-resp-share-element .at-share-btn .at-label{font-family:helvetica neue,helvetica,arial,sans-serif;font-size:9pt;padding:0 15px 0 0;margin:0 0 0 5px;height:2pc;line-height:2pc;background:none}.at-resp-share-element .at-icon,.at-resp-share-element .at-label{cursor:pointer}.at-resp-share-element .at4-share-count-container{text-decoration:none;float:right;padding-right:15px;font-size:9pt}.at-mobile .at-resp-share-element .at-label{display:none}.at-resp-share-element.at-mobile .at-share-btn{margin-right:5px}.at-mobile .at-resp-share-element .at-share-btn{padding:5px;margin-right:5px}</style><style type="text/css">.at-share-tbx-element{position:relative;margin:0;color:#fff;font-size:0}.at-share-tbx-element,.at-share-tbx-element .at-share-btn{font-family:helvetica neue,helvetica,arial,sans-serif;padding:0;line-height:0}.at-share-tbx-element .at-share-btn{cursor:pointer;margin:0 5px 5px 0;display:inline-block;overflow:hidden;border:0;text-decoration:none;text-transform:none;background-color:transparent;color:inherit;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.at-share-tbx-element .at-share-btn:focus,.at-share-tbx-element .at-share-btn:hover{-webkit-transform:translateY(-4px);transform:translateY(-4px);outline-offset:-1px;color:inherit}.at-share-tbx-element .at-share-btn::-moz-focus-inner{border:0;padding:0}.at-share-tbx-element .at-share-btn.at-share-btn.at-svc-compact:hover{-webkit-transform:none;transform:none}.at-share-tbx-element .at-icon-wrapper{vertical-align:middle}.at-share-tbx-element .at4-share-count,.at-share-tbx-element .at-label{margin:0 7.5px 0 2.5px;text-decoration:none;vertical-align:middle;display:inline-block;background:none;height:0;font-size:inherit;line-height:inherit;color:inherit}.at-share-tbx-element.at-mobile .at4-share-count,.at-share-tbx-element.at-mobile .at-label{display:none}.at-share-tbx-element .at_native_button{vertical-align:middle}.at-share-tbx-element .addthis_counter.addthis_bubble_style{margin:0 2px;vertical-align:middle;display:inline-block}.at-share-tbx-element .fb_iframe_widget{display:block}.at-share-tbx-element.at-share-tbx-native .at300b{vertical-align:middle}.at-style-responsive .at-share-btn{padding:5px}.at-style-jumbo{display:table}.at-style-jumbo .at4-spacer{height:1px;display:block;visibility:hidden;opacity:0}.at-style-jumbo .at4-count-container{display:table-cell;text-align:center;min-width:200px;vertical-align:middle;border-right:1px solid #ccc;padding-right:20px}.at-style-jumbo .at4-count{font-size:60px;line-height:60px;font-weight:700}.at-style-jumbo .at4-count-title{position:relative;font-size:18px;line-height:18px;bottom:2px}.at-style-jumbo .at-share-btn-elements{display:table-cell;vertical-align:middle;padding-left:20px}.at_flat_counter{cursor:pointer;font-family:helvetica,arial,sans-serif;font-weight:700;text-transform:uppercase;display:inline-block;position:relative;vertical-align:top;height:auto;margin:0 5px;padding:0 6px;left:-1px;background:#ebebeb;color:#32363b;-webkit-transition:all .2s ease;transition:all .2s ease}.at_flat_counter:after{top:30%;left:-4px;content:"";position:absolute;border-width:5px 8px 5px 0;border-style:solid;border-color:transparent #ebebeb transparent transparent;display:block;width:0;height:0;-webkit-transform:translateY(360deg);transform:translateY(360deg)}.at_flat_counter:hover{background:#e1e2e2}</style><style type="text/css">.at4-thankyou-background{top:0;right:0;left:0;bottom:0;-webkit-overflow-scrolling:touch;z-index:9999999;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABtJREFUeNpizCuu/sRABGBiIBKMKqSOQoAAAwC8KgJipENhxwAAAABJRU5ErkJggg==);background:hsla(217,6%,46%,.95)}.at4-thankyou-background.at-thankyou-shown{position:fixed}.at4-thankyou-inner{position:absolute;width:100%;top:10%;left:50%;margin-left:-50%;text-align:center}.at4-thankyou-mobile .at4-thankyou-inner{top:5%}.thankyou-description{font-weight:400}.at4-thankyou-background .at4lb-inner{position:relative;width:100%;height:100%}.at4-thankyou-background .at4lb-inner .at4x{position:absolute;top:15px;right:15px;display:block;width:20px;height:20px;padding:20px;margin:0;cursor:pointer;-webkit-transition:opacity .25s ease-in;transition:opacity .25s ease-in;opacity:.4;background:url("data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTEvMTMvMTKswDp5AAAAd0lEQVQ4jb2VQRLAIAgDE///Z3qqY1FAhalHMCsCIkVEAIAkkVgvp2lDBgYAnAyHkWotLccNrEd4A7X2TqIdqLfnWBAdaF5rJdyJfjtPH5GT37CaGhoVq3nOm/XflUuLUto2pY1d+vRKh0Pp+MrAVtDe2JkvYNQ+jVSEEFmOkggAAAAASUVORK5CYII=") no-repeat center center;overflow:hidden;text-indent:-99999em;border:1px solid transparent}.at4-thankyou-background .at4lb-inner .at4x:focus,.at4-thankyou-background .at4lb-inner .at4x:hover{border:1px solid #fff;border-radius:50%;outline:0}.at4-thankyou-background .at4lb-inner #at4-palogo{position:absolute;bottom:10px;display:inline-block;text-decoration:none;font-family:helvetica,arial,sans-serif;font-size:11px;cursor:pointer;-webkit-transition:opacity .25s ease-in;moz-transition:opacity .25s ease-in;transition:opacity .25s ease-in;opacity:.5;z-index:100020;color:#fff;padding:2px 0 0 13px}.at4-thankyou-background .at4lb-inner #at4-palogo .at-branding-addthis,.at4-thankyou-background .at4lb-inner #at4-palogo .at-branding-info{color:#fff}.at4-thankyou-background .at4lb-inner #at4-palogo:hover,.at4-thankyou-background.ats-dark .at4lb-inner a#at4-palogo:hover{text-decoration:none;color:#fff;opacity:1}.at4-thankyou-background.ats-dark{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABtJREFUeNpiZGBgeMZABGBiIBKMKqSOQoAAAwB+cQD6hqlbCwAAAABJRU5ErkJggg==");background:rgba(0,0,0,.85)}.at4-thankyou-background .thankyou-title{color:#fff;font-size:38.5px;margin:10px 20px;line-height:38.5px;font-family:helvetica neue,helvetica,arial,sans-serif;font-weight:300}.at4-thankyou-background.ats-dark .thankyou-description,.at4-thankyou-background.ats-dark .thankyou-title{color:#fff}.at4-thankyou-background .thankyou-description{color:#fff;font-size:18px;margin:10px 0;line-height:24px;padding:0;font-family:helvetica neue,helvetica,arial,sans-serif;font-weight:300}.at4-thankyou-background .at4-thanks-icons{padding-top:10px}.at4-thankyou-mobile *{-webkit-overflow-scrolling:touch}#at4-thankyou .at4-recommended-recommendedbox .at-logo{display:none}.at4-thankyou .at-h3{height:49px;line-height:49px;margin:0 50px 0 20px;padding:1px 0 0;font-family:helvetica neue,helvetica,arial,sans-serif;font-size:1pc;font-weight:700;color:#fff;text-shadow:0 1px #000}.at4-thanks{padding-top:50px;text-align:center}.at4-thanks label{display:block;margin:0 0 15px;font-size:1pc;line-height:1pc}.at4-thanks .at4-h2{background:none;border:none;margin:0 0 10px;padding:0;font-family:helvetica neue,helvetica,arial,sans-serif;font-size:28px;font-weight:300;color:#000}.at4-thanks .at4-thanks-icons{position:relative;height:2pc}.at4-thanks .at4-thanks-icons .at-thankyou-label{display:block;padding-bottom:10px;font-size:14px;color:#666}.at4-thankyou-layer .at-follow .at-icon-wrapper{width:2pc;height:2pc}</style><style type="text/css">.at4-recommended-toaster{position:fixed;top:auto;bottom:0;right:0;z-index:100021}.at4-recommended-toaster.ats-light{border:1px solid #c5c5c5;background:#fff}.at4-recommended-toaster.ats-gray{border:1px solid #c5c5c5;background:#f2f2f2}.at4-recommended-toaster.ats-dark{background:#262b30;color:#fff}.at4-recommended-toaster .at4-recommended-container{padding-top:0;margin:0}.at4-recommended.at4-recommended-toaster div.at-recommended-label{line-height:1pc;font-size:1pc;text-align:left;padding:20px 0 0 20px}.at4-toaster-outer .at4-recommended .at4-recommended-item .at4-recommended-item-caption .at-h4{font-size:11px;line-height:11px;margin:10px 0 6px;height:30px}.at4-recommended.at4-recommended-toaster div.at-recommended-label.ats-gray,.at4-recommended.at4-recommended-toaster div.at-recommended-label.ats-light{color:#464646}.at4-recommended.at4-recommended-toaster div.at-recommended-label.ats-dark{color:#fff}.at4-toaster-close-control{position:absolute;top:0;right:0;display:block;width:20px;height:20px;line-height:20px;margin:5px 5px 0 0;padding:0;text-indent:-9999em}.at4-toaster-open-control{position:fixed;right:0;bottom:0;z-index:100020}.at4-toaster-outer .at4-recommended-item{width:90pt;border:0;margin:9px 10px 0}.at4-toaster-outer .at4-recommended-item:first-child{margin-left:20px}.at4-toaster-outer .at4-recommended-item:last-child{margin-right:20px}.at4-toaster-outer .at4-recommended-item .at4-recommended-item-img{max-height:90pt;max-width:90pt}.at4-toaster-outer .at4-recommended-item .at4-recommended-item-img img{height:90pt;width:90pt}.at4-toaster-outer .at4-recommended-item .at4-recommended-item-caption{height:30px;padding:0;margin:0;height:initial}.at4-toaster-outer .ats-dark .at4-recommended-item .at4-recommended-item-caption{background:#262b30}.at4-toaster-outer .at4-recommended .at4-recommended-item .at4-recommended-item-caption small{width:auto;line-height:14px;margin:0}.at4-toaster-outer .at4-recommended.ats-dark .at4-recommended-item .at4-recommended-item-caption small{color:#fff}.at4-recommended-toaster .at-logo{margin:0 0 3px 20px;text-align:left}.at4-recommended-toaster .at-logo .at4-logo-container.at-sponsored-logo{position:relative}.at4-toaster-outer .at4-recommended-item .sponsored-label{text-align:right;font-size:10px;color:#666;float:right;position:fixed;bottom:6px;right:20px;top:initial;z-index:99999}</style><style type="text/css">.at4-whatsnext{position:fixed;bottom:0!important;right:0;background:#fff;border:1px solid #c5c5c5;margin:-1px;width:390px;height:90pt;overflow:hidden;font-size:9pt;font-weight:400;color:#000;z-index:1800000000}.at4-whatsnext a{color:#666}.at4-whatsnext .at-whatsnext-content{height:90pt;position:relative}.at4-whatsnext .at-whatsnext-content .at-branding{position:absolute;bottom:15px;right:10px;padding-left:9px;text-decoration:none;line-height:10px;font-family:helvetica,arial,sans-serif;font-size:10px;color:#666}.at4-whatsnext .at-whatsnext-content .at-whatsnext-content-inner{position:absolute;top:15px;right:20px;bottom:15px;left:140px;text-align:left;height:105px}.at4-whatsnext .at-whatsnext-content-inner a{display:inline-block}.at4-whatsnext .at-whatsnext-content-inner div.at-h6{text-align:left;margin:0;padding:0 0 3px;font-size:11px;color:#666;cursor:default}.at4-whatsnext .at-whatsnext-content .at-h3{text-align:left;margin:5px 0;padding:0;line-height:1.2em;font-weight:400;font-size:14px;height:3pc}.at4-whatsnext .at-whatsnext-content-inner a:link,.at4-whatsnext .at-whatsnext-content-inner a:visited{text-decoration:none;font-weight:400;color:#464646}.at4-whatsnext .at-whatsnext-content-inner a:hover{color:#000}.at4-whatsnext .at-whatsnext-content-inner small{position:absolute;bottom:15px;line-height:10px;font-size:11px;color:#666;cursor:default;text-align:left}.at4-whatsnext .at-whatsnext-content .at-whatsnext-content-img{position:absolute;top:0;left:0;width:90pt;height:90pt;overflow:hidden}.at4-whatsnext .at-whatsnext-content .at-whatsnext-content-img img{position:absolute;top:0;left:0;max-height:none;max-width:none}.at4-whatsnext .at-whatsnext-close-control{position:absolute;top:0;right:0;display:block;width:20px;height:20px;line-height:20px;margin:0 5px 0 0;padding:0;text-indent:-9999em}.at-whatsnext-open-control{position:fixed;right:0;bottom:0;z-index:100020}.at4-whatsnext.ats-dark{background:#262b30}.at4-whatsnext.ats-dark .at-whatsnext-content .at-h3,.at4-whatsnext.ats-dark .at-whatsnext-content a.at4-logo:hover,.at4-whatsnext.ats-dark .at-whatsnext-content-inner a:link,.at4-whatsnext.ats-dark .at-whatsnext-content-inner a:visited{color:#fff}.at4-whatsnext.ats-light{background:#fff}.at4-whatsnext.ats-gray{background:#f2f2f2}.at4-whatsnext.at-whatsnext-nophoto{width:270px}.at4-whatsnext.at-whatsnext-nophoto .at-whatsnext-content-img{display:none}.at4-whatsnext.at-whatsnext-nophoto .at-whatsnext-content .at-whatsnext-content-inner{top:15px;right:0;left:20px}.at4-whatsnext.at-whatsnext-nophoto .at-whatsnext-content .at-whatsnext-content-inner.addthis_32x32_style{top:0;right:0;left:0;padding:45px 20px 0;font-size:20px}.at4-whatsnext.at-whatsnext-nophoto .at-whatsnext-content .at-whatsnext-content-inner .at4-icon,.at4-whatsnext.at-whatsnext-nophoto .at-whatsnext-content .at-whatsnext-content-inner .at4-icon-fw,.at4-whatsnext.at-whatsnext-nophoto .at-whatsnext-content .at-whatsnext-content-inner .whatsnext-msg{vertical-align:middle}.at-whatsnext-img,.at-whatsnext-img-lnk{position:absolute;left:0}</style><style type="text/css">.at4-whatsnextmobile{position:fixed;bottom:0;right:0;left:0;background:#fff;z-index:9999998;height:170px;font-size:28px}.at4-whatsnextmobile .col-2{height:100%;font-size:1em}.at4-whatsnextmobile .col-2:first-child{max-width:200px;display:inline-block;float:left}.at4-whatsnextmobile .col-2:last-child{position:absolute;left:200px;right:50px;top:0;bottom:0;display:inline-block}.at4-whatsnextmobile .at-whatsnext-content-inner{font-size:1em}.at4-whatsnextmobile .at-whatsnext-content-img img{height:100%;width:100%}.at4-whatsnextmobile .at-close-control{font-size:1em;position:absolute;top:0;right:0;width:50px;height:50px}.at4-whatsnextmobile .at-close-control button{width:100%;height:100%;font-size:1em;font-weight:400;text-decoration:none;opacity:.5;padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.at4-whatsnextmobile .at-h3,.at4-whatsnextmobile .at-h6{font-size:1em;margin:0;color:#a1a1a1;margin-left:2.5%;margin-top:25px}.at4-whatsnextmobile .at-h3{font-size:1em;line-height:1em;font-weight:500;height:50%}.at4-whatsnextmobile .at-h3 a{font-size:1em;text-decoration:none}.at4-whatsnextmobile .at-h6{font-size:.8em;line-height:.8em;font-weight:500}.at4-whatsnextmobile .footer{position:absolute;bottom:2px;left:200px;right:0;padding-left:2.5%;font-size:1em;line-height:.6em}.at4-whatsnextmobile .footer small{font-size:.6em;color:#a1a1a1}.at4-whatsnextmobile .footer small:first-child{margin-right:5%;float:left}.at4-whatsnextmobile .footer small:last-child{margin-right:2.5%;float:right}.at4-whatsnextmobile .at-whatsnext-content{height:100%}.at4-whatsnextmobile.ats-dark{background:#262b30;color:#fff}.at4-whatsnextmobile .at-close-control button{color:#bfbfbf}.at4-whatsnextmobile.ats-dark a:link,.at4-whatsnextmobile.ats-dark a:visited{color:#fff}.at4-whatsnextmobile.ats-gray{background:#f2f2f2;color:#262b30}.at4-whatsnextmobile.ats-light{background:#fff;color:#262b30}.at4-whatsnextmobile.ats-dark .footer a:link,.at4-whatsnextmobile.ats-dark .footer a:visited,.at4-whatsnextmobile.ats-gray .footer a:link,.at4-whatsnextmobile.ats-gray .footer a:visited,.at4-whatsnextmobile.ats-light .footer a:link,.at4-whatsnextmobile.ats-light .footer a:visited{color:#a1a1a1}.at4-whatsnextmobile.ats-gray a:link,.at4-whatsnextmobile.ats-gray a:visited,.at4-whatsnextmobile.ats-light a:link,.at4-whatsnextmobile.ats-light a:visited{color:#262b30}@media only screen and (min-device-width:320px) and (max-device-width:480px){.at4-whatsnextmobile{height:85px;font-size:14px}.at4-whatsnextmobile .col-2:first-child{width:75pt}.at4-whatsnextmobile .col-2:last-child{right:25px;left:75pt}.at4-whatsnextmobile .footer{left:75pt}.at4-whatsnextmobile .at-close-control{width:25px;height:25px}.at4-whatsnextmobile .at-h3,.at4-whatsnextmobile .at-h6{margin-top:12.5px}}</style><style type="text/css">.at-custom-mobile-bar{left:0;right:0;width:100%;height:56px;position:fixed;text-align:center;z-index:100020;background:#fff;overflow:hidden;box-shadow:0 0 10px 0 rgba(0,0,0,.2);font:initial;line-height:normal;top:auto;bottom:0}.at-custom-mobile-bar.at-custom-mobile-bar-zindex-hide{z-index:-1!important}.at-custom-mobile-bar.atss-top{top:0;bottom:auto}.at-custom-mobile-bar.atss-bottom{top:auto;bottom:0}.at-custom-mobile-bar .at-custom-mobile-bar-btns{display:inline-block;text-align:center}.at-custom-mobile-bar .at-custom-mobile-bar-counter,.at-custom-mobile-bar .at-share-btn{margin-top:4px}.at-custom-mobile-bar .at-share-btn{display:inline-block;text-decoration:none;-webkit-transition:none;transition:none;box-sizing:content-box}.at-custom-mobile-bar .at-custom-mobile-bar-counter{font-family:Helvetica neue,arial;vertical-align:top;margin-left:4px;margin-right:4px;display:inline-block}.at-custom-mobile-bar .at-custom-mobile-bar-count{font-size:26px;line-height:1.25em;color:#222}.at-custom-mobile-bar .at-custom-mobile-bar-text{font-size:9pt;line-height:1.25em;color:#888;letter-spacing:1px}.at-custom-mobile-bar .at-icon-wrapper{text-align:center;height:3pc;width:3pc;margin:0 4px}.at-custom-mobile-bar .at-icon{vertical-align:top;margin:8px;width:2pc;height:2pc}.at-custom-mobile-bar.at-shfs-medium{height:3pc}.at-custom-mobile-bar.at-shfs-medium .at-custom-mobile-bar-counter{margin-top:6px}.at-custom-mobile-bar.at-shfs-medium .at-custom-mobile-bar-count{font-size:18px}.at-custom-mobile-bar.at-shfs-medium .at-custom-mobile-bar-text{font-size:10px}.at-custom-mobile-bar.at-shfs-medium .at-icon-wrapper{height:40px;width:40px}.at-custom-mobile-bar.at-shfs-medium .at-icon{margin:6px;width:28px;height:28px}.at-custom-mobile-bar.at-shfs-small{height:40px}.at-custom-mobile-bar.at-shfs-small .at-custom-mobile-bar-counter{margin-top:3px}.at-custom-mobile-bar.at-shfs-small .at-custom-mobile-bar-count{font-size:1pc}.at-custom-mobile-bar.at-shfs-small .at-custom-mobile-bar-text{font-size:10px}.at-custom-mobile-bar.at-shfs-small .at-icon-wrapper{height:2pc;width:2pc}.at-custom-mobile-bar.at-shfs-small .at-icon{margin:4px;width:24px;height:24px}</style><style type="text/css">.at-custom-sidebar{top:20%;width:58px;position:fixed;text-align:center;z-index:100020;background:#fff;overflow:hidden;box-shadow:0 0 10px 0 rgba(0,0,0,.2);font:initial;line-height:normal;top:auto;bottom:0}.at-custom-sidebar.at-custom-sidebar-zindex-hide{z-index:-1!important}.at-custom-sidebar.atss-left{left:0;right:auto;float:left;border-radius:0 4px 4px 0}.at-custom-sidebar.atss-right{left:auto;right:0;float:right;border-radius:4px 0 0 4px}.at-custom-sidebar .at-custom-sidebar-btns{display:inline-block;text-align:center;padding-top:4px}.at-custom-sidebar .at-custom-sidebar-counter{margin-bottom:8px}.at-custom-sidebar .at-share-btn{display:inline-block;text-decoration:none;-webkit-transition:none;transition:none;box-sizing:content-box}.at-custom-sidebar .at-custom-sidebar-counter{font-family:Helvetica neue,arial;vertical-align:top;margin-left:4px;margin-right:4px;display:inline-block}.at-custom-sidebar .at-custom-sidebar-count{font-size:21px;line-height:1.25em;color:#222}.at-custom-sidebar .at-custom-sidebar-text{font-size:10px;line-height:1.25em;color:#888;letter-spacing:1px}.at-custom-sidebar .at-icon-wrapper{text-align:center;margin:0 4px}.at-custom-sidebar .at-icon{vertical-align:top;margin:9px;width:2pc;height:2pc}.at-custom-sidebar .at-icon-wrapper{position:relative}.at-custom-sidebar .at4-share-count,.at-custom-sidebar .at4-share-count-container{line-height:1pc;font-size:10px}.at-custom-sidebar .at4-share-count{text-indent:0;font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-weight:200;width:100%;height:1pc}.at-custom-sidebar .at4-share-count-anchor .at-icon{margin-top:3px}.at-custom-sidebar .at4-share-count-container{position:absolute;left:0;right:auto;top:auto;bottom:0;width:100%;color:#fff;background:inherit}</style><style type="text/css">.at-image-sharing-mobile-icon{position:absolute;background:#000 url(//s7.addthis.com/static/44a36d35bafef33aa9455b7d3039a771.png) no-repeat top center;background-color:rgba(0,0,0,.9);background-image:url(//s7.addthis.com/static/10db525181ee0bbe1a515001be1c7818.svg),none;border-radius:3px;width:50px;height:40px;top:-9999px;left:-9999px}.at-image-sharing-tool{display:block;position:absolute;text-align:center;z-index:9001;background:none;overflow:hidden;top:-9999px;left:-9999px;font:initial;line-height:0}.at-image-sharing-tool.addthis-animated{-webkit-animation-duration:.15s;animation-duration:.15s}.at-image-sharing-tool.at-orientation-vertical .at-share-btn{display:block}.at-image-sharing-tool.at-orientation-horizontal .at-share-btn{display:inline-block}.at-image-sharing-tool.at-image-sharing-tool-size-big .at-icon{width:43px;height:43px}.at-image-sharing-tool.at-image-sharing-tool-size-mobile .at-share-btn{margin:0!important}.at-image-sharing-tool.at-image-sharing-tool-size-mobile .at-icon-wrapper{height:60px;width:100%;border-radius:0!important}.at-image-sharing-tool.at-image-sharing-tool-size-mobile .at-icon{max-width:100%;height:54px!important;width:54px!important}.at-image-sharing-tool .at-custom-shape.at-image-sharing-tool-btns{margin-right:8px;margin-bottom:8px}.at-image-sharing-tool .at-custom-shape .at-share-btn{margin-top:8px;margin-left:8px}.at-image-sharing-tool .at-share-btn{line-height:0;text-decoration:none;-webkit-transition:none;transition:none;box-sizing:content-box}.at-image-sharing-tool .at-icon-wrapper{text-align:center;height:100%;width:100%}.at-image-sharing-tool .at-icon{vertical-align:top;width:2pc;height:2pc;margin:3px}</style><style type="text/css">.at-expanding-share-button{box-sizing:border-box;position:fixed;z-index:9999}.at-expanding-share-button[data-position=bottom-right]{bottom:10px;right:10px}.at-expanding-share-button[data-position=bottom-right] .at-expanding-share-button-toggle-bg,.at-expanding-share-button[data-position=bottom-right] .at-expanding-share-button-toggle-btn[data-name]:after,.at-expanding-share-button[data-position=bottom-right] .at-icon-wrapper,.at-expanding-share-button[data-position=bottom-right] [data-name]:after{float:right}.at-expanding-share-button[data-position=bottom-right] [data-name]:after{margin-right:10px}.at-expanding-share-button[data-position=bottom-right] .at-expanding-share-button-toggle-btn[data-name]:after{margin-right:5px}.at-expanding-share-button[data-position=bottom-right] .at-icon-wrapper{margin-right:-3px}.at-expanding-share-button[data-position=bottom-left]{bottom:10px;left:10px}.at-expanding-share-button[data-position=bottom-left] .at-expanding-share-button-toggle-bg,.at-expanding-share-button[data-position=bottom-left] .at-expanding-share-button-toggle-btn[data-name]:after,.at-expanding-share-button[data-position=bottom-left] .at-icon-wrapper,.at-expanding-share-button[data-position=bottom-left] [data-name]:after{float:left}.at-expanding-share-button[data-position=bottom-left] [data-name]:after{margin-left:10px}.at-expanding-share-button[data-position=bottom-left] .at-expanding-share-button-toggle-btn[data-name]:after{margin-left:5px}.at-expanding-share-button *,.at-expanding-share-button :after,.at-expanding-share-button :before{box-sizing:border-box}.at-expanding-share-button .at-expanding-share-button-services-list{display:none;list-style:none;margin:0 5px;overflow:visible;padding:0}.at-expanding-share-button .at-expanding-share-button-services-list>li{display:block;height:45px;position:relative;overflow:visible}.at-expanding-share-button .at-expanding-share-button-toggle-btn,.at-expanding-share-button .at-share-btn{-webkit-transition:.1s;transition:.1s;text-decoration:none}.at-expanding-share-button .at-share-btn{display:block;height:40px;padding:0 3px 0 0}.at-expanding-share-button .at-expanding-share-button-toggle-btn{position:relative;overflow:auto}.at-expanding-share-button .at-expanding-share-button-toggle-btn.at-expanding-share-button-hidden[data-name]:after{display:none}.at-expanding-share-button .at-expanding-share-button-toggle-bg{box-shadow:0 2px 4px 0 rgba(0,0,0,.3);border-radius:50%;position:relative}.at-expanding-share-button .at-expanding-share-button-toggle-bg>span{background-image:url("data:image/svg+xml,%3Csvg%20width%3D%2232px%22%20height%3D%2232px%22%20viewBox%3D%220%200%2032%2032%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Ctitle%3Eshare%3C%2Ftitle%3E%3Cg%20stroke%3D%22none%22%20stroke-width%3D%221%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Cg%20fill%3D%22%23FFFFFF%22%3E%3Cpath%20d%3D%22M26%2C13.4285714%20C26%2C13.6220248%2025.9293162%2C13.7894338%2025.7879464%2C13.9308036%20L20.0736607%2C19.6450893%20C19.932291%2C19.786459%2019.7648819%2C19.8571429%2019.5714286%2C19.8571429%20C19.3779752%2C19.8571429%2019.2105662%2C19.786459%2019.0691964%2C19.6450893%20C18.9278267%2C19.5037195%2018.8571429%2C19.3363105%2018.8571429%2C19.1428571%20L18.8571429%2C16.2857143%20L16.3571429%2C16.2857143%20C15.6279725%2C16.2857143%2014.9750773%2C16.3080355%2014.3984375%2C16.3526786%20C13.8217977%2C16.3973217%2013.2488868%2C16.477306%2012.6796875%2C16.5926339%20C12.1104882%2C16.7079619%2011.6157015%2C16.8660704%2011.1953125%2C17.0669643%20C10.7749235%2C17.2678581%2010.3824423%2C17.5264121%2010.0178571%2C17.8426339%20C9.65327199%2C18.1588557%209.35565592%2C18.534596%209.125%2C18.9698661%20C8.89434408%2C19.4051361%208.71391434%2C19.9203839%208.58370536%2C20.515625%20C8.45349637%2C21.1108661%208.38839286%2C21.7842224%208.38839286%2C22.5357143%20C8.38839286%2C22.9449425%208.40699386%2C23.4025272%208.44419643%2C23.9084821%20C8.44419643%2C23.9531252%208.45349693%2C24.0405499%208.47209821%2C24.1707589%20C8.4906995%2C24.3009679%208.5%2C24.3995532%208.5%2C24.4665179%20C8.5%2C24.5781256%208.46837829%2C24.6711306%208.40513393%2C24.7455357%20C8.34188956%2C24.8199408%208.25446484%2C24.8571429%208.14285714%2C24.8571429%20C8.02380893%2C24.8571429%207.9196433%2C24.7938994%207.83035714%2C24.6674107%20C7.77827355%2C24.6004461%207.72991094%2C24.5186017%207.68526786%2C24.421875%20C7.64062478%2C24.3251483%207.59040206%2C24.2135423%207.53459821%2C24.0870536%20C7.47879436%2C23.9605648%207.43973225%2C23.87128%207.41741071%2C23.8191964%20C6.47246551%2C21.6986501%206%2C20.0208395%206%2C18.7857143%20C6%2C17.3050521%206.19717065%2C16.0662252%206.59151786%2C15.0691964%20C7.79688103%2C12.0706695%2011.0520568%2C10.5714286%2016.3571429%2C10.5714286%20L18.8571429%2C10.5714286%20L18.8571429%2C7.71428571%20C18.8571429%2C7.52083237%2018.9278267%2C7.35342333%2019.0691964%2C7.21205357%20C19.2105662%2C7.07068382%2019.3779752%2C7%2019.5714286%2C7%20C19.7648819%2C7%2019.932291%2C7.07068382%2020.0736607%2C7.21205357%20L25.7879464%2C12.9263393%20C25.9293162%2C13.067709%2026%2C13.2351181%2026%2C13.4285714%20L26%2C13.4285714%20Z%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:center center;background-repeat:no-repeat;-webkit-transition:transform .4s ease;transition:transform .4s ease;border-radius:50%;display:block}.at-expanding-share-button .at-icon-wrapper{box-shadow:0 2px 4px 0 rgba(0,0,0,.3);border-radius:50%;display:inline-block;height:40px;line-height:40px;text-align:center;width:40px}.at-expanding-share-button .at-icon{display:inline-block;height:34px;margin:3px 0;vertical-align:top;width:34px}.at-expanding-share-button [data-name]:after{box-shadow:0 2px 4px 0 rgba(0,0,0,.3);-webkit-transform:translate(0, -50%);transform:translate(0, -50%);-webkit-transition:.4s;transition:.4s;background-color:#fff;border-radius:3px;color:#666;content:attr(data-name);font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:9pt;line-height:9pt;font-weight:500;opacity:0;padding:3px 5px;position:relative;top:20px;white-space:nowrap}.at-expanding-share-button.at-expanding-share-button-show-icons .at-expanding-share-button-services-list{display:block}.at-expanding-share-button.at-expanding-share-button-animate-in .at-expanding-share-button-toggle-bg>span{-webkit-transform:rotate(270deg);transform:rotate(270deg);background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cg%3E%3Cpath%20d%3D%22M18%2014V8h-4v6H8v4h6v6h4v-6h6v-4h-6z%22%20fill-rule%3D%22evenodd%22%20fill%3D%22white%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:center center;background-repeat:no-repeat}.at-expanding-share-button.at-expanding-share-button-animate-in [data-name]:after{opacity:1}.at-expanding-share-button.at-hide-label [data-name]:after{display:none}.at-expanding-share-button.at-expanding-share-button-desktop .at-expanding-share-button-toggle{height:50px}.at-expanding-share-button.at-expanding-share-button-desktop .at-icon-wrapper:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.5)}.at-expanding-share-button.at-expanding-share-button-desktop .at-expanding-share-button-toggle-bg{height:50px;line-height:50px;width:50px}.at-expanding-share-button.at-expanding-share-button-desktop .at-expanding-share-button-toggle-bg>span{height:50px;width:50px}.at-expanding-share-button.at-expanding-share-button-desktop .at-expanding-share-button-toggle-bg:after{box-shadow:0 2px 5px 0 rgba(0,0,0,.2);-webkit-transition:opacity .2s ease;transition:opacity .2s ease;border-radius:50%;content:'';height:100%;opacity:0;position:absolute;top:0;left:0;width:100%}.at-expanding-share-button.at-expanding-share-button-desktop .at-expanding-share-button-toggle-bg:hover:after{opacity:1}.at-expanding-share-button.at-expanding-share-button-desktop .at-expanding-share-button-toggle-btn[data-name]:after{top:25px}.at-expanding-share-button.at-expanding-share-button-mobile .at-expanding-share-button-services-list{margin:0}.at-expanding-share-button.at-expanding-share-button-mobile .at-expanding-share-button-toggle-btn,.at-expanding-share-button.at-expanding-share-button-mobile .at-share-btn{outline:0}.at-expanding-share-button.at-expanding-share-button-mobile .at-expanding-share-button-toggle{height:40px;-webkit-tap-highlight-color:transparent}.at-expanding-share-button.at-expanding-share-button-mobile .at-expanding-share-button-toggle-bg,.at-expanding-share-button.at-expanding-share-button-mobile .at-expanding-share-button-toggle-bg span{height:40px;line-height:40px;width:40px}.at-expanding-share-button.at-expanding-share-button-mobile .at-expanding-share-button-click-flash{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:transform ease,opacity ease-in;transition:transform ease,opacity ease-in;background-color:hsla(0,0%,100%,.3);border-radius:50%;height:40px;opacity:1;position:absolute;width:40px;z-index:10000}.at-expanding-share-button.at-expanding-share-button-mobile .at-expanding-share-button-click-flash.at-expanding-share-button-click-flash-animate{-webkit-transform:scale(1);transform:scale(1);opacity:0}.at-expanding-share-button.at-expanding-share-button-mobile+.at-expanding-share-button-mobile-overlay{-webkit-transition:opacity ease;transition:opacity ease;bottom:0;background-color:hsla(0,0%,87%,.7);display:block;height:auto;left:0;opacity:0;position:fixed;right:0;top:0;width:auto;z-index:9998}.at-expanding-share-button.at-expanding-share-button-mobile+.at-expanding-share-button-mobile-overlay.at-expanding-share-button-hidden{height:0;width:0;z-index:-10000}.at-expanding-share-button.at-expanding-share-button-mobile.at-expanding-share-button-animate-in+.at-expanding-share-button-mobile-overlay{-webkit-transition:opacity ease;transition:opacity ease;opacity:1}</style><style type="text/css">.at-tjin-element .at300b,.at-tjin-element .at300m{display:inline-block;width:auto;padding:0;margin:0 2px 5px;outline-offset:-1px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.at-tjin-element .at300b:focus,.at-tjin-element .at300b:hover,.at-tjin-element .at300m:focus,.at-tjin-element .at300m:hover{-webkit-transform:translateY(-4px);transform:translateY(-4px)}.at-tjin-element .addthis_tjin_label{display:none}.at-tjin-element .addthis_vertical_style .at300b,.at-tjin-element .addthis_vertical_style .at300m{display:block}.at-tjin-element .addthis_vertical_style .at300b .addthis_tjin_label,.at-tjin-element .addthis_vertical_style .at300b .at-icon-wrapper,.at-tjin-element .addthis_vertical_style .at300m .addthis_tjin_label,.at-tjin-element .addthis_vertical_style .at300m .at-icon-wrapper{display:inline-block;vertical-align:middle;margin-right:5px}.at-tjin-element .addthis_vertical_style .at300b:focus,.at-tjin-element .addthis_vertical_style .at300b:hover,.at-tjin-element .addthis_vertical_style .at300m:focus,.at-tjin-element .addthis_vertical_style .at300m:hover{-webkit-transform:none;transform:none}.at-tjin-element .at-tjin-btn{margin:0 5px 5px 0;padding:0;outline-offset:-1px;display:inline-block;box-sizing:content-box;transition:all .2s ease-in-out}.at-tjin-element .at-tjin-btn:focus,.at-tjin-element .at-tjin-btn:hover{-webkit-transform:translateY(-4px);transform:translateY(-4px)}.at-tjin-element .at-tjin-title{margin:0 0 15px}</style><style type="text/css">#addthissmartlayerscssready{color:#bada55!important}.addthis-smartlayers,div#at4-follow,div#at4-share,div#at4-thankyou,div#at4-whatsnext{padding:0;margin:0}#at4-follow-label,#at4-share-label,#at4-whatsnext-label,.at4-recommended-label.hidden{padding:0;border:none;background:none;position:absolute;top:0;left:0;height:0;width:0;overflow:hidden;text-indent:-9999em}.addthis-smartlayers .at4-arrow:hover{cursor:pointer}.addthis-smartlayers .at4-arrow:after,.addthis-smartlayers .at4-arrow:before{content:none}a.at4-logo{background:url(data:image/gif;base64,R0lGODlhBwAHAJEAAP9uQf///wAAAAAAACH5BAkKAAIALAAAAAAHAAcAAAILFH6Ge8EBH2MKiQIAOw==) no-repeat left center}.at4-minimal a.at4-logo{background:url(data:image/gif;base64,R0lGODlhBwAHAJEAAP9uQf///wAAAAAAACH5BAkKAAIALAAAAAAHAAcAAAILFH6Ge8EBH2MKiQIAOw==) no-repeat left center!important}button.at4-closebutton{position:absolute;top:0;right:0;padding:0;margin-right:10px;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;font-size:19px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}button.at4-closebutton:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}div.at4-arrow{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAoCAYAAABpYH0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAV1JREFUeNrsmesOgyAMhQfxwfrofTM3E10ME2i5Oeppwr9a5OMUCrh1XV+wcvNAAIAA+BiAzrmtUWln27dbjEcC3AdODfo0BdEPhmcO4nIDvDNELi2jggk4/k8dT7skfeKzWIEd4VUpMQKvNB7X+OZSmAZkATWC1xvipbpnLmOosbJZC08CkAeA4E6qFUEMwLAGnlSBPCE8lW8CYnZTcimH2HoT7kSFOx5HBmCnDhTIu1p5s98G+QZrxGPhZVMY1vgyAQaAAAiAAAgDQACcBOD+BvJtBWfRy7NpJK5tBe4FNzXokywV734wPHMQlxvgnSGyNoUP/2ACjv/7iSeYKO3YWKzAjvCqlBiBVxqPa3ynexNJwOsN8TJbzL6JNIYYXWpMv4lIIAZgWANPqkCeEJ7KNwExu8lpLlSpAVQarO77TyKdBsyRPuwV0h0gmoGnTWFYzVkYBoAA+I/2FmAAt6+b5XM9mFkAAAAASUVORK5CYII=);background-repeat:no-repeat;width:20px;height:20px;margin:0;padding:0;overflow:hidden;text-indent:-9999em;text-align:left;cursor:pointer}#at4-recommendedpanel-outer-container .at4-arrow.at-right,div.at4-arrow.at-right{background-position:-20px 0}#at4-recommendedpanel-outer-container .at4-arrow.at-left,div.at4-arrow.at-left{background-position:0 0}div.at4-arrow.at-down{background-position:-60px 0}div.at4-arrow.at-up{background-position:-40px 0}.ats-dark div.at4-arrow.at-right{background-position:-20px -20px}.ats-dark div.at4-arrow.at-left{background-position:0 -20px}.ats-dark div.at4-arrow.at-down{background-position:-60px -20px}.ats-dark div.at4-arrow.at-up{background-position:-40px -20}.at4-opacity-hidden{opacity:0!important}.at4-opacity-visible{opacity:1!important}.at4-visually-hidden{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;overflow:hidden}.at4-hidden-off-screen,.at4-hidden-off-screen *{position:absolute!important;top:-9999px!important;left:-9999px!important}.at4-show{display:block!important;opacity:1!important}.at4-show-content{opacity:1!important;visibility:visible}.at4-hide{display:none!important;opacity:0!important}.at4-hide-content{opacity:0!important;visibility:hidden}.at4-visible{display:block!important;opacity:0!important}.at-wordpress-hide{display:none!important;opacity:0!important}.addthis-animated{-webkit-animation-fill-mode:both;animation-fill-mode:both;animation-timing-function:ease-out;-webkit-animation-duration:.3s;animation-duration:.3s}.slideInDown.addthis-animated,.slideInLeft.addthis-animated,.slideInRight.addthis-animated,.slideInUp.addthis-animated,.slideOutDown.addthis-animated,.slideOutLeft.addthis-animated,.slideOutRight.addthis-animated,.slideOutUp.addthis-animated{-webkit-animation-duration:.4s;animation-duration:.4s}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px)}to{opacity:1;-webkit-transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px)}to{opacity:1;-webkit-transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;transform:translateX(-20px)}to{opacity:1;transform:translateX(0)}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;transform:translateX(20px)}to{opacity:1;transform:translateX(0)}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-20px)}}@keyframes fadeOutUp{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-20px)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(20px)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-20px)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(20px)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(1500px)}0%,to{opacity:1}to{-webkit-transform:translateY(0)}}@keyframes slideInUp{0%{transform:translateY(1500px)}0%,to{opacity:1}to{transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}.slideInUp.addthis-animated{-webkit-animation-duration:.4s;animation-duration:.4s}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-850px)}0%,to{opacity:1}to{-webkit-transform:translateY(0)}}@keyframes slideInDown{0%{transform:translateY(-850px)}0%,to{opacity:1}to{transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0)}0%,to{opacity:1}to{-webkit-transform:translateY(-250px)}}@keyframes slideOutUp{0%{transform:translateY(0)}0%,to{opacity:1}to{transform:translateY(-250px)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}@-webkit-keyframes slideOutUpFast{0%{-webkit-transform:translateY(0)}0%,to{opacity:1}to{-webkit-transform:translateY(-1250px)}}@keyframes slideOutUpFast{0%{transform:translateY(0)}0%,to{opacity:1}to{transform:translateY(-1250px)}}#at4m-menu.slideOutUp{-webkit-animation-name:slideOutUpFast;animation-name:slideOutUpFast}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0)}0%,to{opacity:1}to{-webkit-transform:translateY(350px)}}@keyframes slideOutDown{0%{transform:translateY(0)}0%,to{opacity:1}to{transform:translateY(350px)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutDownFast{0%{-webkit-transform:translateY(0)}0%,to{opacity:1}to{-webkit-transform:translateY(1250px)}}@keyframes slideOutDownFast{0%{transform:translateY(0)}0%,to{opacity:1}to{transform:translateY(1250px)}}#at4m-menu.slideOutDown{-webkit-animation-name:slideOutDownFast;animation-name:slideOutDownFast}@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-850px);transform:translateX(-850px)}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-850px);transform:translateX(-850px)}to{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(1250px);transform:translateX(1250px)}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(1250px);transform:translateX(1250px)}to{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-250px);transform:translateX(-250px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-350px);transform:translateX(-350px)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(350px);transform:translateX(350px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(350px);transform:translateX(350px)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}.at4win{margin:0 auto;background:#fff;border:1px solid #ebeced;width:25pc;box-shadow:0 0 10px rgba(0,0,0,.3);border-radius:8px;font-family:helvetica neue,helvetica,arial,sans-serif;text-align:left;z-index:9999}.at4win .at4win-header{position:relative;border-bottom:1px solid #f2f2f2;background:#fff;height:49px;-webkit-border-top-left-radius:8px;-webkit-border-top-right-radius:8px;-moz-border-radius-topleft:8px;-moz-border-radius-topright:8px;border-top-left-radius:8px;border-top-right-radius:8px;cursor:default}.at4win .at4win-header .at-h3,.at4win .at4win-header h3{height:49px;line-height:49px;margin:0 50px 0 0;padding:1px 0 0;margin-left:20px;font-family:helvetica neue,helvetica,arial,sans-serif;font-size:1pc;font-weight:700;text-shadow:0 1px #fff;color:#333}.at4win .at4win-header .at-h3 img,.at4win .at4win-header h3 img{display:inline-block;margin-right:4px}.at4win .at4win-header .at4-close{display:block;position:absolute;top:0;right:0;background:url("data:image/gif;base64,R0lGODlhFAAUAIABAAAAAP///yH5BAEAAAEALAAAAAAUABQAAAIzBIKpG+YMm5Enpodw1HlCfnkKOIqU1VXk55goVb2hi7Y0q95lfG70uurNaqLgTviyyUoFADs=") no-repeat center center;background-repeat:no-repeat;background-position:center center;border-left:1px solid #d2d2d1;width:49px;height:49px;line-height:49px;overflow:hidden;text-indent:-9999px;text-shadow:none;cursor:pointer;opacity:.5;border:0;-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.at4win .at4win-header .at4-close::-moz-focus-inner{border:0;padding:0}.at4win .at4win-header .at4-close:hover{opacity:1;background-color:#ebeced;border-top-right-radius:7px}.at4win .at4win-content{position:relative;background:#fff;min-height:220px}#at4win-footer{position:relative;background:#fff;border-top:1px solid #d2d2d1;-webkit-border-bottom-right-radius:8px;-webkit-border-bottom-left-radius:8px;-moz-border-radius-bottomright:8px;-moz-border-radius-bottomleft:8px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;height:11px;line-height:11px;padding:5px 20px;font-size:11px;color:#666;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}#at4win-footer a{margin-right:10px;text-decoration:none;color:#666}#at4win-footer a:hover{text-decoration:none;color:#000}#at4win-footer a.at4-logo{top:5px;padding-left:10px}#at4win-footer a.at4-privacy{position:absolute;top:5px;right:10px;padding-right:14px}.at4win.ats-dark{border-color:#555;box-shadow:none}.at4win.ats-dark .at4win-header{background:#1b1b1b;-webkit-border-top-left-radius:6px;-webkit-border-top-right-radius:6px;-moz-border-radius-topleft:6px;-moz-border-radius-topright:6px;border-top-left-radius:6px;border-top-right-radius:6px}.at4win.ats-dark .at4win-header .at4-close{background:url("data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTEvMTMvMTKswDp5AAAAd0lEQVQ4jb2VQRLAIAgDE///Z3qqY1FAhalHMCsCIkVEAIAkkVgvp2lDBgYAnAyHkWotLccNrEd4A7X2TqIdqLfnWBAdaF5rJdyJfjtPH5GT37CaGhoVq3nOm/XflUuLUto2pY1d+vRKh0Pp+MrAVtDe2JkvYNQ+jVSEEFmOkggAAAAASUVORK5CYII=") no-repeat center center;background-image:url(//s7.addthis.com/static/fb08f6d50887bd0caacc86a62bcdcf68.svg),none;border-color:#333}.at4win.ats-dark .at4win-header .at4-close:hover{background-color:#000}.at4win.ats-dark .at4win-header .at-h3,.at4win.ats-dark .at4win-header h3{color:#fff;text-shadow:0 1px #000}.at4win.ats-gray .at4win-header{background:#fff;border-color:#d2d2d1;-webkit-border-top-left-radius:6px;-webkit-border-top-right-radius:6px;-moz-border-radius-topleft:6px;-moz-border-radius-topright:6px;border-top-left-radius:6px;border-top-right-radius:6px}.at4win.ats-gray .at4win-header a.at4-close{border-color:#d2d2d1}.at4win.ats-gray .at4win-header a.at4-close:hover{background-color:#ebeced}.at4win.ats-gray #at4win-footer{border-color:#ebeced}.at4win .clear{clear:both}.at4win ::selection{background:#fe6d4c;color:#fff}.at4win ::-moz-selection{background:#fe6d4c;color:#fff}.at4-icon-fw{display:inline-block;background-repeat:no-repeat;background-position:0 0;margin:0 5px 0 0;overflow:hidden;text-indent:-9999em;cursor:pointer;padding:0;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.at44-follow-container a.aticon{height:2pc;margin:0 5px 5px 0}.at44-follow-container .at4-icon-fw{margin:0}</style><style type="text/css">.nps-fade{opacity:1;-webkit-transition:opacity 500ms;transition:opacity 500ms}.nps-fade-enter,.nps-fade-leave{opacity:0}.nps-slide-enter,.nps-slide-leave{bottom:-600px !important}.nps-next{-webkit-transition:height 500ms;transition:height 500ms}.nps-next>div{-webkit-transition:top 500ms;transition:top 500ms}.nps-next>div>div{-webkit-transition:opacity 500ms;transition:opacity 500ms}.nps-expand{max-height:800px;overflow:hidden;-webkit-transition:max-height 500ms, opacity 500ms;transition:max-height 500ms, opacity 500ms}.nps-expand-enter,.nps-expand-leave{max-height:0px;opacity:0}.nps-Bar{position:fixed;bottom:0;left:0;right:0;text-align:center;-webkit-transition:bottom 500ms;transition:bottom 500ms;z-index:2147483647;padding:0 20px;max-height:100vh;overflow:auto}.nps-embed .nps-Bar{position:absolute;max-height:100%}.nps-Bar .nps-PoweredBy{position:absolute;bottom:10px;right:20px}.nps-embed .nps-Bar .nps-PoweredBy{display:none}@media (max-width: 700px){.nps-Bar .nps-PoweredBy{display:none}}.nps-Bar .nps-Scale{margin-left:auto;margin-right:auto}.nps-Bar .nps-Survey-bounding{max-width:600px;margin:20px auto}.nps-Bar .nps-Title{font-size:14px}.nps-Dialog{background-color:white;border-width:2px;border-style:solid;margin:auto;padding:20px;position:fixed;width:417px;z-index:2147483647;-webkit-transition:all 500ms;transition:all 500ms;box-sizing:border-box}.nps-embed .nps-Dialog{position:absolute}.nps-Dialog--top{top:20px}.nps-Dialog--middle{top:50%;-webkit-transform:translate(0, -50%);transform:translate(0, -50%)}.nps-Dialog--bottom{bottom:20px}.nps-Dialog--left{-webkit-transition:left 500ms;transition:left 500ms;left:20px}.nps-Dialog--left.nps-show-enter,.nps-Dialog--left.nps-show-leave{left:-500px}.nps-Dialog--center{left:0;right:0}.nps-Dialog--center.nps-Dialog--top.nps-show-enter,.nps-Dialog--center.nps-Dialog--top.nps-show-leave{top:-500px}.nps-Dialog--center.nps-Dialog--middle{-webkit-transform:translate(0, -50%) scale(1);transform:translate(0, -50%) scale(1)}.nps-Dialog--center.nps-Dialog--middle.nps-show-enter,.nps-Dialog--center.nps-Dialog--middle.nps-show-leave{-webkit-transform:translate(0, -50%) scale(0);transform:translate(0, -50%) scale(0)}.nps-Dialog--center.nps-Dialog--bottom{bottom:20px}.nps-Dialog--center.nps-Dialog--bottom.nps-show-enter,.nps-Dialog--center.nps-Dialog--bottom.nps-show-leave{bottom:-500px}.nps-Dialog--right{right:20px}.nps-Dialog--right.nps-show-enter,.nps-Dialog--right.nps-show-leave{right:-500px}.nps-Dialog .nps-Title{margin-right:20px}.nps-Dialog-close{float:right;font-weight:bold;padding:0;cursor:pointer;background:transparent;border:0;font-size:16px;width:30px;height:30px;color:white;position:absolute;right:0;top:0}.nps-Dialog-close:focus{outline:0}.nps-Dialog-FeedbackPoweredBy{position:absolute;bottom:0;line-height:30px;left:0}.nps-Feedback{text-align:left}.nps-Feedback-reason{margin-top:10px}.nps-Feedback-reason label{display:block;font-weight:normal}.nps-Feedback-reason input{margin-right:8px;margin-left:4px;position:relative;top:-2px}.nps-Feedback-submit{margin-top:10px;float:right}.nps-Panel{border-width:2px;border-style:solid;background-color:white}.nps-Panel{font-size:16px;color:#333;max-width:600px;min-width:375px;margin:20px auto;padding:20px}@media (max-width: 480px){.nps-Survey .nps-Panel{border-width:0;min-width:initial;font-size:14px;box-shadow:none}}.nps-Panel .nps-Survey--powered-by{line-height:38px}.nps-Panel .nps-Title{font-size:18px}.nps-Panel .nps-Rating{margin-bottom:20px}.nps-PoweredBy{font-size:12px;margin-top:20px}.nps-PoweredBy>a{text-decoration:none;font-weight:bold}.nps-Survey{color:#333;font-family:sans-serif;font-weight:normal;font-size:14px;line-height:1.42857143}.nps-Survey-buttons{float:right;margin-top:14px}.nps-Survey-bounding{position:relative;overflow:hidden}.nps-Survey-content{position:relative;top:0}.nps-Title{font-size:16px}.nps-cf:before,.nps-cf:after{content:" ";display:table}.nps-cf:after{clear:both}.nps-left{text-align:left}.nps-center{text-align:center}.nps-margin-t20{margin-top:20px}.nps-Button{display:inline-block;zoom:1;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;font-size:100%;padding:0.5em 1em;text-decoration:none;border:0}.nps-Button::-moz-focus-inner{padding:0;border:0}.nps-Button:focus{outline:0}.nps-Button[disabled]{border:none;background-image:none;opacity:0.40;cursor:default;box-shadow:none}.nps-Button--simple{border:0;cursor:pointer;padding:10px}.nps-Button--icon{width:30px;height:30px;padding:0}.nps-Button--simple:focus,.nps-Button--simple:hover{outline:none}.nps-Link{padding:0.5em 1em;text-decoration:none}.nps-Textarea{margin-top:14px;height:80px;border-width:2px;border-style:solid;font-size:14px;padding:7px 10px;width:100%;resize:vertical;box-sizing:border-box;-webkit-transition:border-color 300ms, background-color 300ms;transition:border-color 300ms, background-color 300ms}.nps-Textarea:focus{outline:0}.nps-Scale{margin-top:14px;display:inline-block}.nps-Scale-values{margin-bottom:4px;text-align:center}.nps-Scale-value{display:inline-block;padding-right:2px;vertical-align:middle;line-height:1;font-size:1.5em}.nps-Scale-value:last-of-type{padding-right:0}.nps-Scale-value:hover{cursor:pointer}.nps-Scale-button{border-radius:50%;width:32px;height:32px;text-align:center;line-height:32px;font-size:12px}@media (max-width: 480px){.nps-Scale-button{width:22px;height:22px;line-height:22px}}.nps-small .nps-Scale-button{width:22px;height:22px;line-height:22px}.nps-Scale-hint{font-size:12px;font-style:italic}.nps-Scale-hint--unlikely{float:left;padding-right:10px}.nps-Scale-hint--likely{float:right;padding-left:10px}.nps-Survey[dir="rtl"] .nps-Scale-hint--unlikely{float:right}.nps-Survey[dir="rtl"] .nps-Scale-hint--likely{float:left}</style></head>
|
|
<body class="course oc-body ">
|
|
<div id="react_root"></div>
|
|
<script id="_EVENTS-PAGE" type="application/json">
|
|
{
|
|
"type": "page",
|
|
"integrations": {
|
|
"HubSpot": false
|
|
}
|
|
}
|
|
</script>
|
|
<header id="oc-header" class="js-tabs-mobile mainHeader " data-widget="tabs">
|
|
<!--[if lt IE 9]>
|
|
<div class="disclaimer disclaimer-error">
|
|
Vous utilisez un navigateur obsolète, veuillez le <a href="http://browsehappy.com/">mettre à jour</a>.
|
|
</div>
|
|
<![endif]-->
|
|
<noscript>
|
|
<div class="disclaimer disclaimer--error">
|
|
Veuillez utiliser un <a href="http://browsehappy.com/">navigateur internet moderne</a> avec JavaScript activé pour naviguer sur OpenClassrooms.com
|
|
</div>
|
|
</noscript>
|
|
<div class="disclaimer disclaimer--info js-cookie-disclaimer" data-widget="dismissibleElement">
|
|
<div class="disclaimer__wrapper">
|
|
<span class="disclaimer__content">
|
|
Bienvenue sur OpenClassrooms ! En poursuivant votre navigation, vous acceptez l'utilisation de cookies. <a href="https://openclassrooms.com/privacy-policy#personal-data-gathering">En savoir plus</a>
|
|
</span>
|
|
<span class="disclaimer__actions">
|
|
<a href="#" class="disclaimer__button js-close-button">ok</a>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="mainHeader__wrapper">
|
|
<div class="mainHeader__inner">
|
|
<a href="https://openclassrooms.com/" class="mainHeader__logo" title="OpenClassrooms.com">
|
|
OpenClassrooms.com
|
|
</a>
|
|
<div class="mainHeader__content">
|
|
<div id="tab-main" class="mainHeader__tabs">
|
|
<div class="mainHeader__container mainHeader__container--mainMenu">
|
|
<nav>
|
|
<ul class="mainTopNav">
|
|
<li class="mainTopNav__itemContainer">
|
|
<a class="mainTopNav__item" href="https://openclassrooms.com/paths/">Parcours</a>
|
|
</li>
|
|
<li class="mainTopNav__itemContainer">
|
|
<a class="mainTopNav__item" href="https://openclassrooms.com/courses">Cours</a>
|
|
</li>
|
|
<li class="mainTopNav__itemContainer">
|
|
<a class="mainTopNav__item" href="https://openclassrooms.com/forum/">Forums</a>
|
|
</li>
|
|
<li class="mainTopNav__itemContainer">
|
|
<a class="mainTopNav__item" href="https://openclassrooms.com/premium">Premium</a>
|
|
</li>
|
|
<li class="mainTopNav__itemContainer">
|
|
<a class="mainTopNav__item u--colorBusiness" href="https://openclassrooms.com/for-business">For Business</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
<div class="mainHeader__container mainHeader__container--search">
|
|
<div id="tab-search" class="mainHeader__search js-header-searchContainer"><div class="js-courseSearch topSearchBox" data-widget="courseSearch">
|
|
<form tabindex="0" class="js-courseSearch-form oc-form" action="https://openclassrooms.com/courses" method="get">
|
|
<div class="js-courseSearch-inputGroup oc-form__widget inputGroup topSearchBox__inner u--block">
|
|
<i class="topSearchBox__icon icon-search"></i>
|
|
<input id="algolia-search-input" class="js-courseSearch-input oc-form__control inputGroup__input topSearchBox__input" title="Rechercher" autocomplete="off" data-option_source="https://openclassrooms.com/components/courses/search?q=<%= term %>" placeholder="Rechercher" aria-label="Rechercher" name="q" type="search">
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="mainHeader__container mainHeader__container--login">
|
|
<a href="https://openclassrooms.com/register" class="mainHeader__actionButton button button--primary button--compact js-popin-activator" data-popin-selector="#popin-sign-in">
|
|
S'inscrire
|
|
</a>
|
|
<a href="https://openclassrooms.com/login" class="mainHeader__actionButton button button--compact js-popin-activator" data-popin-selector="#popin-log-in">
|
|
Se connecter
|
|
</a>
|
|
</div>
|
|
<aside tabindex="-1" role="dialog" aria-labelledby="popin-sign-in_popin_title" class="popin popin--small js-popin" id="popin-sign-in">
|
|
<i class="popin__close-button icon-close js-close-button"></i>
|
|
<div class="popin__inner">
|
|
<div class="popin__mainContainer">
|
|
<h3 id="popin-sign-in_popin_title" class="popin__title js-popin-title">Inscription</h3>
|
|
<div class="popin__content js-popin-content">
|
|
<div class="popin__contentWrapper">
|
|
<div class="formLogin formLogin--smallSize">
|
|
<ul class="table table--fullwidth u--noMargin">
|
|
<li class="formLogin__column">
|
|
<a class="button button--facebook button--fullwidth formLogin__facebook" href="https://www.facebook.com/v2.7/dialog/oauth?client_id=277769842283905&state=9ead23ec28362655c7a33b35faff4754&response_type=code&sdk=php-sdk-5.4.4&redirect_uri=https%3A%2F%2Fopenclassrooms.com%2Flogin_check_facebook&scope=public_profile%2Cemail%2Cuser_birthday">
|
|
<i class="icon-facebook"></i>S'inscrire avec Facebook
|
|
</a>
|
|
<a class="button button--google button--fullwidth formLogin__google" href="https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=online&client_id=132418960718-jdnmpug3g9e6ub2p41ergcci1492qh82.apps.googleusercontent.com&redirect_uri=https%3A%2F%2Fopenclassrooms.com%2Flogin_check_google&state&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&approval_prompt=auto">
|
|
<i class="icon-google"></i>S'inscrire avec Google
|
|
</a>
|
|
</li>
|
|
<li class="formLogin__column">
|
|
<form name="register" method="post" action="https://openclassrooms.com/register" class="js-registerForm oc-form" data-widget="formEvents">
|
|
<div class="accessibility-hidden">
|
|
<label class="oc-form__row "><span class="oc-form__label-text ">
|
|
Wonder
|
|
<abbr class="oc-form__required js-form-required wonder oc-form__required-hidden" title="requis"><span>*</span></abbr></span><span class="oc-form__widget formWidget "><input id="register_wonder" name="register[wonder]" aria-label=" " class=" textInput textInput--text" type="text"></span></label>
|
|
</div>
|
|
<div class="oc-form__group oc-form--requiredHidden">
|
|
<label class="oc-form__row "><span class="oc-form__label-text ">
|
|
Prénom
|
|
<abbr class="oc-form__required js-form-required firstName " title="requis"><span>*</span></abbr></span><span class="oc-form__widget formWidget "><input id="register_firstName" name="register[firstName]" required="required" maxlength="100" autofocus="autofocus" aria-label=" " class=" textInput textInput--text" type="text"></span></label>
|
|
</div>
|
|
<div class="oc-form__group oc-form--requiredHidden">
|
|
<label class="oc-form__row "><span class="oc-form__label-text ">
|
|
Nom
|
|
<abbr class="oc-form__required js-form-required lastName " title="requis"><span>*</span></abbr></span><span class="oc-form__widget formWidget "><input id="register_lastName" name="register[lastName]" required="required" maxlength="100" aria-label=" " class=" textInput textInput--text" type="text"></span></label>
|
|
</div>
|
|
<div class="oc-form__group oc-form--requiredHidden">
|
|
<label class="oc-form__row "><span class="oc-form__label-text ">
|
|
Adresse email
|
|
<abbr class="oc-form__required js-form-required email " title="requis"><span>*</span></abbr></span><span class="oc-form__widget formWidget "><span><!-- react-empty: 1 --></span><input id="register_email" name="register[email]" required="required" maxlength="80" aria-label=" " data-check-email="1" class=" textInput textInput--email" type="email"></span></label>
|
|
<p>
|
|
<em>
|
|
Vous recevrez votre mot de passe sur cette adresse email.
|
|
</em>
|
|
</p>
|
|
</div>
|
|
<div class="oc-form__group oc-form--requiredHidden">
|
|
<label class="oc-form__row oc-form__row--reversed "><span class="oc-form__widget"><span class="ocCheckbox"><input id="register_terms" name="register[terms]" required="required" aria-label=" " class="" value="1" type="checkbox"><span class="ocCheckbox__check"></span></span></span><span class="oc-form__label-text"><span class="oc-form__label-text ">
|
|
J'ai lu et j'accepte les <a target="_blank" href="https://openclassrooms.com/terms-conditions">Conditions Générales d'Utilisation</a>.
|
|
<abbr class="oc-form__required js-form-required terms " title="requis"><span>*</span></abbr></span></span></label>
|
|
</div>
|
|
<div class="oc-form__group center-text">
|
|
<button type="submit" id="register_create" name="register[create]" class="button button--primary button"> S'inscrire</button>
|
|
</div>
|
|
<input id="register__target_path" name="register[_target_path]" class=" textInput textInput--hidden" value="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates" type="hidden"><input id="register__token" name="register[_token]" class=" textInput textInput--hidden" value="Gkc3xEnENYutOXuvQiAqd6SBgn7JeTmHapO20_nZdtA" type="hidden"></form>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
<aside tabindex="-1" role="dialog" aria-labelledby="popin-log-in_popin_title" class="popin popin--small js-popin" id="popin-log-in">
|
|
<i class="popin__close-button icon-close js-close-button"></i>
|
|
<div class="popin__inner">
|
|
<div class="popin__mainContainer">
|
|
<h3 id="popin-log-in_popin_title" class="popin__title js-popin-title">Connexion</h3>
|
|
<div class="popin__content js-popin-content">
|
|
<div class="popin__contentWrapper">
|
|
<div class="formLogin formLogin--smallSize">
|
|
<ul class="table table--fullwidth u--noMargin">
|
|
<li class="formLogin__column">
|
|
<a class="button button--facebook button--fullwidth formLogin__facebook" href="https://www.facebook.com/v2.7/dialog/oauth?client_id=277769842283905&state=9ead23ec28362655c7a33b35faff4754&response_type=code&sdk=php-sdk-5.4.4&redirect_uri=https%3A%2F%2Fopenclassrooms.com%2Flogin_check_facebook&scope=public_profile%2Cemail%2Cuser_birthday"><i class="icon-facebook"></i> Se connecter avec Facebook</a>
|
|
<a class="button button--google button--fullwidth formLogin__google" href="https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=online&client_id=132418960718-jdnmpug3g9e6ub2p41ergcci1492qh82.apps.googleusercontent.com&redirect_uri=https%3A%2F%2Fopenclassrooms.com%2Flogin_check_google&state&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&approval_prompt=auto"><i class="icon-google"></i> Se connecter avec Google</a>
|
|
</li>
|
|
<li class="formLogin__column">
|
|
<form name="" method="post" action="https://openclassrooms.com/login_check" class=" oc-form">
|
|
<div class="oc-form__group oc-form--requiredHidden">
|
|
<label class="oc-form__row "><span class="oc-form__label-text ">
|
|
Adresse email ou nom d'utilisateur
|
|
<abbr class="oc-form__required js-form-required _username " title="requis"><span>*</span></abbr></span><span class="oc-form__widget formWidget "><input id="_username" name="_username" required="required" autofocus="autofocus" aria-label=" " class=" textInput textInput--text" type="text"></span></label>
|
|
</div>
|
|
<div class="oc-form__group oc-form--requiredHidden">
|
|
<label class="oc-form__row "><span class="oc-form__label-text ">
|
|
Mot de passe
|
|
<abbr class="oc-form__required js-form-required _password " title="requis"><span>*</span></abbr></span><span class="oc-form__widget formWidget "><input id="_password" name="_password" required="required" aria-label=" " class=" textInput textInput--password" type="password"></span></label>
|
|
</div>
|
|
<div class="oc-form__group">
|
|
<label class="oc-form__row oc-form__row--reversed "><span class="oc-form__widget"><span class="ocCheckbox"><input id="_remember_me" name="_remember_me" aria-label=" " class="" value="1" checked="checked" type="checkbox"><span class="ocCheckbox__check"></span></span></span><span class="oc-form__label-text"><span class="oc-form__label-text ">
|
|
Se souvenir de moi
|
|
<abbr class="oc-form__required js-form-required _remember_me oc-form__required-hidden" title="requis"><span>*</span></abbr></span></span></label>
|
|
</div>
|
|
<div class="oc-form__group right-text">
|
|
<a href="https://openclassrooms.com/set-new-password">Mot de passe oublié</a>
|
|
</div>
|
|
<div class="oc-form__group center-text">
|
|
<input id="_target_path" name="_target_path" class=" textInput textInput--hidden" value="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates" type="hidden"><div>
|
|
<button type="submit" id="login" name="login" class="button--primary button"> Se connecter</button></div><input id="_csrf_token" name="_csrf_token" class=" textInput textInput--hidden" value="ibqjl_NwAinZkiKkQ53zB2dQmV53WYoUzeuXOULXi5I" type="hidden">
|
|
</div>
|
|
</form>
|
|
</li>
|
|
</ul>
|
|
<p class="text-center space-top">
|
|
Pas encore membre ? <a href="https://openclassrooms.com/register">Inscrivez-vous gratuitement</a> en 30s.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
<nav role="navigation" class="icoTabs mainHeader__tabSet">
|
|
<div class="mainHeader__mobileNav">
|
|
<span class="icoTabs__tab mainHeader__tabLogin">
|
|
<a href="https://openclassrooms.com/register" class="mainHeader__actionButton button button--primary button--compact js-popin-activator" data-popin-selector="#popin-sign-in">
|
|
S'inscrire
|
|
</a>
|
|
<a href="https://openclassrooms.com/login" class="mainHeader__actionButton button button--compact js-popin-activator" data-popin-selector="#popin-log-in">
|
|
Se connecter
|
|
</a>
|
|
</span>
|
|
<a class="js-tabs-tab icoTabs__tab mainHeader__tabSearch" href="#tab-search">
|
|
<span class="accessibility-hidden">Rechercher</span>
|
|
<i class="icon-search icoTabs__icon"></i>
|
|
</a>
|
|
<a class="js-tabs-tab icoTabs__tab mainHeader__tabCourseMenu" href="#tab-courseMenu">
|
|
<span class="accessibility-hidden">Cours</span>
|
|
<i class="icon-plus icoTabs__icon"></i>
|
|
</a>
|
|
<a class="js-tabs-tab icoTabs__tab is-disabled" href="#tab-courseEditMenu">
|
|
<span class="accessibility-hidden">Créer un cours</span>
|
|
<i class="icon-plus icoTabs__icon"></i>
|
|
</a>
|
|
<a class="js-tabs-tab icoTabs__tab is-disabled" data-tabs-default="true" href="#tab-searchMenu">
|
|
<span class="accessibility-hidden">Rechercher</span>
|
|
<i class="icon-search icoTabs__icon"></i>
|
|
</a>
|
|
<a class="js-tabs-tab icoTabs__tab" href="#tab-main">
|
|
<span class="accessibility-hidden">Menu principal</span>
|
|
<i class="icon-menu icoTabs__icon"></i>
|
|
</a>
|
|
</div>
|
|
</nav>
|
|
<div class="js-tabs-content mainHeader__content"></div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
<div class="centered">
|
|
<div id="mainSearch" class="mainSearch"><div data-reactroot=""><button class="mainSearch__close" aria-label="Bouton fermer"><i class="icon-cross"></i></button><input class="mainSearch__input" placeholder="Web, Design, etc." aria-label="Chercher un cours" type="text"><div class="searchFacetsPopup space-bottom"><div class="searchFacetsPopup__overlay"></div><p class="searchFacetsPopup__selectedCategory"><!-- react-text: 8 -->dans<!-- /react-text --><a class="searchFacetsPopup__selectedCategoryLink"></a></p><div class="searchFacetsPopup__content"><div></div></div></div><a class="mainSearch__uncertificateFilter hidden"><span class="bullet bullet--small bullet--grey bullet--smallIcon"><i class="icon-close"></i></span><!-- react-text: 15 --> <!-- /react-text --><!-- react-text: 16 -->avec les cours non certifiants<!-- /react-text --></a><div></div><div></div><p class="space-top"><!-- react-text: 20 -->Voir aussi les<!-- /react-text --><!-- react-text: 21 --> <!-- /react-text --><a><!-- react-text: 23 -->...<!-- /react-text --><!-- react-text: 24 --> <!-- /react-text --><!-- react-text: 25 -->cours non certifiants<!-- /react-text --></a><!-- react-text: 26 --> <!-- /react-text --><!-- react-text: 27 -->correspondant à cette recherche<!-- /react-text --></p></div></div>
|
|
</div>
|
|
<div id="mainContentWithHeader">
|
|
<div id="pre-main-part">
|
|
<section class="inset no-padding">
|
|
<div class="centered">
|
|
<h6 class="accessibility-hidden">Fil d'Ariane</h6>
|
|
<nav class="breadcrumb">
|
|
<ul class="breadcrumb__trail">
|
|
<li class="breadcrumb__item breadcrumb__item--home " itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb">
|
|
<a href="https://openclassrooms.com/" itemprop="url">
|
|
<span itemprop="title">Accueil</span>
|
|
</a>
|
|
</li>
|
|
<li class="breadcrumb__item " itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb">
|
|
<a href="https://openclassrooms.com/courses" itemprop="url">
|
|
<span itemprop="title">Cours</span>
|
|
</a>
|
|
</li>
|
|
<li class="breadcrumb__item breadcrumb__item--current" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb">
|
|
Utilisation de Twig, un moteur de templates !
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
<div class="claire clearfix">
|
|
<article itemscope="" itemtype="http://schema.org/Article">
|
|
<header class="course-header" xmlns="http://www.w3.org/1999/html">
|
|
<div class="centered"><div class="course-header__topPart"><div class="course-header__info"><a itemprop="url" href="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates"><h1 data-course-title="Utilisation de Twig, un moteur de templates !">Utilisation de Twig, un moteur de templates !</h1></a><span class="course-header__updatedTime visible-l">Mis à jour le mardi 4 avril 2017</span></div></div></div><div class="course-header__details-container"><div class="centered"><div class="row"><div class="col12"><div class="course-header__details iconBar"><div class="course-header__detailsGroup course-header__detailsGroup--formats iconBar__group"><ul data-option_popinselector="#popin-formats-availables" class="course-types iconBar__list js-course-formats-bar" data-widget="courseFormatsBar"><li class="iconBar__item course-types__item js-tooltip" title="Ce cours est visible gratuitement en ligne."><a href="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates"><i class="icon-desktop course-types__icon"></i><span class="course-header__format-current"></span></a></li><li class="iconBar__item course-types__item iconBar__item--dimmed js-tooltip" title="Ce cours n'est pas encore en vidéo."><span><i class="icon-video course-types__icon"></i></span></li><li class="iconBar__item course-types__item iconBar__item--dimmed js-tooltip" title="Ce cours n'existe pas encore en livre papier."><a href="" target="_blank"><i class="icon-book course-types__icon"></i></a></li><li class="iconBar__item course-types__item iconBar__item--dimmed js-tooltip" title="Ce cours n'existe pas encore en eBook."><a href=""><i class="icon-ebook course-types__icon"></i></a></li><li class="iconBar__item course-types__item iconBar__item--dimmed js-tooltip" title="Vous ne pouvez pas encore obtenir de certificat de réussite à l'issue de ce cours."><a><i class="icon-badge course-types__icon"></i></a></li><li class="iconBar__item course-types__item iconBar__item--dimmed js-tooltip" title="Ce cours n'est pas encore diplômant et ne vous permet pas d'obtenir des crédits universitaires européens (ECTS)."><span><i class="icon-hat course-types__icon"></i></span></li></ul></div><div class="course-header__detailsGroup course-header__detailsGroup--info iconBar__group"><ul class="iconBar__list"><li class="iconBar__item"><i class="icon-duration iconBar__icon js-tooltip" title="Ce cours demande en moyenne 30 minutes de travail pour être réussi."></i><span class="iconBar__label">30 minutes</span></li><li class="iconBar__item"><i class="icon-level iconBar__icon"></i><span class="iconBar__label">
|
|
Facile
|
|
</span></li></ul></div><div class="course-header__detailsGroup course-header__detailsGroup--licences iconBar__group"><a target="_blank" href="https://creativecommons.org/licenses/by-nc-sa/2.0"><span class="iconBar__label">Licence</span><ul class="iconBar__list"><li class="iconBar__item"><i class="icon-cc iconBar__icon" title="CC"></i></li><li class="iconBar__item"><i class="icon-ccby iconBar__icon" title="BY"></i></li><li class="iconBar__item"><i class="icon-ccnc iconBar__icon" title="NC"></i></li><li class="iconBar__item"><i class="icon-ccsa iconBar__icon" title="SA"></i></li></ul></a></div></div></div></div></div></div>
|
|
<div id="popin-formats-availables" class="popin popin--course-formats-availables">
|
|
<i class="popin__close-button icon-close js-close-button"></i>
|
|
<div class="course-types course-types--withSpace">
|
|
<a class="course-types__item" href="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates">
|
|
<i class="icon-desktop course-types__icon"></i>
|
|
</a>
|
|
</div>
|
|
<p>Ce cours est visible <a href="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates">gratuitement en ligne</a>.</p>
|
|
<a class="button button--primary js-close-button" href="#">J'ai tout compris !</a>
|
|
</div>
|
|
</header>
|
|
<div class="centered">
|
|
<div class="contentWithSidebar spacer js-contentWithSidebar" data-widget="contentWithSidebar">
|
|
<main class="contentWithSidebar__content">
|
|
<div class="relative js-sidebar-container">
|
|
<div class="static">
|
|
<div class="row">
|
|
<div class="col9 col11-s col__small-padding--right">
|
|
<div class="tooltipMessage tooltipMessage--noArrow">
|
|
<i class="tooltipMessage__icon icon-lock"></i>
|
|
<a href="https://openclassrooms.com/login" class="js-popin-activator" data-popin-selector="#popin-log-in">Connectez-vous</a> ou <a href="https://openclassrooms.com/register" class="js-popin-activator" data-popin-selector="#popin-sign-in">inscrivez-vous</a> pour bénéficier de toutes les fonctionnalités de ce cours !
|
|
</div>
|
|
<h2 class="accessibility-hidden">Introduction du cours</h2>
|
|
<div class="text-center spacer-big">
|
|
<div>
|
|
<a href="https://openclassrooms.com/login" class="button button--primary js-popin-activator" data-popin-selector="#popin-log-in">
|
|
<i class="icon-lock"></i>
|
|
Commencer le cours
|
|
</a>
|
|
</div>
|
|
<a class="button button--link" href="https://openclassrooms.com/how-does-it-work">
|
|
<span>Comment ça marche ?</span>
|
|
</a>
|
|
</div>
|
|
<section>
|
|
<div itemprop="articleBody" data-page-indentifier="/courses/utilisation-de-twig-un-moteur-de-templates" class="js-isRestrictablePage js-course-container js-smilize js-course-content">
|
|
<div class="userContent userContent--smallCourse js-userContent">
|
|
<p id="r-442288" data-claire-element-id="442288">Bonjour à tous,</p><p id="r-442289" data-claire-element-id="442289" class="">Aujourd'hui
|
|
je vous propose de découvrir un moteur de templates du nom de Twig.
|
|
Twig est le moteur de templates présent dans le célèbre <a href="http://www.siteduzero.com/tutoriel-3-517569-symfony2-un-tutoriel-pour-debuter-avec-le-framework-symfony2.html">framework Symfony</a>.
|
|
Ce cours portera sur son utilisation "seule" (c'est-à-dire sans
|
|
Symfony) mais il faut savoir que la syntaxe que vous apprendrez à mettre
|
|
dans vos templates sera valable pour ce cours et pour l'utilisation des
|
|
templates avec Symfony (ou si le moteur est intégré dans un autre
|
|
framework).</p><p id="r-442290" data-claire-element-id="442290">Twig est
|
|
un moteur de templates PHP. Je vous conseille donc d'avoir de bonnes
|
|
bases en PHP et si possible en orienté objet (bien que ça ne soit pas
|
|
indispensable). Une petite note : la syntaxe du moteur est énormément
|
|
inspirée de <a href="http://jinja.pocoo.org/">Jinja</a>, le moteur de templates du framework web Python <a href="http://www.django-fr.org/">Django</a>. Un <a href="http://www.siteduzero.com/tutoriel-3-329045-developpez-vos-applications-web-avec-django.html">cours</a> est d'ailleurs disponible sur le site.</p><p id="r-442291" data-claire-element-id="442291">Je vous souhaite une agréable lecture !</p><div class="foldable" id="ui-id-1" data-widget="foldable"><h2 id="r-442320" data-claire-element-id="442320" class="foldable__button secondTitle js-foldable-button">Qu'est ce qu'un moteur de templates ?<i class="foldable__icon icon-next"></i></h2><div class="foldable__content"><p id="r-442292" data-claire-element-id="442292">Twig
|
|
n'est pas le seul moteur de templates qui existe, et ce n'est pas non
|
|
plus le meilleur. C'est un moteur parmi tant d'autres. Au même titre que
|
|
Twig, ce cours n'est pas le seul à traiter du sujet. Vous pouvez
|
|
également lire ces tutoriels :</p><ul id="r-442297" data-claire-element-id="442297"><li id="r-442294" data-claire-element-id="442294"><p id="r-442293" data-claire-element-id="442293"><a href="http://www.siteduzero.com/tutoriel-3-31259-utilisation-d-un-moteur-de-templates-talus-tpl.html">Utilisation d'un moteur de templates : Talus' TPL</a></p></li><li id="r-442296" data-claire-element-id="442296"><p id="r-442295" data-claire-element-id="442295"><a href="http://www.siteduzero.com/tutoriel-3-360073-un-moteur-de-template-smarty.html">Un moteur de template : Smarty</a></p></li></ul><h3 id="r-442307" data-claire-element-id="442307">Présentation</h3><p id="r-442298" data-claire-element-id="442298">Je
|
|
vais ici vous expliquer le fonctionnement d'un "moteur de templates".
|
|
Pour cela, je vous propose un exemple : la création d'un blog basique.
|
|
L'organisation des fichiers que je vous propose ici est personnelle,
|
|
c'est normal si pour vous la conception d'un blog est différente. Les
|
|
grandes lignes sont là.</p><p id="r-442299" data-claire-element-id="442299">Pour
|
|
créer votre blog, vous allez d'abord récupérer votre contenu stocké en
|
|
base de données. Vous allez ensuite afficher via une boucle les
|
|
différents articles. Dans certains cas, vous incluez aussi un en-tête et
|
|
un pied de page.</p><pre id="r-442300" data-claire-element-id="442300" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php include 'inc/header.php'; ?>\n\n<?php \n \n $articles = $db->query('SELECT * FROM blog');\n \n while($article = $articles->fetch()) {\n\n\t ?>\n <div class=\"article\">\n\n <div class=\"title\"><?php echo $article['title']; ?></div> \n <div class=\"content\">\n <?php echo $article['content']; ?>\n </div>\n\n </div>\n }\n \n\n<?php include 'inc/footer.php'; ?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_support ace_function">include</span> <span class="ace_string">'inc/header.php'</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_variable">$articles</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_variable">$db</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">query</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'SELECT * FROM blog'</span><span class="ace_paren ace_rparen">)</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_keyword">while</span><span class="ace_paren ace_lparen">(</span><span class="ace_variable">$article</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_variable">$articles</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">fetch</span><span class="ace_paren ace_lparen">(</span><span class="ace_paren ace_rparen">))</span> <span class="ace_paren ace_lparen">{</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_support ace_php_tag">?></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">class</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"article"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">class</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"title"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_support ace_function">echo</span> <span class="ace_variable">$article</span><span class="ace_paren ace_lparen">[</span><span class="ace_string">'title'</span><span class="ace_paren ace_rparen">]</span>; <span class="ace_support ace_php_tag">?></span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml"> </span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">class</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"content"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_support ace_function">echo</span> <span class="ace_variable">$article</span><span class="ace_paren ace_lparen">[</span><span class="ace_string">'content'</span><span class="ace_paren ace_rparen">]</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> }</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_support ace_function">include</span> <span class="ace_string">'inc/footer.php'</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442301" data-claire-element-id="442301">Je n'explique pas ce code. Il est relativement simple.</p><p id="r-442302" data-claire-element-id="442302">Le
|
|
moteur de templates va vous obliger à utiliser deux fichiers (plus si
|
|
vous utilisez le modèle MVC). Vous allez d'une part avoir un fichier PHP
|
|
avec l'obtention du contenu en base de données, des variables, la
|
|
gestion des sessions, etc. et un fichier template qui gérera l'affichage
|
|
de vos pages. Normalement, plus aucun code HTML ne doit apparaître dans
|
|
vos fichiers PHP.</p><p id="r-442303" data-claire-element-id="442303">Voici donc ce que <strong>pourrait</strong> donner notre exemple précédent avec un moteur de templates :</p><pre id="r-442304" data-claire-element-id="442304" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php include 'inc/header.php'; ?>\n\n\n <?php \n\n $articlesQuery = $db->query('SELECT * FROM blog');\n $articles = $articlesQuery->fetchAll();\n\n $template = $twig->loadTemplate('blog.twig');\n echo $template->render(array(\n\t\t 'articles' => $articles,\n\t ));\n ?>\n<?php include 'inc/footer.php'; ?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_support ace_function">include</span> <span class="ace_string">'inc/header.php'</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_variable">$articlesQuery</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_variable">$db</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">query</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'SELECT * FROM blog'</span><span class="ace_paren ace_rparen">)</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_variable">$articles</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_variable">$articlesQuery</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">fetchAll</span><span class="ace_paren ace_lparen">(</span><span class="ace_paren ace_rparen">)</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_variable">$template</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_variable">$twig</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">loadTemplate</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'blog.twig'</span><span class="ace_paren ace_rparen">)</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_support ace_function">echo</span> <span class="ace_variable">$template</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">render</span><span class="ace_paren ace_lparen">(</span><span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_string">'articles'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_variable">$articles</span>,
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_paren ace_rparen">))</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_support ace_php_tag">?></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_support ace_function">include</span> <span class="ace_string">'inc/footer.php'</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><pre id="r-442305" data-claire-element-id="442305" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% for key, article in articles %}\n\t<div class=\"article\">\n\n <div class=\"title\">{{ article.title }}</div> \n <div class=\"content\">\n {{ article.content }}\n </div>\n\n </div>\n{% endfor %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% for key, article in articles %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">class</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"article"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">class</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"title"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">{{ article.title }}</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml"> </span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">class</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"content"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> {{ article.content }}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endfor %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442306" data-claire-element-id="442306">Je n'explique pas ce code pour le moment car vous allez apprendre cette syntaxe dans la suite du cours.</p><h3 id="r-442319" data-claire-element-id="442319">Pourquoi utiliser un moteur de templates ?</h3><p id="r-442308" data-claire-element-id="442308">Depuis
|
|
tout à l'heure je vous parle de Twig et je viens même de vous montrer
|
|
les grandes lignes de son fonctionnement. Mais vous vous demandez
|
|
peut-être pourquoi utiliser un moteur de templates ? Quel(s) avantage(s)
|
|
peut-on avoir à l'utiliser par rapport à du PHP "classique" ?.</p><p id="r-442309" data-claire-element-id="442309">On peut y voir plusieurs avantages notables :</p><ul id="r-442316" data-claire-element-id="442316"><li id="r-442311" data-claire-element-id="442311"><p id="r-442310" data-claire-element-id="442310">Le code est plus clair : on sait où est le code HTML et on ne doit pas chercher après dans le code PHP</p></li><li id="r-442313" data-claire-element-id="442313"><p id="r-442312" data-claire-element-id="442312">Pour
|
|
reprendre la phrase du dessus on peut noter le fait que vous savez quel
|
|
fichier éditer quand vous savez d'où vient l'erreur. De plus pour
|
|
reprendre l'exemple du blog, si un jour vous voulez modifier simplement
|
|
l'affichage des billets, vous savez quelle partie du code éditer et vous
|
|
n'avez pas à chercher.</p></li><li id="r-442315" data-claire-element-id="442315"><p id="r-442314" data-claire-element-id="442314">Si
|
|
vous travaillez avec un graphiste, c'est un réel plus. Les graphistes
|
|
connaissent généralement HTML et CSS et pas toujours PHP. Le graphiste
|
|
s'y retrouve donc beaucoup plus facilement.</p></li></ul><p id="r-442317" data-claire-element-id="442317">Je
|
|
pourrais en citer d'autres mais je pense que ce sont les plus
|
|
importants qui m'ont fait adopter un tel système pour des sites de
|
|
petites et moyennes tailles.</p><p id="r-442318" data-claire-element-id="442318">Si je vous ai convaincu, je vous propose de lire la suite de ce cours pour voir comment mettre en place Twig.</p></div></div><div class="foldable" id="ui-id-2" data-widget="foldable"><h2 id="r-442354" data-claire-element-id="7730194" class="foldable__button secondTitle js-foldable-button">Mise en place<i class="foldable__icon icon-next"></i></h2><div class="foldable__content"><p id="r-442321" data-claire-element-id="442321">Avant
|
|
de mettre en place le moteur sur votre site, il vous faut le
|
|
télécharger. Je vous propose donc de lire la partie qui vous concerne
|
|
pour le faire. Si vous ne savez pas laquelle choisir, lisez la partie
|
|
juste en dessous.</p><h4 id="r-442325" data-claire-element-id="442325">Via une archive</h4><p id="r-442322" data-claire-element-id="442322">Pour télécharger Twig via une archive rien de plus simple, rendez vous sur <a href="http://twig.sensiolabs.org/">le site</a>
|
|
et cliquez sur le lien "Install now". Choisissez ensuite votre archive
|
|
(en tar ou en zip). Si vous ne savez pas trop, je vous conseille de
|
|
prendre tar si vous êtes sur un système (de type) UNIX et zip sur un
|
|
système Windows.</p><p id="r-442323" data-claire-element-id="442323">Vous
|
|
devez maintenant décompresser l'archive et copier les fichiers dans un
|
|
dossier nommé "twig" dans le dossier de votre site. Vous pouvez, si vous
|
|
le souhaitez, l'appeler différemment ; en sachant que dans ce cours je
|
|
pars du principe que vous avez appelé votre dossier contenant ces
|
|
sources "twig".</p><p id="r-442324" data-claire-element-id="442324">Vous pouvez vous rendre à la partie "Mise en place"</p><h4 id="r-442329" data-claire-element-id="442329">Via git</h4><p id="r-442326" data-claire-element-id="442326">Si vous voulez passer par Git, il vous suffit de vous placer dans le répertoire de votre site et de faire :</p><pre id="r-442327" data-claire-element-id="442327"><samp>git clone http://github.com/fabpot/twig</samp></pre><p id="r-442328" data-claire-element-id="442328">Un dossier twig contenant les fichiers sources va être créé. Vous pouvez vous rendre à la partie "Mise en place"</p><h4 id="r-442333" data-claire-element-id="442333">Via Subversion</h4><p id="r-442330" data-claire-element-id="442330">Pour cloner le dépôt SVN, placez-vous dans le répertoire de votre projet et tapez :</p><pre id="r-442331" data-claire-element-id="442331"><samp>svn co http://svn.twig-project.org/trunk/ twig</samp></pre><p id="r-442332" data-claire-element-id="442332">Un dossier twig contenant les fichiers sources va être créé. Vous pouvez vous rendre à la partie "Mise en place"</p><h4 id="r-442353" data-claire-element-id="7730191">Installation via PEAR</h4><p id="r-442334" data-claire-element-id="442334">Pour les fans de PEAR, vous pouvez vous rendre sur <a href="http://pear.twig-project.org/">la page dédiée à PEAR</a>.</p><p id="r-442335" data-claire-element-id="442335"><strong>Note</strong> : à ma connaissance il n'existe pas de dépôt pour Mercurial ou pour CVS.</p><h3 id="r-442352" data-claire-element-id="7730193">Mise en place</h3><p id="r-442336" data-claire-element-id="442336">Si
|
|
vous le souhaitez, vous pouvez supprimer tous les fichiers et dossiers
|
|
sauf le dossier lib et son contenu. Je vous conseille de laisser le
|
|
dossier tel quel et de ne pas changer les fichiers de place.</p><p id="r-442337" data-claire-element-id="442337">Twig
|
|
est un moteur de templates réalisé avec le langage PHP en orienté
|
|
objet. Il va donc falloir créer une instance des classes en question.
|
|
Voici donc le code que vous devez mettre en début de chaque fichier (que
|
|
je vous conseille de charger via include).</p><p id="r-442338" data-claire-element-id="442338">Avant tout, je vous demanderais de créer un dossier "templates" contenant les templates de votre site.</p><pre id="r-442339" data-claire-element-id="7730192" class="code-block"><code data-claire-semantic="php" data-code="{"language":"php","source":"<?php\n require_once __DIR__ . '/vendor/autoload.php';\n \n $loader = new Twig_Loader_Filesystem('templates'); // Dossier contenant les templates\n $twig = new Twig_Environment($loader, array(\n 'cache' => false\n ));"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_support ace_function">require_once</span> <span class="ace_constant ace_language">__DIR__</span> . <span class="ace_string">'/vendor/autoload.php'</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_variable">$loader</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_keyword">new</span> <span class="ace_support ace_class">Twig_Loader_Filesystem</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'templates'</span><span class="ace_paren ace_rparen">)</span>; <span class="ace_comment">// Dossier contenant les templates</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_variable">$twig</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_keyword">new</span> <span class="ace_support ace_class">Twig_Environment</span><span class="ace_paren ace_lparen">(</span><span class="ace_variable">$loader</span>, <span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_string">'cache'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_constant ace_language">false</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_paren ace_rparen">))</span>;
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442340" data-claire-element-id="442340">Le
|
|
code ici est assez simple. On inclut le fichier Autoloader.php.
|
|
Ensuite, on indique le fichier où se trouvent nos templates. Pour finir,
|
|
on demande à Twig d'aller chercher les templates dans le dossier
|
|
indiqué précédemment et on lui indique quelques options pour plus de
|
|
"souplesse" pendant le développement de notre projet.</p><p id="r-442341" data-claire-element-id="442341">D'ailleurs, ici je n'ai mis que le cache mais il y a d'autres options possibles :</p><ul id="r-442348" data-claire-element-id="442348"><li id="r-442343" data-claire-element-id="442343"><p id="r-442342" data-claire-element-id="442342">cache
|
|
: prend en argument le dossier où vous stockez les templates en cache
|
|
ou bien false pour ne pas s'en servir. Je me permet de vous donner un
|
|
conseil : en production, le cache peut être une bonne chose mais en
|
|
développement le mieux est de le mettre à false.</p></li><li id="r-442345" data-claire-element-id="442345"><p id="r-442344" data-claire-element-id="442344">charset : par défaut à utf-8, définit l'encodage de votre projet.</p></li><li id="r-442347" data-claire-element-id="442347"><p id="r-442346" data-claire-element-id="442346">autoescape : échappe automatiquement les variables. Le code HTML contenu dedans n'est donc pas interprété. Par défaut à true.</p></li></ul><p id="r-442349" data-claire-element-id="442349">Pour plus d'options, je vous renvoie vers <a href="http://twig.sensiolabs.org/doc/api.html#environment-options">cette section</a> de la documentation.</p><p id="r-442350" data-claire-element-id="442350">Sachez
|
|
aussi que si vous le souhaitez, vous pouvez mettre plusieurs dossiers
|
|
contenants les templates. En sachant que Twig va d'abord regarder dans
|
|
le premier, puis le suivant et ainsi de suite. Je vous montre ici un
|
|
code demandant à Twig d'aller chercher dans deux dossiers différents,
|
|
mais vous pouvez en mettre plus :</p><pre id="r-442351" data-claire-element-id="442351" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php\n$loader = new Twig_Loader_Filesystem(array('templates', 'views'));"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_variable">$loader</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_keyword">new</span> <span class="ace_support ace_class">Twig_Loader_Filesystem</span><span class="ace_paren ace_lparen">(</span><span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'templates'</span>, <span class="ace_string">'views'</span><span class="ace_paren ace_rparen">))</span>;
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre></div></div><div class="foldable" id="ui-id-3" data-widget="foldable"><h2 id="r-442369" data-claire-element-id="442369" class="foldable__button secondTitle js-foldable-button">Notre premier template<i class="foldable__icon icon-next"></i></h2><div class="foldable__content"><p id="r-442355" data-claire-element-id="442355">Je
|
|
vous propose maintenant de voir la création de notre premier template.
|
|
Avant toutes choses, créez un fichier appelé index.twig dans le dossier
|
|
dans lequel vous stockez vos templates.</p><aside id="r-442357" data-claire-element-id="442357" data-claire-semantic="information"><p id="r-442356" data-claire-element-id="442356">Ici
|
|
j'ai mis "twig" comme extension mais en fait vous pouvez mettre ce que
|
|
vous voulez. La plupart du temps, il s'agit de html ou tpl mais vous
|
|
pouvez mettre txt, etc.</p></aside><p id="r-442358" data-claire-element-id="442358">Ouvrez ce fichier avec votre éditeur favori et mettez-y le code suivant :</p><pre id="r-442359" data-claire-element-id="442359" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"Vous venez de créer votre premier template avec {{ moteur_name }} !"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">Vous venez de créer votre premier template avec {{ moteur_name }} !</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442360" data-claire-element-id="442360">Nous
|
|
reviendrons juste après sur cette portion de code. Ensuite, créez un
|
|
fichier à la racine de votre site appelé index.php et mettez-y le code
|
|
suivant (n'oubliez pas d'y inclure le fichier contenant le code qui
|
|
instancie le moteur).</p><pre id="r-442361" data-claire-element-id="442361" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php\n $template = $twig->loadTemplate('index.twig');\n echo $template->render(array(\n\t'moteur_name' => 'Twig'\n )); \n?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_variable">$template</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_variable">$twig</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">loadTemplate</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'index.twig'</span><span class="ace_paren ace_rparen">)</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_support ace_function">echo</span> <span class="ace_variable">$template</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">render</span><span class="ace_paren ace_lparen">(</span><span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_string">'moteur_name'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_string">'Twig'</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_paren ace_rparen">))</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442362" data-claire-element-id="442362">Vous pouvez aussi écrire ce qu'il y a au dessus de cette façon :</p><pre id="r-442363" data-claire-element-id="442363" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php\n echo $twig->render('index.twig', array(\n 'moteur_name' => 'Twig'\n ));\n?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_support ace_function">echo</span> <span class="ace_variable">$twig</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">render</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'index.twig'</span>, <span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_string">'moteur_name'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_string">'Twig'</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_paren ace_rparen">))</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442364" data-claire-element-id="442364">Il n'y a pas énormément de différences mais cette portion de code est plus courte que la précédente.</p><p id="r-442365" data-claire-element-id="442365">Quand
|
|
vous ouvrez le fichier, vous voyez "Vous venez de créer votre premier
|
|
template avec Twig". En fait, dans le template le {{ moteur_name }} est
|
|
le nom de la variable que vous avez passé à Twig lors de l'affichage du
|
|
template. Il s'agit de cette portion de code.</p><pre id="r-442366" data-claire-element-id="442366" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php\necho $template->render(array(\n\t'moteur_name' => 'Twig'\n )); \n?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_function">echo</span> <span class="ace_variable">$template</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">render</span><span class="ace_paren ace_lparen">(</span><span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_string">'moteur_name'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_string">'Twig'</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_paren ace_rparen">))</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442367" data-claire-element-id="442367">Dans cet exemple, j'ai mis du texte entre guillemets, mais rien ne vous empêche de mettre des variables, des tableaux, etc.</p><p id="r-442368" data-claire-element-id="442368">Pour
|
|
l'instant c'est plus que basique. Heureusement, Twig nous permet de
|
|
faire bien plus de choses que ça. Je vous propose donc de voir les
|
|
possibilités que nous offre Twig dans la partie suivante.</p></div></div><div class="foldable" id="ui-id-4" data-widget="foldable"><h2 id="r-442432" data-claire-element-id="442432" class="foldable__button secondTitle js-foldable-button">Syntaxe de base<i class="foldable__icon icon-next"></i></h2><div class="foldable__content"><p id="r-442370" data-claire-element-id="442370">Cette
|
|
partie est certainement la plus importante de ce cours. Vous allez
|
|
apprendre à remplir vos templates avec la syntaxe proposée par le
|
|
moteur. Vous pourrez donc faire des opérations complexes comme les
|
|
conditions, les boucles, etc.</p><h3 id="r-442378" data-claire-element-id="442378">Affichage des variables et tableaux</h3><p id="r-442371" data-claire-element-id="442371">Lors
|
|
de l'affichage d'un template (vu un petit peu plus haut), vous passez
|
|
en argument des variables, des tableaux, etc. Voyons un peu l'affichage
|
|
côté template.</p><pre id="r-442372" data-claire-element-id="442372" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"Votre nom est : {{ name }}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">Votre nom est : {{ name }}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442373" data-claire-element-id="442373">Pour afficher une variable, il faut la placer entre accolades.</p><aside id="r-442375" data-claire-element-id="442375" data-claire-semantic="information"><p id="r-442374" data-claire-element-id="442374">Note
|
|
: si vous comptez utiliser Twig par la suite pour vos projets, je vous
|
|
conseille de mettre un raccourci dans votre éditeur pour les doubles
|
|
accolades et le tag {% ... %} que nous verrons après.</p></aside><p id="r-442376" data-claire-element-id="442376">Supposons que vous voulez passer un tableau à votre template, il vous suffit de faire :</p><pre id="r-442377" data-claire-element-id="442377" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{{ array['key'] }} \n{{ array.key }} <!-- fait exactement la même chose qu'au dessus -->"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{{ array['key'] }} </span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{{ array.key }} </span><span class="ace_comment ace_xml"><!-- fait exactement la même chose qu'au dessus --></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h3 id="r-442399" data-claire-element-id="442399">Les filtres</h3><p id="r-442379" data-claire-element-id="442379">Les
|
|
filtres sont un concept que vous ne connaissez peut-être pas. En fait,
|
|
un filtre agit comme une fonction. Il sont déjà définis mais vous pouvez
|
|
créer les vôtres si vous le souhaitez. Pour appliquer un filtre à une
|
|
variable, il faut séparer le nom de la variable et celui du filtre par
|
|
un <em>pipe</em> ( | ). Je vous propose ici de voir quelques filtres utiles.</p><ul id="r-442390" data-claire-element-id="442390"><li id="r-442381" data-claire-element-id="442381"><p id="r-442380" data-claire-element-id="442380">upper : met la chaîne de caractères qui le concerne en majuscule ;</p></li><li id="r-442383" data-claire-element-id="442383"><p id="r-442382" data-claire-element-id="442382">lower : fait exactement l'inverse d'upper et va mettre toutes les lettres en minuscule ;</p></li><li id="r-442385" data-claire-element-id="442385"><p id="r-442384" data-claire-element-id="442384">title : met la première lettre de chaque mot de la chaîne de caractère en majuscule. Comme un titre de noblesse ;</p></li><li id="r-442387" data-claire-element-id="442387"><p id="r-442386" data-claire-element-id="442386">length : retourne le nombre de caractères dont la chaîne se compose ;</p></li><li id="r-442389" data-claire-element-id="442389"><p id="r-442388" data-claire-element-id="442388">escape
|
|
& e : pour échapper du code HTML vous pouvez utiliser escape ou e.
|
|
Tous deux font la même chose mais l'un est plus court que l'autre.</p></li></ul><p id="r-442391" data-claire-element-id="442391">Il y a encore beaucoup d'autres filtres proposés par Twig, en voici <a href="http://twig.sensiolabs.org/doc/filters/index.html">la liste</a>.</p><h4 id="r-442398" data-claire-element-id="442398">Les filtres sur les blocs</h4><p id="r-442392" data-claire-element-id="442392">Si
|
|
vous le souhaitez, plutôt que d'appliquer un filtre à chacune de vos
|
|
variables, si vous comptez le faire sur beaucoup de variables ou une
|
|
partie de votre site en particulier, je vous conseille de passer par
|
|
cette méthode :</p><pre id="r-442393" data-claire-element-id="442393" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% filter upper %}\n je vais être écrit en majuscule\n {{ moi_aussi }}\n{% endfilter %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% filter upper %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> je vais être écrit en majuscule</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> {{ moi_aussi }}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endfilter %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442394" data-claire-element-id="442394">Vous pouvez aussi chaîner les filtres en en mettant plusieurs à la suite :</p><pre id="r-442395" data-claire-element-id="442395" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% filter upper|escape %}\n je vais être écrit en majuscule <em>et échappé</em>\n{% endfilter %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% filter upper|escape %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> je vais être écrit en majuscule </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">em</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">et échappé</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">em</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endfilter %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442396" data-claire-element-id="442396">Concernant
|
|
le filtre escape, un bloc spécial a été prévu à cet effet. Ainsi, si
|
|
par exemple vous avez mis lors de l'initialisation de Twig autoespace à
|
|
true, vous pouvez faire ceci :</p><pre id="r-442397" data-claire-element-id="442397" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% autoescape false %}\n<strong>Je vais être affiché en gras</strong>\n{% endautoescape %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% autoescape false %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">strong</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">Je vais être affiché en gras</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">strong</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endautoescape %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h3 id="r-442402" data-claire-element-id="442402">Les commentaires</h3><p id="r-442400" data-claire-element-id="442400">Ici,
|
|
c'est juste un petit plus. Ça n'est pas vraiment utile (c'est moins
|
|
intuitif, dira-t-on) si vous n'avez pas l'habitude de les utiliser.
|
|
C'est un plus pour ceux qui utilisent Django par exemple :</p><pre id="r-442401" data-claire-element-id="442401" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{# Je suis un commentaire #}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{# Je suis un commentaire #}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h3 id="r-442417" data-claire-element-id="442417">Les conditions</h3><p id="r-442403" data-claire-element-id="442403">Pour faire des conditions, rien de plus simple :</p><pre id="r-442404" data-claire-element-id="442404" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% if online > 1 %}\n Il y a {{ online }} membres en ligne\n{% elseif online == 1 %}\n Il n'y a qu'un seul utilisateur en ligne (Vous !)\n{% else %}\n Il n'y a aucun utilisateur en ligne. Cette phrase ne sera, en principe, jamais lue sauf par toi. Ô grand développeur !.\n{% endif %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% if online > 1 %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Il y a {{ online }} membres en ligne</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% elseif online == 1 %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Il n'y a qu'un seul utilisateur en ligne (Vous !)</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% else %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Il n'y a aucun utilisateur en ligne. Cette phrase ne sera, en principe, jamais lue sauf par toi. Ô grand développeur !.</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endif %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h4 id="r-442406" data-claire-element-id="442406">Les tests utiles (built-in tests)</h4><p id="r-442405" data-claire-element-id="442405">Les
|
|
tests utiles vous permettent de réaliser des conditions plus "poussées"
|
|
et plus intuitives. Par exemple, avec, vous pouvez savoir si une
|
|
variable est divisible par 10 ou si une variable est définie.</p><h4 id="r-442409" data-claire-element-id="442409">defined</h4><p id="r-442407" data-claire-element-id="442407">Celui-ci vous permet de savoir si une variable est définie ou pas. Il renverra true si c'est le cas et false si ça ne l'est pas.</p><pre id="r-442408" data-claire-element-id="442408" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% if session.pseudo is defined %}\n Votre pseudo est {{ session.pseudo}} .\n{% endif %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% if session.pseudo is defined %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Votre pseudo est {{ session.pseudo}} .</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endif %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h4 id="r-442412" data-claire-element-id="442412">divisibleby</h4><p id="r-442410" data-claire-element-id="442410">Une test très intéressant est celui de savoir si votre variable est divisible par un certain nombre.</p><pre id="r-442411" data-claire-element-id="442411" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% if equipe.volley is divisibleby(6) %}\n L'équipe sera divisé en 2 équipes de 6.\n{% endif %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% if equipe.volley is divisibleby(6) %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> L'équipe sera divisé en 2 équipes de 6.</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endif %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h4 id="r-442416" data-claire-element-id="442416">empty</h4><p id="r-442413" data-claire-element-id="442413">Verifie si une variable est vide ou pas.</p><pre id="r-442414" data-claire-element-id="442414" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% if equipe.volley is empty %}\n Le match est annulé.\n{% endif %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% if equipe.volley is empty %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Le match est annulé.</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endif %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442415" data-claire-element-id="442415">Il y a encore beaucoup d'autres test-utiles mais je pense que vous avez compris le principe. Je vous renvoie donc vers <a href="http://twig.sensiolabs.org/doc/tests/index.html">la liste</a> de ces tests.</p><h3 id="r-442426" data-claire-element-id="442426">La boucle for</h3><p id="r-442418" data-claire-element-id="442418">Ici rien de bien compliqué. Je vais surtout vous donner des exemples car il n'y a pas grand-choses à dire sur cette boucle.</p><pre id="r-442419" data-claire-element-id="442419" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% for i in 0..50 %}\n Ceci est la ligne {{ i }}\n{% enfor %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% for i in 0..50 %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Ceci est la ligne {{ i }}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% enfor %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442420" data-claire-element-id="442420">En sachant que ce que je viens de vous montrer marche aussi avec des lettres :</p><pre id="r-442421" data-claire-element-id="442421" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% for lettre in 'a'..'z' %}\n La lettre {{ letter }} est lettre numéro {{ loop.index }} de l'alphabet.\n \n{% endfor %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% for lettre in 'a'..'z' %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> La lettre {{ letter }} est lettre numéro {{ loop.index }} de l'alphabet.</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endfor %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442422" data-claire-element-id="442422">Si
|
|
vous vous demandez d'où je sors le loop.index, il contient en fait le
|
|
numéro de tour de boucle actuel. Vous pouvez voir d'autres variables de
|
|
ce type <a href="http://twig.sensiolabs.org/doc/tags/for.html">ici</a> (en scrollant un peu selon la taille de votre écran ; il s'agit du tableau).<br> Vous pouvez également parcourir vos tableaux avec :</p><pre id="r-442423" data-claire-element-id="442423" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% for joueur in club %}\n Le joueur {{ joueur.nom }} joue dans l'équipe {{ joueur.equipe }}\n{% endfor %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% for joueur in club %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Le joueur {{ joueur.nom }} joue dans l'équipe {{ joueur.equipe }}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endfor %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442424" data-claire-element-id="442424">Depuis
|
|
la version 1.2 de Twig, il est possible de lancer une boucle selon une
|
|
condition dans le même "bloc". Ce n'est pas très clair alors je vous
|
|
propose un exemple.</p><pre id="r-442425" data-claire-element-id="442425" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% for joueur in club if equipe is not empty %}\n Le joueur {{ joueur.nom }} joue dans l'équipe {{ joueur.equipe }}\n{% endfor %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% for joueur in club if equipe is not empty %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Le joueur {{ joueur.nom }} joue dans l'équipe {{ joueur.equipe }}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endfor %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h3 id="r-442431" data-claire-element-id="442431">Définir des variables</h3><p id="r-442427" data-claire-element-id="442427">J'ai
|
|
décidé de mettre cette partie en dernier pour une raison bien
|
|
particulière. La logique d'un moteur de template veut qu'on sépare les
|
|
variables et les fonctions php de l'affichage du contenu. Déclarer des
|
|
variables dans un template casse la logique du système. Je vous le
|
|
montre quand même car c'est quand même vous qui allez entretenir le code
|
|
que vous écrivez par la suite (en principe) et vous faîtes comme vous
|
|
le souhaitez.</p><pre id="r-442428" data-claire-element-id="442428" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% set var = \"val\" %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% set var = "val" %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442429" data-claire-element-id="442429">Vous
|
|
pouvez aussi définir des variables comme en Javascript. C'est à dire en
|
|
mettant une seule fois "set" et en mettant à la suite les différentes
|
|
variables séparées par des virgules :</p><pre id="r-442430" data-claire-element-id="442430" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% set mascotte, os = 'beastie', 'bsd' %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% set mascotte, os = 'beastie', 'bsd' %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre></div></div><div class="foldable" id="ui-id-5" data-widget="foldable"><h2 id="r-442457" data-claire-element-id="442457" class="foldable__button secondTitle js-foldable-button">Quelques ajouts pratiques<i class="foldable__icon icon-next"></i></h2><div class="foldable__content"><p id="r-442433" data-claire-element-id="442433">Voici quelques fonctions, pas indispensables, mais qui peuvent se révéler utiles.</p><h3 id="r-442444" data-claire-element-id="442444">Les includes</h3><p id="r-442434" data-claire-element-id="442434">Vous pouvez aussi inclure des templates comme avec la fonction include de PHP. Pas besoin de vous écrire un roman :</p><pre id="r-442435" data-claire-element-id="442435" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% include 'header.twig' %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% include 'header.twig' %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442436" data-claire-element-id="442436">Une chose que j'ai vraiment adorée c'est de pouvoir inclure des pages en leur restreignant l'accès à certaines variables.</p><pre id="r-442437" data-claire-element-id="442437" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% include 'fichier.twig' with {'var': 'val'} only %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% include 'fichier.twig' with {'var': 'val'} only %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442438" data-claire-element-id="442438">Ici,
|
|
la page n'aura accès qu'à la variable var. Le only lui empêche
|
|
d'accéder aux autres. Vous pouvez bien évidemment enlever le only pour
|
|
que la page accède aux autres variables.</p><p id="r-442439" data-claire-element-id="442439">Une chose que j'ai aussi beaucoup aimée c'est la possibilité d'inclure des pages selon une condition. Par exemple :</p><pre id="r-442440" data-claire-element-id="442440" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% include online ? 'options.twig' : 'connexion.twig' %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% include online ? 'options.twig' : 'connexion.twig' %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442441" data-claire-element-id="442441">Un
|
|
dernier point sur les include est le fait que vous pouvez inclure un
|
|
template, lui passer des variables ou lui restreindre l'accès à
|
|
certaines et indiquer à Twig que si le template est inexistant, aucune
|
|
erreur ne sera renvoyée.</p><pre id="r-442442" data-claire-element-id="442442" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% include \"sidebar.html\" ignore missing %}\n{% include \"sidebar.html\" ignore missing with {'foo': 'bar} %}\n{% include \"sidebar.html\" ignore missing only %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% include "sidebar.html" ignore missing %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% include "sidebar.html" ignore missing with {'foo': 'bar} %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% include "sidebar.html" ignore missing only %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442443" data-claire-element-id="442443">Cet exemple est tiré de la documentation.</p><h3 id="r-442451" data-claire-element-id="442451">Les imports</h3><p id="r-442445" data-claire-element-id="442445">On passe maintenant à une fonctionnalité que j'apprécie énormément : les imports.</p><p id="r-442446" data-claire-element-id="442446">Twig
|
|
vous propose de créer un système équivalent aux helpers. Je vous copie
|
|
le code de la documentation que je trouve tout simplement génial !<br> Supposons que cette page s'appelle forms.html :</p><pre id="r-442447" data-claire-element-id="442447" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% macro input(name, value, type, size) %}\n <input type=\"{{ type|default('text') }}\" name=\"{{ name }}\" value=\"{{ value|e }}\" size=\"{{ size|default(20) }}\" />\n{% endmacro %}\n\n{% macro textarea(name, value, rows) %}\n <textarea name=\"{{ name }}\" rows=\"{{ rows|default(10) }}\" cols=\"{{ cols|default(40) }}\">{{ value|e }}</textarea>\n{% endmacro %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% macro input(name, value, type, size) %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_form ace_tag-name ace_xml">input</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">type</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"{{ type|default('text') }}"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">name</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"{{ name }}"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">value</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"{{ value|e }}"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">size</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"{{ size|default(20) }}"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">/></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endmacro %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% macro textarea(name, value, rows) %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_form ace_tag-name ace_xml">textarea</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">name</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"{{ name }}"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">rows</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"{{ rows|default(10) }}"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">cols</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"{{ cols|default(40) }}"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">{{ value|e }}</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_form ace_tag-name ace_xml">textarea</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endmacro %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442448" data-claire-element-id="442448">Et maintenant dans votre template, mettez le code suivant :</p><pre id="r-442449" data-claire-element-id="442449" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% import 'forms.html' as forms %}\n\n<dl>\n <dt>Username</dt>\n <dd>{{ forms.input('username') }}</dd>\n <dt>Password</dt>\n <dd>{{ forms.input('password', none, 'password') }}</dd>\n</dl>\n<p>{{ forms.textarea('comment') }}</p>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% import 'forms.html' as forms %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dl</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dt</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">Username</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dt</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dd</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">{{ forms.input('username') }}</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dd</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dt</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">Password</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dt</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dd</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">{{ forms.input('password', none, 'password') }}</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dd</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">dl</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">p</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">{{ forms.textarea('comment') }}</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">p</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442450" data-claire-element-id="442450">Les
|
|
formulaires sont un aspect récurrent et assez prise de tête quelques
|
|
fois. Cette fonctionnalité permet un réel gain de temps !</p><h3 id="r-442456" data-claire-element-id="442456">Héritage</h3><p id="r-442452" data-claire-element-id="442452">Une
|
|
autre fonctionnalité qui m'a beaucoup plu est la possibilité d'héritage
|
|
entre templates. Dans la plupart des cas, vous avez une charte définie
|
|
pour votre site et à part le contenu, peu de choses changent dans la
|
|
présentation de votre page. Avec Twig, vous pouvez définir un template
|
|
avec votre header, votre footer (ce n'est qu'un exemple) et faire un
|
|
héritage entre les deux templates (celui qui affiche le contenu et celui
|
|
contenant le header et le footer) pour que vous n'ayez qu'à modifier un
|
|
seul fichier si vous voulez changer la structure de votre site. Je vous
|
|
prends encore un exemple de la documentation. En premier le template
|
|
parent et en second le template qui hérite du premier (l'enfant).</p><pre id="r-442453" data-claire-element-id="442453" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n<html lang=\"en\">\n<head>\n {% block head %}\n <link rel=\"stylesheet\" href=\"style.css\" />\n <title>{% block title %}{% endblock %} - My Webpage</title>\n {% endblock %}\n</head>\n<body>\n <div id=\"content\">{% block content %}{% endblock %}</div>\n <div id=\"footer\">\n {% block footer %}\n &copy; Copyright 2009 by <a href=\"http://domain.invalid/\">you</a>.\n {% endblock %}\n </div>\n</body>\n</html>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_xml-pe ace_doctype ace_xml"><!</span><span class="ace_xml-pe ace_doctype ace_xml">DOCTYPE</span><span class="ace_text ace_whitespace ace_xml"> </span><span class="ace_xml-pe ace_xml">HTML</span><span class="ace_text ace_whitespace ace_xml"> </span><span class="ace_xml-pe ace_xml">PUBLIC</span><span class="ace_text ace_whitespace ace_xml"> </span><span class="ace_string ace_xml">"-//W3C//DTD HTML 4.01//EN"</span><span class="ace_xml-pe ace_doctype ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">html</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">lang</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"en"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">head</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> {% block head %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">link</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">rel</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"stylesheet"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">href</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"style.css"</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">/></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">title</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">{% block title %}{% endblock %} - My Webpage</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">title</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> {% endblock %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">head</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">body</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">id</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"content"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">{% block content %}{% endblock %}</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">id</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"footer"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> {% block footer %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_text ace_xml"> </span><span class="ace_constant ace_language ace_escape ace_reference ace_xml">&copy;</span><span class="ace_text ace_xml"> Copyright 2009 by </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_anchor ace_tag-name ace_xml">a</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">href</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"http://domain.invalid/"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">you</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_anchor ace_tag-name ace_xml">a</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">.</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> {% endblock %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">div</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">body</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">html</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><pre id="r-442454" data-claire-element-id="442454" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"{% extends \"base.html\" %}\n\n{% block title %}Index{% endblock %}\n{% block head %}\n {{ parent() }}\n <style type=\"text/css\">\n .important { color: #336699; }\n </style>\n{% endblock %}\n{% block content %}\n <h1>Index</h1>\n <p class=\"important\">\n Welcome on my awesome homepage.\n </p>\n{% endblock %}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% extends "base.html" %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% block title %}Index{% endblock %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% block head %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> {{ parent() }}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_style ace_tag-name ace_xml">style</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">type</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"text/css"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_variable">.important</span> <span class="ace_paren ace_lparen">{</span> <span class="ace_support ace_type">color</span>: <span class="ace_constant ace_numeric">#336699</span>; <span class="ace_paren ace_rparen">}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_style ace_tag-name ace_xml">style</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endblock %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% block content %}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">h1</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span><span class="ace_text ace_xml">Index</span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">h1</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">p</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_entity ace_other ace_attribute-name ace_xml">class</span><span class="ace_keyword ace_operator ace_attribute-equals ace_xml">=</span><span class="ace_string ace_attribute-value ace_xml">"important"</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> Welcome on my awesome homepage.</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_end-tag-open ace_xml"></</span><span class="ace_meta ace_tag ace_tag-name ace_xml">p</span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{% endblock %}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442455" data-claire-element-id="442455">Dans
|
|
cet exemple, le template parent s'appelle base.html. Un petit point
|
|
dans le template enfant. Dans le block head, il y a un {{ parent() }}.
|
|
Cette fonction signifie que le bloc n'est pas nettoyé et le contenu du
|
|
bloc head sera celui présent dans le template parent et le template
|
|
enfant. Pratique non ?</p></div></div><div class="foldable" id="ui-id-6" data-widget="foldable"><h2 id="r-442494" data-claire-element-id="442494" class="foldable__button secondTitle js-foldable-button">Fonctionnalités côté PHP<i class="foldable__icon icon-next"></i></h2><div class="foldable__content"><p id="r-442458" data-claire-element-id="442458">Pour
|
|
l'instant je vous ai montré des fonctionnalités en majorité valables
|
|
pour les templates. Je vous propose ici de voir certains points
|
|
intéressants côté PHP.</p><h3 id="r-442464" data-claire-element-id="442464">Modifier les tags</h3><p id="r-442459" data-claire-element-id="442459">Par
|
|
défaut, Twig utilise la syntaxe des templates jinja. Pour afficher une
|
|
variable il faut faire {{ variable }} et pour des instructions comme la
|
|
boucle for, ou les conditions il faut faire {% if confition %}. Twig
|
|
vous permet de modifier ces tags. Vous pouvez par exemple mettre les
|
|
tags erb (moteur de template Ruby présent dans <a href="http://rubyonrails.org/">Ruby on Rails</a> et <a href="http://www.sinatrarb.com/">Sinatra</a> pour ne citer qu'eux) :</p><pre id="r-442460" data-claire-element-id="442460" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php\n$syntaxe = new Twig_Lexer($twig, array(\n 'tag_comment' => array('#', '#'),\n 'tag_block' => array('<%', '%>'),\n 'tag_variable' => array('<%=', '%>')\n));"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_variable">$syntaxe</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_keyword">new</span> <span class="ace_support ace_class">Twig_Lexer</span><span class="ace_paren ace_lparen">(</span><span class="ace_variable">$twig</span>, <span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_string">'tag_comment'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'#'</span>, <span class="ace_string">'#'</span><span class="ace_paren ace_rparen">)</span>,
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_string">'tag_block'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'<%'</span>, <span class="ace_string">'%>'</span><span class="ace_paren ace_rparen">)</span>,
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_string">'tag_variable'</span> <span class="ace_keyword ace_operator">=></span> <span class="ace_keyword">array</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'<%='</span>, <span class="ace_string">'%>'</span><span class="ace_paren ace_rparen">)</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_paren ace_rparen">))</span>;
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442461" data-claire-element-id="442461">Ensuite, il faut indiquer au moteur que vous voulez modifier la syntaxe dans vos templates.</p><pre id="r-442462" data-claire-element-id="442462" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php $twig->setLexer($syntaxe); ?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_variable">$twig</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">setLexer</span><span class="ace_paren ace_lparen">(</span><span class="ace_variable">$syntaxe</span><span class="ace_paren ace_rparen">)</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442463" data-claire-element-id="442463">La
|
|
variable $twig représente l'instance de la classe Twig_Environnement().
|
|
Si votre instance de la classe s'appelle différemment, changez en
|
|
conséquence.</p><h3 id="r-442493" data-claire-element-id="442493">Étendre Twig</h3><p id="r-442465" data-claire-element-id="442465">Les
|
|
personnes utilisant des moteurs de templates sont nombreuses. Mais tout
|
|
le monde ne l'utilise pas pour des projets de même taille. Twig peut
|
|
donc être "étendu", c'est-à-dire qu'on peut lui rajouter des
|
|
fonctionnalités très simplement grâce à des méthodes qui font tout le
|
|
travail à notre place. Ça nous évite de toucher au code source pour
|
|
ajouter un simple filtre par exemple.</p><p id="r-442466" data-claire-element-id="442466">Je vous propose ici de voir comment ajouter vos propres filtres et objets.</p><h4 id="r-442474" data-claire-element-id="442474">Ajouter un objet "global"</h4><p id="r-442467" data-claire-element-id="442467">Un
|
|
objet global, avec Twig, est un objet accessible depuis n'importe quel
|
|
template. La documentation montre, par exemple, comment rajouter un
|
|
objet "text" ayant une méthode lipsum. Je vous propose ici de voir
|
|
comment intégrer cet objet.</p><p id="r-442468" data-claire-element-id="442468">Tout d'abord, il faut créer un fichier contenant une nouvelle classe :</p><pre id="r-442469" data-claire-element-id="442469" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php\nclass Text {\n\n public $lipsum_text = 'Lorem ipsum dolor sit amet';\n\n\n /**\n * @param none\n * @return lipsum_text\n */\n\n public function lipsum() {\n \n return $this->lipsum_text;\n \n }\n}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_keyword">class</span> <span class="ace_identifier">Text</span> <span class="ace_paren ace_lparen">{</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_keyword">public</span> <span class="ace_variable">$lipsum_text</span> <span class="ace_keyword ace_operator">=</span> <span class="ace_string">'Lorem ipsum dolor sit amet'</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_comment ace_doc">/**</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_comment ace_doc"> * </span><span class="ace_comment ace_doc ace_tag">@param</span><span class="ace_comment ace_doc"> none</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_comment ace_doc"> * </span><span class="ace_comment ace_doc ace_tag">@return</span><span class="ace_comment ace_doc"> lipsum_text</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span><span class="ace_comment ace_doc"> */</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_keyword">public</span> <span class="ace_keyword">function</span> <span class="ace_identifier">lipsum</span><span class="ace_paren ace_lparen">(</span><span class="ace_paren ace_rparen">)</span> <span class="ace_paren ace_lparen">{</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_indent-guide"> </span> <span class="ace_support ace_function">return</span> <span class="ace_variable">$this</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">lipsum_text</span>;
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span> <span class="ace_paren ace_rparen">}</span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_paren ace_rparen">}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442470" data-claire-element-id="442470">Ensuite,
|
|
indiquez à Twig que vous voulez ajouter votre objet dans les templates
|
|
(il faut que le fichier contenant la classe soit inclus dans le fichier
|
|
contenant cette instruction).</p><pre id="r-442471" data-claire-element-id="442471" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php $twig->addGlobal('text', new Text());"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_variable">$twig</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">addGlobal</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'text'</span>, <span class="ace_keyword">new</span> <span class="ace_support ace_class">Text</span><span class="ace_paren ace_lparen">(</span><span class="ace_paren ace_rparen">))</span>;
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442472" data-claire-element-id="442472">Le
|
|
premier argument représente le nom de votre objet dans les templates et
|
|
le second est une instance de la classe que vous avez précédemment
|
|
créée. Et maintenant dans vos templates vous pouvez faire :</p><pre id="r-442473" data-claire-element-id="442473" class="code-block"><code data-claire-semantic="html" data-code="{"language":"html","source":"Voici un texte : <br />\n{{ text.lipsum() }}"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">Voici un texte : </span><span class="ace_meta ace_tag ace_punctuation ace_tag-open ace_xml"><</span><span class="ace_meta ace_tag ace_tag-name ace_xml">br</span><span class="ace_text ace_tag-whitespace ace_xml"> </span><span class="ace_meta ace_tag ace_punctuation ace_tag-close ace_xml">/></span>
|
|
</div><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_text ace_xml">{{ text.lipsum() }}</span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><h4 id="r-442492" data-claire-element-id="442492">Ajouter des filtres</h4><p id="r-442475" data-claire-element-id="442475">Maintenant
|
|
que vous avez compris le principe pour les objets, les filtres vont
|
|
aller tout seuls. C'est la même marche à suivre que précédemment. Ici
|
|
vous créez une fonction (pas forcément une méthode de classe) et vous
|
|
demandez à Twig de l'ajouter au parseur. Ici je vais vous montrer
|
|
comment ajouter le filtre lower (même s'il existe déjà, c'est juste pour
|
|
l'exemple).</p><pre id="r-442476" data-claire-element-id="442476" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php $twig->addFilter('lower', new Twig_Filter_Function('strtolower')); ?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_variable">$twig</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">addFilter</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'lower'</span>, <span class="ace_keyword">new</span> <span class="ace_support ace_class">Twig_Filter_Function</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'strtolower'</span><span class="ace_paren ace_rparen">))</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442477" data-claire-element-id="442477">Ici,
|
|
je n'ai pas eu à créer la fonction car elle est native mais vous pouvez
|
|
mettre les vôtres sans aucun problème. Vous pouvez aussi appeler la
|
|
méthode d'une classe mais <strong>attention</strong>, il faut que la méthode soit statique. Par exemple :</p><pre id="r-442478" data-claire-element-id="442478" class="code-block"><code data-claire-semantic="html+php" data-code="{"language":"html+php","source":"<?php $twig->addFilter('monfiltre', new Twig_Filter_Function('MaClasse::MaMethode')); ?>"}" class="ace" data-widget="codeBlock"><div class="ace-monokai"><div class="ace_static_highlight ace_show_gutter" style="counter-reset:ace_line 0"><div class="ace_line"><span class="ace_gutter ace_gutter-cell" unselectable="on"></span><span class="ace_support ace_php_tag"><?php</span> <span class="ace_variable">$twig</span><span class="ace_keyword ace_operator">-></span><span class="ace_identifier">addFilter</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'monfiltre'</span>, <span class="ace_keyword">new</span> <span class="ace_support ace_class">Twig_Filter_Function</span><span class="ace_paren ace_lparen">(</span><span class="ace_string">'MaClasse::MaMethode'</span><span class="ace_paren ace_rparen">))</span>; <span class="ace_support ace_php_tag">?></span>
|
|
</div></div></div></code><textarea class="code-block--raw-code"></textarea></pre><p id="r-442479" data-claire-element-id="442479">Ce
|
|
cours s'achève là. Je vous invite à poster un commentaire si vous avez
|
|
des suggestions, des points que vous ne trouvez pas clairs, etc. Pour ce
|
|
qui est de l'aide, je vous renvoie vers le <a href="http://www.siteduzero.com/forum-81-123-php.html">forum php</a>.</p><p id="r-442480" data-claire-element-id="442480">Avant de vous quitter, je peux vous conseiller quelques liens :</p><ul id="r-442491" data-claire-element-id="442491"><li id="r-442482" data-claire-element-id="442482"><p id="r-442481" data-claire-element-id="442481"><a href="http://www.siteduzero.com/tutoriel-3-517569-symfony2-un-tutoriel-pour-debuter-avec-le-framework-symfony2.html">Symfony2 - Un tutoriel pour débuter avec le framework Symfony2</a> : un cours sur le célèbre framework Symfony dans sa version 2. Le framework utilise Twig.</p></li><li id="r-442484" data-claire-element-id="442484"><p id="r-442483" data-claire-element-id="442483"><a href="http://twig.sensiolabs.org/documentation">La documentation Twig</a> : à mettre en favoris si vous comptez utiliser le moteur.</p></li><li id="r-442486" data-claire-element-id="442486"><p id="r-442485" data-claire-element-id="442485"><a href="http://blog.twig.sensiolabs.org/">Le blog</a> : Vous pouvez voir ici les actualités sur Twig (dans 90% des cas, il s'agit de l'annonce d'une nouvelle version).</p></li><li id="r-442488" data-claire-element-id="442488"><p id="r-442487" data-claire-element-id="442487"><a href="https://github.com/fabpot/Twig/issues">La page de rapports de bug</a></p></li><li id="r-442490" data-claire-element-id="442490"><p id="r-442489" data-claire-element-id="442489"><a href="https://github.com/fabpot/Twig">Dépôt Github</a> : ce dépôt contient les sources du projet. Ça peut être intéressant de voir comment fonctionne le moteur.</p></li></ul></div></div>
|
|
</div>
|
|
<div class="js-courseSelementActions sideActions" data-widget="courseElementActions" style="height: 113px; top: 239.5px; left: -37.5px;">
|
|
<ul class="sideActions__container">
|
|
<li>
|
|
<a class="sideActions__item js-courseElementActions-copyUrl js-tooltip" href="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates#/id/r-442289" data-tooltip="Copier le lien" data-tooltip-done="Lien copié !" data-clipboard-text="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates#/id/r-442289">
|
|
#
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<aside tabindex="-1" role="dialog" aria-labelledby="popin-view-restriction_popin_title" class="popin popin--illustrated js-popin" id="popin-view-restriction">
|
|
<i class="popin__close-button icon-close js-close-button"></i>
|
|
<div class="popin__inner">
|
|
<div class="popin__illustrationWrapper">
|
|
<div class="popin__illustration illustration--balloon"></div>
|
|
</div>
|
|
<div class="popin__mainContainer">
|
|
<h3 id="popin-view-restriction_popin_title" class="popin__title js-popin-title">Waouh !</h3>
|
|
<div class="popin__content js-popin-content">
|
|
<div class="popin__contentWrapper">
|
|
<p>
|
|
Très heureux de voir que nos cours vous plaisent, déjà 5 pages lues
|
|
aujourd'hui ! Vous pouvez continuer la lecture de nos cours en devenant
|
|
un Roomie, un membre de la communauté d'OpenClassrooms. C'est gratuit !
|
|
</p>
|
|
<p>
|
|
Vous pourrez aussi suivre votre avancement dans le cours, faire les exercices et discuter avec les autres Roomies.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="popin__actions js-popin-actions">
|
|
<span class="u--inlineBlock">
|
|
<a class="button button--primary " href="https://openclassrooms.com/register">S'inscrire</a>
|
|
</span>
|
|
<span class="u--inlineBlock">
|
|
<a class="button button " href="https://openclassrooms.com/login">Se connecter</a>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="popin-not-certifying-yet_481669" class="popin" data-popin-title="Vous ne pouvez pas encore obtenir de certificat de réussite à l'issue de ce cours.
|
|
<a href='/premium'><i class='icon-star'></i> Devenez Premium</a>
|
|
">
|
|
<img alt="Exemple de certificat de réussite" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/certif.jpg">
|
|
</div>
|
|
<div id="popin-not-certifying-yet_188246" class="popin" data-popin-title="Vous ne pouvez pas encore obtenir de certificat de réussite à l'issue de ce cours.
|
|
<a href='/premium'><i class='icon-star'></i> Devenez Premium</a>
|
|
">
|
|
<img alt="Exemple de certificat de réussite" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/certif.jpg">
|
|
</div>
|
|
</main>
|
|
<aside class="contentWithSidebar__sidebar js-contentWithSidebar-slidingElement">
|
|
<nav>
|
|
<div id="tab-courseMenu" class="col-nav__inner js-sidebar-inner">
|
|
<div class="col-nav__block col-nav__block--premium">
|
|
<strong class="not-certifying col-nav__notCertifying">Vous ne pouvez pas encore obtenir de certificat de réussite à l'issue de ce cours.</strong>
|
|
</div>
|
|
<div class="col-nav__block col-nav__block--institution">
|
|
<h2>Créé par</h2>
|
|
<a href="https://openclassrooms.com/partners/openclassrooms" target="_blank">
|
|
<span data-image-cdn-attr-src="//sdz-upload.s3.amazonaws.com/prod/partners/img/logo_logo-oc.png" data-image-cdn-attr-alt="logo OpenClassrooms" data-image-cdn-attr-class="col-nav__institutionLogo"><img data-reactroot="" srcset="https://oc-upload.imgix.net/prod/partners/img/logo_logo-oc.png?auto=compress&dpr=1 1x,https://oc-upload.imgix.net/prod/partners/img/logo_logo-oc.png?auto=compress&dpr=2 2x" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/logo_logo-oc.png" class="col-nav__institutionLogo" alt="logo OpenClassrooms"></span>
|
|
<p class="col-nav__block--institutionDescription">
|
|
OpenClassrooms, Leading <span class="nowrap">E-Learning<span> Platform in Europe
|
|
</span></span></p>
|
|
</a>
|
|
</div>
|
|
<div class="socialNetwork col-nav__block">
|
|
<ul class="socialButtons js-socialButtons" data-options="
|
|
title: 'Utilisation de Twig, un moteur de templates ! @OpenClassrooms',
|
|
mailTitle: 'Cours "Utilisation de Twig, un moteur de templates !" sur OpenClassrooms',
|
|
mailContent: 'Découvrez le cours "Utilisation de Twig, un moteur de templates !" sur OpenClassrooms.'" data-widget="socialButtons">
|
|
<li>
|
|
<a class="roundIcon roundIcon--twitter addthis_button_twitter js-socialButtons-btn js-tooltip at300b" data-tooltip="Partagez sur Twitter" addthis:url="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates?lang=fr" addthis:title="Utilisation de Twig, un moteur de templates ! @OpenClassrooms" title="Twitter" href="#">
|
|
<i class="roundIcon__icon icon-twitter"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a class="roundIcon roundIcon--facebook addthis_button_facebook js-socialButtons-btn js-tooltip at300b" data-tooltip="Partagez sur Facebook" addthis:url="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates?lang=fr" addthis:title="Utilisation de Twig, un moteur de templates ! @OpenClassrooms" title="Facebook" href="#">
|
|
<i class="roundIcon__icon icon-facebook"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a class="roundIcon roundIcon--googlePlus addthis_button_google_plusone_share js-socialButtons-btn js-tooltip at300b" data-tooltip="Partagez sur Google+" addthis:url="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates?lang=fr" addthis:title="Utilisation de Twig, un moteur de templates ! @OpenClassrooms" target="_blank" title="Google+" href="#">
|
|
<i class="roundIcon__icon icon-google"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a class="roundIcon addthis_button_email js-socialButtons-btn js-socialButtons-email js-tooltip at300b" data-tooltip="Partagez par e-mail" addthis:url="https://openclassrooms.com/courses/utilisation-de-twig-un-moteur-de-templates?lang=fr" addthis:ui_email_title="Utilisation de Twig, un moteur de templates ! @OpenClassrooms" addthis:ui_email_note="Découvrez le cours "Utilisation de Twig, un moteur de templates !" sur OpenClassrooms." addthis:title="Cours "Utilisation de Twig, un moteur de templates !" sur OpenClassrooms" target="_blank" title="Email" href="#">
|
|
<i class="roundIcon__icon icon-letter"></i>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
<footer class="alt-section">
|
|
<div class="centered">
|
|
<div class="row">
|
|
<div class="col4 course-bottom__category">
|
|
<h2 class="highlighted">
|
|
L'auteur
|
|
</h2>
|
|
<div>
|
|
<a itemprop="author" itemscope="" itemtype="http://schema.org/Person" href="https://openclassrooms.com/membres/robin850-43587" class="no-underlined">
|
|
<div class="course-bottom__text-illustrated">
|
|
<span data-author="Robin Dupret" data-image-cdn-background-image="//user.oc-static.com/files/302001_303000/302781.png" style="background-image: url("https://oc-user.imgix.net/files/302001_303000/302781.png?auto=compress");"></span>
|
|
<h4 itemprop="name">Robin Dupret</h4>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="col8 course-bottom__category">
|
|
<h2 class="highlighted">Découvrez aussi ce cours en...</h2>
|
|
<ul class="course-bottom__format">
|
|
<li>
|
|
<a href="https://openclassrooms.com/old-courses-pdf" class="text-decoration-none">
|
|
<div class="circle circle--x-small">
|
|
<span class="circle__content"></span>
|
|
<i class="icon-pdf"></i>
|
|
</div>
|
|
<div class="course-bottom__format-entitled">PDF</div>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
</article>
|
|
</div>
|
|
</div>
|
|
<footer class="footer">
|
|
<div class="centered">
|
|
<div class="row">
|
|
<div class="col3 col6-s footer__item linksList foldable js-foldable is-closed is-forceOpened" data-options="mobileOnly: true, disableOnLargeScreen: true, initialState: 'closed'" data-widget="foldable">
|
|
<h2 class="linksList__title footer__title foldable__button js-foldable-button">
|
|
OpenClassrooms
|
|
<i class="icon-next foldable__icon"></i>
|
|
</h2>
|
|
<ul class="linksList__content foldable__content">
|
|
<li>
|
|
<a href="https://openclassrooms.com/about-us" class="footer__link">Qui sommes-nous ?</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://openclassrooms.com/how-does-it-work" class="footer__link">Fonctionnement de nos cours</a>
|
|
</li>
|
|
<li>
|
|
<a href="http://jobs.openclassrooms.com/" target="_blank" class="footer__link">Recrutement</a>
|
|
</li>
|
|
<li>
|
|
<a href="#" class="js-zendesk-show footer__link">Nous contacter</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col3 col6-s footer__item linksList foldable js-foldable is-closed is-forceOpened" data-options="mobileOnly: true, disableOnLargeScreen: true, initialState: 'closed'" data-widget="foldable">
|
|
<h2 class="linksList__title footer__title foldable__button js-foldable-button">
|
|
Professionnels
|
|
<i class="icon-next foldable__icon"></i>
|
|
</h2>
|
|
<ul class="linksList__content foldable__content">
|
|
<li>
|
|
<a href="https://openclassrooms.com/affiliation" class="footer__link">
|
|
Affiliation
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://openclassrooms.com/partners" class="footer__link">Partenaires</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col3 col6-s footer__item linksList foldable js-foldable is-closed is-forceOpened" data-options="mobileOnly: true, disableOnLargeScreen: true, initialState: 'closed'" data-widget="foldable">
|
|
<h2 class="linksList__title footer__title foldable__button js-foldable-button">
|
|
En plus
|
|
<i class="icon-next foldable__icon"></i>
|
|
</h2>
|
|
<ul class="linksList__content foldable__content">
|
|
<li>
|
|
<a href="https://openclassrooms.com/new-teachers" class="footer__link">Créer un cours</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://openclassrooms.com/courses/courselab" class="footer__link">CourseLab</a>
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
<a href="https://openclassrooms.com/terms-conditions" class="footer__link">
|
|
Conditions Générales d'Utilisation
|
|
</a>
|
|
</strong>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col3 col6-s footer__item linksList foldable js-foldable is-closed is-forceOpened" data-options="mobileOnly: true, disableOnLargeScreen: true, initialState: 'closed'" data-widget="foldable">
|
|
<h2 class="linksList__title footer__title foldable__button js-foldable-button">
|
|
Suivez-nous
|
|
<i class="icon-next foldable__icon"></i>
|
|
</h2>
|
|
<ul class="linksList__content foldable__content">
|
|
<li>
|
|
<a href="http://blog.openclassrooms.com/" class="footer__link">Le blog OpenClassrooms</a>
|
|
</li>
|
|
<li>
|
|
<ul class="footer__socialNetwork">
|
|
<li>
|
|
<a href="https://www.facebook.com/openclassrooms" target="_blank" class="roundIcon roundIcon--facebook footer__socialButtons">
|
|
<span class="hidden">Facebook</span>
|
|
<i class="icon-facebook roundIcon__icon"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://twitter.com/openclassrooms" target="_blank" class="roundIcon roundIcon--twitter footer__socialButtons">
|
|
<span class="hidden">Twitter</span>
|
|
<i class="icon-twitter roundIcon__icon"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://plus.google.com/+OpenClassrooms/posts" target="_blank" class="roundIcon roundIcon--youtube footer__socialButtons">
|
|
<span class="hidden">Google Plus</span>
|
|
<i class="icon-google roundIcon__icon"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://instagram.com/openclassrooms" target="_blank" class="roundIcon roundIcon--instagram footer__socialButtons">
|
|
<span class="hidden">Instagram</span>
|
|
<i class="icon-instagram roundIcon__icon"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://www.youtube.com/user/TheOpenClassrooms" target="_blank" class="roundIcon roundIcon--googlePlus footer__socialButtons">
|
|
<span class="hidden">Youtube</span>
|
|
<i class="icon-youtube roundIcon__icon"></i>
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://www.linkedin.com/company/openclassrooms" target="_blank" class="roundIcon roundIcon--linkedin footer__socialButtons">
|
|
<span class="hidden">Linkedin</span>
|
|
<i class="icon-linkedin roundIcon__icon"></i>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="text-right u--positionRelative">
|
|
<hr>
|
|
<div class="footer__onlineStatus" id="react_conversation_onlineStatus"><!-- react-empty: 1 --></div>
|
|
<ul class="no-decoration inline">
|
|
<li>
|
|
<a class="footer__link" href="https://openclassrooms.com/change-locale/en/hmByGG2N-v8mhYde09OYyxPg-q1UBwcEPogiIbiTY_k">English</a>
|
|
</li>
|
|
<li>
|
|
<a class="footer__link" href="https://openclassrooms.com/change-locale/es/hmByGG2N-v8mhYde09OYyxPg-q1UBwcEPogiIbiTY_k">Español</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
<script type="text/javascript">
|
|
window.analytics=window.analytics||[],window.analytics.methods=["identify","group","track","page","pageview","alias","ready","on","once","off","trackLink","trackForm","trackClick","trackSubmit"],window.analytics.factory=function(t){return function(){var a=Array.prototype.slice.call(arguments);return a.unshift(t),window.analytics.push(a),window.analytics}};for(var i=0;i<window.analytics.methods.length;i++){var key=window.analytics.methods[i];window.analytics[key]=window.analytics.factory(key)}window.analytics.load=function(t){if(!document.getElementById("analytics-js")){var a=document.createElement("script");a.type="text/javascript",a.id="analytics-js",a.async=!0,a.src=("https:"===document.location.protocol?"https://":"http://")+"cdn.segment.io/analytics.js/v1/"+t+"/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n)}},window.analytics.SNIPPET_VERSION="2.0.9",
|
|
window.analytics.load('mou95e6tdn');
|
|
</script>
|
|
<script>App.scripts.push("https://cdn.polyfill.io/v2/polyfill.min.js?features=default,Array.prototype.includes,Intl.~locale.fr");</script>
|
|
<script>App.scripts.push("/js/oc/packages/vendors-d45201d4.js");</script>
|
|
<script>App.scripts.push("/js/oc/packages/common-e476c1d1.js");</script>
|
|
|
|
<script>App.scripts.push("/js/oc/packages/courseView-a8a0b522.js");</script>
|
|
|
|
<script>
|
|
(function () {
|
|
function loadScripts(cb) {
|
|
App.scripts.forEach(function (src, index) {
|
|
var script = document.createElement('script');
|
|
script.src = src;
|
|
script.async = false;
|
|
document.body.appendChild(script);
|
|
|
|
if (cb && index === App.scripts.length - 1) {
|
|
script.onload = cb;
|
|
}
|
|
});
|
|
}
|
|
|
|
function boot() {
|
|
loadScripts(function () {
|
|
if (App.modules) {
|
|
App.modules.startAll();
|
|
}
|
|
});
|
|
}
|
|
|
|
if (window.addEventListener) {
|
|
window.addEventListener('load', boot, false);
|
|
} else if (window.attachEvent) {
|
|
window.attachEvent('onload', boot);
|
|
} else {
|
|
window.onload = boot;
|
|
}
|
|
}());
|
|
</script>
|
|
<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"90dc06697a","applicationID":"20302107","transactionName":"NANaYkJXC0ICAhdYVw1Je0NDQgpcTA4AblsPB1FEVWkGXhYTEFRnAAlNRENTOlIMFBFCXTwQUVNH","queueTime":0,"applicationTime":105,"atts":"GERZFApNGEw=","errorBeacon":"bam.nr-data.net","agent":""}</script>
|
|
|
|
<script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/polyfill.js"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/vendors-d45201d4.js"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/common-e476c1d1.js"></script><script src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/courseView-a8a0b522.js"></script><div><!-- react-empty: 1 --></div><div role="log" aria-live="assertive" aria-relevant="additions" class="ui-helper-hidden-accessible"></div><div style="visibility: hidden; height: 1px; width: 1px; position: absolute; top: -9999px; z-index: 100000;" id="_atssh"><iframe id="_atssh825" title="AddThis utility frame" style="height: 1px; width: 1px; position: absolute; top: 0px; z-index: 100000; border: 0px none; left: 0px;" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/sh.htm"></iframe></div><style id="service-icons-0"></style><div style="width:0px; height:0px; display:none; visibility:hidden;" id="batBeacon0.5590372546755106"><img style="width:0px; height:0px; display:none; visibility:hidden;" id="batBeacon0.5312658410029008" alt="" src="Utilisation%20de%20Twig,%20un%20moteur%20de%20templates%20%21_fichiers/0.txt" width="0" height="0"></div><script type="text/javascript" id="">(function(){window.satismeter=window.satismeter||function(){(window.satismeter.q=window.satismeter.q||[]).push(arguments)};window.satismeter.l=1*new Date;var a=document.createElement("script"),b=document.getElementsByTagName("script")[0].parentNode;a.async=1;a.src="https://app.satismeter.com/satismeter.js";b.appendChild(a)})();
|
|
satismeter({writeKey:"gJsvzWYbMoPRGrAA",userId:"undefined",language:"undefined",traits:{email:"undefined",name:"undefined",createdAt:"undefined",country:"undefined",gender:"undefined",premiumType:"undefined",premium:"false",typeNPS:"global",language:"undefined",locale:"undefined"}});</script></body></html> |