Coding with SPIP 2

Page 1

Programming with SPIP DOCUMENTATION TO BE USED BY DEVELOPERS AND WEBMASTERS

SPIP’s version 2.1.0+ / May 2010



1.(. DN =JOC < KP=GD><ODJI NTNO@H <I? < ?@Q@GJKH@IO KG<OAJMH AO@M < LPD>F OJPM JA 1.(.fN A@<OPM@N R@ RDGG ?@N>MD=@ CJR DO RJMFN <I? @SKG<DI CJR OJ ?@Q@GJK RDOC DO PNDIB C@GKAPG @S<HKG@N RC@M@Q@M KJNND=G@ 2CDN ?J>PH@IO<ODJI O<MB@ON R@=H<NO@MN RDOC FIJRG@?B@ JA .'.

1/* '2+* "11 <I? )<Q<1>MDKO



Contents .M@A<>@ ,JO@N <=JPO OCDN ?J>PH@IO<ODJI (IOMJ?P>ODJI 2C@ O@HKG<O@N "JIO@ION JA OC@ ?DM@>OJMD@N $SO@I?DIB 1.(. %PI>ODJI<GDOD@N %JMHN 1/* <>>@NN "M@<ODIB TJPM JRI KGPBDIN $S<HKG@N &GJNN<MT (I?@S 2<=G@ JA >JIO@ION



Preface 2C@ =@BDIIDIBN JA OCDN =JJF ?<O@ =<>F OJ G<O@ +<OOCD@P R<N NO<MODIB CDN RJMF JI OCDN ?J>PH@IO<ODJI AJM ?@Q@GJK@MN <I? N<D? OJ PN c RC<O@Q@M R@ ?J G@OfN ?J DO RDOC <I JK@I GD>@I>@ NJ OC<O JOC@M K@JKG@ RDGG =@ <=G@ OJ O<F@ JQ@M <AO@M (fQ@ ?JI@ HT K<MO <I? OC@I O<F@ DO @Q@I APMOC@M K@MC<KN JI@ ?<T DO >JPG? @Q@I =@ KP=GDNC@? DI C<M? >JKTd 1.(. =JJF RDOC <I JK@I GD>@I>@ < ?M@<H IPMOPM@? AJM T@<MN R<N IJR NCJRDIB DON ADMNO NDBIN JA O<FDIB NJGD? AJMH 2C@ D?@< C<? =@>JH@ ADMHGT NJPI?@? JPO <I? M@>@IO I@R O@>CIJGJBD@N R@M@ <Q<DG<=G@ OJ C@GK H<F@ DO < M@<GDOT ITJI@ RCJ R<ION OJ KMDIO < =JJF ><I IJR ADI? <GG FDI?N JA NDHKG@ OJJGN JI OC@ DIO@MI@O OJ C@GK RDOC OC@ O<NF (OfN BM@<O OJ OCDIF OC<O <O < HJ?@NO >JNO TJP ><I JM?@M < JI@ JAA >JKT JA <IT O@SO I? OC@ A@@GDIB RC@I TJP ADMNO M@>@DQ@ OC@ KMDIO@? >JKT b ><I TJP DH<BDI@ 2C@ ADMNO Q@MNDJI JA OCDN =JJF DN >JHDIB JPO DI OC@ H<BD><G <OHJNKC@M@ JA OC@ 2MJBGJN H@@ODIB <I? OC<O DN < KJNDODQ@ NDBI 4@MNDJI JA OC@ =JJF ><I =@ N@@I <N OC@ @I? JA JI@ <?Q@IOPM@ =PO DO DN <GNJ OC@ =@BDIIDIB JA <IJOC@M GG OC@ O@>CID><G @G@H@ION M@LPDM@? <M@ IJR DI KG<>@ AJM JOC@M =JJFN 2C@T JIGT I@@? OJ =@ RMDOO@I b JI < 1.(. NDO@ JA >JPMN@ ?? < >JQ@M <I? N@I? DO <GG OJ OC@ KMDIO@M 1.(. 1.(. '--0 7 !@I



Notes about this documentation License and rights 2C@ AMPDON JA GJIB CJPMN JA RMDODIB OCDN ?J>PH@IO<ODJI DN < >JH=DI<ODJI JA FIJRG@?B@ AMJH OC@ 1.(. >JHHPIDOT GG JA OCDN RJMF DN ?DNOMD=PO@? PI?@M OC@ JK@I "M@<ODQ@ "JHHJIN GD>@IN@ OOMD=PODJI 1C<M@ GDF@ >> =T N< 7JP H<T PN@ OC@N@ O@SON AJM <IT KPMKJN@ RC<ONJ@Q@M DI>GP?DIB >JHH@M>D<G HJ?DAT OC@H <I? M@?DNOMD=PO@ OC@H JI OC@ >JI?DODJI OC<O TJP <GGJR TJPM M@<?@MN OC@ N<H@ MDBCON OJ NC<M@

Continuous improvements 2CDN RJMF NODGG DI KMJBM@NN C<N =@@I NP=E@>O OJ IPH@MJPN KMJJAM@<?DIBN =PO DN >@MO<DIGT IJO BP<M<IO@@? @S@HKO AMJH <IT @MMJM .G@<N@ ?JIfO C@NDO<O@ OJ JAA@M DHKMJQ@H@ION JM KJDIO JPO HDNO<F@N =T PNDIB OC@ NPBB@NODJI AJMH <Q<DG<=G@ JI OC@ ?J>PH@IO<ODJI DIO@MI@O NDO@ COOK KMJBM<HH@M NKDK JMB 7JP H<T <GNJ ?DN>PNN OC@ JMB<IDN<ODJI JA OC@ >JIO@IO JM O@>CID><G KM@N@IO<ODJI <I? OC@ OM<ING<ODJIN =T PNDIB OC@ ?DN>PNNDJI GDNO NKDK KMJBM<HH@M M@LPDM@N NP=N>MDKODJI

Write a chapter (A TJP A@@G HJODQ<O@? =T OCDN KMJE@>O TJP H<T JAA@M OJ RMDO@ < >C<KO@M <=JPO < NP=E@>O OC<O TJP C<Q@ H<NO@M@? JM M@RJMF <I @SDNODIB >C<KO@M OJ H<F@ DO >G@<M@M JM HJM@ >JHKG@O@ 5@ RDGG ?J JPM =@NO OJ <>>JHHJ?<O@ TJPM @AAJMON <I? NPKKJMO TJP DI NP>C <>ODQDOD@N

Translations 7JP H<T <GNJ K<MOD>DK<O@ DI OC@ OM<ING<ODJI JA OCDN ?J>PH@IO<ODJI DIOJ $IBGDNC JM 1K<IDNC 2C@ NDO@fN KMDQ<O@ UJI@ COOK KMJBM<HH@M NKDK JMB DN PN@? AJM ?DN>PNNDIB OC@ OM<ING<ODJIN OC<O <M@ >PMM@IOGT =@DIB KM@K<M@? '<QDIB N<D? OC<O

DOfN IJO @SK@>O@? OJ OM<ING<O@ OC@ ?J>PH@IO<ODJI DIOJ JOC@M G<IBP<B@N PIODG NP>C ODH@ <N OC@ JMB<IDN<ODJI JA OC@ Q<MDJPN >C<KO@MN C<N =@@I NO<=DGDN@? RCD>C HDBCO T@O O<F@ N@Q@M<G HJIOCN

Computer code and properties of languages 5DOC OC@ <DH JA M@O<DIDIB >JHK<OD=DGDOT OC@ >JHKPO@M >J?@ N@BH@ION RCD>C N@MQ@ <N @S<HKG@N JIGT >JIO<DI 1"(( >C<M<>O@MN 2CDN H@<IN <HJIB JOC@M OCDIBN OC<O TJP RDGG IJO ADI? <IT G<IBP<B@ ?D<>MDOD> H<MFN DI OC@ >JHH@ION OC<O <>>JHK<IT OC@ @S<HKG@N <ITRC@M@ DI OC@ ?J>PH@IO<ODJI < H<OO@M IJMH<GGT JA >JIND?@M<=G@ DHKJMO<I>@ DI %M@I>C <I? <GHJNO IJI@ DI $IBGDNC 2C@M@AJM@ R@ <NF OC<O TJP @SK@>O NP>C <=N@I>@N OJ J>>PM <I? DBIJM@ OC@H


'<KKT M@<?DIB


Introduction I DIOMJ?P>ODJI OJ 1.(. <I? < KM@N@IO<ODJI JA DON B@I@M<G KMDI>DKG@N

11


What is SPIP? 1.(. DN < AM@@ NJAOR<M@ K<>F<B@ ?DNOMD=PO@? PI?@M OC@ &,3 &.* GD>@I>@ -MDBDI<GGT < "JIO@IO +<I<B@H@IO 1TNO@H DO C<N BM<?P<GGT =@>JH@ < ?@Q@GJKH@IO KG<OAJMH H<FDIB DO KJNND=G@ OJ >M@<O@ H<DIO<DI<=G@ <I? @SO@IND=G@ DIO@MA<>@N DI?@K@I?@IOGT JA OC@ NOMP>OPM@ JA OC@ H<I<B@? ?<O<

What can SPIP be used for? 1.(. DN K<MOD>PG<MGT NPDO<=G@ AJM R@=NDO@N <I? KJMO<GN RDOC M@BPG<M >JHHPIDOT >JIOMD=PODJIN =PO DO ><I <GNJ =@ PN@? AJM < =GJB < RDFD JM < NJ>D<G I@ORJMF +JM@ B@I@M<GGT 1.(. ><I H<I<B@ OC@ NOJM<B@ <I? KM@N@IO<ODJI JA <IT ?<O< NOJM@? DI +T1/* .JNOBM@N JM 1/*DO@ ?<O<=<N@N $SO@INDJIN <M@ <Q<DG<=G@ RCD>C <GNJ JAA@M DIO@M<>ODJI RDOC 6+*

Requirements and basic description 1.(. M@LPDM@N .'. Q@MNDJI JM CDBC@M <I? <O G@<NO +! JA H@HJMT (O <GNJ M@LPDM@N < ?<O<=<N@ +T1/* .JNOBM@N JM 1/*DO@ <M@ NPKKJMO@? 2C@ KP=GD> R@=NDO@ AMJIO JAAD>@ DN QDND=G@ OJ <GG QDNDOJMN =T ?@A<PGO =PO DO ><I =@ M@NOMD>O@? OJ >@MO<DI PN@MN =T N@>ODJI DA M@LPDM@? 2C@ KMDQ<O@ DIO@MA<>@ =<>F JAAD>@ DN <>>@NND=G@ JIGT OJ K@MNJIN <POCJMDN@? OJ H<I<B@ OC@ NJAOR<M@ JM NDO@ >JIO@IO

The templates 2C@ RCJG@ R@=NDO@ <I? DON KMDQ<O@ <M@< <M@ ><G>PG<O@? AMJH O@HKG<O@N OC<O <M@ >JHKJN@? JA NO<OD> >J?@ H<DIGT '2+* <I? 1.(. @G@H@ION 2C@N@ O@HKG<O@N <M@ =T ?@A<PGO NOJM@? DI OC@ ?DM@>OJMD@N NLP@G@OO@N ?DNO <I? KMDQ@ %JM @S<HKG@ RC@I < QDNDOJM H<F@N < M@LP@NO AJM OC@ CJH@ K<B@ 1.(. >M@<O@N <I '2+* K<B@ =<N@? JI OC@ O@HKG<O@ I<H@? sommaire.html $<>C OTK@ JA J=E@>O DI 1.(. C<N < ?@A<PGO O@HKG<O@ OJ ?DNKG<T DO NP>C <N article.html AJM <MOD>G@N <I? rubrique.html AJM N@>ODJIN JM MP=MDLP@N DI %M@I>C

12


# Introduction 1.(. OM<INAJMHN OC@N@ O@HKG<O@N DIOJ .'. >J?@ RCD>C DO NOJM@N DI < ><>C@ 2C@N@ ><>C@? ADG@N <M@ OC@I PN@? OJ KMJ?P>@ OC@ '2+* K<B@N b RCD>C <M@ ><>C@? DI OC@DM OPMI b <I? OC@I M@OPMI@? OJ @<>C QDNDOJM

Quick overview 1.(. OM<INAJMHN O@HKG<O@N DIOJ NO<OD> K<B@N 2@HKG<O@N <M@ H<DIGT >JHKJN@? JA GJJKN <BOUCLE> RCD>C N@G@>O @G@H@ION OTKD><GGT N@ON JA M@>JM?N <I? O<BN #TAG RCD>C ?DNKG<T OC@ KMJK@MOD@N <I? Q<GP@N JA OCJN@ @G@H@ION OTKD><GGT AD@G?N AMJH OC@ M@>JM?N JM NTNO@H RD?@ API>ODJIN <I? KM@>JIADBPM@? Q<GP@N List of 5 most recently published articles: <B_art> <ul> <BOUCLE_art(ARTICLES){!par date}{0,5}> <li><a href="#URL_ARTICLE">#TITRE</a></li> </BOUCLE_art> </ul> </B_art>

(I OCDN @S<HKG@ OCDN <BOUCLE_art()> GJJK K@MAJMHN < N@G@>ODJI AMJH OC@ ARTICLES O<=G@ DI OC@ ?<O<=<N@ (O NJMON OC@ ?<O< DI M@Q@MN@ >CMJIJGJBD><G JM?@M <I? M@OPMIN OC@ ADMNO ADQ@ @G@H@ION %JM @<>C <MOD>G@ OC<O OC@ GJJK N@G@>ON OC@ #URL_ARTICLE O<B DN M@KG<>@? RDOC OC@ 30* AJM DON K<B@ <I? OC@ #TITRE O<B DN M@KG<>@? RDOC DON ODOG@ Typical HTML resulting from this kind of loop: <ul> <li><a href="Recursion">Recursion</a></li> <li><a href="Parameter">Parameter</a></li> <li><a href="Argument">Argument</a></li> <li><a href="Modifying-all-of-your-templatesin">Modifying all of your templates in one hit</a></li> <li><a href="Display-an-authoring-form-if">Display an authoring form, if authorised</a></li> </ul>

13



The templates 1.(. B@I@M<O@N HTML K<B@N AMJH templates >JIO<DIDIB < HDSOPM@ JA HTML loops <I? criteria tags <I? filters (ON NOM@IBOC DN OC@ <=DGDOT OJ @SOM<>O ?<O<=<N@ >JIO@IO PNDIB < NDHKG@ <I? PI?@MNO<I?<=G@ G<IBP<B@

15


Loops loop ?DNKG<TN NJH@ >JIO@IO NOJM@? DI ?<O<=<N@ (O B@I@M<O@N <I JKODHDU@? 1/* LP@MT OC<O @SOM<>ON OC@ ?@NDM@? >JIO@IO

The syntax of loops GJJK NK@>DAD@N =JOC < ?<O<=<N@ O<=G@ AMJH RCD>C OJ @SOM<>O DIAJMH<ODJI <N R@GG OC@ >MDO@MD< AJM N@G@>ODJI <BOUCLE_nom(TABLE){criterion1}{criterion2}> ... for each object ... </BOUCLE_nom>

$Q@MT GJJK C<N < I<H@ RCD>C HPNO =@ PIDLP@ RDOCDI OC@ O@HKG<O@ ADG@ OCDN I<H@ DN PN@? OJB@OC@M RDOC OC@ RJM? c!-3"*$d $IBGDNC GJJK OJ H<MF OC@ NO<MO <I? OC@ @I? JA OC@ GJJK '@M@ OC@ I<H@ DN c;IJHd 2C@ O<=G@ DN NK@>DAD@? @DOC@M =T <I <GD<N RMDOO@I DI ><KDO<G G@OO@MN JM =T OC@ M@<G I<H@ JA OC@ O<=G@ RMDOO@I DI PKK@M <I? GJR@M><N@ G@OO@MN <N OC@ ><N@ H<T =@

AJM @S<HKG@ cNKDK;<MOD>G@Nd 2C@ @S<HKG@ PN@N OC@ c2 !*$d <GD<N 2C@ I@SO >JHKJI@ION JA < GJJK <M@ OC@ >MDO@MD< RCD>C <M@ RMDOO@I =@OR@@I =M<>@N %JM @S<HKG@ OC@ >MDO@MDJI {par nom} RDGG NJMO OC@ M@NPGON <>>JM?DIB OJ OC@ cIJHd >JGPHI JA OC@ ?<O<=<N@ O<=G@

Example 2CDN GJJK GDNON <GG OC@ DH<B@N JI OC@ NDO@ (O ?M<RN DON ?<O< AMJH OC@ ?<O<=<N@ PNDIB OC@ DOCUMENTS <GD<N <I? OC@ >MDO@MDJI {extension IN jpg,png,gif} N@G@>ON JIGT OCJN@ ADG@N RDOC < ADG@I<H@ @SO@INDJI DI OC@ BDQ@I GDNO <BOUCLE_documents(DOCUMENTS){extension IN jpg,png,gif}> [(#FICHIER|image_reduire{300})] </BOUCLE_documents>

16


# The templates 2C@ O<B #FICHIER >JIO<DIN OC@ <??M@NN JA OC@ ?J>PH@IO RCD>C DN HJ?DAD@? RDOC < ADGO@M I<H@? cDH<B@;M@?PDM@d 2CDN RDGG M@NDU@ OC@ DH<B@ OJ =@ <O HJNO KDS@GN <I? M@OPMI <I '2+* <img> O<B AJM OC@ I@R DH<B@

The complete syntax of loops *JJKN GDF@ O<BN C<Q@ < NTIO<S RCD>C <GGJR OC@H OJ ?@GDQ@M >JIO@IO DI HPGODKG@ K<MON -KODJI<G K<MON <M@ ?DNKG<T@? JIGT JI>@ IJO AJM @<>C @G@H@IO <I? JIGT DA OC@ GJJK M@OPMIN NJH@ >JIO@IO I <GO@MI<ODQ@ K<MO DN ?DNKG<T@? JIGT DA OC@ GJJK ?J@N IJO M@OPMI <IT <>OP<G >JIO@IO 2CDN DN OC@ APGG NTIO<S x DN OC@ I<H@ JA OC@ GJJK <Bx> Display once, before the loop content <BOUCLEx(TABLE){critère}> For each element </BOUCLEx> Display once, after the loop content </Bx> Display if there is no result <//Bx>

Example 2CDN GJJK N@G@>ON OC@ ADQ@ G<O@NO <MOD>G@N KP=GDNC@? JI OC@ NDO@ (I OCDN @S<HKG@ OC@ <ul> <I? </ul> '2+* O<BN RDGG =@ ?DNKG<T@? JIGT JI>@

<I? JIGT DA OC@ GJJK >MDO@MD< H<O>C NJH@ @G@H@ION (A OC@M@ <M@ IJ H<O>CDIB @G@H@ION OC@I OC@N@ JKODJI<G K<MON RDGG IJO =@ JPOKPO <B_latest_articles> <ul> <BOUCLE_latest_articles(ARTICLES){!par date}{0,5}> <li>#TITRE, <em>[(#DATE|affdate)]</em></li> </BOUCLE_latest_articles> </ul> </B_latest_articles>

17


2C@ O<B #DATE ?DNKG<TN OC@ KP=GD><ODJI ?<O@ JA OC@ <MOD>G@ <I? OC@ ADGO@M affdate @INPM@N OC<O DO DN DI OC@ >JMM@>O G<IBP<B@ <I? DN AJMH<OO@? ID>@GT Result: <ul> <li>Contenu d’un fichier exec (squelette), <em>13 octobre 2009</em></li> <li>Liens AJAX, <em>1er octobre 2009</em></li> <li>Forcer la langue selon le visiteur, <em>27 septembre 2009</em></li> <li>Definition, <em>27 September 2009</em></li> <li>List of current pipelines, <em>27 September 2009</em></li> </ul>

Nested loops (O DN JAO@I PN@APG OJ I@NO GJJKN RDOCDI @<>C JOC@M OJ ?DNKG<T HJM@ >JHKGD><O@? @G@H@ION ,@NODIB GJJKN DI OCDN R<T H<F@N DO KJNND=G@ OJ PN@ Q<GP@N AMJH OC@ ADMNO JPO@M GJJK <N N@G@>ODJI >MDO@MD< AJM OC@ N@>JI? DII@M GJJK <BOUCLEx(TABLE){criteria}> #ID_TABLE <BOUCLEy(SECOND_TABLE){id_table}> ... </BOUCLEy> </BOUCLEx>

Example '@M@ R@ GDNO <GG JA OC@ <MOD>G@N >JIO<DI@? DI OC@ ADMNO ORJ N@>ODJIN JA OC@ NDO@ 5@ PN@ OC@ {racine} >MDO@MD< OJ N@G@>O JIGT OC@ OJK G@Q@G N@>ODJIN RCD>C R@ PNP<GGT ><GG N@>OJMN <B_rubs> <ul> <BOUCLE_rubs(RUBRIQUES){racine}{0,2}{par titre}>

18


# The templates <li>#TITRE <B_arts> <ul> <BOUCLE_arts(ARTICLES){id_rubrique}{par titre}> <li>#TITRE</li> </BOUCLE_arts> </ul> </B_arts> </li> </BOUCLE_rubs> </ul> </B_rubs>

2C@ ARTICLES GJJK PN@N < NJMODIB F@T {par titre} c=T ODOG@d <I? < >MDO@MDJI {id_rubrique} 2C@ G<OO@M DINOMP>ON 1.(. OJ N@G@>O OC@ <MOD>G@N =@GJIBDIB OJ OC@ >PMM@IO N@>ODJI b DI OCDN ><N@ OC@ JI@ >CJN@I =T OC@ RUBRIQUES GJJK This delivers: <ul class='rubriques'> <li>fr </li> <li>en <ul class='articles'> <li>Notes about this documentation</li> <li>Another article</li> </ul> </li> </ul>

Recursive loops (I KMJBM<HHDIB <I <GBJMDOCH < ?<O< KMJ>@NNDIB >J?@ RCD>C ><GGN DON@GA DN ?@N>MD=@? <N =@DIB M@>PMNDQ@ '@M@ < M@>PMNDQ@ GJJK I >JIO<DI@? DI < K<M@IO GJJK S H<F@N DO KJNND=G@ OJ @S@>PO@ OC@ GJJK S <B<DI =T <POJH<OD><GGT OM<INHDOODIB OC@ M@LPDM@? <MBPH@ION 2C@M@AJM@ DIND?@ OC@ GJJK S OC@ N<H@ GJJK S DN ><GG@? RDOC ?DAA@M@IO K<M<H@O@MN 2CDN DN RC<O R@ ><GG M@>PMNDJI 2CDN KMJ>@NN RDGG =@ M@K@<O@? <N GJIB <N OC@ M@>PMNDQ@ GJJK M@OPMIN M@NPGON

19


<BOUCLEx(TABLE){id_parent}> ... <BOUCLEn(BOUCLEx) /> ... </BOUCLEx>

5C@I < NDO@ C<N H<IT NP= N@>ODJIN JM H<IT AJMPH H@NN<B@N DO JAO@I PN@N M@>PMNDQ@ GJJKN 2CDN H<F@N DO KJNND=G@ OJ ?DNKG<T D?@IOD><G @G@H@ION Q@MT @<NDGT

Example 5@ ><I PN@ < M@>PMNDQ@ GJJK OJ ?DNKG<T < GDNO JA <GG JA OC@ N@>ODJIN DI OC@ NDO@ %JM OC<O R@ GJJK AJM OC@ ADMNO ODH@ JI OC@ N@>ODJIN RDOC < >MDO@MDJI OJ N@G@>O OC@ NP= N@>ODJIN JA OC@ >PMM@IO N@>ODJI {id_parent} 5@ <GNJ NJMO =T IPH=@M BDQ@I OJ OC@ N@>ODJIN NJ OC<O R@ ><I ?DNKG<T OC@H DI < K<MOD>PG<M JM?@M <I? OC@I =T ODOG@ <B_rubs> <ul> <BOUCLE_rubs(RUBRIQUES){id_parent}{par num titre, titre}> <li>#TITRE <BOUCLE_sous_rubs(BOUCLE_rubs) /> </li> </BOUCLE_rubs> </ul> </B_rubs>

(I OC@ ADMNO DO@M<ODJI JA OC@ GJJK {id_parent} RDGG GDNO OC@ N@>ODJIN <O OC@ MJJO JA OC@ NDO@ 2C@T C<Q@ <I D?;K<M@IO AD@G? JA U@MJ 5C@I OC@ ADMNO N@>ODJI DN ?DNKG<T@? OC@ M@>PMNDQ@ GJJK DN ><GG@? <I? 1.(. ><GGN OC@ GJJK c;MP=Nd <B<DI 2CDN ODH@ OC@ {id_parent} >MDO@MDJI N@G@>ON ?DAA@M@IO N@>ODJIN =@><PN@ DO GDNON OC@ NP= N@>ODJIN JA OC@ >PMM@IO N@>ODJI (A OC@M@ <M@ NP= N@>ODJIN OC@ ADMNO DN ?DNKG<T@? 2C@I OC@ c;MP=Nd GJJK DN ><GG@? <B<DI

=PO DI this NP= N@>ODJI N GJIB <N OC@M@ <M@ NP= N@>ODJIN OJ ?DNKG<T OCDN M@>PMNDQ@ KMJ>@NN NO<MON <B<DI Result: <ul>

20


# The templates <li>en <ul> <li>Introduction</li> <li>The templates <ul> <li>Loops</li> </ul> </li> <li>Extending SPIP <ul> <li>Introduction</li> <li>Pipelines</li> ... </ul> </li> ... </ul> </li> <li>fr <ul> <li>Introduction</li> <li>Écriture des squelettes <ul> <li>Boucles</li> <li>Balises</li> <li>Critères de boucles</li> ... </ul> </li> ... </ul> </li> </ul>

More 3I?@MNO<I?DIB OC@ KMDI>DK<GN JA M@>PMNDQ@ KMJBM<HHDIB DN IJO @<NT (A OCDN @SKG<I<ODJI C<N G@AO TJP >JIAPN@? TJP H<T ADI? DO C@GKAPG OJ M@<? OC@ <MOD>G@ <=JPO M@>PMNDQ@ GJJKN JI 1.(. I@O COOK RRR NKDK I@O @I;<MOD>G@ COHG

21


Loops with missing tables 5C@I R@ <NF 1.(. OJ PN@ < O<=G@ RCD>C ?J@N IJO @SDNO DO ?DNKG<TN <I @MMJM JI OC@ K<B@ 2C@N@ @MMJM H@NN<B@N C@GK <?HDIDNOM<OJMN OJ ADS KMJ=G@HN RDOC OC@ NDO@ =PO JOC@M PN@MN B@O OJ N@@ OC@H <N R@GG 1JH@ODH@N R@ ?JIfO ><M@ DA < O<=G@ DN HDNNDIB <I? R<IO OJ DBIJM@ DO NDG@IOGT AJM @S<HKG@ DA R@ M@A@M@I>@ < O<=G@ AJM < KGPB DI RCD>C HDBCO IJO =@ >PMM@IOGT <>ODQ@ (I OC@N@ ><N@N R@ ><I KG<>@ < LP@NODJI H<MF =@AJM@ OC@ @I? JA OC@ =M<>F@ON OJ DI?D><O@ OC<O OC@ <=N@I>@ JA OC@ O<=G@ DN OJG@M<O@? <BOUCLE_table(TABLE ?){criteres}> ... </BOUCLE>

Example: (A < O@HKG<O@ PN@N OC@ KGPB DI c B@I?<d RCD>C DI>GP?@N <I YQZI@H@ION O<=G@ AJM @Q@ION =PO RCD>C HPNO API>ODJI @Q@I DI OC@ <=N@I>@ JA OC@ KGPB DI DO DN KJNND=G@ OJ RMDO@ DON GJJKN GDF@ OCDN <BOUCLE_events(EVENEMENTS ?){id_article}{!par date}> ... </BOUCLE_events>

22


# The templates

Tags 2<BN <M@ HJNO JAO@I PN@? OJ ?DNKG<T >JIO@IO <I? NJH@ODH@N OJ ><G>PG<O@ DO 2CDN >JIO@IO ><I >JH@ AMJH ?DAA@M@IO NJPM>@N \ 2C@ @IQDMJIH@IO JA OC@ O@HKG<O@ D @ NJH@ K<M<H@O@MN K<NN@? OJ OC@ O@HKG<O@ FIJRI <N >JIO@SO >JHKDG<ODJI \ 2C@ >JIO@ION JA < 1/* O<=G@ RDOCDI < GJJK \ IJOC@M NK@>DAD> NJPM>@ (I OCDN ><N@ OC@ O<BN <I? OC@DM <>ODJIN HPNO =@ M@KJMO@? OJ 1.(. RCDG@ OC@ KM@QDJPN NJPM>@N ><I =@ ><G>PG<O@? <POJH<OD><GGT

Tag syntax, the definitive version )PNO GDF@ GJJKN =JP>G@N O<BN C<Q@ JKODJI<G >JHKJI@ION <I? ><I NJH@ODH@N <>>@KO K<M<H@O@M <MBPH@ION 2C@ <NO@MDNFN N@MQ@ OJ =TK<NN PNP<G <POJH<OD> KMJ>@NN@N #TAG #TAG{argument} #TAG{argument, argument, argument} #TAG* #TAG** [(#TAG)] [(#TAG{argument})] [(#TAG*{argument})] [ before (#TAG) after ] [ before (#TAG{argument}|filter) after ] [ before (#TAG{argument}|filter{argument}|filter) after ] ...

How the brackets work 2C@ APGG NTIO<S RDOC K<M@IOC@N@N <I? NLP<M@ =M<>F@ON DN H<I?<OJMT <N NJJI <N JI@ JA OC@ O<BfN <MBPH@ION <GNJ PN@N K<M@IOC@N@N <I? NLP<M@ =M<>F@ON JM RC@I OC@ O<B >JIO<DIN < ADGO@M // risk of bad surprises: #TAG{[(#TAG|filter)]} // always correctly interpreted: [(#TAG{[(#TAG|filter)]})] // although this works in SPIP 2.0, results are not guaranteed: #TAG{#TAG|filter}

23


// using a filter means you MUST also use parentheses and square brackets: [(#TAG|filter)]

Example #DNKG<T < GDIF OJ OC@ CJH@ K<B@ <a href="#URL_SITE_SPIP">#NOM_SITE_SPIP</a>

#DNKG<T <I '2+* <div> O<B <I? OC@ >JIO@ION JA <I #SOUSTITRE DA DO @SDNON [<div class="subtitle">(#SOUSTITRE)</div>]

The #ENV environment 5@ <GNJ PN@ OC@ RJM? @IQDMJIH@IO OJ ?@ADI@ OC@ >JH=DI@? >JGG@>ODJI JA Q<MD<=G@N OC<O <M@ K<NN@? OJ < K<MOD>PG<M O@HKG<O@ 5@ H<T <GNJ NK@<F <=JPO < >JHKDG<ODJI >JIO@SO %JM @S<HKG@ RC@I < QDNDOJM M@LP@NON OJ N@@ <MOD>G@ OC@ <MOD>G@ D?@IODAD@M DN K<NN@? OJ OC@ article.html O@HKG<O@ 5DOCDI OC<O K<MOD>PG<M NLP@G@OO@

DO DN KJNND=G@ OJ M@>JQ@M OC<O Q<MD<=G@ PNDIB < NK@>D<G O<B #ENV (I OCDN R<T

#ENV{id_article} RJPG? ?DNKG<T 1JH@ K<M<H@O@MN <M@ <POJH<OD><GGT K<NN@? OJ OC@ O@HKG<O@ GDF@ OC@ >PMM@IO ?<O@ <O OC@ ODH@ OC@ K<B@ DN B@I@M<O@? RCD>C ><I =@ ?DNKG<T@? RDOC #ENV{date} 1DHDG<MGT DA R@ ><GG < O@HKG<O@ RDOC <MBPH@ION OCMJPBC OC@ K<B@ 30* OC@T <M@ <GNJ K<NN@? DIOJ OC@ @IQDMJIH@IO

Example 2C@ 30* spip.php?page=albums&type=classique RDGG GJ<? PK OC@ O@HKG<O@ albums.html 5DOCDI OC<O O@HKG<O@ #ENV{type} <GGJRN TJP OJ M@>JQ@M OC@ Q<GP@ K<NN@? DI OCDN ><N@ >G<NNDLP@

24


# The templates

The contents of loops (boucles) 2C@ >JIO@IO @SOM<>O@? AMJH OC@ N@G@>ODJI H<?@ =T < 1.(. GJJK DN ?DNKG<T@? =T PNDIB O<BN 1TNO@H<OD><GGT RC@I@Q@M < O<=G@ C<N <I 1/* AD@G? S 1.(. DN <=G@ OJ KMJQD?@ ?DNKG<T OC@ >JIO@ION JA OC<O AD@G? =T PNDIB OC@ NTIO<S #X <BOUCLEx(TABLES)> #X - #NAME_OF_SQL_FIELD - #NONEXISTENT_FIELD<br /> </BOUCLEx>

1.(. RDGG IJO >M@<O@ <I 1/* LP@MT AJM <GG JA OC@ O<=G@fN >JGPHIN SELECT * ... DI JM?@M OJ M@>JQ@M OC@ M@LP@NO@? ?<O< =PO RDGG <O @<>C J>><NDJI

DNNP@ < NK@>DAD> ?<O< M@LP@NO a DI OCDN ><N@ DO RJPG? =@ SELECT

x,

name_of_sql_field FROM spip_table 5C@I@Q@M < AD@G? ?J@N IJO @SDNO DI OC@ 1/* O<=G@ GDF@ cIJI@SDNO@IO;AD@G?d DI JPM @S<HKG@ <=JQ@ 1.(. RDGG IJO DIN@MO DO DIOJ OC@ O<=G@ LP@MT =PO RDGG <OO@HKO OJ M@>JQ@M OC@ AD@G? AMJH < NPMMJPI?DIB GJJK a DA OC@M@ <M@ <IT (A OC@M@ DN IJ K<M@IO GJJK RDOC NP>C < AD@G? OC@I 1.(. GJJFN DIOJ OC@ @IQDMJIH@IO EPNO <N DA TJP C<? RMDOO@I #ENV{nonexistent_field} DINO@<?

Example *@OfN O<F@ <I @S<HKG@ JA <I 1/* O<=G@ I<H@? ><ON RCD>C >JIO<DIN >JGPHIN D?;><O M<>@ I<H@ <B@ >JGJPM 5@ ><I GDNO OC@ >JIO@ION JA OC<O O<=G@ RDOC <B_cats> <table> <tr> <th>Name</th><th>Age</th><th>Race</th> </tr> <BOUCLE_cats(CATS){par name}> <tr> <td>#NAME</td><td>#AGE</td><td>#RACE</td> </tr> </BOUCLE_cats> </table> </B_cats>

25


5C@I <POJH<OD><GGT <I<GTNDIB OC@ NLP@G@OO@ O@HKG<O@ 1.(. RDGG PI?@MNO<I? OC<O DO NCJPG? M@OMD@Q@ OC@ name age <I? race AD@G?N AMJH OC@ chats 1/* O<=G@ 'JR@Q@M DO RDGG IJO M@OMD@Q@ OC@ AD@G?N OC<O DO ?J@N IJO I@@? DI OCDN ><N@ id_cat <I? colour OC@M@=T IJHDI<GGT M@?P>DIB OC@ GJ<? JI OC@ ?<O<=<N@ N@MQ@M

Contents of parent loops 1JH@ODH@N DOfN PN@APG OJ M@OMD@Q@ >JIO@ION AMJH < GJJK RCD>C DN < K<M@IO JA OC@ >PMM@IO GJJK EPNO =T PNDIB <I JM?DI<MT 1.(. O<B 1.(. JAA@MN < NK@>D<G NTIO<S OJ ?J OCDN @SKGD>DOGT RDOC OC@ NTH=JG =T NDHKGT D?@IODATDIB RCD>C GJJK TJP RDNC OJ M@OMD@Q@ OC@ ?<O< AMJH RC@M@ I =@GJR DN OC@ D?@IODAD@M JA OC@ O<MB@O@? GJJK #n:TAG

Example #DNKG<T OC@ ODOG@ JA OC@ N@>ODJI MP=MDLP@ =@ND?@ OC@ ODOG@ JA OC@ >PMM@IO <MOD>G@ <BOUCLE_rubs(RUBRIQUES)> <ul> <BOUCLE_arts(ARTICLES){id_rubrique}> <li>#_rubs:TITRE - #TITRE</li> </BOUCLE_arts> </ul> </BOUCLE_rubs>

Predefined tags 5@ C<Q@ <GM@<?T N@@I OC<O R@ ><I PN@ O<BN OJ @SOM<>O ?<O< AMJH OC@ @IQDMJIH@IO JM AMJH <I 1/* O<=G@ 2C@M@ <M@ <GNJ NJH@ JOC@M O<BN RCD>C C<Q@ OC@DM JRI @SKGD>DOGT ?@ADI@? API>ODJIN (I NP>C ><N@N OC@N@ API>ODJIN <M@ ?@>G<M@? RDOCDI 1.(. @DOC@M DI OC@ @>MDM@ KP=GD> =<GDN@N KCK ADG@ JM DI OC@ @>MDM@ =<GDN@ ?DM@>OJMT

26


# The templates '@M@ <M@ < A@R @S<HKG@N \ #NOM_SITE_SPIP M@OPMIN OC@ I<H@ JA OC@ NDO@ \ #URL_SITE_SPIP M@OPMIN OC@ NDO@ 30* RDOCJPO OC@ ADI<G \ #CHEMIN M@OPMIN OC@ K<OC JA < ADG@ #CHEMIN{javascript/ jquery.js} \ #CONFIG @I<=G@N NDO@ >JIADBPM<ODJI ?<O< OJ =@ M@OMD@Q@? JAO@I NOJM@? DI OC@ NKDK;H@O< 1/* O<=G@ @ B #CONFIG{version_installee} \ #SPIP_VERSION ?DNKG<TN OC@ Q@MNDJI JA 1.(. \ 5@ RDGG N@@ H<IT HJM@ NP>C @S<HKG@N DI OC@ AJGGJRDIB <MOD>G@N

Generic tags 1.(. JAA@MN NJH@ KJR@MAPG OJJGN AJM >M@<ODIB NK@>D<G O<BN OC<O M@AG@>O OC@ >JIO@SO JA OC@ K<B@ OC@ >PMM@IO GJJK JM NDHKGT OC@ O<BfN I<H@ (O DN KJNND=G@ OJ ?@>G<M@ < N@O JA O<BN RDOC OC@ N<H@ KM@ADS RCD>C NC<M@ < >JHHJI KMJ>@NNDIB 2C@N@ OTK@N JA O<BN <M@ ?@>G<M@? DI OC@ @>MDM@ =<GDN@ ?DM@>OJMT 2C@T <M@ NOJM@? <N *_.php ADG@N %JM @S<HKG@ \ #LOGO_ OJ ?DNKG<T OC@ GJBJN JA <I <MOD>G@ < N@>ODJI @O> #LOGO_ARTICLE #LOGO_RUBRIQUE @O> \ #URL_ OJ ?@O@MHDI@ OC@ 30* AJM < 1.(. J=E@>O NP>C <N #URL_MOT RDOCDI < MOTS GJJK \ #FORMULAIRE_ OJ ?DNKG<T < AJMH ?@ADI@? DI OC@ /formulaires ?DM@>OJMT GDF@ OC@ JI@ AJM #FORMULAIRE_INSCRIPTION

Automatic tag processes +JNO 1.(. O<BN @NK@>D<GGT DI>GP?DIB OCJN@ OC<O DIQJGQ@ M@<?DIB ?<O< AMJH OC@ ?<O<=<N@ K@MAJMH <POJH<OD> KMJ>@NN@N OJ =GJ>F H<GD>DJPN >J?@ OC<O HDBCO C<Q@ =@@I <??@? =T <MOD>G@ @?DOJMN RC@I OC@T RMJO@ OC@ <MOD>G@ .'. >J?@ JM )<Q<1>MDKO N>MDKON

27


N R@GG <N OC@N@ NO<I?<M? KMJ>@NN@N OC@M@ <M@ JOC@MN OC<O ><I =@ ?@ADI@? AJM <IT 1/* AD@G? DI JM?@M OJ NTNO@H<OD><GGT <KKGT OCJN@ KMJ>@NN@N OJ OC@ AD@G? DI LP@NODJI 2C@N@ JK@M<ODJIN <M@ ?@ADI@? DI OC@ @>MDM@ KP=GD> DIO@MA<>@N KCK ADG@ PNDIB < BGJ=<G O<=G@ ><GG@? $table_des_traitements 2C@ F@T OJ OCDN O<=G@ DN OC@ O<B I<H@ OC@ Q<GP@ =@DIB <I <NNJ>D<O@? O<=G@ \ DON F@T OC@ ADMNO $table_des_traitements['BALISE'][] @I>JPIO@M@? ?@ADI@N < KMJ>@NN M@B<M?G@NN JA OC@ O<=G@ DI LP@NODJI

\ < O<=G@;I<H@ F@T $table_des_traitements['BALISE']['table_name'] RDOCJPO OC@ O<=G@ KM@ADS ?@ADI@N < KMJ>@NN AJM < O<B DI OC<O K<MOD>PG<M O<=G@ 2C@ KMJ>@NN@N <M@ KMJQD?@? =T @IO@MDIB < >C<M<>O@M NOMDIB fonction(%s) OC<O @SKGD>DOGT M@A@M@I>@ OC@ API>ODJIN OJ =@ <KKGD@? 5DOCDI OC<O API>ODJI ><GG ^ N_ RDGG =@ M@KG<>@? =T OC@ >JIO@ION JA OC@ AD@G? $table_des_traitements['BALISE'][]= 'traitement(%s)'; $table_des_traitements['BALISE']['objets']= 'traitement(%s)';

2RJ >JHHJI PN<B@N JA <POJH<OD> ADGO@MN RCD>C C<Q@ <??DODJI<GGT =@@I ?@ADI@? RDOC >JINO<ION ><I =@ M@PN@? \ _TRAITEMENT_TYPO <KKGD@N OC@ 1.(. OTKJBM<KCD><G KMJ>@NN@N <KKGTDIB =JG? AJM @S<HKG@

\ _TRAITEMENT_RACCOURCIS <KKGD@N OC@ OTKJBM<KCD><G KMJ>@NN@N <I? OM<ING<ODJIN JA 1.(. GDIFN <??DIB OC@ COHG <OOMD=PO@ >G<NN NKDK;JPO AJM @S<HKG@

Example 2C@ #TITRE <I? #TEXTE O<BN <M@ KMJ>@NN@? <POJH<OD><GGT M@B<M?G@NN JA RCD>C JM CJR H<IT GJJKN OC@T <M@ PN@? DI <I? OC@N@ KMJ>@NN@N <M@ ?@ADI@? <N AJGGJR $table_des_traitements['TEXTE'][]= _TRAITEMENT_RACCOURCIS; $table_des_traitements['TITRE'][]= _TRAITEMENT_TYPO;

2C@ #FICHIER O<B K@MAJMHN < NK@>D<G KMJ>@NN JIGT RDOCDI < ?J>PH@ION GJJK

28


# The templates $table_des_traitements['FICHIER']['documents']= 'get_spip_doc(%s)';

Interrupting the automatic processes 2C@ N@>PMDOT KMJ>@NN@N <I? ?@ADI@? KMJ>@NN@N <KKGT <POJH<OD><GGT OJ OC@ O<BN

=PO DO DN KJNND=G@ DI < O@HKG<O@ OJ OPMI OC@H JAA AJM NK@>D<G ><N@N (I @NN@I>@

OCDN ?@GDQ@MN OC@ O<B >JIO@IO DI < HJM@ M<R AJMH<O ??DIB OC@ <NO@MDNF NPAADS OJ < O<B C<N OCDN @AA@>O // all processes #BALISE // avoid the specifically defined processes #BALISE* // avoid even the security processes #BALISE**

Example 2J ?@G<T OC@ <KKGD><ODJI JA OTKJBM<KCD><G <?EPNOH@ION <I? OC@ >JIQ@MNDJI JA 1.(. GDIFN AJM OC@ O@SO JI < K<B@ OC@ propre ADGO@M DN IJMH<GGT <KKGD@? <POJH<OD><GGT DI JM?@M OJ DIO@MKJN@ < >PNOJH ADGO@M =@AJM@ <KKGTDIB OC@ IJMH<G ADGO@M <B<DI <AO@MR<M?N TJP >JPG? ?J OCDN [<div class="texte">(#TEXTE*|special_filter|propre)</div>]

29


Useful tags to know HJIB OC@ H<IT O<BN OC<O 1.(. >JIO<DIN =T ?@A<PGO NJH@ <M@ PN@? AM@LP@IOGT @IJPBC OJ =@ RJMOC H@IODJIDIB C@M@ Name

Description

32-0(1$0 K

"C@>F <POCJMDN<ODJIN

" "'$ K

#@ADI@ OC@ ?PM<ODJI JA OC@ ><>C@

"'$+(, K

0@OMD@Q@ OC@ K<OC OJ < ADG@

#$1"0(.2(%;1(2$;1.(. 0@OPMI OC@ NDO@fN ?@N>MDKODJI K

30

$#(2 K

$?DO >JIO@IO PNDIB OC@ >M<TJIN KGPBDI

$,4 K

0@OMD@Q@ <I @IQDMJIH@IO Q<MD<=G@fN Q<GP@

$4 * K

$Q<GP<O@ <I @SKM@NNDJI PNDIB .'.

$6.-1$ K

'DBCGDBCO OC@ @G@H@IO >PMM@IOGT =@DIB M@<? DI < GDNO JM H@IP

&$2 K

0@OMD@Q@ < Q<GP@ NOJM@? RDOC < #SET

(,"*30$ K

(I>GP?@ < O@HKG<O@

(,1$02;'$ # K

2<B AJM DIN@MODIB N>MDKON DIOJ OC@ '2+* <head> N@>ODJI AJM 1.(. JM DON KGPBDIN

(,1$02;'$ #;"11 K

"11 DIN@MODJI O<B RDOCDI OC@ '2+* <head> N@>ODJI AJM KGPBDIN

(,20-#3"2(-, K

#DNKG<T <I DIOMJ?P>ODJI

* ,& K

%DI? JPO OC@ G<IBP<B@ >J?@

* ,&;#(0 K

0@OPMI OC@ RMDODIB ?DM@>ODJI

*$1 32$301 K

#DNKG<T OC@ <POCJMN JA <I <MOD>G@

+-#$*$ K

(IN@MO < HJ?@G

,-2$1 K

#DNKG<T OC@ IJO@N >M@<O@? PNDIB OC@ [[]] 1.(. GDIF

0$+ K

5MDO@ < >JHH@IO DI OC@ >J?@

1$*% K

0@OPMI OC@ 30* JA OC@ >PMM@IO K<B@

1$11(-, K

0@>JQ@M ?<O< <=JPO OC@ N@NNDJI

1$11(-,;1$2 K

#@ADI@ N@NNDJI Q<MD<=G@N


# The templates Name

Description

1$2 K

1OJM@ < Q<GP@ M@OMD@Q<=G@ RDOC #GET

4 * K

0@OPMI < Q<GP@

#AUTORISER #AUTORISER DN PN@? OJ >C@>F <>>@NN <POCJMDN<ODJIN OJ K<MOD>PG<M >JIO@IO OJ H<I<B@ NK@>DAD> ?DNKG<TN AJM >@MO<DI QDNDOJN K DN ?@QJO@? EPNO OJ OCDN OJKD>

NK@>DAD> >C<KO@M POCJMDN<ODJIN

[(#AUTORISER{action,objet,identifiant}) I am authorised ]

2C@ @SDNO@I>@ JA OCDN O<B <N RDOC OC@ #SESSION O<B B@I@M<O@N < ?DAA@M@IO ><>C@ AJM @Q@MT D?@IODAD@? QDNDOJM OJ OC@ NDO@ <I? JI@ HJM@ ><>C@ AJM PI <POC@IOD><O@? QDNDOJMN

Example "C@>F DA < QDNDOJM C<N OC@ MDBCO \ OJ QD@R < K<MOD>PG<M <MOD>G@ \ OJ HJ?DAT < K<MOD>PG<M <MOD>G@ [(#AUTORISER{voir,article,#ID_ARTICLE}) I am authorised to view the article] [(#AUTORISER{modifier,article,#ID_ARTICLE}) I am authorised to modify the article]

#CACHE #CACHE{duree} DN PN@? OJ ?@ADI@ OC@ ?PM<ODJI OC<O OC@ ><>C@ DN Q<GD? AJM <AO@M ><G>PG<ODJI JA < O@HKG<O@ @SKM@NN@? <N < IPH=@M JA N@>JI?N 5C@I OCDN ?PM<ODJI DN @S>@@?@? OC@ O@HKG<O@ DN ><G>PG<O@? <I@R

31


2CDN O<B DN B@I@M<GGT DIN@MO@? <O OC@ OJK JA O@HKG<O@N (I DON <=N@I>@ =T ?@A<PGO OC@ Q<GD?DOT ?PM<ODJI JA < K<B@ DN AJM CJPMN ?@ADI@? =T OC@ >JINO<IO _DUREE_CACHE_DEFAUT

Example #@ADI@ < ><>C@ Q<GD?DOT JA JI@ R@@F #CACHE{3600*24*7}

#CHEMIN #CHEMIN{directory/file.ext} M@OPMIN OC@ M@G<ODQ@ <??M@NN JA < ADG@ RDOCDI OC@ 1.(. CD@M<M>CT 0@A@M OJ OCDN OJKD> C@M@ 2C@ >JI>@KO JA K<OC K

Example 0@OPMI OC@ <??M@NN JA OC@ C<=DGG<B@ >NN ADG@ (A DO @SDNON DI OC@ squelettes/ AJG?@M OC<O <??M@NN RDGG =@ KMJQD?@? JOC@MRDN@ DO RDGG =@ OC@ <??M@NN JA OC@ ADG@ KM@N@IO DI OC@ squelettes-dist/ ?DM@>OJMT #CHEMIN{habillage.css}

2C@ NLP@G@OO@N ?DNO DI> C@<? COHG ADG@ PN@N DO OJ GJ<? OC@ >JMM@NKJI?DIB NOTG@NC@@O DIOJ OC@ <head> N@>ODJI JA OC@ '2+* >J?@ (A OC@ ADG@ DN AJPI?

OC@ '2+* <link> O<B DN ?DNKG<T@? [<link rel="stylesheet" href="(#CHEMIN{habillage.css}|direction_css)" type="text/ css" media="projection, screen, tv" />]

,JO@ OC<O OC@ direction_css ADGO@M DN PN@? OJ DIQ@MO OC@ RCJG@ "11 NOTG@NC@@O left OJ right <I? QD>@ Q@MN< DA OC@ >JIO@ION JA OC@ NDO@ <M@ DI < G<IBP<B@ OC<O DN RMDOO@I AMJH MDBCO OJ G@AO

32


# The templates

#DESCRIPTIF_SITE_SPIP #DESCRIPTIF_SITE_SPIP M@OPMIN OC@ ?@N>MDKODJI JA OC@ NDO@ <N ?@ADI@? JI OC@ >JIADBPM<ODJI K<B@ DI OC@ KMDQ<@ UJI@

Example (I OC@ <head> N@>ODJI JA OC@ '2+* >J?@ DO DN OC@M@=T KJNND=G@ OJ ?@ADI@ OC@ H@O< ?@N>MDKODJI PNDIB OCDN O<B K<MOD>PG<MGT PN@APG JI OC@ NDO@fN CJH@ K<B@ OC@ sommaire.html ADG@ [<meta name="description" content="(#DESCRIPTIF_SITE_SPIP|couper{150}|textebrut)" />]

2C<O OC<O OC@ couper{150} ADGO@M >PON OC@ >JIO@ION OJ OC@ ADMNO >C<M<>O@MN RCDGNO NODGG <QJD?DIB OJ >PO < K<MOD>PG<M RJM? DI C<GA OC@ textebrut ADGO@M M@HJQ@N <IT '2+* H<MFPK

#EDIT #EDIT{name_of_the_field} OCDN O<B =T DON@GA ?J@N IJOCDIB <I? M@OPMIN IJOCDIB` !PO RC@I >JPKG@? RDOC OC@ >M<TJIN KGPBDI DO H<F@N DO KJNND=G@ OJ @?DO >JIO@IO JI OC@ KP=GD> A<>DIB NDO@ DA OC@ >PMM@IO QDNDOJM DN <POCJMDN@? OJ ?J NJ (I OCDN ><N@ DO M@OPMIN OC@ I<H@N JA OC@ "11 >G<NN@N RCD>C RDGG =@ PN@? =T < E/P@MT N>MDKO NPKKGD@? =T OC<O KGPBDI <div class="#EDIT{champ}">#CHAMP</div>

Example 2J =@ <=G@ OJ @?DO OC@ ODOG@ AD@G? <h2[ class="(#EDIT{titre})"]>#TITRE</h2> <h2 class="#EDIT{titre} another_css_class">#TITRE</h2>

33


#ENV #ENV{parameter} a RCD>C R@ <??M@NN@? DI 2C@ $,4 @IQDMJIH@IO K a M@OMD@Q@N @IQDMJIH@IO Q<MD<=G@N K<NN@? DIOJ OC@ O@HKG<O@ N@>JI? <MBPH@IO DN PN@? OJ <NNDBI < ?@A<PGO Q<GP@ DA OC@ K<M<H@O@M M@LP@NO@? ?J@N IJO @SDNO DI OC@ @IQDMJIH@IO JM DA DON >JIO@ION <M@ @HKOT #ENV{parameter, default value}

2C@ K<M<H@O@M Q<GP@ M@OMD@Q@? DN <POJH<OD><GGT ADGO@M@? OCMJPBC entites_html RCD>C >JIQ@MON OC@ O@SO DIOJ <I '2+* @IODOT < < >C<M<>O@M OC@M@=T =@>JHDIB < 2J <QJD? OCDN >JIQ@MNDJI R@ ><I <KKGT <I <NO@MDNF OJ OC@ O<B #ENV*{parameter, default value}

%DI<GGT OC@ #ENV O<B EPNO =T DON@GA M@OPMIN < N@LP@IOD<G O<=G@ JA <GG JA OC@ @IQDMJIH@IO K<M<H@O@MN

Example 0@OMD@Q@ <I <MOD>G@ D?@IODAD@M JOC@MRDN@ OC@ NOMDIB I@R #ENV{id_article,new}

#DNKG<T <GG JA OC@ @IQDMJIH@IO Q<MD<=G@N PN@APG AJM ?@=PBBDIB [<pre>(#ENV**|unserialize|print_r{1})</pre>]

#EVAL #EVAL{expression} <GOCJPBC LPDO@ N@G?JH PN@? H<F@N DO KJNND=G@ OJ ?DNKG<T OC@ M@NPGON JA OC@ .'. @Q<GP<ODJI JA OC@ @SKM@NNDJI K<NN@?

Example #EVAL{3*8*12}

34


# The templates

#EVAL{_DIR_PLUGINS} #EVAL{$GLOBALS['meta']}

#EXPOSE #EXPOSE DN PN@? OJ CDBCGDBCO < M@NPGO RDOCDI < GDNO 5C@I R@ GJJK JI < O<=G@ <I? OC@ #ENV{id_table} DN KM@N@IO RDOCDI OC@ @IQDMJIH@IO JM #ID_TABLE DI < CDBC@M G@Q@G GJJK OC@I #EXPOSE RDGG M@OPMI < NK@>D<G >J?@ RC@I OC@ GJJK CDON OC@ N<H@ Q<GP@ <N OC@ D?@IODAD@M (ON NTIO<S DN #EXPOSE{text if yes} #EXPOSE{text if yes, text if no} // expose just by itself returns 'on' or '' #EXPOSE

Example *DNO OC@ <MOD>G@N DI OC@ >PMM@IO N@>ODJI <I? <NNDBI OC@ "11 >G<NN JI AJM OC@ >PMM@IO <MOD>G@ <ul> <BOUCLE_arts(ARTICLES){id_rubrique}{par num titre, titre}> <li[ class="(#EXPOSE{on})"]>#TITRE</li> </BOUCLE_arts> </ul>

Results: <ul> <li>#AUTORISER</li> ... <li>#ENV</li> <li>#EVAL</li> <li class="on">#EXPOSE</li> ...

35


</ul>

#GET #GET{variable} DN PN@? OJ M@OMD@Q@ OC@ Q<GP@ JA < GJ><G Q<MD<=G@ OC<O R<N NOJM@? PNDIB < #SET{variable, value} 1@@ <GNJ 1$2 K N@>JI? <MBPH@IO DN PN@? OJ M@OPMI < ?@A<PGO Q<GP@ DA OC@ K<M<H@O@M M@LP@NO@? ?J@N IJO @SDNO JM DA DON >JIO@ION <M@ @HKOT #GET{variable, default value}

Example (A PN@;?J>PH@IO<ODJI @LP<GN T@N H<F@ DO FIJRI #SET{use_documentation,yes} [(#GET{use_documentation}|=={yes}|yes) We use documentation! ]

#DNKG<T < GDIF OJ OC@ NDO@fN CJH@ K<B@ JQ@M <I DH<B@ ><GG@? HJI;GJBJ KIB DA OC@M@ DN JI@ JOC@MRDN@ PN@ GJBJ KIB JOC@MRDN@ PN@ OC@ NDO@ GJBJ [(#SET{image,[(#CHEMIN{mon_logo.png} |sinon{#CHEMIN{logo.png}} |sinon{#LOGO_SITE_SPIP})]})] [<a href="#URL_SITE_SPIP/">(#GET{image} |image_reduire{100})</a>]

36


# The templates #DAA@M@IOD<O@ OC@ <=N@I>@ JA <I @G@H@IO DI OC@ @IQDMJIH@IO ?@ADI@ #ENV{defalt} <N < ?@A<PGO Q<GP@ RC@I #ENV{activer} ?J@N IJO @SDNO 2J ?J OCDN OC@ is_null ADGO@M <GGJRN PN OJ O@NO DA #ENV{activer} DN IJO ?@ADI@? (A #ENV{activer} @SDNON =PO DN @HKOT DO RDGG =@ PN@? 5@ ><I OC@M@=T ?DAA@M@IOD<O@ OC@ ><N@ JA N@I?DIB <I @HKOT Q<GP@ DIOJ < AJMH <N NCJRI =@GJR RC@I OC@ Q<GP@ N@IO DN OC<O JA OC@ ^>C<HK;<>ODQ@M;IJI_ DIKPO AD@G? [(#SET{valeur,[(#ENV{activer} |is_null|?{#ENV{defaut},#ENV{activer}})]})] <input type="radio" name="activer" id="champ_activer_oui"[ (#GET{valeur}|oui)checked='checked'] value='on' /> <label for="champ_activer_oui"><:item_oui:></label> <input type="radio" name="activer" id="champ_activer_non"[ (#GET{valeur}|non)checked='checked'] value='' /> <label for="champ_activer_non"><:item_non:></label>

#INCLURE #INCLURE DN PN@? OJ <?? OC@ M@NPGON JA <I DI>GPNDJI DIOJ OC@ >PMM@IO O@HKG<O@ 5@ ><GG OCDN < NO<OD> DI>GPNDJI NDI>@ O@C M@NPGO JA OC@ >JHKDG<ODJI DN <??@? OJ OC@ >PMM@IO O@HKG<O@ DIOJ OC@ N<H@ ><>C@ ADG@ 2CDN O<B DN OC@M@AJM@ ?DAA@M@IO AMJH < ?TI<HD> DI>GPNDJI PNDIB <INCLURE.../> RCD>C >M@<O@N < N@K<M<O@ ><>C@ ADG@ RDOC DON JRI K<MOD>PG<M ><>C@ ?PM<ODJI // preferred format [(#INCLURE{fond=template_name, argument, argument=xx})] // other format, best to avoid [(#INCLURE{fond=template_name}{argument}{argument=xx})]

%MJH OC@ K@MNK@>ODQ@ JA OC@ QDND=G@ M@PGON PNDIB <INCLURE> JM #INCLURE RDGG M@NPGO DI D?@IOD><G ?DNKG<TN =PO ><PN@N LPDO@ ?DAA@M@IO JK@M<ODJIN AMJH OC@ DIO@MI<G H<I<B@H@IO KJDIO JA QD@R #TI<HD> DI>GPNDJI PNDIB <INCLURE> RDGG B@I@M<O@ HJM@ <POJIJHJPN ><>C@ ADG@N 1O<ODN DI>GPNDJI PNDIB #INCLURE >M@<O@N G@NN ADG@N =PO <GG JA OC@H <M@ G<MB@M NDI>@ OC@ ADG@ >JIO@ION <GG DI>GP?@ ?PKGD><ODJIN DI @<>C K<B@ JA OC@ ><>C@

37


Example %JM OC@ >PMM@IO O@HKG<O@ <?? OC@ >JIO@ION M@NPGODIB AMJH OC@ >JHKDG<ODJI JA OC@ DI> I<QDB<ODJI COHG O@HKG<O@ OJ RCD>C R@ RDGG K<NN D?;MP=MDLP@ <N >JIO@SO [(#INCLURE{fond=inc-navigation, id_rubrique})]

,JO@ OC@ DI>GPNDJIN inc-head <I? inc-navigation DI 1.(.fN ?@A<PGO O@HKG<O@N <M@ ><GG@? PNDIB ?TI<HD> DI>GPNDJIN <I? IJO NO<OD> JI@N <N NCJRI DI OCDN @S<HKG@

#INSERT_HEAD #INSERT_HEAD @IO@M@? =@OR@@I OC@ '2+* <head> <I? </head> H<MFPK O<BN DN PN@? OJ <POJH<OD><GGT <?? DI >@MO<DI )<Q<1>MDKO N>MDKON 1JH@ N>MDKON <M@ <GM@<?T <??@? DI =T ?@A<PGO =T 1.(. E/P@MT AJM @S<HKG@ <I? JOC@MN <M@ DIN@MO@? =T Q<MDJPN KGPBDIN 0@A@M OJ OC@ N@>ODJIN <=JPO OC@ DIN@MO;C@<? K <I? ELP@MT;KGPBDIN K KDK@GDI@N RCD>C O<GF APMOC@M <=JPO <??DIB DI NP>C N>MDKON 2J <?? DI <??DODJI<G "11 >J?@ DO DN =@OO@M OJ PN@ OC@ #INSERT_HEAD_CSS O<B <I? OC@ DIN@MO;C@<?;>NN K KDK@GDI@ (I 1.(.fN ?@A<PGO O@HKG<O@N OCDN O<B DN DIN@MO@? <O OC@ @I? JA OC@ O@HKG<O@ I<H@? NLP@G@OO@N ?DNO DI> C@<? COHG

#INSERT_HEAD_CSS #INSERT_HEAD_CSS DIN@MO@? =@OR@@I OC@ <head> <I? </head> '2+* 2<BN @I<=G@N KGPBDIN OJ <?? "11 N>MDKON =T PNDIB OC@ DIN@MO;C@<?;>NN K KDK@GDI@ (A OCDN O<B ?J@N IJO @SDNO DI OC@ O@HKG<O@ ADG@ OC@I #INSERT_HEAD RDGG <?? OC@ >JIO@ION JA OC@ KDK@GDI@ DON@GA (I 1.(.fN ?@A<PGO O@HKG<O@ ADG@N OCDN O<B DN DIN@MO@? EPNO =@AJM@ OC@ habillage.css "11 ADG@ DI NLP@G@OO@N ?DNO DI> C@<? COHG 2CDN H@<IN OC<O BM<KCD><G OC@H@N OC<O JQ@MGJ<? OCDN habillage.css ADG@ ><I @LP<GGT =@ JQ@MGJ<?@? PNDIB "11 =T ?@>G<M<ODJIN <??@? =T OC@ >JMM@NKJI?DIB DINO<GG@? KGPBDIN

38


# The templates

#INTRODUCTION #INTRODUCTION ?DNKG<T <I @SOM<>O JA OC@ >JIO@ION JA <I 1/* O@SO AD@G? DA OC@ O<=G@ C<N NP>C < AD@G? %JM <MOD>G@N OCDN @SOM<>O DN ?M<RI AMJH OC@ !MD@A ?@N>MDKODJI AD@G? @GN@ AMJH OC@ 1O<I?ADMNO DIOMJ?P>ODJI AD@G? @GN@ AMJH OC@ 2@SO AD@G? 2C@ @SOM<>O ><I <GNJ =@ @SKGD>DOGT ?@ADI@? RC@I RMDODIB OC@ >JIO@IO

=T AM<HDIB DO RDOC <intro> <I? </intro> H<MFPK O<BN I <MBPH@IO DN PN@? OJ ?@ADI@ OC@ H<SDHPH G@IBOC JA OC@ DIOMJ?P>ODJI #INTRODUCTION{length}

Example .MJQD?@ OC@ '2+* H@O< O<B ?@N>MDKODJI RDOC <I DIOMJ?P>OJMT O@SO <=JPO OC@ <MOD>G@ K<B@N @S<HKG@ DI NLP@G@OO@N ?DNO <MOD>G@ COHG <BOUCLE_principale(ARTICLES) {id_article}> ... [<meta name="description" content="(#INTRODUCTION{150}|attribut_html)" />] ... </BOUCLE_principale>

#DNKG<T OC@ HJNO M@>@IO <MOD>G@N RDOC <I DIOMJ?P>ODJI JA OC@DM >JIO@ION <B_articles_recents> <h2><:derniers_articles:></h2> <ul> <BOUCLE_articles_recents(ARTICLES) {!par date} {0,10}> <li> <h3><a href="#URL_ARTICLE">#TITRE</a></h3> [<div class="#EDIT{intro} introduction">(#INTRODUCTION)</div>] </li> </BOUCLE_articles_recents> </ul> </B_articles_recents>

39


#LANG #LANG ?DNKG<TN OC@ G<IBP<B@ >J?@ O<F@I AMJH OC@ @G@H@IO OC<O DN >GJN@NO OJ OC@ O<B (A OC@ O<B DN GJ><O@? RDOCDI < GJJK #LANG RDGG M@OPMI OC@ 1/* G<IB AD@G? AMJH OC@ GJJK DA DO @SDNON JOC@MRDN@ DO RDGG M@OPMI OC<O JA OC@ #ENV{lang} @IQDMJIH@IO <I? A<DGDIB OC<O OC@ G<IBP<B@ >J?@ AJM OC@ NDO@fN H<DI G<IBP<B@ #CONFIG{langue_site} #LANG* DN PN@? OJ M@OPMI JIGT OC@ G<IBP<B@ JA OC@ GJJK JM OC@ @IQDMJIH@IO (A IJI@ DN ?@ADI@? OC@I OC@ O<B ?J@NIfO M@OPMI <ITOCDIB OC<O DN DO ?J@NIfO @Q@I M@OPMI OC@ NDO@fN KMDI>DK<G G<IBP<B@

Example #@ADI@ OC@ G<IBP<B@ DI OC@ '2+* O<B AJM OC@ K<B@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">

#@ADI@ OC@ G<IBP<B@ DI <I 011 A@@? <I @S<HKG@ AMJH NLP@G@OO@N ?DNO =<>F@I? COHG <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/ content/" > <channel[ xml:lang="(#LANG)"]> <title>[(#NOM_SITE_SPIP|texte_backend)]</title> ... <language>#LANG</language> <generator>SPIP - www.spip.net</generator> ... </channel> </rss>

40


# The templates

#LANG_DIR #LANG_DIR M@OPMIN OC@ RMDODIB ?DM@>ODJI AJM < O@SO ?@K@I?DIB JI DON G<IBP<B@

=@DIB @DOC@M GOM AJM G@AO OJ MDBCO JM MOG AJM MDBCO OJ G@AO N RDOC OC@ #LANG O<B OC@ G<IBP<B@ DN O<F@I AMJH OC@ >GJN@NO GJJK >JIO<DIDIB < G<IB AD@G?

JOC@MRDN@ AMJH OC@ @IQDMJIH@IO JOC@MRDN@ AMJH OC@ NDO@fN KMDI>DK<G G<IBP<B@ 2CDN O<B DN Q@MT PN@APG AJM HPGOD GDIBP<G NDO@N OC<O HDS G<IBP<B@N C<QDIB ?DAA@M@IO RMDODIB ?DM@>ODJIN GDF@ $IBGDNC <I? M<= AJM @S<HKG@

Example #DNKG<T OC@ O@SO AJM < N@>ODJI DI OC@ ?DM@>ODJI OC<O DO NCJPG? =@ DI <BOUCLE_display_content(RUBRIQUES){id_rubrique}> <div dir='#LANG_DIR'>#TEXTE</div> </BOUCLE_display_content>

#LESAUTEURS #LESAUTEURS ?DNKG<TN OC@ GDNO JA <POCJMN JA <I <MOD>G@ JM NTI?D><O@? <MOD>G@

N@K<M<O@? =T >JHH<N 5C@I OC@ 1/* AD@G? G@N<PO@PMN ?J@N IJO @SDNO AJM OC@ O<=G@ M@LP@NO@? <N AJM OC@ <MOD>G@N O<=G@ OCDN O<B GJ<?N < AJMH<OODIB HJ?@G NLP@G@OO@N ?DNO HJ?@G@N G@N<PO@PMN COHG

Example 5DOCDI <I ARTICLES GJJK ?DNKG<T OC@ <POCJMN <small>[<:par_auteur:> (#LESAUTEURS)]</small>

#MODELE #MODELE{nom} DIN@MON OC@ M@NPGON JA < O@HKG<O@ >JIO<DI@? DI OC@ modeles/ ?DM@>OJMT 2C@ D?@IODAD@M JA OC@ K<M@IO GJJK DN K<NN@? =T ?@A<PGO RDOC OC@ D? K<M<H@O@M OJ OCDN >J?@ DI>GPNDJI ??DODJI<G <MBPH@ION ><I =@ K<NN@?

41


// preferred format [(#MODELE{name, argument=xx, argument})] // other format, to be avoided [(#MODELE{name}{argument=xx}{argument})]

2C@N@ DI>GPNDJIN H<T <GNJ =@ ><GG@? RDOCDI OC@ O@SO JA <I <MOD>G@ RDOC OC@ >JMM@>O NK@>DAD> AJMH<O ><GG // XX is the identified of the object to pass. <nameXX> // arguments using | (pipes) <nameXX|argument=xx|argument2=yy>

Example *DNO OC@ Q<MDJPN OM<ING<ODJI G<IBP<B@N AJM <I <MOD>G@ RDOC < GDIF AJM @<>C JA OC@H OJ <>>@NN OCJN@ OM<ING<O@? <MOD>G@N <BOUCLE_art(ARTICLES){id_article}> #MODELE{article_traductions} </BOUCLE_art>

#NOTES #NOTES ?DNKG<TN OC@ IJO@N N@IO OJ OC@ =JOOJH JA OC@ K<B@ RCD>C C<Q@ =@@I ><G>PG<O@? ?PMDIB OC@ ?DNKG<T JA OC@ KM@>@?DIB O<BN ,JR RC@I < O<B AJM RCD>C R@ ><G>PG<O@ 1.(. GDIFN RDOC OC@ propre ADGO@M JM RDOC <I <POJH<OD> KMJ>@NN

>JIO<DIN NJH@ IJO@N OC@N@ IJO@N RDGG =@ ?DNKG<T@? =T OC@ #NOTES O<B <AO@M OC@T C<Q@ =@@I ><G>PG<O@? [(#BALISE|propre)] #TEXTE #NOTES

42


# The templates Details about notes (O DN OC@ traiter_raccourcis() API>ODJI ><GG@? =T OC@ propre ADGO@M RCD>C @S@>PO@N OC@ inc_notes_dist() API>ODJI DI OC@ @>MDM@ DI> IJO@N KCK ADG@

RCD>C O@HKJM<MDGT NOJM@N OC@ IJO@N DI H@HJMT 5C@I OC@ #NOTES O<B DN <>OP<GGT ><GG@? OC@N@ IJO@N <M@ M@OPMI@? <I? OC@I @HKOD@? AMJH H@HJMT (H<BDI@ OC@M@ DN < O@SO DI OC@ 1O<I?ADMNO DIOMJ?P>ODJI <I? DI OC@ 2@SO JA <I <MOD>G@ <N NCJRI =@GJR // Introductory text : In the intro, there is one [[Note A]] and another note [[Note B]] // Main text: In the text, there is one [[Note C]] and another note [[Note D]]

#PMDIB OC@ ?DNKG<T JA < O@HKG<O@ OC@N@ ORJ NTIO<S@N <=JQ@ RDGG KMJ?P>@ ?DAA@M@IO >JIO@ION 2C@ ADMNO RDGG ?DNKG<T OC@ IJO@N IPH=@M@? AMJH OJ <AO@M OC@ >JIO@ION JA OC@ O@SO <BOUCLE_art(ARTICLES){id_article}> #CHAPO #TEXTE #NOTES </BOUCLE_art>

(I OCDN N@>JI? AJMH<O =@GJR OC@ IJO@N JA OC@ DIOMJ <M@ ?DNKG<T@? ADMNO IPH=@M@? AMJH OJ <AO@M OC@ >JIO@ION JA OC@ #CHAPO O<B <I? OC@I OC@ IJO@N AMJH OC@ O@SO <GNJ IPH=@M@? AMJH OJ <M@ ?DNKG<T@? <AO@M OC@ >JIO@ION JA OC@ #TEXTE O<B <BOUCLE_art(ARTICLES){id_article}> #CHAPO #NOTES #TEXTE #NOTES </BOUCLE_art>

43


Example "<GGDIB OC@ IJO@N DN JAO@I ?JI@ <AO@M <GG OC@ JOC@M AD@G?N AJM <I <MOD>G@ RCD>C RDGG O<F@ DIOJ >JIND?@M<ODJI <GG OC@ IJO@N OC<O C<Q@ =@@I ><G>PG<O@? 2C@ ?DNKG<T OC@H DN LPDO@ NDHKG@ [<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]

#REM #REM DN PN@? AJM >JHH@IODIB >J?@ RDOCDI OC@ O@HKG<O@N [(#REM) This is NOT a pipe! It's just a comment]

Note: 2C@ >J?@ >JIO<DI@? DI OC@ O<B DN IJI@OC@G@NN DIO@MKM@O@? =T 1.(. =PO IJOCDIB DN ?DNKG<T@? ADGO@M AJPI? JI OC@ O<B RDGG @AA@>ODQ@GT =@ ><GG@? RCD>C DN IJO I@>@NN<MDGT RC<O TJP RJPG? GDF@ OJ C<KK@I [(#REM|filtre)] [(#REM) [(#BALISE|filtre)] ]

#SELF #SELF M@OPMIN OC@ 30* JA OC@ >PMM@IO K<B@ 2CDN 30* ><I JIGT =@ >JMM@>OGT ><G>PG<O@? DI <I DI>GPNDJI DA OC@ self JM env K<M<H@O@M C<N =@@I K<NN@? DI JM?@M OJ >M@<O@ < ?DAA@M@IO ><>C@ AJM @<>C JA OC@ 30*N <INCLURE{fond=xx}{env} />

44


# The templates

#SESSION #SESSION{parameter} ?DNKG<TN ?<O< <=JPO OC@ >JII@>O@? QDNDOJM

N@NNDJI

><I =@ >JIND?@M@? <N DI?DQD?P<G ?<O< NOJM@? JI OC@ N@MQ@M RCDG@ OC@ QDNDOJM DN >JII@>O@? N NP>C OC@N@ ?<O< ><I =@ M@OMD@Q@? <I? M@PN@? RC@I OC@ QDNDOJM >C<IB@N K<B@N 2C@ @SDNO@I>@ JA OCDN O<B <N RDOC OC@ #AUTORISER O<B B@I@M<O@N < ?DAA@M@IO ><>C@ AJM @<>C <POC@IOD><O@? QDNDOJM JI OC@ NDO@ <I? JI@ HJM@ ><>C@ AJM OC@ IJI <POC@IOD><O@? QDNDOJMN

Example #DNKG<T OC@ I<H@ JA OC@ QDNDOJM DA DO DN FIJRI #SESSION{nom}

#DNKG<T < IJOD>@ DA OC@ QDNDOJM DN <POC@IOD><O@? OC<O DN DA OC@ QDNDOJM C<N <I id_auteur Q<GP@ [(#SESSION{id_auteur}|oui) You have been authenticated]

#SESSION_SET 2C@ #SESSION_SET{parameter, Q<MD<=G@N AJM < QDNDOJM

#SESSION{parameter}

value} O<B DN PN@? OJ ?@ADI@ N@NNDJI

RCD>C

><I

OC@I

=@

M@OMD@Q@?

PNDIB

Example #@ADI@ < AG<QJPM <N Q<IDGG< #SESSION_SET{flavour,vanilla} #SESSION{flavour}

45


#SET #SET{variable,value} DN NP@? OJ NOJM@ Q<GP@N GJ><GGT RDOCDI < O@HKG<O@ 2C@T <M@ M@OMD@Q<=G@ RDOCDI OC@ N<H@ O@HKG<O@ PNDIB #GET{variable} 1@@ <GNJ &$2 K

Example 1OJM@ < >JGJPM @SDNODIB DI OC@ @IQDMJIH@IO JOC@MRDN@ < ?@A<PGO >JGJPM #SET{light,##ENV{light_colour,edf3fe}} #SET{dark,##ENV{dark_colour,3874b0}} <style class="text/css"> #contenu h3 { color:[(#GET{light})]; } </style>

#VAL #VAL{valeur} DN PN@? OJ M@OPMI OC@ Q<GP@ K<NN@? <N <I <MBPH@IO 2CDN O<B DN H<DIGT PN@? OJ N@I? < ADMNO <MBPH@IO OJ NJH@ @SDNODIB ADGO@MN #VAL{This text will be returned}

Example 0@OPMI < >C<M<>O@M PNDIB OC@ .'. API>ODJI chr [(#VAL{91}|chr)] [(#VAL{93}|chr)]

// [ // ]

1JH@ODH@N OC@ 1.(. >JHKDG@M B@ON HDS@? =@OR@@I OC@ NLP<M@ =M<>F@ON OC<O R@ R<IO OJ NCJR <N O@SO >C<M<>O@MN <I? OC@ JK@IDIB <I? >GJNDIB NLP<M@ =M<>F@ON AJM O<BN >JHHJI @S<HKG@ DN N@I?DIB < O<=G@ K<M<H@O@M OJ < AJMH name="field[]" RC@I OC@ AD@G? DN DI>GP?@? DIND?@ < GJJK // problem: the ] for field[] is confused

46


# The templates // with the closing of the #ENV tag [(#ENV{afficher}|oui) <input type="hidden" name="champ[]" value="valeur" /> ] // no problem here below [(#ENV{afficher}|oui) <input type="hidden" name="champ[(#VAL{91}|chr)][(#VAL{93}|chr)]" value="valeur" /> ]

47


Criteria for loops 3N@ >MDO@MD< DI GJJKN OJ NK@>DAT NDHKG@ JM >JHKG@S N@G@>ODJI >JI?DODJIN

Criteria syntax 2C@ >MDO@MD< AJM GJJKN <M@ RMDOO@I =@OR@@I =M<>@N EPNO <AO@M OC@ I<H@ JA OC@ O<=G@ <BOUCLE_name(TABLE){criterion1}{criterion2}...{criterion n}>

IT 1/* AD@G? DI < O<=G@ ><I =@>JH@ < N@G@>ODJI >MDO@MDJI N@K<M<O@? =T <I JK@M<OJM !PO JOC@M >MDO@MD< ><I =@ >M@<O@? RC@I I@>@NN<MT 2C@T <M@ ?@ADI@? DI OC@ @>MDM@ KP=GD> >MDO@M@N KCK ADG@ 1JH@ O<BN ><I <GNJ =@ PN@? <N >MDO@MD< K<M<H@O@MN =PO DO DN IJO KJNND=G@ OJ PN@ OC@DM JKODJI<G >JHKJI@ION (I B@I@M<G OC@ PN<B@ JA =M<>F@ON DN IJO KJNND=G@ <BOUCLE_name(TABLE){id_table=#TAG}> OK <BOUCLE_name(TABLE){id_table=(#TAG|filter)}> OK <BOUCLE_name(TABLE){id_table=[(#TAG)]}> Will fail

Example 2CDN ARTICLES GJJK C<N >MDO@MD< 2C@ ADMNO N@G@>ON OC@ <MOD>G@N RC@M@ OC@ D?;MP=MDLP@ 1/* AD@G? DI OC@ NKDK;<MOD>G@N 1/* O<=G@ @LP<GN 2C@ N@>JI? >MDO@MDJI NK@>DAD@N OC<O OC@ M@NPGON NCJPG? =@ NJMO@? =DI JM?@M JA OCJN@ <MOD>G@Nf ODOG@N <BOUCLE_arts(ARTICLES){id_rubrique=8}{par titre}> - #TITRE<br /> </BOUCLE_arts>

48


# The templates

Short-cut criteria >MDO@MDJI ><I NJH@ODH@N =@ RMDOO@I DI < NDHKGDAD@? AJMH {criterion} (I NP>C ><N@N 1.(. IJMH<GGT OM<ING<O@N OCDN <N DA DO R@M@ {criteria=#CRITERIA} PIG@NN < NK@>D<G API>ODJI C<N =@@I ?@ADI@? AJM OCDN K<MOD>PG<M >MDO@MDJI DI @>MDM@ KP=GD> >MDO@M@N KCK <BOUCLEx(TABLES){criterion}>...

Example <BOUCLE_art(ARTICLES){id_article}>...

(I

OCDN

@S<HKG@

H<F@N

{id_article}

{id_article=#ID_ARTICLE}

)PNO

<N

RDOC

OC@ <IT

N@G@>ODJI 1.(.

O<B

#ID_ARTICLE DN M@OMD@Q@? DA KM@N@IO AMJH OC@ >GJN@NO >JIO<DIDIB GJJKN

JOC@MRDN@ DO DN M@OMD@Q@? AMJH OC@ @IQDMJIH@IO <N DA TJP C<? RMDOO@I #ENV{id_article}

Simple operators GG >MDO@MD< K@MAJMHDIB N@G@>ODJIN =<N@? JI 1/* AD@G?N C<Q@ < >@MO<DI IPH=@M JA JK@M<OJMN <Q<DG<=G@ AJM OC@DM PN@ {field operator value}

'@M@ DN < GDNO JA OC@ NDHKG@ JK@M<OJMN \ = @LP<GDOT JK@M<OJM {id_rubrique=8} N@G@>ON M@>JM?N RDOC D?;MP=MDLP@ @LP<G OJ \ > NOMD>OGT BM@<O@M OC<I JK@M<OJM {id_rubrique>8} N@G@>ON M@>JM?N RDOC D?;MP=MDLP@ BM@<O@M OC<I \ >= BM@<O@M JM @LP<G JK@M<OJM {id_rubrique>=8} N@G@>ON M@>JM?N RDOC D?;MP=MDLP@ BM@<O@M OC<I JM @LP<G OJ \ < NOMD>OGT G@NN@M OC<I JK@M<OJM {id_rubrique<8} N@G@>ON M@>JM?N RDOC D?;MP=MDLP@ G@NN OC<I \ <= G@NN@M JM @LP<G JK@M<OJM {id_rubrique<=8} N@G@>ON M@>JM?N RDOC D?;MP=MDLP@ G@NN OC<I JM @LP<G OJ

49


\ != IJO @LP<G JK@M<OJM {id_rubrique!=8} N@G@>ON M@>JM?N RDOC D?;MP=MDLP@ ?DAA@M@IO AMJH

The IN operator 2C@M@ <M@ NJH@ JOC@M JK@M<OJMN OC<O <GGJR AJM HJM@ NK@>DAD> N@G@>ODJIN 2C@ IN JK@M<OJM N@G@>ON M@>JM?N =<N@? JI < GDNO JA KJNND=G@ H@H=@M @G@H@ION 2C@ GDNO ><I @DOC@M =@ BDQ@I =T < >JHH< N@K<M<O@? GDNO JA >C<M<>O@MN =T <I <MM<T O<=G@ M@OPMI@? =T < O<B JM =T < O<B JM O<B ADGO@M <BOUCLEx(TABLES){field IN a,b,c}> <BOUCLEx(TABLES){field IN #ARRAY{0,a,1,b,2,c}}> <BOUCLEx(TABLES){field IN (#VAL{a:b:c}|explode{:})}>

2C@ DIQ@MN@ JK@M<OJM !IN N@G@>ON M@>JM?N OC<O C<Q@ AD@G? Q<GP@N OC<O ?J IJO H<O>C <IT JA OCJN@ GDNO@? <AO@M OC@ JK@M<OJM <BOUCLEx(TABLES){field !IN a,b,c}>

Example 1@G@>O OC@ DH<B@N GDIF@? OJ <I <MOD>G@ <BOUCLE_documents(DOCUMENTS){id_article}{extension IN png,jpg,gif}> - #FICHIER<br /> </BOUCLE_documents>

1@G@>O OC@ N@>ODJIN @S>@KO AJM NK@>DAD> JI@N <BOUCLE_sections(RUBRIQUES){id_rubrique !IN 3,4,5}> - #TITRE<br /> </BOUCLE_sections>

50


# The templates

The == operator 2C@ == JK@M<OJM JM DON DIQ@MN@ !== PN@ PN@? AJM N@G@>ODIB M@>JM?N =<N@? JI M@BPG<M @SKM@NNDJIN 2C@T ><I OC@M@AJM@ @I<=G@ @SOM@H@GT NK@>DAD> N@G@>ODJI >MDO@MD< =PO H<T <GNJ =@ LPDO@ M@NJPM>@ DIO@INDQ@ AJM OC@ ?<O<=<N@ H<I<B@M <BOUCLEx(TABLES){field == expression}> <BOUCLEx(TABLES){field !== expression}>

Example 1@G@>O <MOD>G@N RDOC < ODOG@ OC<O NO<MON RDOC 2C@ JM OC@ <BOUCLE_arts(ARTICLES){titre == ^[Ttl]he}> - #TITRE<br /> </BOUCLE_arts>

1@G@>O <MOD>G@ O@SON OC<O ?J IJO >JIO<DI OC@ RJM? ><MIDQ<G <BOUCLE_arts(ARTICLES){texte !== 'carnival'}> - #TITRE<br /> </BOUCLE_arts>

1@G@>O <MOD>G@ O@SON OC<O >JIO<DI OC@ RJM? ><MIDQ<G =PO JIGT DA AJGGJR@? =T OC@ RJM? 4@ID>@ RDOCDI >C<M<>O@MN <BOUCLE_arts(ARTICLES){texte == 'carnival.{0,20}Venice'}> - #TITRE<br /> </BOUCLE_arts>

The "!" operator "JI?DODJI<G >MDO@MD< JA NDHKG@ I@B<ODJI RC@I JK@M<ODIB JI AD@G?N OC<O <M@ @SO@MI<G OJ OC@ O<=G@ AD@G?N <>>@NN@? =T < EJDI OJ <IJOC@M O<=G@ ?J IJO <GR<TN ?J RC<O JI@ HDBCO OCDIF <O ADMNO N <I @S<HKG@ OC@ >MDO@MD< {titre_mot!=rose} N@G@>ON AJM <I

02("*$1

GJJK <GG OC@ <MOD>G@N RCD>C <M@ IJO GDIF@? OJ OC@ F@TRJM? MJN@ 'JR@Q@M OC@ OTK@ JA 1/* EJDI >M@<O@? N@G@>ON JIGT <MOD>G@N GDIF@? OJ <O G@<NO JI@ F@TRJM?

<I? RC@M@ <O G@<NO JI@ JA OCJN@ F@TRJM?N DN IJO MJN@

51


!PO DI HJNO ><N@N R@ RJPG? NDHKGT =@ OMTDIB OJ ?DNKG<T <GG <MOD>G@N OC<O ?J IJO C<Q@ OC@ F@TRJM? MJN@ M@B<M?G@NN JA RC@OC@M OC@T C<? <IT JOC@M F@TRJM?N JM IJO 2C<O DN OC@ M@NPGO KMJ?P>@? =T < >J?@ PNDIB {!criterion} 2C@ >J?@ =@GJR KMJ?P>@N < ?JP=G@ 1/* LP@MT <BOUCLE_articles(ARTICLES){!titre_mot = 'X'}> ...

%DMNO <MOD>G@N RDOC F@TRJM? 6 <M@ N@G@>O@? OC@I OC@T <M@ M@HJQ@? AMJH OC@ H<DI 1/* M@>JM? N@G@>ODJI =T PN@ JA < NOT IN (selection criteria) JI OC@ <>OP<G 1/* ?<O<=<N@ LP@MT 2CDN IJO<ODJI DN @LP<GGT Q<GD? RC@I TJP R<IO OJ AJM>@ < EJDI AD@G? RCD>C >JPG? =@ RMDOO@I <N AJGGJRN <BOUCLE_articles(ARTICLES){!mots.titre = 'X'}> ...

Example 1@G@>O OC@ N@>ODJIN RCD>C C<Q@ IJ <MOD>G@ RCJN@ ODOG@ NO<MON RDOC <I * JM <I G ,JO@ CJR@Q@M OC<O OCDN LP@MT PN@N < M@BPG<M @SKM@NNDJI ^[Ll] RCD>C RDGG M@LPDM@ HJM@ ><G>PG<ODJI ODH@ AMJH OC@ ?<O<=<N@ H<I<B@M <BOUCLE_rub(RUBRIQUES){!articles.titre == '^[Ll]'}> ...

Optional criteria 1JH@ODH@N DOfN PN@APG OJ H<F@ < N@G@>ODJI JIGT DA OC@ @IQDMJIH@IO >JIO<DIN OC@ M@LP@NO@? O<B %JM @S<HKG@ R@ HDBCO CJK@ OJ ADGO@M OC@ GJJKN =<N@? JI < K<MOD>PG<M N@<M>C =PO JIGT DA < N@<M>C C<N =@@I K@MAJMH@? JOC@MRDN@ ?DNKG<T @Q@MTOCDIB (I NP>C < ><N@ < OM<DGDIB LP@NODJI H<MF DN PN@? OJ M@LP@NO NP>C <I <>ODJI <BOUCLEx(TABLES){criterion?}>...

52


# The templates Example #DNKG<T @DOC@M <GG OC@ <MOD>G@N JA OC@ NDO@ DA OC@M@ DN IJ id_article

id_rubrique JM recherche Q<MD<=G@ <KK<M@IO JM K@MAJMH < N@G@>ODJI =<N@? JI OC@ >MDO@MD< OC<O <M@ KM@N@IO (I OCDN R<T DA R@ ><GG OC@ O@HKG<O@ RDOC OC@ id_rubrique=8 <I? recherche=extra K<M<H@O@MN OC@ GJJK RDGG N@G@>O JIGT OC@ <MOD>G@N OC<O H<O>C OC@N@ >MDO@MD< <BOUCLE_art(ARTICLES){id_article?}{id_rubrique?}{recherche?}> - #TITRE<br /> </BOUCLE_art>

Optional criteria with operators 2C@ PN@ JA JKODJI<G >MDO@MD< H<T =@ >JH=DI@? RDOC OC@ PN@ JA JK@M<OJMN PI?@M >@MO<DI NK@>DAD> >JI?DODJIN (I K<MOD>PG<M DO DN I@>@NN<MT AJM OC@ Q<MD<=G@ RCD>C DN =@DIB O@NO@? DI OC@ @IQDMJIH@IO OJ C<Q@ OC@ N<H@ I<H@ <N OC@ >MDO@MD< AJM @S<HKG@ X DI {X ?operator #ENV{X}}

IT JK@M<OJM ><I =@ PN@? C@M@ <I? TJP JIGT

I@@? OJ <AADS < ? OJ OC@ N@G@>O@? JK@M<OJM G@<QDIB IJ NK<>@ =@OR@@I OC@ ? <I? OC@ JK@M<OJM (I OC@ AJGGJRDIB @S<HKG@N OC@ O@NO DN K@MAJMH@? JIGT DA OC@ Q<MD<=G@ DN KM@N@IO DI OC@ @IQDMJIH@IO -OC@MRDN@ OC@ >MDO@MDJI DN DBIJM@? <BOUCLEx(TABLES){myvar <BOUCLEx(TABLES){myvar <BOUCLEx(TABLES){myvar <BOUCLEx(TABLES){myvar

?operator #ENV{myvar}}> ?== ^#ENV{myvar}$}> ?!IN #ENV{myvar}}> ?LIKE %#ENV{myvar}%}>...

Example 2J N@G@>O OC@ HJNO M@>@IO <MOD>G@N =PO RDOC <I c@<MGD@M KP=GDNCDIB ?<O@d KMDJM OJ OC@ JI@ DI OC@ >PMM@IO @IQDMJIH@IO JM A<DGDIB OC<O NDHKGT OC@ HJNO M@>@IO <MOD>G@N PN@ OCDN GJJK <ul>

53


<BOUCLE_art(ARTICLES){date_redac ?< #ENV{date_redac}}{!par date}{0, 10}> <li>#TITRE</li> </BOUCLE_art> <ul>

54


# The templates

Tag filters KKGTDIB ADGO@MN <GGJRN TJP OJ >C<IB@ OC@ JPOKPO B@I@M<O@? =T 1.(. O<BN

Filter syntax %DGO@MN <M@ <KKGD@? OJ O<BN =T PNDIB OC@ cVd KDK@ >C<M<>O@M 2C@DM @AA@>O DN OJ ><GG < .'. API>ODJI RC@OC@M JI@ RCD>C DN DI=PDGO JM JI@ RCD>C DN ?@>G<M@? RDOCDI 1.(. [(#TAG|filter)] [(#TAG|filter{argument2, argument3, ...})]

5C@I@Q@M < ADGO@M cSd DN M@LP@NO@? 1.(. GJJFN AJM < API>ODJI ><GG@? cADGOM@;Sd (A DO ?J@N IJO ADI? JI@ DO GJJFN AJM cADGOM@;S;?DNOd <I? OC@I cSd (O OC@I MPIN OC@ API>ODJI OC<O DO C<N AJPI? K<NNDIB <IT <MBPH@ION (O DN DHKJMO<IO OJ PI?@MNO<I? OC<O OC@ ADMNO <MBPH@IO N@IO OJ OC@ ADGO@M <I? OC@M@AJM@ OJ OC@ .'. API>ODJI DN OC@ M@NPGO JA OC@ >JHKJI@IO OJ OC@ DHH@?D<O@ G@AO JA OC<O ADGO@M 2CPN OC@ @S<HKG@ <=JQ@ NCJRN OC@ ADGO@MfN K<M<H@O@M GDNO <N <MBPH@IO <MBPH@IO @O>

Example (IN@MO < title <OOMD=PO@ JI < GDIF 2J ?J OCDN R@ PN@ OC@ |couper ADGO@M RCD>C <GGJRN PN OJ >PO < O@SO ?JRI OJ < M@LP@NO@? G@IBOC <I? OC@ |attribut_html ADGO@M RCD>C <GGJRN PN OJ <KKGT @N><K@ N@LP@I>@ >C<M<>O@MN OJ <KJNOMJKC@N OC<O HDBCO ><PN@ KMJ=G@HN RDOC OC@ B@I@M<O@? '2+* >J?@ @S<HKG@ title='David's book' RJPG? ><PN@ < KMJ=G@H =@><PN@ JA OC@ @H=@??@? <KJNOMJKC@ 2C@ |couper ADGO@M DN <KKGD@? OJ OC@ M@NPGO JA OC@ #TITRE O<B <I? OC@ |attribut_html ADGO@M DN <KKGD@? OJ OC@ M@NPGO JA OC@ |couper ADGO@M 2CDN DN CJR ADGO@MN ><I =@ >C<DI@? <a href="#URL_ARTICLE" title="[(#TITRE|couper{80}|attribut_html)]">Next article</a>

55


Filters derived from PHP classes G@NN R@GG FIJRI >J?DIB O@>CIDLP@ H<F@N DO KJNND=G@ OJ <GNJ @S@>PO@ < .'. >G<NN H@OCJ? 5C@I M@LP@NO@? OJ KMJ>@NN < ADGO@M RMDOO@I <N cS Td 1.(. RDGG GJJF AJM < cADGO@M;Sd .'. >G<NN RDOC <I @S@>PO<=G@ cTd H@OCJ? (A DO ?J@NIfO ADI? JI@ DO RDGG OC@I GJJF AJM < >G<NN cADGOM@;S;?DNOd <I? OC@I ADI<GGT AJM < >G<NN cSd [(#TAG|class::method)]

Example *@OfN DH<BDI@ < .'. >G<NN C<N =@@I ?@ADI@? <N NCJRI =@GJR (O >JIO<DIN < M@>PMNDQ@ API>ODJI RCD>C ><G>PG<O@N A<>OJMD<GN x! = x*(x-1)*(x-2)*...*3*2*1 class Math{ function factorial($n){ if ($n==0) return 1; else return $n * Math::factorial($n-1); } }

(O >JPG? =@ ><GG@? RDOCDI 1.(. <N AJGGJRN [(#VAL{9}|Math::factorial)] // returns 362880

Comparison filters )PNO GDF@ OC@ >MDO@MD< PN@? AJM GJJKN >JHK<MDNJI ADGO@MN ><I =@ <KKGD@? OJ O<BN OJJ RDOC OC@ AJGGJRDIB NTIO<S [(#BALISE|operator{value})]

'@M@ DN < GDNO JA OC@ JK@M<OJMN \ == >JIADMHN @LP<GDOT \ != \ >

56


# The templates \ >= \ < \ <=

Example [(#TITRE|=={Chocolate}|oui) Some chocolate! ] [(#TEXTE|strlen|>{200}|oui) This text is longer than 200 characters! ]

[(#TITRE|=={Chocolate}) Some chocolate!] RJPG? DA OC@ O@NO @Q<GP<O@N OJ OMP@ ?DNKG<T c 1JH@ >CJ>JG<O@ d NDI>@ DI?D><O@N < true Q<GP@ DI .'. !PO <??DIB OC@ |oui ADGO@M %M@I>C AJM T@N <GGJRN TJP OJ CD?@ OC@ M@NPGON JA OC@ O@NO

Search and replace filters 2C@M@ <M@ NJH@ ADGO@MN OC<O <GGJR TJP OJ K@MAJMH >JHK<MDNJIN JM N@<M>C@N AJM >JHKJI@ION 2CDN DN OC@ ><N@ AJM OC@ VH<O>C <I? VM@KG<>@ ADGO@MN \ match DN PN@? OJ O@NO DA OC@ <MBPH@IO K<NN@? Q@MDAD@N < M@BPG<M @SKM@NNDJI K<NN@? <N OC@ ADGO@MfN N@>JI? <MBPH@IO \ replace DN PN@? OJ M@KG<>@ O@SO <I? DN <GNJ AJGGJR@? =T < M@BPG<M @SKM@NNDJI [(#BALISE|match{text})] [(#BALISE|replace{text,other text})]

Example // displays "texte yes" [(#VAL{A good text}|match{text}) yes ] // displays "yes" [(#VAL{A good text}|match{text}|oui) yes ]

57


// doesn't display anything [(#VAL{A good house}|match{text}) non ] // displays "yes" [(#VAL{A good house}|match{text}|non) yes ] // displays "A fine cat" [(#VAL{A fine house}|replace{house,cat})]

Filters for testing 2C@M@ <M@ N@Q@M<G ADGO@MN PN@? AJM O@NON <I? GJBD><G JK@M<ODJIN 2C@N@ <M@ OC@ ADGO@MN NDIJI @GN@ DI %M@I>C JPD IJI @O JP SJP RCD>C <M@ B@I@M<GGT PN@? DI HJNO ><N@N \ |?{vrai,faux} M@OPMIN A<PS A<GN@ DI %M@I>C DA RC<O DN DIKPO OJ OC@ ADGO@M DN @HKOT JM IPGG JOC@MRDN@ DO M@OPMIN QM<D OMP@ DI %M@I>C OCDN HDBCO =@ =@OO@M DIO@MKM@O@? DI $IBGDNC <N =JJG@<I;?J@N;OCDN;C<Q@;<;Q<GP@ \ |sinon{this text} M@OPMIN OCDN O@SO JIGT DA RC<O DN DIKPO OJ OC@ ADGO@M DN @HKOT JOC@MRDN@ DO NDHKGT M@OPMIN OC<O N<H@ DIKPO OCDN HDBCO =@ =@OO@M DIO@MKM@O@? DI $IBGDNC <N =PO;DA;@HKOT;KPO;OCDN DINO@<? \ |oui M@OPMIN @DOC@M < NK<>@ JM IJOCDIB (O DN @LPDQ<G@IO OJ |?{' ',''} or |?{' '} <I? DN PN@? OJ M@OPMI < IJI @HKOT >JIO@IO < NK<>@ OJ DI?D><O@ OC<O OC@ JKODJI<G K<MON JA OC@ O<BN NCJPG? =@ ?DNKG<T@? \ |non DN OC@ JKKJNDO@ JA |oui <I? DN @LPDQ<G@IO OJ |?{'',' '} \ |et DN PN@? OJ >JIADMH OC@ @SDNO@I>@ JA @G@H@ION GJBD><G ,# \ |ou DN PN@? OJ >JIADMH OC@ @SDNO@I>@ JA @DOC@M JM @G@H@ION GJBD><G -0 \ |xou DN PN@? OJ >JIADMH OC@ @SDNO@I>@ JA JI@ <I? JIGT JI@ JA OC@ ORJ @G@H@ION GJBD><G 6-0 (I <??DODJI 1.(. RDGG <GNJ PI?@MNO<I? OC@ $IBGDNC @LPDQ<G@ION AJM OC@N@ T@N

IJO JM <I? <I? SJM

58


# The templates Example // display the short description if it exists, otherwise the start of the text [(#CHAPO|sinon{#TEXTE|couper{200}})] // displays "This title is long" only if the title is longer than 30 characters [(#TITRE|strlen|>{30}|oui) This title is long ] [(#CHAPO|non) There is no short description ] [(#CHAPO|et{#TEXTE}) There is a short description, and a text ] [(#CHAPO|et{#TEXTE}|non) The two do not exist at the same time ] [(#CHAPO|ou{#TEXTE}) There is either a short description, a text, or both ] [(#CHAPO|ou{#TEXTE}|non) There is neither one nor the other ] [(#CHAPO|xou{#TEXTE}) There is one, or the other, but not both, and not neither ] [(#CHAPO|xou{#TEXTE}|non) There is either neither or both, but not just one of the two ]

59


Includes 2J A<>DGDO<O@ OC@ H<DIO@I<I>@ JA B@I@M<O@? >J?@ DO DN DHKJMO<IO OJ =@ <=G@ OJ NC<M@ M@ PN<=G@ >J?@ 2CDN DN <>CD@Q@? OCMJPBC OC@ PN@ JA DI>GP?@? >J?@ N@BH@ION

Includes within the templates "M@<ODIB <I? PNDIB DI>GP?@N OC@N@ =@DIB NK@>DAD> M@PN<=G@ >J?@ N@BH@ION

H<F@N DO @<ND@M OJ H<DIO<DI TJPM O@HKG<O@N (I B@I@M<G KM<>OD>@ >@MO<DI N@BH@ION JA OC@ '2+* K<B@N JI TJPM NDO@ <M@ D?@IOD><G M@B<M?G@NN JA OC@ OTK@ JA K<B@ DI LP@NODJI 2CDN DN JAO@I OC@ ><N@ RC@I ?DNKG<TDIB < KJMOAJGDJ JA DH<B@N AJM < I<QDB<ODJI H@IP AJM F@TRJM?N <OO<>C@? OJ < N@>ODJI JM <I <MOD>G@

AJM H@O< O<BN DI OC@ '2+* =J?T JM NO<I?<M? AJJO@M O@SO <I? GDIFN <O OC@ =JOOJH JA @<>C QDND=G@ K<B@ IT @SDNODIB 1.(. O@HKG<O@ >J?@ ><I =@ DI>GP?@? RDOCDI <IJOC@M PNDIB OC@ AJGGJRDIB NTIO<S <INCLURE{fond=file_name}{passed parameters} />

2TKD><GGT OC@ JIGT K<M<H@O@MN K<NN@? <M@ PNP<GGT OC@ >PMM@IO JM < NK@>DAD> D?;MP=MDLP@ D?;<MOD>G@ JM NDHDG<M D?@IODAD@M OC@ >PMM@IO JM < NK@>DAD> G<IBP<B@ >J?@ JM OC@ F@TRJM? ?JP=GJIN OJ K@MHDO < ?<O< >JIO@SO OJ M@>JBIDN@ <I JQ@MG<KKDIB @IQDMJIH@IO<G ?<O< ?PKGD><ODJI

Passing parameters to includes 7JP ><I K<NN JI@ JM HJM@ K<M<H@O@MN OJ >J?@ N@BH@ION OC<O C<Q@ =@@I DI>GP?@? DI < O@HKG<O@ !T ?@A<PGO IJOCDIB DN K<NN@? OJ DI>GP?@? >J?@ @S>@KO OC@ ><G>PG<ODJI ?<O@ 2J K<NN K<M<H@O@MN OJ OC@ >JHKDG<ODJI >JIO@SO JA OC@ O@HKG<O@ OC@T HPNO =@ @SKGD>DOGT ?@>G<M@? RC@I ><GGDIB OC@ DI>GP?@ <INCLURE{fond=include_template}{parameter} /> <INCLURE{fond=include_template}{parameter=value} />

60


# The templates 2C@ ADMNO @S<HKG@ RDOC {parameter} JIGT M@OMD@Q@N OC@ Q<GP@ JA #PARAMETER <I? K<NN@N DO OJ OC@ >JHKDG<ODJI >JIO@SO DI OC@ Q<MD<=G@ parameter 2C@ N@>JI? @S<HKG@ <NNDBIN < NK@>DAD> Q<GP@ OJ OC<O param Q<MD<=G@ (I =JOC ><N@N RDOCDI OC@ DI>GP?@? >J?@ R@ ><I M@OMD@Q@ OC@ Q<GP@ =T M@A@M@I>@ PNDIB #ENV{parameter}

Passing the entire current context 2C@ {env} K<M<H@O@M ><I =@ PN@? OJ K<NN OC@ @IODM@ O@HKG<O@ >JHKDG<ODJI >JIO@SO OJ OC@ >J?@ OC<O DN =@DIB DI>GP?@?

Example // file A.html <INCLURE{fond=B}{type}{mot=triton} /> // file B.html <INCLURE{fond=C}{env}{couleur=rouge} /> // file C.html Type : #ENV{type} <br /> Keyword : #ENV{mot} <br /> Colour : #ENV{couleur}

(A R@ ><GG OC@ K<B@ spip.php?page=A&type=animal OC<O RJPG? K<NN OC@ type <I? mot K<M<H@O@MN OJ OC@ B.html O@HKG<O@ N@BH@IO 2CDN OCDM? @S<HKG@ K<NN@N @Q@MTOCDIB DO C<N M@>@DQ@? <I? <??N <IJOC@M K<M<H@O@M couleur RC@I DO ><GGN OC@ C.html O@HKG<O@ N@BH@IO 5DOCDI OC@ C.html O@HKG<O@ R@ OC@I N@@ OC<O DO DN KJNND=G@ OJ M@OMD@Q@ <GG JA OC@ K<M<H@O@MN OC<O C<Q@ =@@I K<NN@?

61


Ajax 1.(. <GGJRN TJP OJ @<NDGT M@GJ<? K<MON JA < K<B@ PNDIB ) 6

AJAX Paginations (I>GP?@N RCD>C C<Q@ OC@ {ajax} >MDO@MD< <M@ PN@? OJ M@GJ<? JIGT OC@ K<MO JA OC@ K<B@ OC<O C<N =@@I DI>GP?@? +JNO JA OC@ ODH@ TJP HPNO <GNJ DI>GP?@ OC@ {env} >MDO@MD< RC@I@Q@M OC@M@ DN < K<BDI<ODJI H@>C<IDNH RDOCDI OC@ DI>GP?@? >J?@ <INCLURE{fond=inclure/fichier}{env}{ajax} />

5C@I R@ >JH=DI@ OCDN DI>GP?@ >MDO@MD< RDOC OC@ #PAGINATION O<B OC@ K<BDI<ODJI GDIFN RDGG OC@I <POJH<OD><GGT =@>JH@ ) 6 GDIFN +JM@ NK@>DAD><GGT

<GG JA OC@ GDIFN DI OC@ DI>GP?@? O@HKG<O@ >J?@ <M@ >JIO<DI@? RDOCDI < "11 >G<NN I<H@? <N pagination <p class="pagination">#PAGINATION</p>

Example *DNO OC@ ADQ@ HJNO M@>@IO <MOD>G@N 2CDN DI>GP?@ GDNON OC@ HJNO M@>@IO <MOD>G@N DI BMJPKN JA <I? ?DNKG<TN < K<BDI<ODJI =GJ>F <INCLURE{fond=modeles/list_recent_articles}{env}{ajax} />

2C@ ADG@ modeles/list_recent_articles.html PN@N <B_art> #ANCRE_PAGINATION <ul> <BOUCLE_art(ARTICLES){!par date}{pagination 5}> <li><a href="#URL_ARTICLE">#TITRE</a></li> </BOUCLE_art> </ul> <p class="pagination">#PAGINATION</p> </B_art>

62


# The templates Results: E<S K<BDI<ODJI DI BMJPKN JA <a id="pagination_art" name="pagination_art"/> <ul> <li><a href="Recursivite,246" title="art246">RÊcursivitÊ</a></li> <li><a href="Parametre" title="art245">Paramètre</a></li> ... </ul> <p class="pagination"> <strong class="on">0</strong> <span class="separateur">|</span> <a rel="nofollow" class="lien_pagination noajax" href="Paginations-AJAX?debut_art=5#pagination_art">5</a> <span class="separateur">|</span> <a rel="nofollow" class="lien_pagination noajax" href="PaginationsAJAX?debut_art=10#pagination_art">10</a> <span class="separateur">|</span> ... <a rel="nofollow" class="lien_pagination noajax" href="PaginationsAJAX?debut_art=205#pagination_art">...</a> </p>

AJAX links (I <??DODJI OJ OC@ DI>GP?@N OC<O >JIO<DI < K<BDI<ODJI H@>C<INDH DO DN KJNND=G@ OJ NK@>DAT GDIFN OJ =@ M@GJ<?@? PNDIB ) 6 =T <??DIB OC@ "11 >G<NNajax OJ OCJN@ GDIFN <a class="ajax" href="[(#URL_ARTICLE|parametre_url{tous,oui})]">Display all</a>

63


Example <INCLURE{fond=modeles/list_articles}{env}{ajax} />

2C@ ADG@ modeles/list_articles.html #DNKG<TN JM CD?@N OC@ DIOMJ?P>ODJI OJ <MOD>G@N <ul> <BOUCLE_art(ARTICLES){!par date}{0,5}> <li>#TITRE [(#ENV{afficher_introduction}|=={oui}|oui) <div>#INTRODUCTION</div> ] </li> </BOUCLE_art> </ul> [(#ENV{afficher_introduction}|=={oui}|oui) <a class="ajax" href="[(#SELF|parametre_url{afficher_introduction,''})]">Hide the introductions</a> ] [(#ENV{afficher_introduction}|=={oui}|non) <a class="ajax" href="[(#SELF|parametre_url{afficher_introduction,oui})]">Display the introductions</a> ]

64


# The templates

Linguistic elements 2C@ H<I<B@H@IO <I? OC@ >M@<ODJI JA HPGODGDIBP<G >JIO@IO DN <GR<TN < ?@GD><O@ OCDIB OJ JMB<IDN@ 5@ RDGG N@@ DI OCDN N@>ODJI CJR OJ H<I<B@ OC@ HPGODGDIBP<G DIO@MA<>@ 1.(. C<N OJ H<I<B@ OC@ DIO@MA<>@ O@SON LPDO@ ?DNODI>O AMJH @?DOJMD<G >JIO@IO JA ORJ @G@H@ION G<IBP<B@ NOMDIBN ><GG@? D?DJHN <I? < HPGODGDIBP<G O<B ><GG@? KJGTBGJO

The syntax of language strings *<IBP<B@ NK@>DAD> NOMDIBN FIJRI <N D?DJHN RDOCDI 1.(. <M@ OC@ >J?@N AJM OC@ @SDNODIB OM<ING<ODJIN DI OC@ ADG@N NOJM@? DI OC@ lang/ ?DM@>OJMD@N JA 1.(. AJM KGPBDIN JM AJM NK@>DAD> O@HKG<O@ ADG@N 2J M@A@M@I>@ < G<IBP<B@ NOMDIB TJP JIGT I@@? OJ FIJR DON >JMM@NKJI?DIB >J?@ <:bouton_ajouter:> <:navigation:>

2C@ B@I@M<G NTIO<S DN <:key:> <:prefix:key:>

2C@ KM@ADS AJM < KGPBDI DN OC@ KM@ADS OC<O OC<O KGPBDI C<N ?@>D?@? OJ PN@ AJM DON 1/* O<=G@N @O>

Language files 2C@ G<IBP<B@ ADG@N <M@ NOJM@? DI OC@ lang/ ?DM@>OJMD@N 2C@N@ <M@ .'. ADG@N I<H@? RDOC < KM@ADS <I? < G<IBP<B@ >J?@ prefix_xx.php

Content of the files 2C@N@ .'. ADG@N @<>C ?@>G<M@ < H<KKDIB O<=G@ $<>C F@T C<N DON >JMM@NKJI?DIB Q<GP@ IT <I? <GG KMJ=G@H<OD> G<IBP<B@ >C<M<>O@MN <M@ OM<IN>MD=@? PNDIB OC@ '2+* I<H@N AJM <>>@IO@? G@OO@MN AJM @S<HKG@ <I? NJH@ G<IBP<B@N C<Q@ OC@ Q<GP@N RMDOO@I DI C@S<?@>DH<G @ B AJM )<K<I@N@ '@=M@R @O>

65


<?php $GLOBALS[$GLOBALS['idx_lang']] = array( 'key' => 'value', 'key2' => 'value2', // ... );

Example '@M@ DN <I @SOM<>O AMJH OC@ %M@I>C G<IBP<B@ ADG@ AJM OC@ O@HKG<O@ JA OCDN NDO@ documentation_fr.php <?php $GLOBALS[$GLOBALS['idx_lang']] = array( //C 'choisir'=>'Choisir...', 'conception_graphique_par'=>'Thème graphique adapté de ', //E 'en_savoir_plus' => 'En savoir plus !', //... );

2C@ @LPDQ<G@IO @SOM<>O AMJH OC@ documentation_en.php RJPG? GJJF GDF@ OCDN

$IBGDNC

Q@MNDJI

<?php $GLOBALS[$GLOBALS['idx_lang']] = array( //C 'choisir'=>'Select...', 'conception_graphique_par'=>'Graphical theme based on ', //E 'en_savoir_plus' => 'Find out more!', //... );

66


# The templates

Using the language codes IT G<IBP<B@ D?DJH @SO@MI<GGT ?@ADI@? >C<M<>O@M NOMDIBN ><I =@ M@A@M@I>@? DI < 1.(. O@HKG<O@ ADG@ PNDIB OCDN NTIO<S <:prefix:code:>

Looking for a code in several files (O DN KJNND=G@ OJ N@<M>C AJM < >J?@ DI N@Q@M<G G<IBP<B@ ADG@N !T ?@A<PGO DA OC@ KM@ADS C<N IJO =@@I NPKKGD@? 1.(. RDGG GJJF DI OC@ local_xx.php ADG@N OC@I OC@ spip_xx.php ADG@N <I? ADI<GGT OC@ ecrire_xx.php ADG@N (A DO ?J@N IJO ADI? OC@ >J?@ DI OC@ G<IBP<B@ M@LP@NO@? DO OC@I GJJFN DI OC@ %M@I>C G<IBP<B@ (A DO NODGG ?J@N IJO ADI? OC@ >J?@ DO RDGG ?DNKG<T OC@ G<IBP<B@ >J?@ DON@GA =PO M@KG<>DIB PI?@MN>JM@ >C<M<>O@MN RDOC NK<>@N 7JP ><I NK@>DAT OC<O OC@ N@<M>C NCJPG? JK@M<O@ JQ@M N@Q@M<G ADG@N RDOC OC@ AJGGJRDIB NTIO<S <:prefix1/prefix2/.../prefixN:choisir:>

Overloading a language file 2J JQ@MGJ<? OC@ G<IBP<B@ DO@HN <GM@<?T KM@N@IO DI < 1.(. G<IBP<B@ ADG@ AJM @S<HKG@ ecrire/lang/spip_xx.php JM DI < KGPBDI G<IBP<B@ ADG@ lang/ plugin_prefix_xx.php TJP JIGT I@@? OJ >M@<O@ < squelettes/ local_xx.php ADG@ <I? DIN@MO <IT HJ?DAD@? JM I@R DO@HN DIOJ OC<O ADG@ 1.(. <POJH<OD><GGT PN@N NP>C GJ><G ADG@N <N O<FDIB KM@>@?@I>@ JQ@M OC@ JOC@MN H@IODJI@? <=JQ@ 1P>C <I JK@M<ODJI DN JAO@I PN@? AJM GJ><G@ NK@>DAD> JQ@MMD?@N AJM DINO<I>@ DI %M<I>@ OC@M@ <M@ M@BDJI<G ?DQDNDJIN FIJRI <N ?YK<MO@H@ION <I? MYBDJIN

RC@M@<N DI 1RDOU@MG<I? DO HDBCO =@ HJM@ <KKMJKMD<O@ OJ M@I<H@ OC<O N<H@ AD@G? <N < ><IOJI

Example 1@G@>O OC@ MDBCO ?J>PH@IO<ODJI <:documentation:choisir:>

67


(A bouton_ajouter DN IJO AJPI? DI OC@ ?J>PH@IO<ODJI G<IBP<B@ ADG@

OC@I GJJF AJM DO DI OC@ NKDK G<IBP<B@ ADG@ <I? A<DGDIB OC<O DI OC@ @>MDM@ G<IBP<B@ ADG@ <:documentation/spip/ecrire:bouton_ajouter:>

The complete syntax of language codes 2C@ >JHKG@O@ NTIO<S DN <N NCJRI =@GJR <:prefixe:code{param=value}|filtre{params}:>

Parameters 2C@ G<IBP<B@ >J?@N ><I M@>@DQ@ K<M<H@O@MN RCD>C RDGG =@ DIN@MO@? DIOJ OC@ Q<GP@N <O OC@ ODH@ JA OM<ING<ODJI 2C@ K<M<H@O@MN <M@ OC@I RMDOO@I DI OC@ G<IBP<B@ ADG@N =@OR@@I <O @ NDBIN G<IBP<B@ >J?@ HDBCO OC@M@AJM@ =@ 'creer_fichier'=>'Create the @fichier@ file?',

Calling with parameters 5@ >JPG? ><GG OCDN K<M<H@O@M <N =@GJR <:documentation:creer_fichier{fichier=tete_de_linote.txt}:>

Filtering language codes (OfN IJO < >JHHJIGT PN@? KM<>OD>@ =PO DO DN KJNND=G@ OJ K<NN G<IBP<B@ >J?@N OCMJPBC ADGO@MN EPNO <N DA OC@T R@M@ 1.(. O<BN AJM @S<HKG@ <:documentation:long_item_description|couper{80}:>

Using language codes in PHP API>ODJI C<N =@@I >M@<O@? DI .'. OJ M@OMD@Q@ OC@ OM<ING<ODJIN JA OC@ G<IBP<B@ >J?@N _T

68


# The templates (O DN PN@? Q@MT NDHKGT <N NCJRI =@GJR _T('code'); _T('prefix:code'); _T('prefix1/.../prefixN:code'); _T('prefix:code', array('param'=>'value'));

Character strings during development 7JP H<T NJH@ODH@N MPI DIOJ OC@ _L API>ODJI RCD>C DN PN@? OJ NDBIDAT "C<M<>O@M NOMDIB OJ =@ <NNDBI@? < G<IBP<B@ >J?@ RC@I ?@Q@GJKH@IO DN I@<MGT ADIDNC@? 2C@ B@I@M<G D?@< DN OC<O ?PMDIB ?@Q@GJKH@IO JA 1.(. JM KGPBDI API>ODJI<GDOT OC@ G<IBP<B@ NOMDIBN H<T >C<IB@ LPDO@ AM@LP@IOGT (I JM?@M OJ ?DNODIBPDNC NOMDIBN RCD>C C<Q@ <GM@<?T =@@I OM<ING<O@? DI OC@ G<IBP<B@ ADG@N AMJH OCJN@ OC<O C<Q@ EPNO M@>@IOGT =@@I >M@<O@? R@ B@I@M<GGT <KKGT OC@ _L API>ODJI _L('This text will need to be codified and translated!');

5C@I OC@ >J?@ ?@Q@GJKH@IO C<N NO<=DGDN@? < N@<M>C OCMJPBC OC@ >J?@ AJM PN@N JA OC@ ;* API>ODJI H<F@N DO @<NT OJ M@KG<>@ NP>C >C<M<>O@M NOMDIBN RDOC <KKMJKMD<O@ G<IBP<B@ >J?@N <I? OC@I PN@ OC@ _T API>ODJI DINO@<?

Example 2C@ 2D>F@ON KGPBDI C<N < G<IBP<B@ ADG@ I<H@? lang/tickets_fr.php RCD>C >JIO<DIN <HD?NO JOC@M >J?@ $GLOBALS[$GLOBALS['idx_lang']] = array( // ... 'ticket_enregistre' => 'Ticket saved', );

5C@I NJH@JI@ >M@<O@N < I@R OD>F@O OC@ A@@?=<>F AJMH DI?D><O@N OC<O DO C<N <>OP<GGT =@@I N<Q@? =T N@I?DIB OC@ G<IBP<B@ NOMDIB OJ OC@ message_ok K<M<H@O@M JA OC@ OD>F@O RMDODIB AJMH $message['message_ok'] = _T('tickets:ticket_enregistre'); // being = "Ticket enregistré" if it were in French.

69


Polyglots (multi tags) <multi> O<B DI OC@ '2+* N@IN@ JA OC@ RJM? PN<=G@ =JOC AJM O@HKG<O@N <I? DI >JIO@IO RMDOO@I =T @?DOJMN H<F@N DO KJNND=G@ OJ N@G@>O < K<MOD>PG<M KD@>@ JA O@SO =<N@? JI OC@ M@LP@NO@? JM >PMM@IOGT ?@A<PGO G<IBP<B@ (O DN RMDOO@I DI OC@ AJMH NCJRI =@GJR <multi>[fr]en franรงais[en]in english</multi>

2CDN H@<IN OC<O HPGODGDIBP<G @G@H@ION ><I @<NDGT =@ RMDOO@I RDOCDI O@HKG<O@N RDOCJPO I@@?DIB OJ PN@ G<IBP<B@ >J?@N <I? NOMDIBN <N ?DN>PNN@? DI KM@QDJPN <MOD>G@N DI OCDN N@>ODJI

Usage by content editors 2CDN NTIO<S DN HJNOGT @HKGJT@? =T >JIO@IO @?DOJMN JM OCMJPBC H@<IN JA < ?<O< @IOMT KGPBDI OC<O ?J@N OC@ RJMF <POJH<OD><GGT OJ OM<ING<O@ < NDO@ RC@I OC@M@ <M@ JIGT < A@R JM G<IBP<B@N OJ =@ OM<ING<O@? <multi> DN OC@M@AJM@ HJM@ B@I@M<GGT PN@? JI OC@ >JIO@IO >M@<ODJI ND?@ M<OC@M OC<I DI >JINOMP>ODJI JA OC@ O@HKG<O@N (A NP>C < <multi> =GJ>F ?J@N IJO >JIO<DI <I @IOMT AJM < NK@>DAD@? G<IBP<B@ OC@I OC@ ADMNO @IOMT RDOCDI OC<O =GJ>F RDGG =@ PN@? <N OC@ ?@A<PGO

70


# The templates

Multilingualism 1.(. DN ?@NDBI@? OJ H<I<B@ < HPGODGDIBP<G R@=NDO@ 7JP ><I ?DNODIBPDNC ?DAA@M@IO KJNND=DGDOD@N AJM RC<O < HPGODGDIBP<G R@=NDO@ H@<IN \ '<QDIB OC@ G<IBP<B@ JA OC@ DIO@MA<>@ OC<O <?<KON OJ OC@ QDNDOJM AJM @S<HKG@ ?DNKG<TDIB ?<O@N JM RMDODIB RJM?N DI OC@ >JMM@>O ?DM@>ODJI

\ '<QDIB >JIO@IO DI HPGODKG@ G<IBP<B@N IJO EPNO OC@ DIO@MA<>@ AJM @S<HKG@ < Q@MNDJI JA OC@ NDO@ DN DI %M@I>C <IJOC@M DI $IBGDNC

\ -M RCT IJO < HDSOPM@ JA =JOC DIO@MA<>@ DI M<=D> RDOC O@SO DI %M@I>C 1.(. C<N Q<MDJPN OJJGN <I? NTIO<S@N OJ <>CD@Q@ <GG OC@N@ @I?N

Multilingual possibilities 2C@M@ <M@ < IPH=@M JA R<TN JA ?@Q@GJKDIB < HPGODGDIBP<G NDO@ RDOC 1.(. AJM @S<HKG@ \ >M@<O@ < N@>OJM < N@>ODJI <O OC@ MJJO JA OC@ NDO@ AJM @<>C G<IBP<B@ RDOC >JHKG@O@GT <POJIJHJPN >JIO@IO

\ >M@<O@ OC@ NDO@ DI OC@ KMDI>DK<G G<IBP<B@ <I? ?@ADI@ OM<ING<ODJIN JA OC@ <MOD>G@N DI OC@ Q<MDJPN G<IBP<B@ N ?@NDM@?

\ JM @Q@I ?@ADI@ OC@ G<IBP<B@ AJM @<>C N@>ODJI JA OC@ NDO@ JM AJM @<>C <MOD>G@ $<>C JA OC@N@ NJGPODJIN C<N DON JRI <?Q<IO<B@N <I? ?DN<?Q<IO<B@N <I? OC@ R@=H<NO@MfN >CJD>@ JA RCD>C H@OCJ? OJ PN@ RDGG G<MB@GT IJO <AA@>O OC@ >JINOMP>ODJI JA OC@ O@HKG<O@ ADG@N NLP@G@OO@N (I OC@ AJGGJRDIB K<B@N R@ RDGG M@QD@R NJH@ JA OC@ OJJGN PN@? =T OC@ K<B@ O@HKG<O@N AJM ?@GDQ@MDIB HPGODGDIBP<G >JIO@IO

More I @S>@GG@IO ?DN>JPMN@ JI HPGODGDIBP<GDNH R<N >JHKDG@? =T G@S<I?M< &PD?@M?JID AJM OC@ 1.(. .<MOT DI "G@MHJIO %@MM<I? DI 0@<?DIB DO RDGG =@I@ADO <ITJI@ RCJ RDNC@N OJ PI?@MNO<I? OC@ NP=OG@OD@N JM RCJ I@@?N OJ <NF OC@HN@GQ@N OC@ MDBCO LP@NODJIN ?PMDIB OC@ >JINOMP>ODJI JA < HPGODGDIBP<G NDO@ DI %M@I>C JIGT COOK RRR BPD?@M?JID I@O 1.(. @O G

71


The language of the environment 1.(. K<NN@N OC@ G<IBP<B@ M@LP@NO@? =T OC@ NDO@ QDNDOJM OJ OC@ ADMNO O@HKG<O@

RCD>C ><I =@ M@>JQ@M@? =T PNDIB OC@ #ENV{lang} API>ODJI RDOCDI < O@HKG<O@ !T ?@A<PGO OCDN RDGG =@ OC@ KMDI>DK<G G<IBP<B@ JA OC@ NDO@ =PO DN HJ?DAD<=G@ PNDIB OC@ #MENU_LANG AJMH RCD>C GDNON OC@ KM@?@O@MHDI@? G<IBP<B@N AJM TJPM NDO@fN HPGODGDIBP<G >JIO@IO 5C@I@Q@M TJP PN@ OC@ #MENU_LANG AJMH OC@ G<IBP<B@ N@G@>O@? DN N<Q@? DI < >JJFD@ <I? < M@?DM@>ODJI DN H<?@ AJM OC@ >PMM@IO K<B@ RDOC OC@ lang 30* K<M<H@O@M N@O OJ OC@ N@G@>O@? G<IBP<B@ 2C@ lang K<M<H@O@M OC<O DN K<NN@? RDGG OC@I =@ <>>@NND=G@ =T 1.(. (O RDGG OC@I <GNJ =@ KJNND=G@ OJ PN@ OC@ >JJFD@ G<O@M OJ AJM>@ OC@ ?DNKG<T G<IBP<B@ 2C@ G<IBP<B@ H<T JOC@MRDN@ =@ NK@>DAD@? @SKGD>DOGT RDOCDI < O@HKG<O@ ADG@ =T PNDIB OC@ lang >MDO@MDJI <INCLURE{fond=A}{lang=en} />

The language of an object "@MO<DI @?DO<=G@ J=E@>ON DI 1.(. GDF@ N@>ODJIN <I? <MOD>G@N AJM DINO<I>@ C<Q@ < G<IBP<B@ AD@G? NOJM@? DI OC@DM >JMM@NKJI?DIB 1/* O<=G@N RCD>C H<F@ DO KJNND=G@ OJ NK@>DAT DI RCD>C G<IBP<B@ OC@T C<Q@ =@@I RMDOO@I JM OJ RCD>C G<IBP<B@ OC@T =@GJIB 5@ ><I ADI? JPO OC@ G<IBP<B@ JA OC@ >PMM@IO N@>ODJI JM <MOD>G@ =T PNDIB OC@ #LANG O<B RDOCDI < RUBRIQUES JM ARTICLES GJJK 5C@I OC@ >PMM@IO N@>ODJI ?J@N IJO C<Q@ < NK@>DAD> G<IBP<B@ <NNDBI@? OC@I OC<O JA DON K<M@IO N@>ODJI DN M@OPMI@? <I? A<DGDIB OC<O OC@ KMDI>DK<G G<IBP<B@ JA OC@ NDO@

Example #DNKG<T OC@ <MOD>G@N <I? OC@ G<IBP<B@N JA OC@ ADMNO N@>ODJIN DI OC@ NDO@ Your language: #ENV{lang}

72


# The templates <B_rubs> <ul> <BOUCLE_rubs(RUBRIQUES){racine}{0,2}> <li>#TITRE : #LANG <B_arts> <ul> <BOUCLE_arts(ARTICLES){id_rubrique}> <li>#TITRE : #LANG</li> </BOUCLE_arts> </ul> </B_arts> </li> </BOUCLE_rubs> </ul> </B_rubs>

Results: Votre langue : fr <ul> <li>en : en <ul> <li>Notes about this documentation : en</li> </ul> </li> <li>fr : fr <ul> <li>Notes sur cette documentation : fr</li> </ul> </li> </ul>

Special language criteria 1JH@ NK@>D<G GJJK >MDO@MD< H<F@ DO KJNND=G@ OJ M@OMD@Q@ <MOD>G@N DI < NK@>DAD><GGT ?@NDM@? G<IBP<B@

lang %DMNO JA <GG OC@ LPDO@ NDHKG@ {lang} >MDO@MD< @I<=G@N PN OJ N@G@>O OC@ QDNDOJMfN G<IBP<B@ JM < NK@>DAD> G<IBP<B@

73


// language of the visitor <BOUCLE_art(ARTICLES){lang}> ... </BOUCLE_art> // English language (en) <BOUCLE_art(ARTICLES){lang=en}> ... </BOUCLE_art>

traduction 2C@ {traduction} >MDO@MD< @I<=G@N PN OJ GDNO OC@ Q<MDJPN OM<ING<ODJIN JA <I <MOD>G@ <BOUCLE_article(ARTICLES){id_article}> <ul> <BOUCLE_traductions(ARTICLES) {traduction}{par lang}> <li>[(#LANG|traduire_nom_langue)]</li> </BOUCLE_traductions> </ul> </BOUCLE_article>

(I OCDN ><N@ <GG OC@ OM<ING<ODJIN JA <I <MOD>G@ RDGG =@ ?DNKG<T@? DI>GP?DIB OC@ >PMM@IO <MOD>G@ RCD>C ><I =@ @S>GP?@? =T NK@>DAD><GGT <??DIB OC@ {exclus} >MDO@MD<

origine_traduction 2CDN >MDO@MD< @I<=G@N PN OJ M@OMD@Q@ OC@ JMDBDI<G NJPM>@ <MOD>G@ AJM < K<MOD>PG<M OM<ING<O@? <MOD>G@ OC<O =@DIB OC@ JI@ OC<O N@MQ@N <N M@A@M@I>@ OJ OC@ JOC@M OM<ING<ODJIN 2J NCJR <GG JA OC@ NJPM>@ <MOD>G@N PN@ <BOUCLE_sources(ARTICLES) {origine_traduction}> #TITRE (#LANG)<br /> </BOUCLE_sources>

2J NCJR OC@ JMDBDI<G OM<ING<ODJI AJM <I <MOD>G@ OC@ JI@ DI OC@ >PMM@IO >JIO@SO <BOUCLE_article(ARTICLES){id_article}> <BOUCLE_origine(ARTICLES) {origine_traduction}> #TITRE (#LANG) </BOUCLE_origine> </BOUCLE_article>

74


# The templates Example #DNKG<T <I <MOD>G@ DI OC@ QDNDOJMfN G<IBP<B@ RC@M@ KJNND=G@ <I? DA IJO OC@I DI OC@ KMDI>DK<G G<IBP<B@ 5@ NO<MO =T GDNODIB AJM < N@>ODJI <GG OC@ <MOD>G@N RCD>C N@MQ@ <N NJPM>@N AJM OC@ >M@<ODJI JA OM<ING<ODJIN 5@ OC@I >JIODIP@ =T >C@>FDIB DA < OM<ING<ODJI @SDNON DI OC@ G<IBP<B@ M@LP@NO@? =T OC@ QDNDOJM #@K@I?DIB JI OC@ M@NPGO

R@ ?DNKG<T OC@ ODOG@ JA OC@ OM<ING<O@? <MOD>G@ JM OC<O JA OC@ NJPM>@ <MOD>G@ <BOUCLE_art1(ARTICLES){id_rubrique}{origine_traduction}> <BOUCLE_art2(ARTICLES){traduction}{lang=#ENV{lang}}> // if a translation does exist <li>#TITRE</li> </BOUCLE_art2> // otherwise use the original article's title <li>#TITRE</li> <//B_art2> </BOUCLE_art1>

Forcing the language of the visitor’s choice The parameter forcer_lang 2C@ #MENU_LANG AJMH NOJM@N OC@ N@G@>O@? G<IBP<B@ DI OJ < >JJFD@ 2CDN >JJFD@ ><I OC@I =@ PN@? OJ M@?DNKG<T OC@ NDO@ DI OC@ G<IBP<B@ OC<O OC@ PN@M C<N >CJN@I -I@ JA OC@ R<TN JA ?JDIB OCDN DN OJ ?@ADI@ OC@ forcer_lang BGJ=<G Q<MD<=G@ DI OC@ JKODJIN ADG@ $GLOBALS['forcer_lang'] = true;

1K@>DATDIB OCDN K<M<H@O@M DI?D><O@N OJ 1.(. OC<O DO NCJPG? NTNO@H<OD><GGT M@?DM@>O < M@LP@NO@? K<B@ =T <??DIB OC@ lang 30* K<M<H@O@M RDOC OC@ G<IBP<B@ >JJFD@ Q<GP@ DA OC@M@ DN JI@ <I? DA IJO OC@I RDOC OC@ >J?@ JA OC@ NDO@fN KMDI>DK<G G<IBP<B@ 2CDN forcer_lang BGJ=<G >J?@ CJR@Q@M <GNJ C<N <IJOC@M <>ODJI <O OC@ N<H@ ODH@ DO NK@>DAD@N OC<O OC@ G<IBP<B@ NOMDIBN JA OC@ DIO@MA<>@ NCJPG? ?DNKG<T DI OC@ QDNDOJMfN G<IBP<B@ <I? IJO DI OC@ G<IBP<B@ <NNDBI@? OJ OC@ <MOD>G@N <I? N@>ODJIN

75


Another use of the cookie IJOC@M KJNND=DGDOT DN OJ PN@ OC@ PN@MfN KM@A@M@I>@ =PO OJ IJO AJM>@ OC@ M@?DM@>ODJI OCMJPBC OC@ lang 30* K<M<H@O@M =PO M<OC@M =T PNDIB 1.(.fN set_request API>ODJI OJ <?? < ><G>PG<O@? lang K<M<H@O@M OC<O 1.(. RDGG G<O@M M@PN@ RC@I DO ><GGN OC@ _request API>ODJI

Example 2C@ @S<HKG@ =@GJR PN@? DI <I JKODJIN ADG@ ><G>PG<O@N OC@ G<IBP<B@ OJ =@ PN@? 2CDN ><G>PG<ODJI DN H<?@ DI ORJ NO@KN \ >C@>F DA OC@ 30* DN JA OC@ AJMH http://name.domain/ language/rest_of_the_url RC@M@ G<IBP<B@ DN JI@ JA OC@ G<IBP<B@N ?@ADI@? AJM OC@ NDO@ AM @I JM @N AJM @S<HKG@ <I? DI NP>C < ><N@ PN@ OC@ G<IBP<B@ OCPN ?DN>JQ@M@?

\ JOC@MRDN@ OC@ utiliser_langue_visiteur() API>ODJI PN@N OC@ >JJFD@ G<IBP<B@ JOC@MRDN@ PN@ OC@ G<IBP<B@ JA OC@ =MJRN@M I? ADI<GGT DA OC@ G<IBP<B@ ><G>PG<O@? DN ?DAA@M@IO AMJH OC@ >JJFD@ OC@I OC@ >JJFD@ DN M@>M@<O@? // Systematically add the context original language. if (!$langue = _request('lang')) { include_spip('inc/lang'); $langues = explode(',', $GLOBALS['meta']['langues_multilingue']); // if the language is defined in the url (en/ or fr/ ), then use it if (preg_match(',^' . $GLOBALS['meta']['adresse_site'] . '/(' . join('|',$langues) . ')/,', 'http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $r)) { $langue = $r[1]; changer_langue($langue); } else { $langue = utiliser_langue_visiteur(); if (!in_array($langue, $langues)) { //$langue = "en"; // pour ne pas s'embeter ! $langue = $GLOBALS['meta']['langue_site']; } } // store it in $_GET

76


# The templates set_request('lang', $langue); } // store the language as a cookie... if ($langue != $_COOKIE['spip_lang']) { include_spip('inc/cookie'); spip_setcookie('spip_lang', $langue); }

Choosing the navigation language !T ?@A<PGO RC@I TJP =MJRN@ OJ <I $IBGDNC <MOD>G@ OC@ >JHKJI@ION JA OC@ DIO@MA<>@ <M@ OM<ING<O@? DIOJ $IBGDNC !T PNDIB OC@ G<IBP<B@ N@G@>ODJI AJMH #MENU_LANG OCDN RDGG >C<IB@ OC@ >JHKJI@ION @G@H@ION =T ?@A<PGO <I? AJM OC@ <MOD>G@N DI OC@ N@G@>O@? G<IBP<B@ 3IG@NN R@ <M@ <GM@<?T DI <I <MOD>G@ AJM < NK@>DAD> G<IBP<B@ $IBGDNC AJM @S<HKG@

<I? OC@M@AJM@ <GM@<?T RDOC OC@ $IBGDNC DIO@MA<>@ <I? RDOC OC@ G<IBP<B@ H@IP ?DNKG<TDIB $IBGDNC <I? R@ M@LP@NO OJ ?DNKG<T DO DI %M@I>C PNDIB OC@ G<IBP<B@ H@IP OC@ 30* AJM OC@ K<B@ <??N < K<M<H@O@M lang=fr =PO IJOCDIB >C<IB@N

RDOC =JOC OC@ <MOD>G@ DON@GA <I? DON DIO@MA<>@ M@H<DIDIB DI $IBGDNC DI A<>O DO DN OC@ <MOD>G@fN >JIO@SO RCD>C C<N O<F@I KMDJMDOT JQ@M OC@ QDNDOJMfN M@LP@NO 5@ ><I N@@ OC@ JKKJNDO@ ?DNKG<TDIB OC@ DIO@MA<>@ DI %M@I>C =PO M@<?DIB OC@ <MOD>G@ $IBGDNC <ITR<T (I JM?@M OJ H<F@ OC@ DIO@MA<>@ =@C<Q@ DI?@K@I?@IOGT JA OC@ >PMM@IO <MOD>G@fN JM >PMM@IO N@>ODJIfN G<IBP<B@ TJP HPNO ?@ADI@ OC@ BGJ=<G Q<MD<=G@ forcer_lang // enforce the language of the visitor $GLOBALS['forcer_lang']=true;

77


Forcing a change in the interface language N < ADI<G IJO@ JA DHKJMO<I>@ M@B<M?DIB HPGODGDIBPDNH NJH@ K@JKG@ NJH@ODH@N R<IO OJ C<Q@ < HDS JA G<IBP<B@N =@OR@@I OC@ DIO@MA<>@ <I? OC@ >JIO@IO T@O NODGG RDNC OJ H<DIO<DI NJH@ >JINDNO@I>T +JM@ NK@>DAD><GGT H<IT RJPG? GDF@ OJ ?DNKG<T OC@ <MOD>G@N DI OC@ NJPM>@ G<IBP<B@N DA OC@T C<Q@ IJO <N T@O =@@I OM<ING<O@? DIOJ OC@ M@LP@NO@? G<IBP<B@ (I NP>C ><N@N TJP RDGG =@@? OJ <>ODQ<O@ OC@ forcer_lang N@OODIB ,JI@OC@G@NN RC@I ?DNKG<TDIB <I <MOD>G@ DO DN KJNND=G@ OJ GDNO OC@ JOC@M Q<MDJPN @SDNODIB OM<ING<ODJIN <N DN ?JI@ DI OC@ 1.(. HJ?@G >J?@ modeles/ articles_traductions.html RC@M@ OC@ B@I@M<O@? GDIF ?J@N IJO >C<IB@ OC@ DIO@MA<>@ G<IBP<B@ BDQ@I OC<O forcer_lang H<DIO<DIN OC@ QDNDOJMfN G<IBP<B@ (A TJP RJPG? KM@A@M OC<O >GD>FDIB JI < OM<ING<ODJI GDIF DHKGD@N >C<IBDIB OC@ DIO@MA<>@ G<IBP<B@ <N R@GG DIOJ OC@ N<H@ G<IBP<B@ <N OC<O JA OC@ OM<ING<O@? <MOD>G@ OC@I TJP RDGG I@@? OJ @?DO OC@ HJ?@G >J?@ AJM articles_traductions.html JM >M@<O@ < I@R Q@MNDJI 5@ OC@I PN@ OC@ >JIQ@MN@M <>ODJI @I<=GDIB OC@ B@I@M<ODJI JA < NK@>D<G GDIF RCD>C M@?DM@>ON OJ OC@ ?@NDM@? <M>DG@ DI OC@ ?@NDM@? DIO@MA<>@ G<IBP<B@ [(#VAL{converser} |generer_url_action{[redirect=(#URL_ARTICLE |parametre_url{var_lang,#LANG})]})]

Example of a complete (and complex!) model: 2CDN DN < HJ?@G OC<O GDNON OC@ Q<MDJPN OM<ING<ODJIN JA <I <MOD>G@ (A DO DN IJO OC@ OM<ING<ODJI >PMM@IOGT =@DIB QD@R@? < GDIF DN KMJKJN@? DI?D><ODIB OC@ OM<ING<ODJI G<IBP<B@ <BOUCLE_article(ARTICLES){id_article}> <BOUCLE_traductions(ARTICLES) {traduction} {par lang} {','}>[ (#TOTAL_BOUCLE|>{1}|?{' '}) <span lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR"[ class="(#EXPOSE)"]> [(#EXPOSE{'',<a href="[(#VAL{converser} |generer_url_action{[redirect=(#URL_ARTICLE |parametre_url{var_lang,#LANG})]})]" rel="alternate" hreflang="#LANG"[ title="(#TITRE|attribut_html|couper{80})"]>})] [(#LANG|traduire_nom_langue)]

78


# The templates #EXPOSE{'',</a>} </span> ]</BOUCLE_traductions> </BOUCLE_article>

79


SQL joins between tables EJDI DI 1/* DN RC<O <GGJRN DIAJMH<ODJI OJ =@ M@OMD@Q@? AMJH HPGODKG@ O<=G@N >JH=DI@? DI < NDIBG@ LP@MT (O DN KJNND=G@ OJ K@MAJMH NJH@ EJDIN PNDIB 1.(.fN GJJK NTIO<S

Automatic joins 5C@I@Q@M < GJJK DN M@LP@NO@? OJ PN@ < >MDO@MD< RCD>C ?J@N IJO =@GJIB OJ GJJKfN JRI O<=G@ 1.(. <POJH<OD><GGT OMD@N OJ ADI? < GDIF@? O<=G@ RCD>C >JIO<DIN OC@ M@LP@NO@? AD@G? 1.(. C<N ORJ H@OCJ?N OJ ADI? GDIF@? O<=G@N @DOC@M OCMJPBC GDIFN OC<O <M@ ?@>G<M@? @SKGD>DOGT JM JI@N OC<O <M@ ><G>PG<O@?

Example 0@OMD@QDIB ?J>PH@ION RCD>C <M@ DIN@MO@? DIOJ OC@ O@NO JA <MOD>G@N JM JOC@M @?DOJMD<G >JIO@IO GDF@ RDOC < <docXX> OTK@ HJ?@G <I? RCD>C <M@ IJO EPNO NDHKGT GDIF@? OJ OC<O J=E@>O 2C@ vu AD@G? =@GJIBN OJ OC@ spip_documents_liens O<=G@

EJDI DN >M@<O@? OJ J=O<DI OC@ ?@NDM@?

M@NPGO <BOUCLE_doc(DOCUMENTS){0,10}{vu=oui}> - #FICHIER<br /> </BOUCLE_doc>

Explicit join declarations 2C@ GDIFN =@OR@@I O<=G@N <M@ ?@>G<M@? RDOCDI 1.(. DI OC@ @>MDM@ KP=GD> DIO@MA<>@N KCK ADG@ %PMOC@M ?@>G<M<ODJIN ><I =@ <??@? RDOC OC@ ?@>G<M@M;O<=G@N;DIO@MA<>@N KDK@GDI@ 1P>C < ?@>G<M<ODJI HDBCO GJJF GDF@ // propose a join between sections and documents $tables_jointures['spip_rubriques'][]= 'documents_liens';

80


# The templates // propose a join between articles and authors, specifying the join field explicitly $tables_jointures['spip_articles']['id_auteur']= 'auteurs_articles';

2CDN NCJRN OC@ GDIFN OC<O <M@ KJNND=G@ =@OR@@I O<=G@N 5C@I O<=G@N ><I C<Q@ N@Q@M<G AD@G?N OJ GDIF =@OR@@I OC@H OC@ @S<HKG@ <=JQ@ NCJRN CJR OJ NK@>DAT OC@ GDIFDIB AD@G? KM@>DN@GT

Exceptions (O DN @Q@I KJNND=G@ OJ >M@<O@ EJDIN =T ><GGDIB IJI @SDNO@IO AD@G?N <N ?@HJINOM<O@? =T OC@ N<HKG@ >MDO@MD< {titre_mot=yy} RCD>C ><I G@<? OJ < EJDI JI OC@ NKDK;HJON O<=G@ @Q@I OCJPBC OC@ ODOM@;HJO 1/* AD@G? ?J@N IJO @SDNO DI OC<O O<=G@ 2CDN DN ?JI@ <N NCJRI =@GJR $exceptions_des_jointures['titre_mot'] = array('spip_mots', 'titre');

Automating joins 5C@I OC@T C<Q@ IJO =@@I @SKGD>DOGT ?@>G<M@? OJ 1.(. EJDIN <M@ ><G>PG<O@? RC@M@ OC@T <M@ KJNND=G@ 2J ?J OCDN 1.(. >JHK<M@N OC@ I<H@N JA OC@ AD@G?N JA OC@ Q<MDJPN O<=G@N %JM @S<HKG@ DA <I AUTEURS GJJK GJJFN AJM < >MDO@MD< AD@G? OC<O DN IJO DI DON O<=G@

K@MC<KN {prenom=Daniel} AJM @S<HKG@ 1.(. RDGG BJ <I? GJJF DI OC@ JOC@M O<=G@N OC<O DO FIJRN JA <I? RCD>C C<Q@ AD@G?N RDOC OC@ N<H@ I<H@N <N OC@ <PO@PM O<=G@ GDF@ OC@ id_auteur F@T AD@G? OJ N@@ DA NP>C O<=G@N C<Q@ OC@ KM@IJH AD@G? =@DIB M@LP@NO@? (A JI@ JA OC@ O<=G@N ?J@N C<Q@ OC<O AD@G? OC@I < EJDI RDGG =@ H<?@ =@OR@@I OC@N@ ORJ O<=G@N %JM @S<HKG@ DA < >PNOJH O<=G@ AUTEURS_ELARGIS @SO@I?@?;<POCJMN @SDNON <N DO ?J@N AJM OC@ (IN>MDKODJI KGPBDI RDOC =JOC JA OC@ AD@G?N D?;<PO@PM <I? KM@IJH < EJDI RJPG? =@ H<?@ OJ @I<=G@ OC@ KM@QDJPNGT H@IODJI@? GJJK >MDO@MD< OJ JK@M<O@ >JMM@>OGT

81


object, id_object 1.(. DIOMJ?P>@N < I@R H@OCJ? JA N@<M>CDIB AJM EJDIN 2C@ KMDH<MT F@TN JA JI@ O<=G@ DI OCDN ><N@ D?;<PO@PM AJM OC@ spip_auteurs O<=G@ <N R@GG <N =@DIB N@<M>C@? AJM DI OC@ AD@G? I<H@N JA OC@ JOC@M O<=G@N <M@ <GNJ N@<M>C@? AJM DI O<=G@N OC<O OC<O C<Q@ OC@ K<DM JA AD@G?N J=E@>O <I? D?;J=E@>O RC@M@ J=E@O <PO@PM DI JPM @S<HKG@ (I OC@ >PMM@IO 1.(. NO<I?<M? ?<O<=<N@ N>C@H<

OCDN DN <>OP<GGT OC@ ><N@ AJM OC@ spip_documents_liens O<=G@

Forcing joins 1.(.fN <POJH<OD> ?@O@>ODJI ><K<=DGDOD@N <M@ NJH@ODH@N GDHDO@? <I? NJ ORJ NTIO<S Q<MD<ION <M@ JAA@M@? AJM AJM>DIB O<=G@ EJDIN JM OC@ AD@G?N JA OC@ O<=G@N OJ =@ PN@? // forcing a particular table <BOUCLE_table(TABLE1 table2 tablen){...}> // forcing a field in a table <BOUCLE_table(TABLE){table.field}>

Example 2C@N@ ORJ GJJKN N@G@>O <MOD>G@N RC@M@ <I <POCJM C<N < I<H@ >JIO<DIDIB I< GDF@ #D<I< )J<II< @O> <BOUCLE_art(ARTICLES auteurs_articles auteurs){nom==na}{0,5}> - #TITRE / #NOM<br /> </BOUCLE_art> <hr /> <BOUCLE_art2(ARTICLES){auteurs.nom==na}{0,5}> - #TITRE / #NOM<br /> </BOUCLE_art2>

'JR@Q@M < ?DAA@M@I>@ JA NDU@ @SDNON <O KM@N@IO JIGT OC@ ADMNO JI@ ?@>G<MDIB <GG JA OC@ O<=G@N RDGG H<F@ DO KJNND=G@ OJ ?DNKG<T < AD@G? #FIELD AMJH <IJOC@M O<=G@ 2C@M@AJM@ #NOM RDGG JIGT =@ KMJQD?@? DI OC@ ADMNO GJJK

82


# The templates

Accessing multiple databases 1.(. ><I @<NDGT M@<? <IT +T1/* .JNOBM@N JM 1/*DO@ ?<O<=<N@ <I? ?DNKG<TN OC@DM >JIO@IO RDOCDI < NOMP>OPM@N ?@ADI@? DI OC@ 1.(. O@HKG<O@N

Declaring another database (I JM?@M OJ <>>@NN <IJOC@M ?<O<=<N@ 1.(. I@@?N OJ C<Q@ <>>@NN >J?@N OJ OC@ ?<O<=<N@ DI LP@NODJI O OC@ ODH@ JA RMDODIB N@>JI?<MT ?@>G<M@? ?<O<=<N@N <M@ >JMM@>OGT C<I?G@? DI M@<? HJ?@ 5MDODIB OJ NP>C ?<O<=<N@N CJR@Q@M DN IJO T@O C<I?G@? =T 1.(. 2J ?@>G<M@ <IJOC@M ?<O<=<N@ OC@M@ <M@ ORJ KJNND=G@ NJGPODJIN \ PN@ OC@ NO<I?<M? BM<KCD><G DIO@MA<>@ ?@ADI@? AJM OC<O KPMKJN@ "JIADBPM<ODJI 1DO@ H<DIO@I<I>@ #@>G<M@ <IJOC@M ?<O<=<N@ \ RMDO@ TJPM JRI >JII@>OJM ADG@ AJGGJRDIB OC@ NTIO<S ?@ADI@? AJM OC<O KPMKJN@ <I? NOJM@ DO DI OC@ config/ ?DM@>OJMT JM OC@ ?DM@>OJMT ?@ADI@? =T OC@ >JINO<IO _DIR_CONNECT

The connector file config/xx.php %JM < >JII@>OJM ADG@ ><GG@? tarabiscote.php DON >JIO@IO RJPG? =@

<?php if (!defined("_ECRIRE_INC_VERSION")) return; define('_MYSQL_SET_SQL_MODE',true); $GLOBALS['spip_connect_version'] = 0.7; spip_connect_db('localhost','','username','password','tarabiscote','mysql', 'spip',''); ?>

5@ RJPG? OC@I ><GG OC@ spip_connect_db() API>ODJI PNDIB OC@ AJGGJRDIB <MBPH@ION DI JM?@M OC@ <??M@NN JA OC@ NLG N@MQ@M OC@ >JII@>ODIB KJMO IPH=@M DA I@>@NN<MT OC@ PN@MI<H@ OC@ K<NNRJM? OC@ ?<O<=<N@ I<H@ OC@ N@MQ@M OTK@ HTNLG KB NLGDO@ NLGDO@ OC@ O<=G@ KM@ADS <M@ PN@MN >JII@>O@? PNDIB G?<K

83


Accessing a declared database $Q@MT <??DODJI<GGT ?@>G<M@? ?<O<=<N@ ><I =@ <>>@NN@? PNDIB 1.(. GJJKN <N AJGGJRN <BOUCLE_externe(name:TABLE)>

2C@ name K<M<H@O@M >JMM@NKJI?N OJ OC@ I<H@ JA OC@ >JII@>OJM ADG@

Example (I O@NODIB RDOC 5JM?.M@NN NJH@ ODH@ <BJ OC@ <POCJM R<N <=G@ OJ @NO<=GDNC < API>ODJI<G ?<O<=<N@ GDIF !T >M@<ODIB < wordpress.php >JII@>OJM ADG@

DO R<N KJNND=G@ OJ M@>JQ@M OC@ G<NO KP=GDNC@? <MOD>G@N RDOC OC@ >J?@ NCJRI =@GJR <BOUCLE_articles(wordpress:WP_POSTS){0,5}{!par post_date}{post_status=publish}> <h2>#POST_TITLE</h2> <div class="texte">#POST_CONTENT</div> </BOUCLE_articles>

The "connect" URL parameter 5C@I DO C<N IJO =@@I NK@>DAD@? @SKGD>DOGT RDOC < >JII@>OJM ADG@ AJM PN@ RDOCDI GJJKN 1.(. PN@N OC@ ?@A<PGO >JII@>OJM ADG@ JAO@I I<H@? connect.php %JM <GG JA OC@N@ GJJKN R@ ><I M@LP@NO < NK@>DAD> >JII@>ODJI OC<O RDGG OC@I =@ <KKGD@? =T PNDIB OC@ 30* K<M<H@O@M connect=name

Example 1<T TJP C<Q@ 1.(. NDO@N RDOC ?DAA@M@IO NLP@G@OO@ O@HKG<O@N NDO@ <I? NDO@ ! !T >JKTDIB OC@ >JII@>OJM ADG@ AJM NDO@ JQ@M OJ NDO@ ! <I? M@I<HDIB DO <N A.php <I? QD>@ Q@MN< AJM NDO@ ! TJP ><I OC@I I<QDB<O@ OC@ NDO@N DI Q<MDJPN >JH=DI<ODJIN \ http://A/ OC@ >JIO@ION JA NDO@ ?DNKG<T PNDIB O@HKG<O@

84


# The templates \ http://B/ OC@ >JIO@ION JA NDO@ ! ?DNKG<T PNDIB O@HKG<O@ ! \ http://A/?connect=B OC@ >JIO@ION JA NDO@ ! ?DNKG<T PNDIB O@HKG<O@ \ http://B/?connect=A OC@ >JIO@ION JA NDO@ ?DNKG<T PNDIB O@HKG<O@ ! (I NPHH<MT K<NNDIB connect=nom DI OC@ 30* H<F@N DO KJNND=G@ OJ PN@ OC@ I<H@ >JII@>OJM ADG@ AJM <GG OC@ GJJKN DI OC@ O@HKG<O@N OC<O ?J IJO C<Q@ <I @SKGD>DO >JII@>OJM ?@ADI@? NP>C <N <BOUCLE_a(ARTICLES)>

Inclure with a connector parameter (O DN KJNND=G@ OJ K<NN < K<MOD>PG<M >JII@>ODJI RC@I PNDIB < >J?@ DI>GP?@ <INCLURE{fond=recent_articles}{connect=demo.example.org}> [(#INCLURE{fond=recent_articles, connect=demo.example.org})]

I DI>GP?@ ?J@N IJO <POJH<OD><GGT K<NN OC@ K<M@IO >JII@>ODJI OJ KMJK<B<O@ < >JII@>ODJI TJP I@@? OJ NK@>DAT DO DI OC@ DI>GP?@ DON@GA <INCLURE{fond=recent_articles}{connect}> [(#INCLURE{fond=recent_articles, connect})]

85



Contents of the directories 2CDN >C<KO@M RDGG >G<MDAT OC@ KPMKJN@ JA OC@ Q<MDJPN ?DM@>OJMD@N PN@? =T 1.(. (I NJH@ ><N@N DO RDGG <??M@NN OC@ H<II@M DI RCD>C I@R @G@H@ION <M@ >M@<O@? DI OC@N@ ?DM@>OJMD@N

87


The list of directories Name

Description

>JIADB K

#<O<=<N@ >JII@>ODJI D?@IODAD@MN <I? NDO@ JKODJIN

@>MDM@ <>ODJI K

'<I?G@N OC@ <>ODJIN RCD>C <AA@>O OC@ >JIO@ION JA OC@ ?<O<=<N@

@>MDM@ <POC K

+<I<B@ PN@M <POC@IOD><ODJIN

@>MDM@ =<GDN@ K

#@>G<M<ODJIN JA ?TI<HD> O<BN <I? B@I@MD> O<BN

@>MDM@ =<N@ K

.(N M@G<ODIB OJ OC@ ?<O<=<N@ <I? 1/* O<=G@ ?@>G<M<ODJIN

@>MDM@ >C<MN@ON "C<M<>O@M @I>J?DIB OM<ING<ODJI N@ON K

88

@>MDM@ >JIADBPM<ODJI K

"JIADBPM<ODJI >JHKJI@ION AJM 1.(.fN KMDQ<O@ =<>F @I? UJI@

@>MDM@ @S@> K

4D@RDIB K<B@N DI OC@ KMDQ<O@ UJI@ .'. >J?@

@>MDM@ B@ID@ K

.@MDJ?D> O<NFN OJ =@ MPI =T OC@ RDU<M? cron

@>MDM@ DI> K

*D=M<MD@N <I? Q<MDJPN .(N

@>MDM@ DINO<GG K

1.(.fN DINO<GG<ODJI KMJ>@?PM@N

@>MDM@ G<IB K

2C@ GJ><GDN<ODJI G<IBP<B@ ADG@N

@>MDM@ H<E K

2C@ ?<O<=<N@ PK?<O@ KMJ>@?PM@N

@>MDM@ IJODAD><ODJIN K

%PI>ODJIN AJM IJODAD><ODJIN <I? >JIO@ION JA IJODAD><ODJI @H<DGN

@>MDM@ KGPBDIN K

"J?@ M@G<ODIB OJ OC@ DINO<GG<ODJI <I? H<I<B@H@IO JA KGPBDIN

@>MDM@ KP=GD> K

2C@ >JHKDG@M <I? ><>C@ H<I<B@M


# Contents of the directories Name

Description

@>MDM@ M@L K

2C@ ?<O<=<N@ ?MDQ@MN

@>MDM@ OTKJBM<KCD@ K

2TKJBM<KCD><G >JMM@>ODJIN

@>MDM@ PMGN K

30* M@RMDODIB >JIQ@IODJIN

@>MDM@ SHG K

6+* K<MN@M <I? Q@MDAD@M

@SO@INDJIN K

2C@ ?DM@>OJMT AJM KGPBDIN RCD>C ><I IJO =@ ?@<>ODQ<O@?

(+& K

1OJM<B@ JA NDO@ ?J>PH@ION

GD= K

$SO@MI<G GD=M<MD@N <??@? =T KGPBDIN

GJ><G K

1OJM<B@ GJ><ODJI AJM ><>C@N JA DH<B@N "11 <I? )<Q<N>MDKO ADG@N

KGPBDIN K

2C@ KGPBDIN ?DM@>OJMT

KMDQ@ >JIO@IP K

2@HKG<O@N AJM QD@RDIB J=E@>ON DI OC@ KMDQ<O@ UJI@

KMDQ@ @?DO@M K

2@HKG<O@N PN@? AJM OC@ @?DODIB AJMHN AJM 1.(. J=E@>ON

KMDQ@ @S@> K

4D@RDIB K<B@N DI OC@ KMDQ<O@ UJI@ >J?@? <N 1.(. O@HKG<O@ ADG@N

KMDQ@ AJMHPG<DM@N K

$?DODIB AJMHN AJM @?DOJMD<G J=E@>ON

KMDQ@ DH<B@N K

(H<B@ ADG@N PN@? DI OC@ KMDQ<O@ UJI@

KMDQ@ DIAJN K

2@HKG<O@N AJM OC@ DIAJMH<ODJI K<I@GN ?DNKG<T@? AJM 1.(. J=E@>ON DI OC@ KMDQ<O@ UJI@

KMDQ@ E<Q<N>MDKO )<Q<1>MDKO N>MDKON K KMDQ@ HJ?@G@N K

2C@ NO<I?<M? HJ?@G NIDKK@ON KMJQD?@? =T 1.(.

KMDQ@ MNN K 2@HKG<O@N OC<O B@I@M<O@ OC@ 011 A@@?N AJM HJIDOJMDIB @?DOJMD<G >C<IB@N H<?@ DI OC@ KMDQ<O@ UJI@

89


Name

Description

KMDQ@ NO<ON K

2@HKG<O@N PN@? AJM ?DNKG<TDIB NDO@ NO<ODNOD>N

KMDQ@ OM<INH@OOM@ K

2@HKG<O@N PN@? AJM "14 @SKJMON

KMDQ@ QDBI@OO@N K

(>JI DH<B@N AJM <OO<>C@? ?J>PH@ION

NLP@G@OO@N K

"PNOJHDN<ODJIN JA O@HKG<O@N <I? JOC@M NO<I?<M? ADG@N

NLP@G@OO@N ?DNO K

2C@ ?@A<PGO N@O JA NDO@ O@HKG<O@N

OHK K

2@HKJM<MT ADG@N <I? ><>C@ ADG@N

config 2C@ config ?DM@>OJMT NOJM@N >JIADBPM<ODJI ?@O<DGN AJM OC@ NDO@ NP>C <N D?@IODAD@MN AJM OC@ NO<I?<M? 1.(. ?<O<=<N@ >JII@>ODJI DI connect.php JM AJM JOC@M @SO@MI<G ?<O<=<N@N OC@ mes_options.php ADG@ PN@? OJ ?@ADI@ NDO@ JKODJIN <I? OC@ N@>PMDOT N>M@@I ecran_securite.php RCD>C H<F@N DO KJNND=G@ OJ M<KD?GT M@>JQ@M AMJH NJH@ NTNO@H A<DGPM@N OC<O <M@ J=N@MQ@?

extensions 2C@ extensions ?DM@>OJMT DN PN@? OJ ?@ADI@ KGPBDIN RCD>C <M@ KM@ DINO<GG@?

KM@ <>ODQ<O@? <I? RCD>C ><I IJO =@ G<O@M ?@<>ODQ<O@? <N K<MO JA OC@ NO<I?<M? 1.(.DINO<GG<ODJI GG OC<O DN M@LPDM@? DN OJ NOJM@ OC@ ?@NDM@? KGPBDIN DI OCDN ?DM@>OJMT (I OC@ NO<I?<M? ?DNOMD=PODJI JA 1.(. NJH@ KGPBDIN <M@ DI>GP?@? =T ?@A<PGO \ "JHKM@NN@PM OJ >JHKM@NN )<Q<N>MDKO "11 <I? '2+* ADG@N

\ %DGOM@N DH<B@N @O >JPG@PMN (H<B@ <I? >JGJPM ADGO@MN KMJQD?DIB API>ODJIN AJM BM<KCD><G <I? OTKJBM<KCD><G H<IDKPG<ODJI

\ .JMO@ .GPH@ JAA@MDIB <I @?DOJMfN OJJG=<M OJ DIN@MO 1.(. NCJMO>PON

\ 1<A@'2+* AJM >G@<IDIB JPO PIR<IO@? JM ?<IB@MJPN DO@HN AMJH AJMPH >JIOMD=PODJIN <I? NTI?D><O@? NDO@ >JIO@IO A@@?N 011

90


# Contents of the directories

IMG 2C@ IMG/ ?DM@>OJMT >JIO<DIN <GG JA OC@ @?DOJMD<G ?J>PH@ION <??@? OJ OC@ NDO@

>G<NNDAD@? =T ?@A<PGO <>>JM?DIB OJ OC@DM ADG@ @SO@INDJIN DI OJ Q<MDJPN NP= ?DM@>OJMD@N (O M@O<DIN OC@ DH<B@ M@G<O@? ?DM@>OJMT I<H@ AMJH @<MGD@M ?<TN RC@I <??DODJI<G ?J>PH@ION AJM 1.(. JIGT DIQJGQ@? <??DODJI<G DH<B@ ADG@N

lib 2CDN ?DM@>OJMT RCD>C DN IJO >M@<O@? DI OC@ ?@A<PGO DINO<GG @I<=G@N KGPBDIN OJ NC<M@ @SO@MI<G >JHHJI GD=M<MD@N RCD>C <M@ OC@M@AJM@ OJ =@ ?JRIGJ<?@? <I? @SOM<>O@? DIOJ OCDN ?DM@>OJMT

local 2CDN ?DM@>OJMT CJPN@N OC@ ><>C@N OC<O <M@ B@I@M<O@? AJM OTKJBM<KCD><G DH<B@N

DH<B@ M@NDUDIB BM<KCD>N H<IDKPG<ODJIN <I? "11 <I? )<Q<1>MDKO >JHKM@NNDJIN OC<O DN <GG OC@ ><>C@N OC<O M@LPDM@ '22. <>>@NN %JM HJM@ DIAJMH<ODJI KG@<N@ M@A@M OJ OC@ AJGGJRDIB <MOD>G@N \ 2C@ "11 <I? )<Q<1>MDKO ><>C@N K \ 2C@ DH<B@ KMJ>@NNDIB ><>C@ K

plugins 2C@ plugins ?DM@>OJMT DN PN@? AJM DINO<GGDIB KGPBDIN RCD>C RDGG =@ <>ODQ<O@? JM ?@<>ODQ<O@? AMJH OC@ KMDQ<O@ UJI@fN KGPBDI >JIADBPM<ODJI <?HDIDNOM<ODJI K<B@ .GPBDIN <M@ OTKD><GGT ?JRIGJ<?@? PNDIB %2. <I? @SOM<>O@? DIOJ OCDN ?DM@>OJMT

JI@ NP= ?DM@>OJMT K@M KGPBDI 2C@ @SDNO@I>@ JA < ?DM@>OJMT ><GG@? plugins/ auto OC<O DN RMDO@ <>>@NND=G@ RDGG @I<=G@ R@=H<NO@MN OJ <POJH<OD><GGT ?JRIGJ<? KGPBDIN AMJH RDOCDI OC@ KMDQ<O@ UJI@ DIO@MA<>@ RDOCJPO I@@?DIB OJ PN@ %2. JM OJ 3,8(. OC@ KGPBDIN H<IP<GGT 2C@ ?@ADIDODQ@ >JGG@>ODJI JA KGPBDIN DN GJ><O@? <O COOK ADG@N NKDK JMB NKDK UJI@

=PO JOC@M KGPBDIN H<T =@ <Q<DG<=G@ AMJH JOC@M NDO@N N RDOC <IT @SO@MI<GGT >JIOMD=PO@? >J?@ =@ Q@MT ><M@APG RC<O TJP DINO<GG <I? DA DI ?JP=O JIGT PN@ KGPBDIN AMJH 1.(.fN JRI ?@ADIDODQ@ >JGG@>ODJI

91


squelettes 2C@ squelettes ?DM@>OJMT DN IJO >M@<O@? =T OC@ ?@A<PGO DINO<GG<ODJI JA 1.(. -I>@ DO C<N =@@I >M@<O@? H<IP<GGT DO H<F@N DO KJNND=G@ AJM OC@ R@=H<NO@M OJ JQ@MGJ<? JM JQ@MMD?@ <N DO R@M@ OC@ JMDBDI<G ADG@N DI>GP?@? DI 1.(. <I? KGPBDIN

OC@N@ KMDI>DK<GGT =@DIB OC@ ?@A<PGO O@HKG<O@N AJM 1.(. 2CDN ?DM@>OJMT DN <GNJ PN@? OJ >M@<O@ TJPM JRI NK@>D<G O@HKG<O@ ADG@N <I? OJ NOJM@ <IT ADG@N OC<O <M@ NK@>DAD> OJ TJPM NDO@ 2C@ <?Q<IO<B@ JA PNDIB OCDN ?DM@>OJMT AJM >PNOJHDN<ODJIN DN OJ KM@Q@IO TJPM >C<IB@N =@DIB JQ@MRMDOO@I <IT ODH@ OC<O TJP PK?<O@ 1.(. DON@GA JM <IT KGPBDIN OC<O TJP H<T PN@ )PNO <N HP>C <N TJP I@@? OJ >M@<O@ OCDN ?DM@>OJMT H<IP<GGT OJ NOJM@ >PNOJHDN@? Q@MNDJIN JA ADG@N IJMH<GGT GJ><O@? DI OC@ NLP@G@OO@N ?DM@>OJMT NJ HPNO TJP <GNJ >M@<O@ NP= ?DM@>OJMD@N AJM <IT JQ@MMD?DIB ADG@N TJP >M@<O@ OC<O RJPG? IJMH<GGT @SDNO DI NP= ?DM@>OJMD@N JA OC@ NO<I?<M? NLP@G@OO@N ?DM@>OJMT

squelettes-dist 2CDN ?DM@>OJMT >JIO<DIN OC@ N@O JA O@HKG<O@ ADG@N NPKKGD@? RDOC OC@ NO<I?<M? DINO<GG<ODJI JA 1.(. (O <GNJ >JIO<DIN NP= ?DM@>OJMD@N JA ADG@N AJM OC@ KP=GD> AJMHN <I? HJ?@GN NIDKK@ON #J IJO ?@G@O@ JM JQ@MRMDO@ OC@N@ ADG@N DA TJP ><I <QJD? ?JDIB NJ <N <IT >C<IB@N TJP H<F@ OJ OC@N@ ADG@N RDGG =@ GJNO DA TJP PK?<O@ TJPM Q@MNDJI JA 1.(. TJP <M@ <?QDN@? OJ PNDIB OC@ NLP@G@OO@N K ?DM@>OJMT AJM TJPM >PNOJHDN<ODJIN

tmp 2CDN ?DM@>OJMT >JIO<DIN <IT ADG@N JA < O@HKJM<MT I<OPM@ DI>GP?DIB OCJN@ AJM ><>C@N <I? GJBN <I? RCD>C <M@ IJO <>>@NND=G@ QD< '22. (O >JIO<DIN NP= ?DM@>OJMD@N NK@>D<GGT >M@<O@? AJM \ OC@ ><>C@ cache

\ <IT =<>FPKN H<?@ OCMJPBC OC@ <?HDI DIO@MA<>@ dump

\ N@NNDJIN AJM M@BDNO@M@? PN@MN sessions

\ ?J>PH@ION N@IO =T %2. upload \ NO<ODNOD>N B@I@M<O@? <I? ><G>PG<O@? =@><PN@ JA NDO@ QDNDOJMN visites

92


# Contents of the directories

ecrire 2CDN ?DM@>OJMT >JIO<DIN <GG JA OC@ 1.(. >J?@ OJ H<F@ OC@ @IBDI@ OD>F

ecrire/action 2CDN ?DM@>OJMT DN DIO@I?@? OJ NOJM@ >J?@ PN@? OJ HJ?DAT OC@ >JIO@ION JA OC@ ?<O<=<N@ +JNO JA OC@ <>ODJIN <M@ N@>PM@? DI NP>C < R<T <N OJ >JIADMH =JOC OC<O \ OC@ <POCJM K@MAJMHDIB OC@ <>ODJI DN <POCJMDN@? OJ ?J NJ <I? \ OC@ <>ODJI DN <>OP<GGT =@DIB M@LP@NO@? =T OC@ K@MNJI >PMM@IOGT GJBB@? DI 3KJI >JHKG@ODJI JA OC@N@ KMJ>@NN@N < M@?DM@>ODJI DN H<?@ OJ < 30* OC<O B@I@M<GGT H<F@N M@A@M@I>@ OJ OC@ M@>@IO <>ODJI ><GG .G@<N@ M@A@M OJ OC@ N@>ODJI JI <>ODJIN <I? KMJ>@NN@N K AJM APMOC@M ?@O<DGN

ecrire/auth 2C@ ecrire/auth ?DM@>OJMT >JIO<DIN OC@ Q<MDJPN N>MDKON PN@? OJ H<I<B@ PN@M >JII@>ODJIN -I@ ADG@ H<I<B@N <POC@IOD><ODJI PNDIB OC@ 1.(. H@OCJ?JGJBT

<I? OC@ JOC@M RJMFN AJM <I *# . ?DM@>OJMT 2C@ <POC@IOD><ODJI KMJ>@NN@N <M@ M@G<ODQ@GT >JHKG@S <N OC@T DIQJGQ@ IPH@MJPN N@>PMDOT >C@>FN I .( ?@ADI@N OC@ Q<MDJPN NO<B@N JA <POC@IOD><ODJI <I? OC@ >M@<ODJI JA I@R PN@MN .G@<N@ M@A@M OJ OC@ N@>ODJI JI <POC@IOD><ODJI K AJM APMOC@M ?@O<DGN

ecrire/balise 2C@ ecrire/balise ?DM@>OJMT DN PN@? OJ ?@ADI@ \ ?TI<HD> O<BN H@<IDIB OCJN@ OC<O DIQJGQ@ ><G>PG<ODJIN AJM @Q@MT K<B@ M@A@M@I>@ <I? B@I@M<ODJI <I? \ B@I@MD> O<BN H@<IDIB OCJN@ NO<MODIB RDOC OC@ N<H@ KM@ADS <I? K@MAJMHDIB NC<M@? <>ODJIN #URL_ #FORMULAIRE_ 2C@ NO<OD> O<BN CJR@Q@M <M@ ?@>G<M@? DI OC@ @>MDM@ KP=GD> =<GDN@N KCK ADG@ JM RC@I OC@T =@GJIB OJ KGPBDIN RDOCDI OC@ API>ODJI ?@ADIDODJI ADG@N AJM @<>C KGPBDI

93


.G@<N@ M@A@M OJ OC@ N@>ODJI JI O<BN K AJM APMOC@M ?@O<DGN

ecrire/base 2CDN AJG?@M >JIO<DIN >J?@ M@G<O@? OJ OC@ ?<O<=<N@ OC@ O<=G@ ?@ADIDODJIN 1/* <=NOM<>ODJI API>ODJIN <I? API>ODJIN PN@? AJM >M@<ODIB <I? PK?<ODIB OC@ 1/* O<=G@N >JHKG@O@ >C<KO@M DN ?@QJO@? OJ OC@ ?<O<=<N@ 1/* <>>@NN K

ecrire/charsets 2CDN ?DM@>OJMT >JIO<DIN OC@ ADG@N PN@? AJM OM<ING<ODIB >C<M<>O@M @I>J?DIBN

B@I@M<GGT ><GG@? =T OC@ ecrire/inc/charsets.php ADG@

ecrire/configuration 2CDN ?DM@>OJMT >JIO<DIN >JHKJI@ION PN@? DI OC@ >JIADBPM<ODJI K<B@N JA 1.(.fN KMDQ<O@ UJI@ $<>C ADG@ >JMM@NKJI?N OJ JI@ K<MOD>PG<M >JIADBPM<ODJI AM<H@

ecrire/exec 2C@ ecrire/exec ?DM@>OJMT DN PN@? OJ NOJM@ OC@ .'. ADG@N PN@? OJ ?DNKG<T K<B@N DI OC@ KMDQ<O@ UJI@ PNDIB OC@ ?exec=name K<M<H@O@M 'JR@Q@M DO DN =@>JHDIB DI>M@<NDIBGT >JHHJI OJ PN@ M@BPG<M 1.(. O@HKG<O@ ADG@N AJM OC@N@ K<B@N RCD>C <M@ DINO<GG@? DI OC@ KMDQ@ @S@> K ?DM@>OJMT ?@O<DG@? @SKG<I<ODJI DN KMJQD?@? DI OC@ N@>ODJI ?@QJO@? OJ "M@<ODIB K<B@N DI OC@ KMDQ<O@ UJI@ K

ecrire/genie 2C@ ecrire/genie ?DM@>OJMT DN PN@? OJ NOJM@ API>ODJIN OJ MPI K@MDJ?D><GGT =T OC@ BYID@ <F< RDU<M? RCD>C <M@ NDHDG<M OJ =PO IJO OC@ N<H@ <N cron O<NFN

@<>C JA RCD>C IJMH<GGT C<N < ?@?D><O@? ADG@ OJ =@ MPI AJM @<>C OC<O O<NF

94


# Contents of the directories .G@<N@ M@A@M OJ OC@ N@>ODJI JI OCDN NP=E@>O .@MDJ?D> O<NFN >MJI K

ecrire/inc 2CDN ?DM@>OJMT >JIO<DIN HJNO JA OC@ .'. GD=M<MD@N >M@<O@? AJM PN@ RDOC 1.(. 1JH@ JA OC@N@ GD=M<MD@N <M@ NTNO@H<OD><GGT GJ<?@? AJM @Q@MT 1.(. NDO@ 2CDN DN OC@ ><N@ AJM ecrire/inc/utils.php RCD>C >JIO<DIN OC@ >JM@ <I? NO<MO PK API>ODJIN <I? <GNJ AJM ecrire/inc/flock.php RCD>C O<F@N ><M@ JA ADG@ GJ>FDIB <I? <>>@NN

ecrire/install 2C@ ecrire/install ?DM@>OJMT >JIO<DIN @Q@MTOCDIB M@LPDM@? AJM 1.(. DINO<GG<ODJI 2C@ Q<MDJPN ADG@N DI OCDN ?DM@>OJMT >JHKMDN@ OC@ DINO<GG<ODJI NO@KN <I? <M@ ><GG@? AMJH OC@ ecrire/exec/install.php ADG@

ecrire/lang 2C@ ecrire/lang ?DM@>OJMT >JIO<DIN OC@ Q<MDJPN OM<ING<ODJI ADG@N AJM OC@ 1.(. KP=GD> <I? KMDQ<O@ DIO@MA<>@N 2C@N@ OM<ING<ODJIN <M@ KMJQD?@? =T OC@ PN@ JA ADG@N AJM @<>C G<IBP<B@ RC@M@ xx DN < NK@>DAD> G<IBP<B@ >J?@ \ public_xx.php OM<ING<O@N O@SO NOMDIBN <KK@<MDIB DI OC@ KP=GD> O@HKG<O@ ADG@N

\ ecrire_xx.php OM<ING<O@N O@SO NOMDIBN DI OC@ KMDQ<O@ UJI@ <>ODJI @S@>

\ spip_xx.php OM<ING<O@N OC@ JOC@MN DI> KMDQ@ AJMHPG<DM@N HJ?@G@N

ecrire/maj 2CDN ?DM@>OJMT >JIO<DIN OC@ PK?<O@ MJPODI@N AJM OC@ ?<O<=<N@ <N DO KMJBM@NN@N OCMJPBC ?DAA@M@IO Q@MNDJIN JA 1.(. %JM JG?@M Q@MNDJI DO <GNJ >JIO<DIN OC@ NOMP>OPM@ JA OC@ JMDBDI<G ?<O<=<N@ 2CDN H<F@N DO KJNND=G@ OJ M@ DHKJMO 1.(. =<>FPKN AMJH KM@QDJPN Q@MNDJIN =<>F OJ 1.(. IJMH<GGT RDOCJPO <IT KMJ=G@HN

95


ecrire/notifications 2CDN ?DM@>OJMT >JIO<DIN OC@ Q<MDJPN API>ODJIN ><GG@? =T 1.(.fN IJODAD><ODJIN .( DI OC@ ecrire/inc/notifications.php ADG@ 2C@ IJODAD><ODJIN H<F@ DO KJNND=G@ =T ?@A<PGO OJ N@I? @H<DGN <AO@M >@MO<DI @Q@ION J>>PM RDOCDI 1.(. NP>C <N OC@ <MMDQ<G JA < I@R H@NN<B@ DI < AJMPH JM OC@ KMJKJN<G JA < I@R <MOD>G@ AJM KP=GD><ODJI 2CDN ?DM@>OJMT <GNJ NOJM@N >@MO<DI 1.(. O@HKG<O@N OC<O <M@ PN@? OJ =PDG? OC@ @H<DG O@SO H@NN<B@N DI>GP?@? DI OC@N@ IJODAD><ODJIN

ecrire/plugins 2C@ ecrire/plugins ?DM@>OJMT >JIO<DIN <GG JA OC@ >J?@ PN@? AJM 1.(.fN KGPBDIN <N R@GG <N >J?@ AJM OC@ @SO@INDJIN KGPBDIN RCD>C ><I IJO =@ ?@<>ODQ<O@? <I? @SO@MI<G GD=M<MD@N OC@ lib/ ?DM@>OJMT 2CDN I<OPM<GGT DI>GP?@N OC@ >J?@ AJM GDNODIB OC@ KGPBDIN ?@O@MHDIDIB OC@DM ?@K@I?@I>D@N KMJ>@NNDIB OC@DM plugin.xml ADG@N <I? H<I<BDIB OC@ Q<MDJPN ><>C@N PN@? =T OC@ KGPBDIN KG@<N@ M@<? OC@ DIAJMH<ODJI <=JPO OC@ KGPBDIN ><>C@ K

ecrire/public 2C@ M<OC@M =<?GT I<H@? ecrire/public ?DM@>OJMT >JIO<DIN OC@ Q<MDJPN ADG@N DIQJGQ@? DI N@<M>CDIB <I<GTNDIB >JHKDG<ODJI <I? ?@=PBBDIB JA OC@ 1.(. O@HKG<O@N OC@ >M@<ODJI JA OC@ K<B@N B@I@M<O@? =T OC@ O@HKG<O@N <I? OC@ H<I<B@H@IO JA OC@DM >JMM@NKJI?DIB ><>C@N 1JH@ APMOC@M ?@O<DGN JI OC@ >JHKDG<ODJI JA OC@ O@HKG<O@N K <M@ <Q<DG<=G@ DI OC@ >JMM@NKJI?DIB N@>ODJI

ecrire/req 2C@ ecrire/req ?DM@>OJMT >JIO<DIN OC@ OM<ING<OJMN PN@? OJ OM<INAJMH 1.(.fN 1/* <=NOM<>ODJI API>ODJIN <I? LP@MD@N AJM OC@ >JMM@NKJI?DIB ?<O<=<N@ @IBDI@N %JPM ?MDQ@MN <M@ <Q<DG<=G@ +T1/* .JNO&M@N 1/*DO@ <I? 1/*DO@

96


# Contents of the directories

ecrire/typographie 2CDN ?DM@>OJMT >JIO<DIN OC@ OTKJBM<KCD><G >JMM@>ODJIN AJM %M@I>C <I? $IBGDNC

<KKGD@? =T ><GGDIB OC@ typo API>ODJI 2CDN KMJ>@NNDIB DN M@LPDM@? OJ M@NJGQ@ OTKJBM<KCD><G ?DAA@M@I>@N =@OR@@I CJR O@SO DN @IO@M@? <I? CJR DO DN ?DNKG<T@?

NP>C <N OC@ PN@ JA ?DAA@M@IO >C<M<>O@M N@LP@I>@N AJM G@AO <I? MDBCO LPJO<ODJI H<MFN DI ?DAA@M@IO G<IBP<B@N AJM @S<HKG@

ecrire/urls 2C@ ecrire/urls ?DM@>OJMT >JIO<DIN OC@ >J?@ PN@? OJ ?MDQ@ OC@ 30* M@RMDODIB NTNO@HN JAA@M@? =T 1.(. KMJKM@ COHG <M=JM@N>@IO 2C@ .( AJM OC@N@ 30* M@RMDODIB NTNO@HN H<F@N DO KJNND=G@ OJ >JINOMP>O 30*N =<N@? JI < BDQ@I >JIO@SO <I? DI >JHKG@H@IO<MT A<NCDJI OJ D?@IODAT <I J=E@>O <I? DON D?@IODAD@M =<N@? JI < PN@M M@LP@NO@? 30* IT >PNOJH =PDGO J=E@>ON <??@? OJ 1.(. H<T I@@? OJ =@ <??M@NN@? =T RC<O@Q@M 30* M@RMDODIB H@OCJ? DN N@G@>O@? AJM OC@ NDO@

ecrire/xml 2CDN ?DM@>OJMT >JIO<DIN OC@ API>ODJIN PN@? AJM <I<GTNDIB 6+* NOMDIBN <I? OM<INAJMHDIB OC@H DIOJ .'. <MM<TN Q@MDAD><ODJI OJJG DN <GNJ <Q<DG<=G@ NJ OC<O #2# K<B@ @MMJMN ><I =@ D?@IODAD@?

97


prive 2C@ prive ?DM@>OJMT NOJM@N <GG JA OC@ O@HKG<O@N PN@? DI 1.(.fN KMDQ<O@ UJI@ <N R@GG <N >@MO<DI "11 NOTG@NC@@ON <KKGD@? OJ OC@ KMDQ<O@ UJI@

prive/contenu 2C@ prive/contenu ?DM@>OJMT >JIO<DIN OC@ O@HKG<O@N PN@? OJ display OC@ >JIO@ION JA 1.(. J=E@>ON NP>C <N AJM <MOD>G@N OC@ article.html ADG@ DI OC@ KMDQ<O@ UJI@

prive/editer 2C@ prive/editer ?DM@>OJMT >JIO<DIN OC@ O@HKG<O@N JA OC@ AJMHN PN@? AJM editing OC@ 1.(. J=E@>ON

prive/exec 2C@ prive/exec ?DM@>OJMT DN PN@? OJ NOJM@ 1.(. O@HKG<O@ ADG@N PN@? AJM ?DNKG<TDIB K<B@N DI OC@ KMDQ<O@ UJI@ PNDIB OC@ ?exec=name K<M<H@O@M 2CDN ?DM@>OJMT DN IJO PN@? =T OC@ >JM@ JA 1.(. =PO NJH@ KGPBDIN H<T PN@ DO ?@O<DG@? @SKG<I<ODJI DN KMJQD?@? DI OC@ N@>ODJI JI >M@<ODIB K<B@N DI OC@ KMDQ<O@ UJI@ K

prive/formulaires 2C@ prive/formulaires ?DM@>OJMT >JIO<DIN OC@ "42 @?DODIB AJMHN AJM 1.(. @?DOJMD<G J=E@>ON

prive/images 2CDN ?DM@>OJMT NOJM@N <GG JA OC@ DH<B@N <I? D>JIN OC<O <M@ PN@? DI OC@ KMDQ<O@ UJI@ <I? OCJN@ PN@? ?PMDIB OC@ DINO<GG<ODJI KMJ>@?PM@N

98


# Contents of the directories

prive/infos 2C@ prive/infos ?DM@>OJMT >JIO<DIN OC@ O@HKG<O@N AJM OC@ DIAJMH<ODJI <I? NJH@ODH@N <>ODJI =POOJI K<I@GN AJM 1.(. J=E@>ON DI OC@ KMDQ<O@ UJI@ 2C@N@ K<I@GN OTKD><GGT DI>GP?@ OC@ J=E@>O D?@IODAD@M OC@ J=E@>O NO<OPN <I? NJH@ NO<ODNOD>N @ B OC@ IPH=@M JA <MOD>G@N DI < N@>ODJI OC@ IPH=@M JA ODH@N OC@ <MOD>G@ C<N =@@I QDNDO@? @O>

prive/javascript 2CDN ?DM@>OJMT >JIO<DIN OC@ )<Q<1>MDKO N>MDKON DI>GP?DIB E/P@MT OC<O <M@ PN@? DI OC@ KMDQ<O@ UJI@ <I? AJM >@MO<DI ><GGN AMJH OC@ ELP@MT;KGPBDIN K KDK@GDI@ AMJH OC@ KP=GD> NDO@ <N R@GG

prive/modeles 2CDN ?DM@>OJMT >JIO<DIN OC@ M@PN<=G@ 1.(. >J?@ NIDKK@ON OC<O ><I =@ PN@? RDOCDI J=E@>O O@SON =T NDO@ >JIOMD=POJMN NP>C <N <imgXX> <I? <docXX> 2C@T ><I <GNJ =@ PN@? RDOCDI JOC@M >PNOJHDN@? O@HKG<O@ ADG@N =T PNDIB OC@ #MODELE O<B

prive/rss 2C@N@ O@HKG<O@N B@I@M<O@ OC@ 011 A@@?N AJM HJIDOJMDIB NDO@ >C<IB@N DI OC@ KMDQ<O@ UJI@ <I? <M@ ><GG@? =T OC@ prive/rss.html ADG@ RDOC < 30* >JINOMP>O@? =T OC@ bouton_spip_rss API>ODJI ?@>G<M@? DI ecrire/inc/ presentation.php

prive/stats 2@HKG<O@N PN@? AJM ?DNKG<TDIB OC@ NO<ODNOD>N H<DIO<DI@? DI 1.(.fN DIO@MI<G NO<ODNOD>N ADG@N

99


prive/transmettre 2C@ prive/transmettre ?DM@>OJMT >JIO<DIN OC@ O@HKG<O@N PN@? OJ B@I@M<O@ "14 ?<O< ><GG@? AMJH OC@ prive/transmettre.html O@HKG<O@ ADG@

prive/vignettes 2CDN ?DM@>OJMT NOJM@N OC@ Q<MDJPN DH<B@N OC<O @<>C >JMM@NKJI? OJ <I @SO@INDJI AJM < >G<NN JA <OO<>C@? ?J>PH@ION 2C@ #LOGO_DOCUMENT O<B M@OPMIN OC@ <KKGD><=G@ D>JI DA IJ NK@>DAD> D>JI C<N =@@I <NNDBI@? OJ <I DI?DQD?P<G ?J>PH@IO -OC@M API>ODJIN M@G<O@? OJ OC@N@ DH<B@ QDBI@OO@N <M@ AJPI? DI ecrire/inc/ documents.php

100


Extending SPIP -I@ GJIB O@MH BJ<G JA 1.(. C<N =@@I <?<KO<=DGDOT 2C@M@ <M@ H<IT R<TN OJ M@ADI@ <I? @SO@I? DO <>>JM?DIB OJ OC@ M@LPDM@H@ION JA @<>C K<MOD>PG<M R@= NDO@ JM OJ >M@<O@ I@R API>ODJI<GDOT IJO DI>GP?@? DI OC@ >JM@ HJ?PG@N 2CDN N@>ODJI @SKG<DIN OC@ R<TN OC<O KMJBM<HH@MN ><I PN@ OJ @SO@I? 1.(.

101


Introduction 2@HKG<O@N KGPB DIN <>>@NN K<OCN OC@ _dist() API>ODJIN <I? CJR OJ PN@ <I? JQ@MMD?@ OC@H 2CDN N@>ODJI @SKG<DIN DO <GG

Templates or plug-ins? Use the "squelettes" folder 2C@ squelettes/ AJG?@M DN PN@? OJ NOJM@ <GG OC@ ADG@N M@LPDM@? AJM OC@ JK@M<ODJI JA TJPM NDO@ <I? OJ >PNOJHDN@ DON BM<KCD> ?@NDBI O@HKG<O@N JM cNLP@G@OO@Nd

DH<B@N )<Q<1>MDKO <I? "11 ADG@N .'. GD=M<MD@N

Or create a plug-in KGPB DI NOJM@? DI < AJG?@M GDF@ plugins/name_of_the_plugin/ ><I also >JIO<DI <IT JM <GG JA OC@ ADG@N OC<O TJPM NDO@ HDBCO M@LPDM@ EPNO GDF@ OC@ squelettes/ AJG?@M ??DODJI<GGT < KGPB DI NPKKJMON NJH@ <??DODJI<G <>ODJIN

@NN@IOD<GGT OCJN@ M@LPDM@? OJ DINO<GG <I? PIDINO<GG OC@ KGPB DI

So, is it best to write a plug-in or simply use the squelettes folder? &@I@M<GGT NK@<FDIB OC@ squelettes/ AJG?@M DN PN@? OJ NOJM@ @Q@MTOCDIB OC<O DN NK@>DAD> OJ < K<MOD>PG<M NDO@ -IGT RC@I < KD@>@ JA >J?@ DN B@I@MD> <I? M@PN<=G@ ?J@N DO H<F@N N@IN@ OJ K<>F<B@ DO <N < KGPB DI

Declaring options 5C@I < QDNDOJM M@LP@NON < K<B@ RC@OC@M JM IJO DO DN DI OC@ ><>C@ 1.(. ><MMD@N JPO < IPH=@M JA <>ODJIN JI@ JA RCD>C DN OJ GJ<? OC@ cJKODJINd ADG@N (I OC@N@ ADG@N R@ ><I AJM @S<HKG@ ?@ADI@ I@R >JINO<ION JM HJ?DAT BGJ=<G Q<MD<=G@N OC<O >JIOMJG OC@ R<T 1.(. JK@M<O@N 2C@N@ JKODJIN ><I =@ >M@<O@? DI OC@ ADG@ config/mes_options.php JM DI <IT KGPB DI =T ?@>G<MDIB OC@ I<H@ JA OC@ ADG@ DI plugin.xml GDF@ OCDN <options>pluginprefix_options.php</options> GG JKODJIN ADG@N OCJN@ JA OC@ NDO@ <I? OC@I OCJN@ JA <GG OC@ KGPBDIN <M@ GJ<?@? @Q@MT ODH@ < K<B@ M@LP@NO DN H<?@ DI OC@ KP=GD> UJI@ JM OC@ KMDQ<O@ UJI@ NJ OC@T NCJPG? =@ <N NDHKG@ <I? <N NH<GG <N KJNND=G@

102


# Extending SPIP 2CDN @S<HKG@ AMJH < >JIOMD=PODJI ><GG@? cNRDO>C@Md RDGG >C<IB@ OC@ N@O JA O@HKG<O@N PN@? =T OC@ NDO@ JM NOMD>OGT NK@<FDIB OC@ I<H@ JA OC@ O@HKG<O@N AJG?@M ?@K@I?DIB JI OC@ Q<GP@ JA OC@ var_skel K<M<H@O@M DI OC@ 30* <?php // 'name' => 'template path' $squelettes = array( '2008'=>'squelettes/2008', '2007'=>'squelettes/2007', ); // If a particular set of templates are requested (and exist), set a cookie, otherwise delete the cookie if (isset($_GET['var_skel'])) { if (isset($squelettes[$_GET['var_skel']])) setcookie('spip_skel', $_COOKIE['spip_skel'] = $_GET['var_skel'], NULL, '/'); else setcookie('spip_skel', $_COOKIE['spip_skel'] = '', -24*3600, '/'); } // If a particular template path is permitted, define it as the templates folder if (isset($_COOKIE['spip_skel']) AND isset($squelettes[$_COOKIE['spip_skel']])) $GLOBALS['dossier_squelettes'] = $squelettes[$_COOKIE['spip_skel']]; ?>

Declaring new functions 2C@ c;AJI>ODJINd ADG@N <M@ GJ<?@? <POJH<OD><GGT =T 1.(. =PO b PIGDF@ OC@ c;JKODJINd ADG@N K b JIGT RC@I DO I@@?N OJ @Q<GP<O@ < O@HKG<O@ OJ B@I@M<O@ < I@R K<B@ 2C@N@ ADG@N H<F@ DO KJNND=G@ AJM @S<HKG@ OJ ?@ADI@ I@R ADGO@MN OC<O ><I =@ PN@? DI O@HKG<O@N (A TJP >M@<O@ < squelettes/mes_fonctions.php ADG@ >JIO<DIDIB OC@ AJGGJRDIB >J?@ OC@I TJP RDGG =@ <=G@ OJ PN@ OC@ hello_world ADGO@M DI TJPM O@HKG<O@N PN@G@NN OCJPBC DO DN <?php function filtre_hello_world($v, $add){ return "Title:" . $v . ' // Followed by: ' . $add;

103


} ?>

[(#TITRE|hello_world{this text is added afterwards})]

?DNKG<TN 2DOG@ ODOG@ JA OC@ <MOD>G@ %JGGJR@? =T OCDN O@SO DN <??@? <AO@MR<M?N 2J >M@<O@ NP>C ADG@N DI < KGPB DI TJP I@@? OJ <?? OC@ I<H@ JA OC@ ADG@ DI TJPM plugin.xml GDF@ NJ <fonctions>pluginprefix_fonctions.php</fonctions>

$<>C

KGPB DI H<T >JIO<DI <IT IPH=@M JA OC@N@ ?@>G<M<ODJIN <I? ADG@N

Functions for specific templates 1JH@ODH@N ADGO@MN <M@ NK@>DAD> OJ < NDIBG@ O@HKG<O@ (O DN IJO <GR<TN ?@NDM<=G@ OJ GJ<? <GG NP>C API>ODJIN AJM @<>C <I? @Q@MT K<B@ 1.(. OCPN H<F@N DO KJNND=G@ OJ GJ<? >@MO<DI API>ODJIN JIGT RC@I ><G>PG<ODIB < K<MOD>PG<M O@HKG<O@ 1P>C < ADG@ NCJPG? =@ >M@<O@? DI OC@ N<H@ AJG?@M <N OC@ O@HKG<O@ <I? I<H@? <AO@M DO =PO RDOC _fonctions.php DINO@<? JA .html "JIND?@M OC@ @S<HKG@ AMJH <=JQ@ <B<DI (A OC@ ADG@ I<H@? squelettes/ world.html >JIO<DIN OC@ >J?@ [(#TITRE|hello_world{this text is added afterwards})] OC@I OC@ hello_world API>ODJI >JPG? =@ ?@>G<M@? DI OC@ squelettes/world_fonctions.php ADG@ 2CDN ADG@ RDGG JIGT =@ GJ<?@? RC@I 1.(. DN B@I@M<ODIB < K<B@ =<N@? JI OC@ squelettes/world.html O@HKG<O@

The concept of path 1.(. PN@N < G<MB@ IPH=@M JA API>ODJIN <I? O@HKG<O@N >JIO<DI@? DI Q<MDJPN AJG?@MN 5C@I < N>MDKO I@@?N OJ JK@I < ADG@ OJ GJ<? < API>ODJI JM OJ M@<? < O@HKG<O@ 1.(. RDGG N@<M>C AJM DO DI JI@ JA < IPH=@M JA AJG?@MN 2C@ ADMNO H<O>CDIB ADG@ AJPI? DI JI@ JA OC@N@ RDGG =@ GJ<?@? <I? PN@? 2C@ AJG?@MN <M@ K@MPN@? DI OC@ JM?@M ?@ADI@? =T OC@ >JINO<IO SPIP_PATH <I?

JKODJI<GGT PNDIB OC@ BGJ=<G Q<MD<=G@ $GLOBALS [’dossier_squelettes’]

104


# Extending SPIP 2C@ ?@A<PGO N@<M>C K<OC DN DI JM?@M \ squelettes/ \ OC@ KGPB DI plugin_B/ RCD>C ?@K@I?N JI cKGPBDI d \ OC@ KGPB DI plugin_A/ \ squelettes-dist/ \ prive/ \ ecrire/ \ ./

Overriding a file -I@ JA OC@ ADMNO KJNND=DGDOD@N OJ HJ?DAT 1.(.fN =@C<QDJPM DN OJ >JKT JI@ JA DON ADG@N AMJH ecrire/ DIOJ < AJG?@M RDOC CDBC@M KMDJMDOT K b < KGPB DI JM squelettes/ AJG?@M AJM @S<HKG@ b RCDG@ KM@N@MQDIB OC@ AJG?@M CD@M<M>CT 2CPN JI@ >JPG? HJ?DAT OC@ R<T DI RCD>C 1.(. H<I<B@N OC@ ><>C@ =T >JKTDIB ecrire/public/cacher.php OJ squelettes/public/cacher.php <I? OC@I HJ?DATDIB OCDN >JKT (O DN OCDN HJ?DAD@? >JKT RCD>C RJPG? =@ GJ<?@? =T 1.(. <N DO b =@DIB DI squelettes/ b C<N < CDBC@M KMDJMDOT OC<I OC@ JMDBDI<G This technique must be used with full knowledge of the facts. 5CDG@ OCDN O@>CIDLP@ DN Q@MT KJR@MAPG DO DN <GNJ Q@MT N@INDODQ@ OJ >C<IB@N DI 1.(. (A TJP PN@ OCDN H@OCJ? TJP H<T ADI? DO ?DAAD>PGO JM DHKJNND=G@ OJ PKBM<?@ TJPM NDO@ OJ APOPM@ Q@MNDJIN JA 1.(.

Overloading a _dist function +<IT JA OC@ API>ODJIN DI 1.(. <M@ ?@NDBI@? OJ =@ JQ@MMD??@I 2C@N@ API>ODJIN C<Q@ OC@ @SO@INDJI c;?DNOd DI OC@DM I<H@ GG OC@ baliseN cO<BNd boucleN cGJJKNd <I? critereN c>MDO@MD<d <M@ I<H@? GDF@ OCDN <I? ><I OCPN =@ JQ@MMD??@I =T ?@>G<MDIB K@MC<KN DI OC@ ADG@ mes_fonctions.php OC@ N<H@ API>ODJI =PO RDOCJPO OC@ NPAADS c;?DNOd DI OC@ I<H@ %JM @S<HKG@ OC@ @>MDM@ KP=GD> =JP>G@N KCK ADG@ >JIO<DIN < API>ODJI ><GG@? boucle_ARTICLES_dist (O ><I =@ JQ@MGJ<?@? =T ?@>G<MDIB < API>ODJI GDF@ OCDN function boucle_ARTICLES($id_boucle, &$boucles) {

105


// ... }

106


# Extending SPIP

Some functions you should know 1.(. >JIO<DIN H<IT @SOM@H@GT PN@APG .'. API>ODJIN 1JH@ <M@ PN@? HJM@ AM@LP@IOGT OC<I JOC@MN <I? ?@N@MQ@ < =DO HJM@ @SKG<I<ODJI Name

Description

>C<MB@M;AJI>ODJI K

%DI? < API>ODJI

ADI?;<GG;DI;K<OC K

%DI? < GDNO JA ADG@N

M@>PK@M@M;AJI? K

0@OPMIN OC@ M@NPGON JA >JHKDGDIB < O@HKG<O@

NKDK;GJB K

-POKPO <??DODJI<G ?<O< OJ OC@ GJBN

OMJPQ@M;O<=G@ K

.MJQD?@N OC@ ?@N>MDKODJI JA <I 1/* O<=G@

;M@LP@NO K

0@OMD@Q@ < Q<MD<=G@ AMJH OC@ 30* JM < AJMH

DI>GP?@;NKDK K

(I>GP?@ < .'. GD=M<MT

ADI?;DI;K<OC K

%DI? < API>ODJI

charger_fonction 2CDN charger_fonction() OM<ING<ODJI load_function() API>ODJI DN PN@? OJ M@OMD@Q@ OC@ I<H@ JA <I JQ@MGJ<?<=G@ 1.(. API>ODJI 5C@I@Q@M <I DIO@MI<G API>ODJI RDOC < _dist() NPAADS DN JQ@MGJ<?@? =T M@>M@<ODIB DO RDOCJPO OC<O NPAADS JM RC@I@Q@M <GG JA < ADG@ OC<O >JIO<DIN NP>C < API>ODJI DN JQ@MGJ<?@?

OC@I OC@ >JMM@>O API>ODJI OJ =@ MPI HPNO =@ M@OMD@Q<=G@ <O OC@ ODH@ OC<O OC<O API>ODJI DN OJ =@ @S@>PO@? 2CDN DN RC<O OC@ charger_fonction() ?J@N (O M@OPMIN OC@ >JMM@>O I<H@ JA OC@ API>ODJI OJ =@ @S@>PO@? $ma_fonction = charger_fonction('my_function','directory'); $ma_fonction();

The searching principle 2C@ API>ODJI JK@M<O@N <N AJGGJRN \ DA OC@ directory_my_function API>ODJI C<N <GM@<?T =@@I ?@>G<M@?

OC@I OC<O API>ODJI DN M@OPMI@?

\ @GN@ directory_my_function_dist

\ @GN@ OMT OJ GJ<? < ADG@ ><GG@? directory/my_function.php OC@I

107


\ M@OPMI directory/my_function DA DO @SDNON

\ @GN@ directory/my_function_dist

\ @GN@ M@OPMI false

Example 1@I? <I @H<DG $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); $envoyer_mail($email_address, $subject, $text_body);

find_all_in_path find_all_in_path() M@OPMIN OC@ GDNO JA ADG@N OC<O H<O>C < NK@>DAD> K<OO@MI *DF@ find_in_path() K OC@N@ ADG@N <M@ N@<>C@? DI <GG OC@ ?DM@>OJMD@N ?@ADI@? DI OC@ 1.(. ADG@ K<OC $list_of_files = find_all_in_path($dir, $pattern);

Example 1.(. PN@N OCDN API>ODJI OJ B@O <GG OC@ "11 OC<O OC@ KGPBDIN <?? OJ OC@ KMDQ<O@ DIO@MA<>@ PNDIB OC@ ADG@N I<H@? KMDQ@ NOTG@;KMDQ@;KGPBDI;prefix COHG 2J ?J NJ DO PN@N OC@ AJGGJRDIB GDI@ JA .'. >J?@ $list = find_all_in_path('prive/', '/style_prive_plugin_');

recuperer_fond IJOC@M API>ODJI RCD>C DN @SOM@H@GT DHKJMO<IO RDOCDI 1.(.

recuperer_fond() DN PN@? OJ M@OPMI OC@ M@NPGON JA >JHKDGDIB < BDQ@I O@HKG<O@ 2CDN DN NJMO JA OC@ N<H@ <N AJM <INCLURE{fond=name} /> PN@? DI O@HKG<O@N =PO DI .'.

108


# Extending SPIP (O <>>@KON AMJH OJ K<M<H@O@MN \ OC@ I<H@ <I? <??M@NN JA OC@ NJPM>@ >J?@ ADG@ RDOCJPO @SO@INDJI \ OC@ >JHKDG<ODJI >JIO@SO F@T Q<GP@ O<=G@ \ < O<=G@ JA JKODJIN \ OC@ I<H@ JA OC@ >JII@>ODJI ADG@ OJ OC@ ?<O<=<N@ OJ =@ PN@?

Simple usage 2C@ ?<O< M@OPMI@? DN OC@ >J?@ B@I@M<O@? =T OC@ >JHKDG<ODJI JPOKPO $code = recuperer_fond($name, $context);

Advanced usage 2C@ raw JKODJI N@O OJ true RDGG KMJQD?@ M<OC@M OC<I EPNO OC@ B@I@M<O@? >J?@ < O<=G@ JA DO@HN ><G>PG<O@? =T OC@ >JHKDG<ODJI RCD>C <GNJ DI>GP?@N OC@ >J?@ RDOC OC@ F@T texte 5C<O ?J@N OCDN O<=G@ >JIO<DI OC@I 2C@ O@SO OC@ <??M@NN JA OC@ O@HKG<O@ NJPM>@ O<BB@? NJPM>@ OC@ ADG@I<H@ JA OC@ .'. ><>C@ B@I@M<O@? =T OC@ >JHKDG<ODJI O<BB@? NLP@G@OO@ <I DI?D><OJM JA OC@ KM@N@I>@ JA .'. DI OC@ B@I@M<O@? ><>C@ ADG@ O<BB@? KMJ>@NN;DIN <I? Q<MDJPN JOC@M Q<GP@N DI>GP?@? DI OC@ >JHKDG<ODJI >JIO@SO OC@ G<IBP<B@ <I? ?<O< <M@ <POJH<OD><GGT <??@? NDI>@ OC@T C<Q@ IJO =@@I K<NN@? <N K<M<H@O@MN

Example 0@OMD@Q@ OC@ >JIO@ION JA < ADG@ /inclure/inc-liste-articles.html =T K<NNDIB OC@ D?@IODAD@M JA OC@ ?@NDM@? N@>ODJI MP=MDLP@ DI OC@ >JIO@SO $code = recuperer_fond("inclure/inc-liste-articles", array( 'id_rubrique' => $id_rubrique, ));

Using the raw option: '@M@ DN < NH<GG O@NO RDOC < O@HKG<O@ ><GG@? FD COHG >JIO<DIDIB JIGT OC@ O@SO CJK (I OCDN @S<HKG@ OC@ M@NPGON <M@ JPOKPO OJ < GJB ADG@ ><GG@? tmp/ test.log

109


$infos = recuperer_fond('ki',array(),array('raw'=>true)); spip_log($infos,'test');

2C@N@ <M@ OC@ M@NPGON OC<O RDGG =@ JPOKPO OJ tmp/test.log array ( 'texte' => 'hop ', 'squelette' => 'html_1595b873738eb5964ecdf1955e8da3d2', 'source' => 'sites/tipi.magraine.net/squelettes/ ki.html', 'process_ins' => 'html', 'invalideurs' => array ( 'cache' => '', ), 'entetes' => array ( 'X-Spip-Cache' => 36000, ), 'duree' => 0, 'contexte' => array ( 'lang' => 'en', 'date' => '2009-01-05 14:10:03', 'date_redac' => '2009-01-05 14:10:03', ), )

spip_log 2CDN API>ODJI DN PN@? OJ M@>JM? <>ODJIN JPO OJ OC@ GJB ADG@N B@I@M<GGT GJ><O@? DI OC@ tmp/log/ ?DM@>OJMT 2CDN API>ODJI <>>@KON JM <MBPH@ION 5DOC JI@ <MBPH@IO DO RDGG RMDO@ JPO OJ EPNO OC@ spip.log ADG@ 5DOC ORJ <MBPH@ION DO RDGG RMDO@ JPO OJ =JOC < N@K<M<O@ GJB ADG@ <I? <GNJ OJ OC@ spip.log <?php spip_log($tableau); spip_log($tableau, 'second_file');

110


# Extending SPIP spip_log("adding field $champ into the $table table","my_plugin"); ?>

5C@I < O<=G@ DN K<NN@? OJ OC@ GJB API>ODJI 1.(. RDGG RMDO@ JPO OC@ JPOKPO AMJH print_r() DIOJ OC@ GJB ADG@ %JM @<>C ADG@ M@LP@NO@? DI OCDN ><N@ spip =T ?@A<PGO <I? second_file 1.(. RDGG >M@<O@ JM <?? OC@ >JIO@ION JA OC@ ADMNO <MBPH@IO =PO IJO EPNO <ITRC@M@ (A OC@ N>MDKO DN MPI AMJH OC@ KMDQ<O@ DIO@MA<>@

DO RDGG RMDO@ JPO OJ KMDQ@;NKDK GJB JM OJ KMDQ@;N@>JI?;ADG@ GJB JOC@MRDN@ DO RDGG RMDO@ OJ NKDK GJB JM N@>JI?;ADG@ GJB 2C@ >JIADBPM<ODJI ADG@ ecrire/inc_version.php ?@ADI@N OC@ H<SDHPH NDU@ JA OC@ GJB ADG@N 5C@I < BDQ@I GJB ADG@ @S>@@?N OCDN KM@ ?@O@MHDI@? ADG@ NDU@ DO DN M@I<H@? prive_spip.log.n n RDGG <POJH<OD><GGT DI>M@H@IO 2C@ IPH=@M JA NP>C ADG@N OC<O H<T @SDNO DN <GNJ >JIADBPM<=G@ (O DN <GNJ KJNND=G@ OJ ?@<>ODQ<O@ OC@ GJBN =T N@OODIB JI@ JA OC@N@ NK@>DAD@? Q<GP@N OJ U@MJ RDOCDI OC@ mes_options.php ADG@ $GLOBALS['nombre_de_logs'] = 4; // maximum 4 log files $GLOBALS['taille_des_logs'] = 100; // maximum 100 KB each

2C@M@ DN <GNJ < _MAX_LOG >JINO<IO N@O OJ =T ?@A<PGO RCD>C NK@>DAD@N OC@ IPH=@M JA @IOMD@N OC<O @<>C ><GG AMJH < BDQ@I K<B@ H<T RMDO@ OJ < GJB ADG@ 5DOC OCDN ?@A<PGO N@OODIB <AO@M ><GGN <M@ H<?@ OJ spip_log() AMJH <IT K<MOD>PG<M N>MDKO OC@ GJB API>ODJI RDGG M@APN@ OJ RMDO@ <IT APMOC@M >JIO@IO AJM OC<O N>MDKO

trouver_table 2C@ trouver_table() API>ODJI base_trouver_table_dist DN ?@>G<M@? DI @>MDM@ =<N@ OMJPQ@M;O<=G@ KCK <I? DN PN@? OJ J=O<DI < ?@N>MDKODJI AJM <I 1/* O<=G@ (O KMJQD?@N < H@>C<IDNH OJ M@OMD@Q@ OC@ GDNO JA >JGPHIN F@TN ?@>G<M@? EJDIN <I? NJH@ JOC@M DIAJMH<ODJI ?@O<DGN N <I JQ@MGJ<?<=G@ API>ODJI DO DN PN@? RDOC >C<MB@M;AJI>ODJI K $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table, $serveur);

111


(ON K<M<H@O@MN <M@ $table OC@ I<H@ JA OC@ O<=G@ fNKDK;<MOD>G@Nf JM f<MOD>G@Nf $serveur JKODJI<G OC@ I<H@ JA OC@ 1/* >JII@>ODJI RCD>C DN =T ?@A<PGO OC@ N<H@ <N OC<O AJM OC@ 1.(. DINO<GG<ODJI DON@GA 2C@ $desc O<=G@ M@OPMI@? DN NOMP>OPM@? <N AJGGJRN array( 'field' => array('column' => 'description'), 'key' => array( 'PRIMARY KEY' => 'column', 'KEY name' => 'column' // or 'column1, column2' ), 'join' => array('column' => 'column'), 'table' => 'spip_tables' 'id_table' => $table, 'connexion' => 'connection_name', 'titre' => 'column_title AS titre, column_language AS lang' );

\ 2C@ field F@T DN <I <NNJ>D<ODQ@ O<=G@ GDNO <GG JA OC@ O<=G@fN >JGPHIN <I? OC@DM 1/* ?@N>MDKODJIN

\ key DN <IJOC@M O<=G@ GDNODIB OC@ KMDH<MT <I? N@>JI?<MT F@TN

\ join GDNON OC@ >JGPHIN JA <IT EJDIN DA ?@>G<M@? DI OC@ ?@N>MDKODJIN JA OC@ KMDI>DK<G JM <PSDGD<MT O<=G@N \ table DN OC@ <>OP<G I<H@ JA OC@ O<=G@ RDOCJPO KM@ADS DA OC@ O<=G@ KM@ADS DN ?DAA@M@IO AMJH NKDK OC@I DO RDGG =@ NKDK;O<=G@N OC<O RDGG =@ M@OPMI@?

\ id_table DN OC@ BDQ@I $table K<M<H@O@M

\ connexion DN OC@ I<H@ JA OC@ >JII@>ODJI ADG@ DA ?DAA@M@IO AMJH OC<O JA OC@ DINO<GG<ODJI

\ titre DN <I 1/* 1$*$"2 ?@>G<M<ODJI DI?D><ODIB RC@M@ DN OC@ >JGPHI ODOG@ JM RC@M@ DN OC@ >JGPHI G<IBP<B@ PN@? <HJIBNO JOC@M OCDIBN OJ ><G>PG<O@ OC@ 30*N @ B titre, lang JM name AS title, '' AS lang 2CDN API>ODJI ><>C@N K OC@ M@NPGO JA OC@ <I<GTNDN DI JM?@M OJ <QJD? M@K@ODODQ@ ?DNMPKODQ@ <>>@NN OJ OC@ 1/* N@MQ@M 2J AJM>@ < M@><G>PG<ODJI JA OCDN ><>C@ OC@ API>ODJI HPNO =@ ><GG@? RDOC <I @HKOT NOMDIB $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table('');

112


# Extending SPIP Note: 5C@I@Q@M < O<=G@ DN M@LP@NO@? RDOCJPO OC@ NKDK KM@ADS DO DN OC@ I<H@ JA OC@ O<=G@ RDOC OC@ KM@ADS <NNDBI@? AJM OC@ NDO@ OC<O RDGG =@ M@OPMI@? NJ GJIB <N OC@ O<=G@ DN ?@>G<M@? DI 1.(. 0@LP@NODIB < NKDK;O<=G@N O<=G@ RDGG GJJF AJM OC@ M@<G @SDNO@I>@ JA OC<O O<=G@ OC@ KM@ADS DN IJO M@KG<>@? =T OC<O PN@? AJM OC@ NDO@ (I OC@ APOPM@ <I JKODJI RDGG KMJ=<=GT =@ <??@? OJ OC@ trouver_table() API>ODJI <N OC@M@ DN <GM@<?T AJM NLG;NCJRO<=G@ K DI JM?@M OJ =@ <=G@ OJ <POJH<OD><GGT HJ?DAT OC@ KM@ADS

Example 2C@ creer_champs_extras() API>ODJI AMJH OC@ "C<HKN $SOM<N KGPBDI DN PN@? OJ >M@<O@ 1/* >JGPHIN ?@N>MD=@? =T OC@ "C<HK$SOM< J=E@>O DINO<I>@N K<NN@? $c->table DN OC@ I<H@ JA OC@ 1/* O<=G@ $c>champ DN OC<O JA OC@ >JGPHI 2C@ API>ODJI M@OPMIN false DA < >JGPHI C<N IJO =@@I >M@<O@? function creer_champs_extras($champs) { // the function updates the tables in question using maj_tables() // [...] // It then tests if the new fields have actually been created: // for each to create, check that is actually exists now! $trouver_table = charger_fonction('trouver_table','base'); $trouver_table(''); // recreate the description of the tables. $retour = true; foreach ($champs as $c){ if ($table = table_objet_sql($c->table)) { $desc = $trouver_table($table); if (!isset($desc['field'][$c->champ])) { extras_log("Le champ extra '" . $c->champ . "' sur $table n'a pas ete cree :(", true); $retour = false; } } else { $retour = false; } } return $retour;

113


}

_request 2C@ _request() API>ODJI DN PN@? OJ M@OMD@Q@ OC@ Q<GP@N JA Q<MD<=G@N N@IO =T OC@ NDO@ QDNDOJM @DOC@M OCMJPBC < 30* JM OCMJPBC < KJNO@? AJMH $name = _request('name');

Security principles 2C@N@ API>ODJIN HPNO IJO =@ GJ><O@? EPNO <ITRC@M@ <HJIBNO OC@ 1.(. ADG@N DI JM?@M OJ =@ <=G@ OJ ><M@APGGT M@NOMD>O OC@ KJNND=G@ GJ><ODJIN GDF@GT OJ =@ O<MB@ODIB AJM KDM<ODIB 2C@ @G@H@ION KMJQD?@? =T PN@M DIKPO HPNO JIGT =@ M@OMD@Q<=G@ AMJH \ <>ODJI ADG@N DI OC@ action/ ?DM@>OJMT

\ OC@ KMDQ<O@ UJI@ ?DNKG<T ADG@N DI OC@ exec/ ?DM@>OJMT

\ NJH@ Q@MT M<M@ ?TI<HD> O<B API>ODJIN DI OC@ balise/ ?DM@>OJMT JM \ DI OC@ ADG@N OC<O KMJ>@NN R@= AJMHN DI OC@ formulaires/ ?DM@>OJMT N <I <??DODJI<G B@I@M<G MPG@ DO DN I@>@NN<MT OJ Q@MDAT OC<O OC@ Q<MD<=G@ OTK@ M@>@DQ@? DN DI?@@? DI OC@ @SK@>O@? AJMH<O OJ @GDHDI<O@ <IT MDNF JA C<>FDIB @Q@I DA 1.(. <GM@<?T K@MAJMHN < ADMNO G@Q@G >G@<IDIB JA DIKPO ?<O< AJM @S<HKG@ DA TJP @SK@>O < IPH=@M OC@I TJP HPNO <KKGT OC@ intval() API>ODJI RCD>C RDGG OM<INAJMH <IT O@SO DIOJ DON IPH@MD> Q<GP@ if ($identifiant = _request('identifier')){ $identifier = intval($identifier); }

Retrieval from a table (A TJP R<IO OJ M@OMD@Q@ JIGT >@MO<DI NK@>DAD> Q<GP@N OC<O @SDNO DI < O<=G@ TJP ><I K<NN OC<O O<=G@ <N < N@>JI? K<M<H@O@M // retrieve if there is a $table['name'] $name = _request('name', $table);

114


# Extending SPIP Example 0@OMD@Q@ JIGT AMJH OC@ Q<GP@N OC<O R@M@ K<NN@? DI OC@ 30* $name = _request('name', $_GET);

include_spip 2C@ API>ODJI include_spip() DI>GP?@N < .'. ADG@ 2C@ ?DAA@M@I>@ AMJH .'.fN IJMH<G include_once() DN OC<O OC@ ADG@ DN N@<M>C@? AJM DI OC@ 1.(. path K OC<O DN DI <GG OC@ FIJRI ?DM@>OJMD@N <I? DI OC@ N@<M>C KMDJMDOT JM?@M NK@>DAD@? DI OC@ 1.(. K<OC include_spip() <>>@KON JM <MBPH@ION \ OC@ I<H@ JM M@G<ODQ@ K<OC JA OC@ ADG@ RDOCJPO DON KCK @SO@INDJI \ < AG<B OMP@ =T ?@A<PGO OC<O DI?D><O@N DA OC@ ADG@ DN <>OP<GGT OJ =@ DI>GP?@? JM DA JIGT OC@ K<OC JA OC@ ADG@ DN OJ =@ M@OPMI@? include_spip('fichier'); include_spip('dossier/fichier'); $adresse = include_spip('fichier'); $adresse = include_spip('fichier', false); // inclusion is not performed

Example // loads the file containing the functions used on // the installation pages or error pages include_spip('inc/minipres'); echo minipres('Bad luck!', 'An error has occurred!'); exit;

find_in_path 2C@ API>ODJI find_in_path() M@OPMIN OC@ K<OC JA < K<MOD>PG<M API>ODJI 2CDN API>ODJI DN N@<M>C@? AJM DI OC@ 1.(. K<OC K

115


(O O<F@N JM <MBPH@ION \ OC@ I<H@ JM M@G<ODQ@ K<OC JA < ADG@ RDOC DON @SO@INDJI \ KJNND=GT OC@ ?DM@>OJMT RC@M@ DO DN NOJM@? $f = find_in_path("directory/file.ext"); $f = find_in_path("file.ext","directory");

Example (A OC@ pattern/inc-special.html ADG@ @SDNON ><G>PG<O@ COHG <N OC@ M@NPGO JA >JHKDGDIB OCDN O@HKG<O@ -OC@MRDN@ COHG DN OC@ M@NPGO JA >JHKDGDIB pattern/inc-normal.html if (find_in_path("pattern/inc-special.html")) { $html = recuperer_fond("pattern/inc-special"); } else { $html = recuperer_fond("pattern/inc-normal"); }

116


# Extending SPIP

Pipelines 1JH@ K<MON JA OC@ >J?@ ?@ADI@ cKDK@GDI@Nd 2C@T KMJQD?@ JI@ JA OC@ =@NO R<TN OJ HJ?DAT JM <?<KO OC@ =@C<QDJPM JA 1.(.

insert_head_css 2C@ insert_head_css KDK@GDI@ DN PN@? =T KGPBDIN OJ DIN@MO OC@ "11 ADG@N OC<O OC@T I@@? OJ JK@M<O@ >JMM@>OGT DIOJ OC@ N@>ODJI JA OC@ 1.(. O@HKG<O@ OC<O DI>GP?@N OC@ #INSERT_HEAD_CSS O<B DA OC@M@ DN JI@ <I? DA IJO OC@I <O OC@ NO<MO JA OC@ >J?@ DI>GP?@? PNDIB OC@ #INSERT_HEAD O<B 2CDN <GGJRN < O@HKG<O@ OJ DI?D><O@ < NK@>DAD> GJ><ODJI AJM <??DODJI<GGT GJ<?@? "11 >J?@ (O DN ><GG@? LPDO@ NDHKGT =T PNDIB return pipeline('insert_head_css', '');

Example 2C@ .JMO@ .GPH@ @SO@INDJI PN@N DO DI < NDHKGDAD@? H<II@M OJ <?? ORJ "11 ADG@N OC@ N@>JI? =@DIB < 1.(. O@HKG<O@ ADG@ function porte_plume_insert_head_css($flux) { $css = find_in_path('css/barre_outils.css'); $css_icones = generer_url_public('barre_outils_icones.css'); $flux .= "<link rel='stylesheet' type='text/css' media='all' href='$css' />\n" . "<link rel='stylesheet' type='text/css' media='all' href='$css_icones' />\n"; return $flux; }

Definition .DK@GDI@N <M@ KMJQD?@? =T 1.(. OJ <GGJR TJPM KGPBDI OJ eCJJF DIOJf 1.(. >J?@ OC<O DN AJM 1.(. OJ ><GG API>ODJIN DI TJPM KGPBDI <O NK@>DAD> HJH@ION <I? OC@M@=T N@O TJPM KGPBDI DI HJODJI

117


2C@ ?@>G<M<ODJI ADG@ plugin.xml JA OC@ KGPBDI HPNO >JIO<DI OC@N@ GDI@N <cadre class="xml"> <prefix>pluginPrefix</prefix> <pipeline> <nom>pipelineName</nom> <inclure>cfg_pipeline.php</inclure> </pipeline> </cadre> \ IJH OC@ KDK@GDI@ I<H@

\ DI>GPM@ DI?D><O@N OC@ ADG@ OC<O ?@>G<M@N OC@ API>ODJI OJ @S@>PO@ RC@I OC@ KDK@GDI@ DN OMDBB@M@? OCDN API>ODJI DN <GR<TN I<H@? OCPN pluginPrefix_pipelineName() 2C@ ADG@ config/mes_options.php <I? JOC@M 66;JKODJIN ADG@N K <GNJ <GGJRN >J?@ @S@>PODJI JA < KDK@GDI@ RDOC OCDN NJMO JA @IOMT $GLOBALS['spip_pipeline']['insert_head'] .= "|functionName";

List of current pipelines 2C@ ?@A<PGO KDK@GDI@N ?@ADI@? DI 1.(. <M@ GDNO@? DI OC@ ADG@ @>MDM@ DI>;Q@MNDJI KCK 'JR@Q@M KGPBDIN <M@ <=G@ OJ >M@<O@ I@R JI@N 2C@M@ <M@ N@Q@M<G OTK@N JA KDK@GDI@N NJH@ JA OC@H ?@<G RDOC OTKJBM<KCD><G HJ?DAD><ODJIN JOC@MN ?@<G RDOC ?<O<=<N@ HJ?DAD><ODJIN JM K<B@N OC<O <M@ JIGT ?DNKG<T@? DI OC@ KMDQ<O@ <M@< @O>

Declaring a new pipeline 2C@ KDK@GDI@ HPNO ADMNO =@ ?@>G<M@? DI < BGJ=<G JKODJIN ADG@ GDF@ OCDN $GLOBALS['spip_pipeline']['newPipelineName'] = ''; 2C@ I<H@ JA OCDN KDK@GDI@ HPNO =@ < F@T JA OC@ <NNJ>D<ODQ@ <MM<T $GLOBALS['spip_pipeline'] 2C@I OC@ KDK@GDI@N HPNO =@ ><GG@? AMJH NJH@RC@M@ @DOC@M DI < O@HKG<O@ JM < .'. ADG@

118


# Extending SPIP \ 2@HKG<O@N #PIPELINE{newPipelineName, initial content} \ .'. $data = pipeline("newPipelineName", "initial content"); 2C@ #PIPELINE O<B <I? OC@ pipeline() API>ODJI =JOC PN@ OC@ N<H@ <MBPH@ION 2C@ ADMNO <MBPH@IO DN OC@ I<H@ DI JPM @S<HKG@ DOfN I@R.DK@GDI@,<H@ 2C@ JOC@M JI@ DN OC@ ?<O< OC<O DN N@IO OJ OC@ CJJF 2C@ KDK@GDI@ DN < >C<II@G =T RCD>C DIAJMH<ODJI DN OM<INHDOO@? N@LP@IOD<GGT $<>C KGPBDI OC<O C<N ?@>G<M@? OCDN KDK@GDI@ DN K<MOT OJ OCDN >C<II@G <I? NJ ><I >JHKG@O@ JM HJ?DAT OC@ DIKPO ?<O< <I? OM<INHDO OC@ M@NPGO OJ OC@ I@SO K<MO 2C@ M@NPGO JA OC@ KDK@GDI@ DN OC@ M@NPGO JA OC@ G<NO KMJ>@NN OC<O C<N =@@I <KKGD@?

Contextual pipelines (O DN JAO@I I@>@NN<MT OJ K<NN >JIO@SOP<G <MBPH@ION OJ OC@ KDK@GDI@ JI OJK JA OC@ ?<O< M@OPMI@? =T OC@ KDK@GDI@ 2CDN DN KJNND=G@ =T PNDIB < O<=G@ RDOC <O G@<NO F@TN I<H@? "args" <I? "data" 5C@I OC@ G<NO API>ODJI JA OC@ KDK@GDI@ >C<DI DN ><GG@? JIGT OC@ Q<GP@ JA data DN M@OPMI@? $data = pipeline('newPipeline',array( 'args'=>array( 'id_article'=>$id_article ), 'data'=>"initial content" );

[(#PIPELINE{newPipeline, [(#ARRAY{ args,[(#ARRAY{id_article,#ID_ARTICLE})], data,initial content })]})]

119


Pipeline details 2CDN N@>ODJI ?@N>MD=@N OC@ PN@ JA NJH@ JA 1.(.fN KDK@GDI@N Name

Description

M@>C@M>C@M;GDNO@;?@N;>C<HKN #@ADI@ OC@ AD@G?N <I? R@DBCODIBN OJ <KKGT AJM K N@<M>C@N DI < O<=G@ <>>P@DG;@I>JPMN K

120

?? >JIO@IO OJ OC@ >@IOM@ JA OC@ CJH@ K<B@

<>>P@DG;B<?B@O K

?? GDIFN <=JQ@ OC@ >JIO@IO JA OC@ CJH@ K<B@

<>>P@DG;DIAJMH<ODJIN K

.MJQD?@ NO<ODNOD>N <=JPO @?DOJMD<G J=E@>ON JI OC@ CJH@ K<B@

<AAD>C<B@;@IO@O@N;ADI<G K

+J?DAT OC@ C@<?@MN JA OC@ K<B@N M@OPMI@?

<AAD>C<B@;ADI<G K

.@MAJMH KMJ>@NNDIB EPNO =@AJM@ KP=GDNCDIB KP=GD> A<>DIB R@= K<B@N

<AAD>C@M;>JIADB;J=E@O K

?? @G@H@ION DIOJ OC@ >JIADBPM<ODJI K<I@GN AJM @?DOJMD<G J=E@>ON

<AAD>C@M;>JIO@IP;J=E@O K

+J?DAT JM <?? OJ OC@ QD@R AJMH JA <I J=E@>O DI OC@ KMDQ<O@ DIO@MA<>@

<AAD>C@M;AD>C@;J=E@O K

?? >JIO@IO DIOJ OC@ QD@R N>M@@IN JA @?DOJMD<G J=E@>ON

<AAD>C@;?MJDO@ K

?? >JIO@IO OJ OC@ MDBCO C<I? >JGPHI DI OC@ KMDQ<O@ UJI@

<AAD>C@;@IA<ION K

+J?DAT JM <?? OJ OC@ >JIO@ION JA OC@ GDNON NCJRDIB OC@ >CDG?M@I JA <I J=E@>O DI OC@ KMDQ<O@ UJI@

<AAD>C@;B<P>C@ K

?? >JIO@ION OJ OC@ G@AO C<I? >JGPHI DI OC@ KMDQ<O@ UJI@

<AAD>C@;CD@M<M>CD@ K

+J?DAT OC@ '2+* >J?@ JA OC@ =M@<?>MPH= K<OC DI OC@ KMDQ<O@ UJI@

<EJPO@M;=JPOJIN K

?? =POOJIN OJ OC@ KMDQ<O@ NK<>@ H@IP =<M

<EJPO@M;JIBG@ON K

?? O<=N OJ OC@ KMDQ<O@ UJI@ K<B@N

<G@MO@N;<PO@PM K

?? R<MIDIBN OJ OC@ <POCJM GJBB@? DI OJ OC@ KMDQ<O@ UJI@

<POJMDN@M K

*J<? OC@ <POCJMDN<ODJI API>ODJIN


# Extending SPIP Name

Description

=J?T;KMDQ@ K

(IN@MO >JIO@IO <AO@M OC@ <body> N@>ODJI DI OC@ KMDQ<O@ UJI@

>JHKO@M;>JIOMD=PODJIN;<PO@PM "JPIO <I <POCJMfN >JIOMD=PODJIN K ?@>G<M@M;O<=G@N;<PSDGD<DM@N K

#@>G<MDIB <PSDGD<MT 1/* O<=G@N

?@>G<M@M;O<=G@N;DIO@MA<>@N K

#@>G<M@ <??DODJI<G ?<O< DI 1/* O<=G@N <GD<N

KMJ>@NN@N EJDIN

?@>G<M@M;PMG;J=E@ON K

$I<=G@ NO<I?<M? 30*N AJM < I@R @?DOJMD<G J=E@>O

?@ADIDM;N@NNDJI K

#@ADI@ OC@ K<M<H@O@MN OC<O D?@IODAT OC@ QDNDOJM NK@>DAD> ><>C@N

?@G@O@;NO<ODNODLP@N K

2MDBB@M@? RC@I OC@ NO<ODNOD>N O<=G@N <M@ KPMB@?

?@G@O@;O<=G@N K

2MDBB@M@? ?PMDIB ?<O<=<N@ KPMB@N

@?DO@M;>JIO@IP;J=E@O K

+J?DAT OC@ '2+* >JIO@IO JA AJMHN

AJMHPG<DM@;>C<MB@M K

+J?DAT OC@ O<=G@ JA Q<GP@N M@OPMI@? =T OC@ charger API>ODJI AJM < "42 AJMH

AJMHPG<DM@;OM<DO@M K

+J?DAT OC@ O<=G@ M@OPMI@? =T OC@ traiter API>ODJI AJM < "42 AJMH JM K@MAJMH NJH@ NPKKG@H@IO<MT KMJ>@NN@N

AJMHPG<DM@;Q@MDAD@M K

+J?DAT OC@ O<=G@ M@OPMI@? =T OC@ verifier API>ODJI AJM < "42 AJMH

C@<?@M;KMDQ@ K

?? >JIO@IO DIOJ OC@ <head> N@>ODJI JA KMDQ<O@ UJI@ K<B@N

GDNO@M;O<=G@N;IJ@M<N@ K

*DNO OC@ O<=G@N RCD>C IJO OJ =@ KPMB@? =@AJM@ < =<>FPK M@NOJM@

GDNO@M;O<=G@N;IJ@SKJMO K *DNO OC@ 1/* O<=G@N IJO OJ =@ =<>F@? PK GDNO@M;O<=G@N;IJDHKJMO K *DNO OC@ 1/* O<=G@N IJO OJ =@ DHKJMO@? JKODHDN@M;=<N@;?DNK<MPN K

"G@<I JPO JMKC<I M@>JM?N AMJH OC@ ?<O<=<N@

KJNO;OTKJ K

+J?DAT O@SO <AO@M OC@ OTKJBM<KCD><G KMJ>@NN@N C<Q@ =@@I <KKGD@?

121


Name

Description

KM@;DIN@MODJI K

?? ?@A<PGO >JIO@IO RC@I < ?<O<=<N@ DIN@MO DN @S@>PO@?

KM@;GD@IN K

.MJ>@NN OTKJBM<KCD><G NCJMO>PON M@G<ODIB OJ GDIFN

KM@;OTKJ K

+J?DAT O@SO =@AJM@ OC@ OTKJBM<KCD><G KMJ>@NN@N <M@ <KKGD@?

M@>PK@M@M;AJI? K

+J?DAT OC@ M@NPGON JA < O@HKG<O@ >JHKDG<ODJI

MP=MDLP@;@I>JPMN K

?? >JIO@IO DIOJ OC@ .MJKJN@? AJM KP=GD><ODJI <M@< AJM N@>ODJIN

O<>C@N;B@I@M<G@N;>MJI K

1@OODIB PK K@MDJ?D> O<NFN

OMDB;NPKKMDH@M;J=E@ON;GD@N K

#@G@O@ OC@ GDIFN AJM <I J=E@>O RC@I <I J=E@>O DN ?@G@O@?

<I? OC@ M@NO JA OC@H K

2CJN@ OC<O <M@ T@O OJ =@ ?J>PH@IO@?

rechercher_liste_des_champs 2CDN KDK@GDI@ NK@>DAD@N OC@ AD@G?N OJ =@ >JIND?@M@? RC@I < N@<M>C DN K@MAJMH@? JI < BDQ@I O<=G@ (O H<IDKPG<O@N < ?DH@INDJI<G <NNJ>D<ODQ@ <MM<T >JHKJN@? GDF@ OCDN \ OC@ ADMNO F@T DN OC@ I<H@ JA < 1.(. J=E@>O <MOD>G@ MP=MDLP@ \ OC@ JOC@M F@T DN OC@ I<H@ JA < AD@G? ODOM@ O@SO@ OJ O<F@ DIOJ <>>JPIO AJM OC@ N@<M>C \ OC@ Q<GP@ DN OC@ R@DBCODIB >J@AAD>D@IO OC@ CDBC@M OCDN Q<GP@ DN OC@ HJM@ KJDION <M@ <OOMD=PO@? OJ < M@NPGO AJPI? DI OC@ >JMM@NKJI?DIB AD@G? Example: function prefixPlugin_rechercher_liste_des_champs($tables){ // add a field 'town' to the articles $tables['article']['town'] = 3; // hide a field from the search process unset($tables['rubrique']['descriptif']); return $tables; }

122


# Extending SPIP

accueil_encours 2CDN KDK@GDI@ DN PN@? OJ <?? >JIO@IO OJ OC@ >@IOM@ JA OC@ CJH@ K<B@ DI OC@ KMDQ<O@ UJI@ @ B OJ ?DNKG<T I@R <MOD>G@N KMJKJN@? AJM KP=GD><ODJI $res = pipeline('accueil_encours', $res);

2CDN KDK@GDI@ <>>@KON < O@SO NOMDIB <N <MBPH@IO <I? M@OPMIN OC@ NPKKG@H@IO@? O@SO <N JPOKPO

Example 2C@ =M@Q@N KGPBDI DA DO @SDNO@? RJPG? PN@ OCDN KDK@GDI@ OJ <?? OC@ GDNO JA M@>@IOGT KMJKJN@? I@RN DO@HN function breves_accueil_encours($texte){ $texte .= afficher_objets('breve', afficher_plus(generer_url_ecrire('breves')) . _T('info_breves_valider'), array("FROM" => 'spip_breves', 'WHERE' => "statut='prepa' OR statut='prop'", 'ORDER BY' => "date_heure DESC"), true); return $texte; }

accueil_gadget 2CDN KDK@GDI@ DN PN@? OJ <?? GDIFN <=JQ@ OC@ >JIO@IO JA OC@ CJH@ K<B@ DI OC@ KMDQ<O@ UJI@ RDOCDI OC@ AM<H@ OC<O GDNON OC@ Q<MDJPN <>ODJIN <Q<DG<=G@ >M@<O@ < N@>ODJI <I <MOD>G@ < I@RN DO@H @O> $gadget = pipeline('accueil_gadgets', $gadget);

2CDN KDK@GDI@ <>>@KON < O@SO <MBPH@IO <I? M@OPMIN OC@ NPKKG@H@IO@? O@SO <N JPOKPO

123


Example 2C@ =M@Q@N KGPBDI DA DO @SDNO@? RJPG? PN@ OCDN KDK@GDI@ OJ <?? < GDIF <O OC@ OJK OJ <GGJR OC@ PN@M OJ >M@<O@ JM QD@R OC@ GDNO JA I@RN DO@H ?@K@I?DIB JI OC@ NO<OPN JA OC@ <POCJM >PMM@IOGT >JII@>O@? function breves_accueil_gadgets($texte){ if ($GLOBALS['meta']['activer_breves'] != 'non') { // create, otherwise view if ($GLOBALS['visiteur_session']['statut'] == "0minirezo") { $ajout = icone_horizontale(_T('icone_nouvelle_breve'), generer_url_ecrire("breves_edit","new=oui"), "breve-24.png","new", false); } else { $ajout = icone_horizontale (_T('icone_breves'), generer_url_ecrire("breves",""), "breve-24.png", "", false); } $texte = str_replace("</tr></table>", "<td>$ajout</td></tr></table>", $texte); } return $texte; }

accueil_informations 2CDN KDK@GDI@ DN PN@? OJ <?? NO<ODNOD><G ?<O< <=JPO OC@ @?DOJMD<G J=E@>ON DIOJ OC@ ND?@ I<QDB<ODJI K<I@G JI OC@ CJH@ K<B@ $res = pipeline('accueil_informations', $res);

(O <>>@KON O@SO <N < K<M<H@O@M OC<O DO H<T >JHKG@O@ <I? M@OPMI <N JPOKPO

Example 2C@ =M@Q@N KGPBDI DA DO @SDNO@? HDBCO PN@ OCDN KDK@GDI@ OJ <?? OC@ IPH=@M JA I@RN DO@HN <R<DODIB Q<GD?<ODJI AJM KP=GD><ODJI

124


# Extending SPIP function breves_accueil_informations($texte){ include_spip('base/abstract_sql'); $q = sql_select("COUNT(*) AS cnt, statut", 'spip_breves', '', 'statut', '','', "COUNT(*)<>0"); // processes operating on the text depending on the resulting output // ... return $texte; }

affichage_entetes_final 2CDN KDK@GDI@ ><GG@? AJM @Q@MT 1.(. KP=GD> K<B@ RC@I DO DN ?DNKG<T@? <>>@KON < O<=G@ K<M<H@O@M >JIO<DIDIB OC@ GDNO JA K<B@ C@<?@MN (O OC@I <GGJRN OC@ HJ?DAD><ODJI JA JM <??DODJI OJ OCJN@ C@<?@MN (O DN ><GG@? EPNO =@AJM@ OC@ <AAD>C<B@;ADI<G K KDK@GDI@ RCD>C DON@GA M@>@DQ@N OC@ O@SO NOMDIB JPOKPO =T OCDN API>ODJI 2CDN KDK@GDI@ DN ><GG@? DI @>MDM@ KP=GD> KCK O<FDIB <I? M@OPMIDIB < O<=G@ K<M<H@O@M >JIO<DIDIB OC@ Q<MDJPN K<B@ C@<?@MN $page['entetes'] = pipeline('affichage_entetes_final', $page['entetes']);

Example -I@ PN<B@ JA OCDN KDK@GDI@ DN OJ @I<=G@ NDO@ NO<ODNOD>N B@I@M<ODJI NDI>@ =T FIJRDIB OC@ C@<?@MN N@IO JPO <I? OC@M@AJM@ OC@ K<B@ OTK@ <I? >@MO<DI JOC@M @IQDMJIH@IO<G K<M<H@O@MN R@ ><I H<F@ @IOMD@N DIOJ < QDNDOJM NO<ODNOD>N O<=G@ OC@ <>ODJI >J?@ C<N =@@I NDHKGDAD@? AJM M@A@M@I>@ KPMKJN@N C@M@ <I? >JH@N AMJH OC@ 1O<ODNODLP@N KGPBDI // for html pages generated, count the visits. function stats_affichage_entetes_final($entetes){ if (($GLOBALS['meta']["activer_statistiques"] != "non") AND preg_match(',^\s*text/html,', $entetes['ContentType'])) { $stats = charger_fonction('stats', 'public');

125


$stats(); } return $entetes; }

affichage_final 2CDN KDK@GDI@ DN ><GG@? <O OC@ ODH@ OC<O OC@ >JIO@ION JA < K<B@ <M@ =@DIB N@IO =<>F OJ OC@ QDNDOJMfN =MJRN@M (O <>>@KON < O@SO <MBPH@IO HJNO >JHHJIGT OC@ '2+* K<B@ OC<O DO H<T @?DO JM <?? OJ 2C@ HJ?DAD><ODJIN <M@ IJO NOJM@? DI OC@ ><>C@ =T 1.(. echo pipeline('affichage_final', $page['texte']);

2CDN DN < KDK@GDI@ AM@LP@IOGT PN@? =T KGPBDIN OC<O @I<=G@ < RD?@ M<IB@ JA <>ODJIN ,JI@OC@G@NN NDI>@ OC@ M@NPGON JA OC@ KDK@GDI@ <M@ IJO NOJM@? DI OC@ ><>C@ <I? OCDN KDK@GDI@ DN ><GG@? AJM @Q@MT K<B@ ?DNKG<T@? DO RJPG? =@ RDN@ OJ GDHDO DON PN<B@ AJM API>ODJIN OC<O <M@ IJO OJJ M@NJPM>@ DIO@INDQ@

Example 2C@ 61.% KGPBDI RCD>C DN PN@? OJ B@I@M<O@ HPGODH@?D< B<GG@MD@N <??N < )<Q<1>MDKO >JHKJI@IO JIGT OJ K<B@N OC<O M@LPDM@ DO <N NCJRI =@GJR function xspf_affichage_final($page) { // check to see if the page has any "player" class components if (strpos($page, 'class="xspf_player"')===FALSE) return $page; // If so, add the swfobject js $jsFile = find_in_path('lib/swfobject/swfobject.js'); $head = "<script src='$jsFile' type='text/ javascript'></script>"; $pos_head = strpos($page, '</head>'); return substr_replace($page, $head, $pos_head, 0); }

126


# Extending SPIP 2C@ O<MB@O KGPBDI JK@IN @SO@MI<G GDIFN DI < I@R RDI?JR JC T@N @Q@I DA OC<OfN IJO < O@MMD=GT KJKPG<M D?@< OC@N@ ?<TN function target_affichage_final($texte) { $texte = str_replace('spip_out"', 'spip_out" target="_blank"', $texte); $texte = str_replace('rel="directory"', 'rel="directory" class="spip_out" target="_blank"', $texte); $texte = str_replace('spip_glossaire"', 'spip_glossaire" target="_blank"', $texte); return $texte; }

afficher_config_objet 2CDN KDK@GDI@ DN PN@? OJ <?? @G@H@ION DIOJ OC@ >JIADBPM<ODJI K<I@GN AJM 1.(. J=E@>ON (O DN ><GG@? <N ?@HJINOM<O@? DI @>MDM@ @S@> <MOD>G@N KCK $masque = pipeline('afficher_config_objet', array('args' => array('type'=>'type objet', 'id'=>$id_objet), 'data'=>$masque));

N JA RMDODIB DO JIGT <KKGD@N OJ <MOD>G@N <I? <??N DON >JIO@IO DIOJ OC@ %JMPH <I? .@ODODJIN K<I@G

Example 2C@ %JMPH KGPBDI <??N HJ?@M<ODJI >JIOMJG N@OODIBN IJ AJMPH

M@BDNOM<ODJI M@LPDM@? KJNO HJ?@M<ODJI AJM @<>C <MOD>G@ PNDIB OC@ AJGGJRDIB >J?@ function forum_afficher_config_objet($flux){ if (($type = $flux['args']['type']) == 'article'){ $id = $flux['args']['id']; if (autoriser('modererforum', $type, $id)) {

127


$table = table_objet($type); $id_table_objet = id_table_objet($type); $flux['data'] .= recuperer_fond( "prive/ configurer/moderation", array($id_table_objet => $id)); } } return $flux; }

afficher_contenu_objet 2CDN KDK@GDI@ DN PN@? OJ HJ?DAT JM >JHKG@O@ OC@ >JIO@ION JA OC@ K<B@N DI OC@ KMDQ<O@ DIO@MA<>@ OC<O <M@ PN@? OJ ?DNKG<T J=E@>ON NP>C <N OC@ K<B@ AJM QD@RDIB <I <MOD>G@ (O DN ><GG@? ?PMDIB OC@ GDA@ JA <IT J=E@>O DI OC@ KMDQ<O@ UJI@ =T K<NNDIB OC@ OTK@ <I? D?@IODAD@M JA OC@ J=E@>O DI OC@ args K<M<H@O@M <I? OC@ '2+* >J?@ AJM OC@ J=E@>O QD@R DI OC@ data K<M<H@O@M $fond = pipeline('afficher_contenu_objet', array( 'args'=>array( 'type'=>$type, 'id_objet'=>$id_article, 'contexte'=>$contexte), 'data'=> ($fond)));

Example 2C@ +YO<?JIIY@N .CJOJN KCJOJ H@O<?<O< KGPBDI <??N < KCJOJ PN<B@ BM<KCD> <I? OC@ $6(% ?<O< PI?@MI@<OC OC@ ?@N>MDKODJI JA OC@ ).& DH<B@N RCD>C <M@ <OO<>C@? OJ OC@ >PMM@IO J=E@>O PNDIB OC@ >J?@ =@GJR function photo_infos_pave($args) { if ($args["args"]["type"] == "case_document") { $args["data"] .= recuperer_fond("pave_exif", array('id_document' => $args["args"]["id"])); }

128


# Extending SPIP return $args; }

afficher_fiche_objet 2CDN KDK@GDI@ DN PN@? OJ <?? >JIO@IO DIOJ OC@ QD@R K<B@N AJM @?DOJMD<G J=E@>ON DI OC@ KMDQ<O@ UJI@ (O DN ><GG@? <N ?@HJINOM<O@? =@GJR pipeline('afficher_fiche_objet', array( 'args' => array( 'type' => 'type_objet', 'id' => $id_objet), 'data' => "<div class='fiche_objet'>" . "...contenus..." . "</div>");

N JA RMDODIB DO DN PN@? AJM <??DIB @G@H@ION OJ OC@ <MOD>G@N <I? I<QDB<ODJI N@>ODJIN K<B@N

Example 2C@ %JMPH KGPBDI PN@N OCDN KDK@GDI@ OJ <?? =POOJIN @I<=GDIB ?DN>PNNDJI JA <I <MOD>G@ (O ?J@N OCDN =T <??DIB < AJMPH DI OC@ AJJO@M JA OC@ <MOD>G@ K<B@ function forum_afficher_fiche_objet($flux){ if (($type = $flux['args']['type'])=='article'){ $id = $flux['args']['id']; $table = table_objet($type); $id_table_objet = id_table_objet($type); $discuter = charger_fonction('discuter', 'inc'); $flux['data'] .= $discuter($id, $table, $id_table_objet, 'prive', _request('debut')); } // [...] return $flux; }

129


affiche_droite 2CDN KDK@GDI@ DN PN@? OJ <?? >JIO@IO DI OC@ MDBCO C<I? >JGPHI RCD>C DN IJO I@>@NN<MDGT <>OP<GGT JI OC@ MDBCO C<I? ND?@ ?@K@I?DIB JI OC@ PN@MfN KM@A@M@I>@ N@OODIBN <I? G<IBP<B@ JI OC@ @S@> K<B@N DI OC@ KMDQ<O@ UJI@ 2CDN >JGPHI IJMH<GGT >JIO<DIN CJMDUJIO<G I<QDB<ODJI GDIFN M@G<O@? OJ OC@ >PMM@IOGT ?DNKG<T@? >JIO@ION NP>C <N DI OC@ (I OC@ N<H@ N@>ODJI K<I@G RCD>C GDNON M@>@IOGT KP=GDNC@? <MOD>G@N DI OC@ N<H@ N@>ODJI <N OC@ >PMM@IO <MOD>G@ echo pipeline('affiche_droite', array( 'args'=>array( 'exec'=>'naviguer', 'id_rubrique'=>$id_rubrique), 'data'=>''));

2CDN KDK@GDI@ <>>@KON OC@ @S@> K<B@ I<H@ ?DNKG<T@? <N < K<M<H@O@M <N R@GG <N <I JKODJI<G D?@IODAD@M AJM OC@ J=E@>O >PMM@IOGT =@DIB M@<? @ B D?;MP=MDLP@

Example 2C@ J?O NKDK KGPBDI PN@? OJ >M@<O@ 1.(. <MOD>G@N =<N@? JI -K@I-AAD>@ O@SO ?J>PH@ION RDOC OC@ .odt ADG@ @SO@INDJI @HKGJTN OCDN KDK@GDI@ OJ <?? < AJMH OJ OC@ N@>ODJI QD@R N>M@@I DI JM?@M OJ @IO@M OC@ odt ADG@I<H@ function odt2spip_affiche_droite($flux){ $id_rubrique = $flux['args']['id_rubrique']; if ($flux['args']['exec']=='naviguer' AND $id_rubrique > 0) { $icone = icone_horizontale(_T("odtspip:importer_fichier"), "#", "", _DIR_PLUGIN_ODT2SPIP . "images/odt-24.png", false, "onclick='$(\"#boite_odt2spip\").slideToggle(\"fast\"); return false;'"); $out = recuperer_fond('formulaires/odt2spip', array('id_rubrique'=>$id_rubrique, 'icone'=>$icone)); $flux['data'] .= $out; } return $flux; }

130


# Extending SPIP

affiche_enfants 2CDN KDK@GDI@ DN PN@? OJ <?? OJ JM HJ?DAT OC@ >JIO@ION JA OC@ GDNON NCJRDIB OC@ >CDG?M@I JA <I J=E@>O (O M@>@DQ@N DI DON args OC@ I<H@ JA OC@ >PMM@IO K<B@ <I? OC@ J=E@>O D?@IODAD@M <I? DI DON data DO M@>@DQ@N OC@ '2+* >J?@ NCJRDIB OC@ J=E@>OfN >CDG?M@I 2CDN KDK@GDI@ DN <>OP<GGT JIGT ><GG@? AMJH < NDIBG@ GJ><ODJI JI OC@ N@>ODJI I<QDB<ODJI K<B@ $onglet_enfants = pipeline('affiche_enfants', array( 'args'=>array( 'exec'=>'naviguer', 'id_rubrique'=>$id_rubrique), 'data'=>$onglet_enfants));

affiche_gauche 2CDN KDK@GDI@ DN PN@? OJ <?? >JIO@IO OJ OC@ G@AO C<I? >JGPHI DI OC@ KMDQ<O@ UJI@ K<B@N 2CDN >JGPHI B@I@M<GGT >JIO<DIN GDIFN JM AJMHN M@G<ODIB OJ OC@ >PMM@IOGT ?DNKG<T@? >JIO@IO GDF@ OC@ AJMH AJM <??DIB < GJBJ AJM OC@ >PMM@IO N@>ODJI <MOD>G@ echo pipeline('affiche_gauche', array( 'args'=>array( 'exec'=>'articles', 'id_article'=>$id_article), 'data'=>''));

2CDN KDK@GDI@ <>>@KON OC@ I<H@ JA OC@ >PMM@IOGT ?DNKG<T@? @S@> K<B@ <N <I <MBPH@IO <N R@GG <N OC@ KJNND=G@ D?@IODAD@M AJM OC@ J=E@>O >PMM@IOGT =@DIB ?DNKG<T@? NP>C <N OC@ D?;<MOD>G@

Example 2C@ NKDK =DNJPN KGPBDI RCD>C DN PN@? OJ N@I? FDNN@N =DNJPN <HJIBNO NDO@ <POCJMN @HKGJTN OCDN KDK@GDI@ OJ ?DNKG<T OC@ GDNO JA FDNN@N M@>@DQ@? <I? N@IO AJM OC@ <POCJM K<B@N function bisous_affiche_gauche($flux){ include_spip('inc/presentation'); if ($flux['args']['exec'] == 'auteur_infos'){ $flux['data'] .=

131


debut_cadre_relief('',true,'', _T('bisous:bisous_donnes')) . recuperer_fond('prive/bisous_donnes', array('id_auteur'=>$flux['args']['id_auteur'])) . fin_cadre_relief(true) . debut_cadre_relief('',true,'', _T('bisous:bisous_recus')) . recuperer_fond('prive/bisous_recus', array('id_auteur'=>$flux['args']['id_auteur'])) . fin_cadre_relief(true); } return $flux; }

affiche_hierarchie 2C@ <AAD>C@;CD@M<M>CD@ KDK@GDI@ DN PN@? OJ HJ?DAT JM <?? OJ OC@ '2+* >J?@ AJM OC@ =M@<?>MPH= K<OC DI OC@ KMDQ<O@ UJI@ (O <>>@KON < >@MO<DI IPH=@M JA ?<O< DO@HN DI OC@ args OC@ NP=E@>O JA DON >PMM@IO D?@IODAD@M DA OC@M@ DN JI@ <I? KJNND=GT OC@ D?@IODAD@M JA OC@ N@>OJM $out = pipeline('affiche_hierarchie', array( 'args'=>array( 'id_parent'=>$id_parent, 'message'=>$message, 'id_objet'=>$id_objet, 'objet'=>$type, 'id_secteur'=>$id_secteur, 'restreint'=>$restreint), 'data'=>$out));

Example 2C@ KJGTCDYM<M>CD@ KGPBDI RCD>C @I<=G@N < N@>ODJI JM <MOD>G@ OJ C<Q@ HPGODKG@ K<M@ION PN@N OCDN KDK@GDI@ OJ GDNO OC@ Q<MDJPN K<M@ION AJM OC@ N@>ODJI JM <MOD>G@ >PMM@IOGT ?DNKG<T@? function polyhier_affiche_hierarchie($flux){ $objet = $flux['args']['objet']; if (in_array($objet,array('article','rubrique'))){

132


# Extending SPIP $id_objet = $flux['args']['id_objet']; include_spip('inc/polyhier'); $parents = polyhier_get_parents($id_objet,$objet,$serveur=''); $out = array(); foreach($parents as $p) $out[] = "[->rubrique$p]"; if (count($out)){ $out = implode(', ',$out); $out = _T('polyhier:label_autres_parents')." ".$out; $out = PtoBR(propre($out)); $flux['data'] .= "<div id='chemins_transverses'>$out</div>"; } } return $flux; }

affiche_milieu 2CDN KDK@GDI@ DN PN@? OJ <?? NJH@ >JIO@IO OJ 1.(.fN exec/ K<B@N 2C@ I@R >JIO@IO DN DIN@MO@? <AO@M OC@ >JIO@IO JA OC@ HD??G@ K<MO JA OC@ K<B@ (O DN ><GG@? <N AJGGJRN echo pipeline('affiche_milieu',array( 'args'=>array('exec'=>'name_of_the_exec','id_objet'=>$object_id), 'data'=>''));

Examples 2C@ KGPBDI 1YG@>ODJI ?f<MOD>G@N PN@N DO OJ <?? < AJMH OJ OC@ N@>ODJIN K<B@ OJ JAA@M < N@G@>ODJI JA <MOD>G@N function pb_selection_affiche_milieu($flux) { $exec = $flux["args"]["exec"]; if ($exec == "naviguer") { $id_rubrique = $flux["args"]["id_rubrique"];

133


$contexte = array('id_rubrique'=>$id_rubrique); $ret = "<div id='pave_selection'>"; $ret .= recuperer_fond("selection_interface", $contexte); $ret .= "</div>"; $flux["data"] .= $ret; } return $flux; }

2C@ KGPBDI NO<ODNODLP@N <??N < >JIADBPM<ODJI AJMH DIND?@ 1.(.fN >JIADBPM<ODJI K<B@N function stats_affiche_milieu($flux){ // displays the configuration ([de]activate the statistics). if ($flux['args']['exec'] == 'config_fonctions') { $compteur = charger_fonction('compteur', 'configuration'); $flux['data'] .= $compteur(); } return $flux; }

ajouter_boutons 2CDN KDK@GDI@ DN PN@? OJ <?? =POOJIN OJ OC@ KMDQ<O@ UJI@ I<QDB<ODJI H@IP (O DN IJO M@<GGT NJ PN@APG NDI>@ OC@ >M@<ODJI JA OC@ <bouton> O<B DI OC@ plugin.xml ADG@ N@@ #@ADIDIB =POOJIN K $boutons_admin = pipeline('ajouter_boutons', $boutons_admin);

2C@ <EJPO@M;=JPOJIN KDK@GDI@ <>>@KON < K<M<H@O@M O<=G@ JA =POOJI D?@IODA@M =POOJI ?@N>MDKODJI >JPKG@N RDOC < .'. >G<NN JA !JPOJI !POOJI =POOJI ><I ?@>G<M@ < NP= H@IP DI OC@ NP=H@IP Q<MD<=G@ JA OC@ !JPOJI !POOJI >G<NN 7JP HPNO >M@<O@ <I DINO<I>@ JA OC@ Bouton >G<NN OJ ?@ADI@ OCDN function plugin_ajouter_boutons($boutons_admin){ $boutons_admin['identifiant'] = new Bouton('image/du_bouton.png', 'Button title', 'url');

134


# Extending SPIP $boutons_admin['identifiant']->sousmenu['autre_identifiant'] = new Bouton('image/du_bouton.png', 'Button title', 'url'); return $boutons_admin; }

2C@ OCDM? url K<M<H@O@M JA OC@ Bouton >G<NN DN JKODJI<G !T ?@A<PGO DO RDGG =@ <I @S@> K<B@ RDOC OC@ N<H@ I<H@ <N OC@ D?@IODAD@M KMJQD?@? ecrire/ ?exec=identifier

Example 2C@ 2C@GD< KGPBDI RCD>C H<F@N DO KJNND=G@ OJ DIO@MA<>@ 1.(. RDOC OC@ 2CYGD< NJAOR<M@ K<>F<B@ PN@N OCDN KDK@GDI@ OJ <?? < GDIF OJ OC@ 2CYGD< ><O<GJBP@ OJ OC@ W?DODJI H@IP RDOC OC@ I<QDBP@M D?@IODAD@M function spip_thelia_ajouter_boutons($boutons_admin) { // if you are admin if ($GLOBALS['visiteur_session']['statut'] == "0minirezo") { $boutons_admin['naviguer']>sousmenu['spip_thelia_catalogue'] = new Bouton(_DIR_PLUGIN_SPIP_THELIA . 'img_pack/ logo_thelia_petit.png', 'Catalogue Thélia'); } return $boutons_admin; }

Migration to the new system 2J M@RMDO@ OCDN @S<HKG@ OJ OC@ I@R NTNO@H ORJ OCDIBN RJPG? I@@? OJ =@ N@K<M<O@? OC@ =POOJI ?@>G<M<ODJI <I? OC@ <POCJMDN<ODJI OJ QD@R DO JM IJO DI OCDN ><N@ <POCJMDN<ODJI DN JIGT AJM <?HDIDNOM<OJMN 2C@ ?@>G<M<ODJI DN RMDOO@I DI OC@ plugin.xml ADG@ <bouton id="spip_thelia_catalogue" parent="naviguer"> <icone>smg_pack/logo_thelia_petit.png</icone> <titre>title language string</titre> </bouton>

135


2C@ <POCJMDN<ODJI >JHKJI@IO DN =PDGO RDOC < NK@>D<G <POCJMDN<ODJI API>ODJI PN@ OC@ <POJMDN@M K KDK@GDI@ OJ ?@ADI@ OCDN function autoriser_spip_thelia_catalogue_bouton_dist($faire, $type, $id, $qui, $opt) { return ($qui['statut'] == '0minirezo'); }

ajouter_onglets 2CDN KDK@GDI@ DN PN@? OJ <?? O<=N OJ OC@ exec K<B@N DI OC@ KMDQ<O@ UJI@ (O DN IJO NJ I@<MGT PN@APG NDI>@ OC@ >M@<ODJI JA OC@ <onglet> O<B DI OC@ plugin.xml ADG@ N@@ #@ADIDIB K<B@ O<=N K return pipeline('ajouter_onglets', array('data'=>$onglets,'args'=>$script));

2C@ <EJPO@M;JIBG@ON KDK@GDI@ <>>@KON < O<=G@ JA >JPKG@N JA O<= D?@IODAD@M O<= ?@N>MDKODJI .'. >G<NN JA !JPOJI =PO <GNJ <I D?@IODAD@M AJM OC@ O<= OJJG=<M DI DI args // add a tab to SPIP's configuration page function plugin_ajouter_onglets($flux){ if ($flux['args']=='identifiant') $flux['data']['identifiant_bouton']= new Bouton("mon/ image.png", "titre de l'onglet"), 'url'); return $flux; }

2C@ OCDM? url K<M<H@O@M AJM OC@ Bouton >G<NN DN JKODJI<G !T ?@A<PGO DO RDGG =@ <I @S@> K<B@ RDOC OC@ N<H@ I<H@ <N OC@ KMJQD?@? D?@IODAD@M ecrire/ ?exec=identifier (I OC@ exec K<B@N < OJJG=<M DN ><GG@? RDOC ORJ <MBPH@ION OC@ D?@IODAD@M JA OC@ ?@NDM@? OJJG=<M <I? OC@ D?@IODAD@M JA OC@ <>ODQ@ O<= echo barre_onglets("tab toolbar identifier", "active tab identifier");

136


# Extending SPIP echo barre_onglets("configuration", "contenu");

Example 2C@ B@I?< KGPBDI HJ?DAD@N OC@ ?@A<PGO O<=N AJM 1.(.fN ><G@I?<M =T PNDIB OCDN KDK@GDI@ function agenda_ajouter_onglets($flux) { if($flux['args']=='calendrier'){ $flux['data']['agenda']= new Bouton( _DIR_PLUGIN_AGENDA . '/img_pack/agenda-24.png', _T('agenda:agenda'), generer_url_ecrire("calendrier","type=semaine")); $flux['data']['calendrier'] = new Bouton( 'cal-rv.png', _T('agenda:activite_editoriale'), generer_url_ecrire("calendrier", "mode=editorial&type=semaine")); } return $flux; }

Migration to the new system 2J M@RMDO@ OCDN @S<HKG@ DI OC@ I@R NTNO@H OCDIBN I@@? OJ =@ N@K<M<O@? OC@ ?@>G<M<ODJI JA OC@ =POOJI <I? OC@ <POCJMDN<ODJI OJ N@@ DO JM IJO 2C@ ?@>G<M<ODJI DN H<?@ DI OC@ plugin.xml ADG@ <onglet id="agenda" parent="calendrier"> <icone>img_pack/agenda-24.png</icone> <titre>agenda:agenda</titre> <url>calendrier</url> <args>type=semaine</args> </onglet> <onglet id="calendrier" parent="calendrier"> <icone>cal-rv.png</icone> <titre>agenda:activite_editoriale</titre> <url>calendrier</url> <args>mode=editorial&type=semaine</args> </onglet>

137


2C@ <POCJMDN<ODJI DN M@GJ><O@? DIOJ < NK@>D<G API>ODJI PN@ OC@ <POJMDN@M K KDK@GDI@ OJ ?@ADI@ DO function autoriser_calendrier_onglet_dist($faire, $type, $id, $qui, $opt) { return true; } function autoriser_agenda_onglet_dist($faire, $type, $id, $qui, $opt) { return true; }

alertes_auteur 1.(. ><I N@I? R<MIDIB H@NN<B@N AJM Q<MDJPN @Q@ION OC<O H<T =@ HJM@ JM G@NN >JIND?@M@? <N =@DIB PMB@IO \ ?<O<=<N@ >M<NC \ KGPBDI >M<NC \ KGPBDI <>ODQ<ODJI @MMJM \ IJODAD><ODJI OC<O OC@M@ DN < H@NN<B@ DI OC@ H<DG=JS 2CDN KDK@GDI@ ><GG@? DI @>MDM@ DI> >JHH@I>@M;K<B@ KCK =T OC@ alertes_auteur() API>ODJI DN PN@? OJ KJKPG<O@ OC@ O<=G@ >JIO<DIDIB NP>C R<MIDIBN $alertes = pipeline('alertes_auteur', array( 'args' => array( 'id_auteur' => $id_auteur, 'exec' => _request('exec'), ), 'data' => $alertes ) );

(O M@>@DQ@N < O<=G@ <N < K<M<H@O@M \ data >JIO<DIN < O<=G@ JA OC@ Q<MDJPN R<MIDIBN

\ args >JIO<DIN < O<=G@ RDOC g id_auteur =@DIB OC@ >PMM@IOGT GJBB@? DI <POCJM

g exec DN OC@ I<H@ JA OC@ ?DNKG<T@? K<B@

138


# Extending SPIP Example 1PKKJN@ OC<O OC@M@ DN < KGPBDI ><GG@? 5<O>C JPO AJM =<I<I<N RCD>C O@GGN K@JKG@ OC<O OC@T <M@ <O MDNF JA NO@KKDIB JI < =<I<I< <I? C<QDIB <I <>>D?@IO OC@I R@ >JPG? KMJQD?@ OCDN <N AJGGJRN function bananes_alertes_auteur($flux){ $alertes = $flux['data']; // If there is a banana in front of this author if (tester_banane($flux['args']['id_auteur'])) { // We add a warning $alertes[] = "<strong>Watch out! There's a banana!</strong>"; } // We return the table of warnings return $alertes; }

HJNO AJMOPDOJPN <I? =@I@AD>@IO KGPBDI DI?@@?

autoriser 2C@ <POJMDN@M KDK@GDI@ DN < NK@>D<G JI@ (O DN NDHKGT PN@? OJ GJ<? OC@ <POCJMDN<ODJI API>ODJIN OC@ ADMNO ODH@ OC<O OC@ autoriser() API>ODJI DN ><GG@? 2CDN KDK@GDI@ I@DOC@M <>>@KON <MBPH@ION IJM M@OPMIN JPOKPO pipeline('autoriser');

5DOC OCDN KDK@GDI@ < KGPBDI ><I ?@>G<M@ DON JRI NK@>D<G <POCJMDN<ODJIN

M@BMJPK@? DI < ADG@ I<H@? .GPBDI.M@ADS;<POJMDN<ODJIN KCK <I? ?@>G<M@ OC@H DI OC@ plugin.xml ADG@ <N DI OCDN @S<HKG@ <pipeline> <nom>autoriser</nom> <inclure>prefixePlugin_autorisations.php</inclure> </pipeline>

139


(I <??DODJI OJ <POCJMDN<ODJI API>ODJIN OC@ ADG@ HPNO >JIO<DI OC@ API>ODJI ><GG@? =T <GG JA OC@ KDK@GDI@N .GPBDI.M@ADS;.DK@GDI@,<H@ =PO DO C<N IJOCDIB OJ @S@>PO@ @ B function prefixePlugin_autoriser(){}

Example 2C@ AJMPH KGPBDI ?@>G<M@N N@Q@M<G <POCJMDN<ODJIN (ON plugin.xml ADG@ >JIO<DIN <pipeline> <nom>autoriser</nom> <inclure>forum_autoriser.php</inclure> </pipeline>

I? OC@ ADG@ RCD>C DN ><GG@? ^AJMPH;<POJMDN@M KCK_ >JIO<DIN // declare the pipeline function function forum_autoriser(){} function autoriser_forum_interne_suivi_bouton_dist($faire, $type, $id, $qui, $opt) { return true; } function autoriser_forum_reactions_bouton_dist(($faire, $type, $id, $qui, $opt) { return autoriser('publierdans', 'rubrique', _request('id_rubrique')); } // Moderate the forum? // = modify the corresponding object (if there is a forum for this object) // = default rights else (full admin for full moderation rights) function autoriser_modererforum_dist($faire, $type, $id, $qui, $opt) { return autoriser('modifier', $type, $id, $qui, $opt); } // Modify a forum ? never ! function autoriser_forum_modifier_dist($faire, $type, $id, $qui, $opt) {

140


# Extending SPIP return false; } ...

base_admin_repair 2CDN KDK@GDI@ DN KG<>@? <O OC@ @I? JA < M@K<DM KMJ>@NN AJM @S<HKG@ OJ M@K<DM ?J>PH@ION (O C<N =@@I >M@<O@? =T OC@ >C<IB@N@O 9 :

body_prive 2CDN KDK@GDI@ DN PN@? OJ HJ?DAT OC@ '2+* body O<B DI OC@ KMDQ<O@ UJI@ JM OJ <?? >JIO@IO EPNO <AO@M OCDN O<B (O DN ><GG@? =T OC@ commencer_page() API>ODJI OC<O DN @S@>PO@? ?PMDIB OC@ ?DNKG<T JA KMDQ<O@ UJI@ K<B@N $res = pipeline('body_prive', "<body class='$rubrique $sous_rubrique " . _request('exec') . "'" . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : "") . '>');

boite_infos 2CDN KDK@GDI@ HJ?DAD@N DI OC@ KMDQ<O@ <M@< OC@ DIAJMH<ODJI =GJ>F JA OC@ J=E@>ON JA 1.(. %JM @S<HKG@ OCDN DN OC@ =GJ>F OC<O >JIO<DIN OC@ IPH=@M JA <I <MOD>G@ <I? OC@ GDIFN OJ >C<IB@ DON NO<OPN (O M@>@DQ@N <I <NNJ>D<ODQ@ <MM<T ?@ADI@? GDF@ OCDN \ data RC<O RDGG =@ ?DNKG<T@? JI OC@ K<B@

\ args <IJOC@M <NNJ>D<ODQ@ <MM<T g type OC@ J=E@>O OTK@ <MOD>G@ MP=MDLP@ g id OC@ J=E@>O D? g row <MM<T >JIO<DIDIB <GG OC@ 1/* AD@G?N JA OC@ J=E@>O <I? OC@DM Q<GP@N

141


Example 2C@ KGPBDI .MYQDNP<GDN<ODJI KJPM G@N <MOD>G@N @I >JPMN ?@ MY?<>ODJI KM@QDNP;M@?<> <??N OC@ =POOJI KM@QD@R RC@I <I <MOD>G@ DN NODGG DI OC@ @?DODIB KMJ>@NN IJMH<GGT OCDN GDIF <KK@<MN JIGT RC@I <I <MOD>G@ C<N =@@I NP=HDOO@? AJM @Q<GP<ODJI function previsu_redac_boite_infos(&$flux){ if ($flux['args']['type']=='article' AND $id_article=intval($flux['args']['id']) AND $statut = $flux['args']['row']['statut'] AND $statut == 'prepa' AND autoriser('previsualiser')){ $message = _T('previsualiser'); $h = generer_url_action('redirect', "type=article&id=$id_article&var_mode=preview"); $previsu = icone_horizontale($message, $h, "racine-24.gif", "rien.gif",false); if ($p = strpos($flux['data'],'</ul>')){ while($q = strpos($flux['data'],'</ul>',$p+5)) $p=$q; $flux['data'] = substr($flux['data'],0,$p+5) . $previsu . substr($flux['data'], $p+5); } else $flux['data'].= $previsu; } return $flux; }

calculer_rubriques 5DOC OCDN KDK@GDI@ KGPBDI ><I >C<IB@ OC@ NO<OPN JA < N@>ODJI AJM @S @<>C N@>ODJI DN KP=GDNC@? <O DON >M@<ODJI 2CDN KDK@GDI@ ><I ?J @Q@MTOCDIB =PO DI JM?@M OJ HJ?DAT OC@ AD@G?N status/ dates DO HPNO HJ?DAT OC@ AD@G?N statut_tmp/date_tmp GDF@ OCDN sql_updateq('spip_rubriques', array('date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prive'));

142


# Extending SPIP !@><PN@ DI 1.(. 1/* LP@MD@N <M@IfO OM<IN<>ODJI<G OC@N@ O@HKJM<MT AD@G?N <M@ I@>@NN<MT DI JM?@M OJ =@ NPM@ OC<O OC@ ?<O<=<N@ RJIfO =@ =MJF@I ?PMDIB OC@ ><G>PG<ODJI KMJ>@NN 2CDN KDK@DI@ DN ><GG@? C@M@ COOK OM<> M@UJ I@O OM<> NKDK =MJR

compter_contributions_auteur 2CDN KDK@GDI@ DN PN@? OJ DIN@MO >JIO@IO JIOJ OC@ <POCJM GDNO K<B@ NCJRDIB OC@ QJGPH@ JA @<>C <POCJMfN >JIOMD=PODJIN (O DN ><GG@? <N NCJRI =@GJR AMJH @>MDM@ DI> AJMH<O@M;<PO@PM KCK $contributions = pipeline('compter_contributions_auteur', array( 'args' => array('id_auteur' => $id_auteur, 'row' => $row), 'data' => $contributions));

Example 2C@ %JMPH KGPBDI <??N OC@ IPH=@M JA H@NN<B@N RMDOO@I =T <I <POCJM function forum_compter_contributions_auteur($flux){ $id_auteur = intval($flux['args']['id_auteur']); if ($cpt = sql_countsel("spip_forum AS F", "F.id_auteur=".intval($flux['args']['id_auteur']))){ // manque "1 message de forum" $contributions = ($cpt>1) ? $cpt . ' '. _T('public:messages_forum') : '1 ' . _T('public:message'); $flux['data'] .= ($flux['data']?", ":"") . $contributions; } return $flux; }

143


configurer_liste_metas 2CDN KDK@GDI@ DN PN@? OJ NPKKG@H@IO JM HJ?DAT 1.(.fN ?@A<PGO >JIADBPM<ODJI K<M<H@O@M Q<GP@N (O <>>@KON < K<M<H@O@M >JINDNODIB JA < O<=G@ JA I<H@ Q<GP@ K<DMN <I? M@OPMIN OC@ N<H@ <N JPOKPO 2CDN KDK@GDI@ DN ><GG@? DI @>MDM@ DI> >JIADB KCK return pipeline('configurer_liste_metas', array( 'nom_site' => _T('info_mon_site_spip'), 'adresse_site' => preg_replace(",/$,", "", url_de_base()), 'descriptif_site' => '', //... ));

2C@ config() API>ODJI DN PN@? OJ NPKKG@H@IO OC@ K<M<H@O@MN NODGG HDNNDIB AMJH 1.(. =PO RCD>C C<Q@ < ?@A<PGO Q<GP@ ?@ADI@? =T OC@ KDK@GDI@ (O DN NK@>DAD><GGT ><GG@? AMJH 1.(.fN I<ODQ@ >JIADBPM<ODJI AJMHN $config = charger_fonction('config', 'inc'); $config();

Example 2C@ "JHKM@NN@PM @SO@INDJI PN@N OCDN KDK@GDI@ OJ ?@ADI@ OC@ ?@A<PGO JKODJIN AJM OC@ K<B@ >JHKM@NNDJI NTNO@H function compresseur_configurer_liste_metas($metas){ $metas['auto_compress_js']='non'; $metas['auto_compress_closure']='non'; $metas['auto_compress_css']='non'; return $metas; }

declarer_tables_auxiliaires 2CDN KDK@GDI@ ?@>G<M@N OC@ ^<PSDGD<MT_ O<=G@N RCD>C <M@ H<DIGT PN@? OJ >M@<O@ EJDIN =@OR@@I KMDI>DK<G O<=G@N

144


# Extending SPIP (O M@>@DQ@N OC@ N<H@ <MBPH@ION <N OC@ KDK@GDI@ ?@>G<M@M;O<=G@N;KMDI>DK<G@N K

Example 2C@ KGPBDI 1.(. !DNJPN @I<=G@N <I <POCJM OJ N@I? < poke OJ <IJOC@M <POCJM (O ?@>G<M@N < O<=G@ spip_bisous GDIFDIB H@H=@MN RDOC OC@ KJF@fN ?<O@ PNDIB >J?@ <N NCJRI =@GJR ,JO@ OC<O OC@ KMDH<MT F@T DN >JHKJN@? JA N@K<M<O@ AD@G?N function bisous_declarer_tables_auxiliaires($auxiliary_tables){ $spip_bisous = array( 'id_donneur' => 'bigint(21) DEFAULT "0" NOT NULL', 'id_receveur' => 'bigint(21) DEFAULT "0" NOT NULL', 'date' => 'datetime DEFAULT "0000-00-00 00:00:00" NOT NULL' ); $spip_bisous_key = array( 'PRIMARY KEY' => 'id_donneur, id_receveur' ); $auxiliary_tables['spip_bisous'] = array( 'field' => &$spip_bisous, 'key' => &$spip_bisous_key ); return $auxiliary_tables; }

declarer_tables_interfaces 2CDN KDK@GDI@ DN PN@? OJ ?@>G<M@ DIAJMH<ODJI M@G<ODIB OJ 1/* O<=G@N JM AJM >@MO<DI AD@G?N DI OCJN@ O<=G@N (O H<F@N DO KJNND=G@ OJ NPKKG@H@IO OC@ DIAJMH<ODJI KMJQD?@? =T @>MDM@ KP=GD> DIO@MA<>@N KCK

145


2C@ API>ODJI <>>@KON < K<M<H@O@M RCD>C DN OC@ O<=G@ JA ?@>G<M@? @G@H@ION JAO@I ><GG@? $interface RCD>C HPNO <GNJ =@ M@OPMI@? <N JPOKPO AMJH OC@ API>ODJI 2CDN O<=G@ >JINDNON JA OC@ Q<MDJPN @G@H@ION @<>C JA RCD>C <M@ <GNJ O<=G@N \ table_des_tables ?@>G<M@N OC@ <GD<N I<H@N JA 1/* O<=G@N

\ exceptions_des_tables <NNDBIN <GD<N@N OJ 1/* >JGPHIN AJM < BDQ@I O<=G@

\ table_titre NK@>DAD@N OC@ 1/* >JGPHI JA <I J=E@>O PN@? OJ ?@ADI@ OC@ ODOG@ AJM >@MO<DI OTK@N JA 30* I<HDIB >JIQ@IODJIN

\ table_date NK@>DAD@N <I 1/* ?<O< OTK@ >JGPHI AJM < BDQ@I 1/* O<=G@ RCD>C ><I =@ PN@? AJM >@MO<DI NK@>DAD> N@G@>ODJI >MDO@MD< <B@ <B@;M@G<ODA

\ tables_jointures ?@ADI@N OC@ KJNND=G@ EJDIN =@OR@@I 1/* O<=G@N

\ exceptions_des_jointures >M@<O@N <GD<N@N AJM 1/* >JGPHIN M@NPGODIB AMJH < EJDI

\ table_des_traitements NK@>DAD@N ADGO@MN OJ =@ NTNO@H<OD><GGT <KKGD@? JI 1.(. O<BN

table_des_tables #@>G<M@N <GD<N I<H@N AJM 1/* O<=G@N M@G<ODIB OJ OC@ ?@>G<M<ODJI KMJQD?@? DI @DOC@M OC@ KMDI>DK<G JM EJDI O<=G@N (I B@I@M<G <IT KGPBDI JAA@MDIB < I@R @?DOJMD<G J=E@>O <GNJ ?@>G<M@N <I D?@IOD><G <GD<N <N OC@ J=E@>O I<H@ 2CDN H<F@N DO KJNND=G@ OJ RMDO@ GJJKN GDF@ <BOUCLEx(NAME)> DI @S<>OGT OC@ N<H@ R<T <N <BOUCLEx(spip_name)> RCD>C NDHKGT NK@>DAD@N OC@ I<H@ JA OC@ 1/* O<=G@ // 'nom_declare' = 'spip_rubriques', but without the 'spip_' prefix $interface['table_des_tables']['alias'] = 'nom_declare'; // examples $interface['table_des_tables']['articles'] = 'articles'; // ARTICLE loops on spip_articles $interface['table_des_tables']['billets'] = 'articles'; // BILLET loops on spip_articles

exceptions_des_tables )PNO <N RDOC ?@>G<M<ODJI JA <GD<N@N AJM 1/* <=G@N DO DN <GNJ KJNND=G@ OJ ?@>G<M@ <GD<N@N AJM 1/* >JGPHIN 2C@N@ <GD<N@N ><I <GNJ AJM>@ < EJDI OJ <IJOC@M O<=G@

146


# Extending SPIP // the tag #COLUMN_ALIAS or criteria {column_alias} applied to the correct loop $interface['exceptions_des_tables']['alias']['colonne_alias'] = 'column'; $interface['exceptions_des_tables']['alias']['colonne_alias'] = array('table', 'column'); // examples $interface['exceptions_des_tables']['breves']['date'] = 'date_heure'; $interface['exceptions_des_tables']['billets']['id_billet'] = 'id_article'; $interface['exceptions_des_tables']['documents']['type_document'] = array('types_documents' , 'titre'); // allows for the use of criteria like racine, meme_parent (same parent), id_parent $interface['exceptions_des_tables']['evenements']['id_parent'] = 'id_evenement_source'; $interface['exceptions_des_tables']['evenements']['id_rubrique'] = array('spip_articles', 'id_rubrique');

table_titre 1K@>DAD@N RCD>C AD@G? RDGG =@ PN@? OJ B@I@M<O@ OC@ ODOG@N AJM >@MO<DI 30* I<HDIB >JIQ@IODJIN KMJKM@ <M=JM@N>@IO 2C@ >C<M<>O@M NOMDIB K<NN@? DN <I 1/* N@G@>ODJI ?@>G<M<ODJI 1$*$"2 RCD>C HPNO M@OPMI >JGPHIN <N JPOKPO JM OC@ 1/* >JGPHI <GD<N N ODOG@ <I? G<IB 5C@I OC@ J=E@>O C<N IJ >JMM@NKJI?DIB G<IB AD@G? OC@I DO HPNO M@OPMI '' AS lang DINO@<? $interface['table_titre']['alias']= "title_column AS titre, lang_column AS lang"; // examples $interface['table_titre']['mots']= "titre, '' AS lang"; $interface['table_titre']['breves']= 'titre , lang';

5C@I@Q@M <I J=E@>O C<N ?@>G<M@? DON ODOG@ OC@ 30* B@I@M<OJM ><I OC@I >M@<O@ H@<IDIBAPG 30*fN <POJH<OD><GGT ?@K@I?DIB JI OC@ 30* I<HDIB >JIQ@IODJI >CJN@I AJM OC@ R@= NDO@

147


table_date 2CDN DIAJMH<ODJI DN PN@? OJ ?@>G<M@ >@MO<DI 1/* >JGPHIN <N ?<O@ OTK@ AD@G?N 2C@ 1.(. >JHKDG@M ><I OC@I <KKGT >@MO<DI FDI?N JA >MDO@MD< OJ OC@N@ AD@G?N NP>C <N <B@ <B@;M@G<ODA EJPM;M@G<ODA -IGT JI@ NDIBG@ ?<O@ OTK@ AD@G? ><I =@ ?@>G<M@? AJM <IT BDQ@I O<=G@ $interface['table_date']['alias'] = 'column_name'; // examples $interface['table_date']['articles']='date'; $interface['table_date']['evenements'] = 'start_date';

tables_jointures 2C@N@ ?@>G<M<ODJIN <M@ PN@? =T OC@ >JHKDG@M OJ @SKGD>DOGT ?@O@MHDI@ OC@ KJNND=G@ EJDIN RC@I@Q@M < GJJK JI < O<=G@ M@LP@NON <I PIFIJRI AD@G? O<B JM >MDO@MD< 2C@ >JHKDG@M FIJRN DHKGD>DOGT CJR OJ H<F@ >@MO<DI EJDIN RDOCJPO ?@>G<MDIB OC@H =T GJJFDIB AJM OC@ >JGPHI M@LP@NO@? DI OC@ JOC@M 1/* O<=G@N OC<O DO FIJRN <=JPO 2C@ >JHKDG@M ?J@N IJO N@<M>C OCMJPBC <GG O<=G@N =PO JIGT DI OCJN@ OC<O C<Q@ NK@>DAD> >JGPHIN DI >JHHJI \ N<H@ I<H@ <N OC@ KMDH<MT F@T

\ N<H@ I<H@ <N < >JGPHI ?@>G<M@? <N < KJO@IOD<G EJDI DI DON join ?@N>MDKODJI DI OC@ KMDI>DK<G JM EJDI O<=G@N (I H<IT ><N@N DO DN PN@APG <I? KM@A@M<=G@ OJ @SKGD>DOGT ?@>G<M@ OJ OC@ >JHKDG@M RCD>C EJDIN OC<O DO ><I OMT OJ H<F@ RC@I DO DN KM@N@IO@? RDOC <I PIFIJRI AD@G? DI < O<=G@ 2C<O DN OC@ @SKGD>DO KPMKJN@ JA OC@N@ FDI?N JA ?@>G<M<ODJI 2C@ JM?@M JA OC@ ?@>G<M<ODJIN DN NJH@ODH@N DHKJMO<IO NDI>@ DO RDGG @AA@>O RCD>C EJDI OC@ >JHKDG@M RDGG ADI? RC@I DO GJJFN AJM OC@ AD@G? DI <IJOC@M O<=G@ $Q@I DA OC@ AD@G? NJPBCO <AO@M RJPG? =@ AJPI? ?@>G<M@? AJM OC@ O<=G@ <ITR<T $interface['tables_jointures']['spip_nom'][] = 'other_table'; $interface['tables_jointures']['spip_nom']['colonne'] = 'other_table'; // examples // {id_mot} for ARTICLES $interface['tables_jointures']['spip_articles'][]= 'mots_articles'; $interface['tables_jointures']['spip_articles'][]= 'mots'; // event joins (for the plugin agenda) on keywords or articles $interface['tables_jointures']['spip_evenements'][]= 'mots'; // inserted before the articles join

148


# Extending SPIP $interface['tables_jointures']['spip_evenements'][] = 'articles'; $interface['tables_jointures']['spip_evenements'][] = 'mots_evenements'; // articles joins to events (evenements) $interface['tables_jointures']['spip_articles'][] = 'evenements';

+JNO JA OC@ ODH@ =T <GNJ PNDIB OC@ @S>@KODJIN;?@N;EJDIOPM@N ?@N>MDKODJI @SKG<DI@? =@GJR DO RDGG =@ NPAAD>D@IO AJM < 1.(. GJJK OJ FIJR CJR OJ ><G>PG<O@ OC@ EJDIN OC<O DO RDGG I@@? OJ ?DNKG<T OC@ Q<MDJPN O<BN M@LP@NO@? (A OC<O DN IJO <GR<TN NPAAD>D@IO ?JIfO AJMB@O OC<O EJDIN ><I <GNJ =@ NK@>DAD@? DI OC@ GJJKN <I? >MDO@MD< OC@HN@GQ@N >A %JM>DIB EJDIN K

exceptions_des_jointures 2CDN ?@ADIDODJI DN PN@? OJ <NNDBI < >JGPHI <GD<N OC<O >M@<O@N < EJDI RDOC <IJOC@M O<=G@ OJ M@OMD@Q@ <IJOC@M AD@G? NJ GJIB <N OC@ EJDI DN KJNND=G@ (OfN < =DO GDF@ OC@ @S>@KODJI;?@N;O<=G@N RCD>C ?@>G<M@ < EJDI =PO DN IJO NK@>DAD> OJ < BDQ@I O<=G@ 5@ ><I OC@I PN@ OCDN <GD<N <N < 1.(. O<B JM <N < GJJK >MDO@MD< ,JO@ OC<O RC@I R@ PN@ OC@N@ EJDIN JIGT <N GJJK >MDO@MD< GDF@ {titre_mots=xx} DO DN KM@A@M<=G@ OJ RMDO@ OCDN <N {mots.titre=xx} RCD>C DN < HJM@ B@I@MD> NOTG@ <I? ?J@N IJO M@LPDM@ < ?@>G<M<ODJI $interface['exceptions_des_jointures']['colonne_alias'] = array('table', 'column'); // examples $interface['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre');

-I@ NK@>D<G N>@I<MDJ <GNJ @SDNON < OCDM? <MBPH@IO ><I =@ KMJQD?@? OC<O >JIO<DIN OC@ I<H@ JA OC@ API>ODJI RCD>C RDGG >M@<O@ OC@ EJDI 2CDN DN < M<M@ >DM>PHNO<I>@ JI@ PN@ JA RCD>C DN @HKGJT@? =T OC@ %JMHN 2<=G@N KGPBDI // special case $interface['exceptions_des_jointures']['forms_donnees']['id_mot'] = array('spip_forms_donnees_champs', 'valeur', 'forms_calculer_critere_externe');

149


table_des_traitements 2C@N@ ?@N>MDKODJIN <M@ Q@MT PN@APG OC@T H<F@ DO KJNND=G@ OJ ?@ADI@ NO<I?<M?DN@? KMJ>@NN@N ADGO@MN AJM >@MO<DI 1.(. O<BN 3NDIB <I <NO@MDNF D @ #TAG* RDGG ?@<>ODQ<O@ <IT NP>C KMJ>@NN@N (I >JI>M@O@ O@MHN AJM @<>C O<B JM @<>C O<B GJJK K<DM OC@ API>ODJIN NK@>DAD@? RDGG =@ @S@>PO@? %s RDGG =@ M@KG<>@? =T OC@ <>OP<G >JIO@ION OC<O OC@ O<B M@OPMIN 2RJ >JINO<ION <M@ <Q<DG<=G@ AJM OC@ HJNO >JHHJI PN<B@N // typographical processing define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect)'); // SPIP shortcut processing ([->artXX], <cadre>, {{}}, ...) define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect)');

$interface['table_des_traitements']['BALISE'][]= 'filtre_A(%s)'; $interface['table_des_traitements']['BALISE'][]= 'filtre_B(filtre_A(%s))'; $interface['table_des_traitements']['BALISE'][]= _TRAITEMENT_TYPO; $interface['table_des_traitements']['BALISE'][]= _TRAITEMENT_RACCOURCIS; $interface['table_des_traitements']['BALISE']['boucle']= _TRAITEMENT_TYPO; // examples in SPIP $interface['table_des_traitements']['BIO'][]= _TRAITEMENT_RACCOURCIS; $interface['table_des_traitements']['CHAPO'][]= _TRAITEMENT_RACCOURCIS; $interface['table_des_traitements']['DATE'][]= 'normaliser_date(%s)'; $interface['table_des_traitements']['ENV'][]= 'entites_html(%s,true)'; // exemples dans le plugin d'exemple "chat" $interface['table_des_traitements']['RACE']['chats'] = _TRAITEMENT_TYPO; $interface['table_des_traitements']['INFOS']['chats'] = _TRAITEMENT_RACCOURCIS;

150


# Extending SPIP I @S<HKG@ RCD>C DN JAO@I Q@MT PN@APG DN OC@ <POJH<OD> ?@G@ODJI JA OC@ IPH=@MN PN@? <N KM@ADS@N DI N@>ODJI ODOG@N 2CDN ><I =@ DHKG@H@IO@? PNDIB OCDN H@OCJ? DI OC@ config/mes_options.php ADG@ JM =T PNDIB OCDN KDK@GDI@ DI < KGPBDI JA >JPMN@ // simple version $GLOBALS['table_des_traitements']['TITRE'][]= 'typo(supprimer_numero(%s), "TYPO", $connect)'; // complex version (do not overwrite the existing definition) if (isset($GLOBALS['table_des_traitements']['TITRE'][0])) { $s = $GLOBALS['table_des_traitements']['TITRE'][0]; } else { $s = '%s'; } $GLOBALS['table_des_traitements']['TITRE'][0] = str_replace('%s', 'supprimer_numero(%s)', $s);

Example 2<F@ OC@ >JHKG@S @S<HKG@ JA OC@ B@I?< KGPBDI RCD>C ?@>G<M@N < O<=G@ ><GG@? spip_evenements @Q@ION

< GDIF<B@ O<=G@ ><GG@? spip_mots_evenenents F@TRJM? @Q@ION <I? < N@>JI? GDIF<B@ O<=G@ ><GG@? spip_evenements_participants @Q@IO K<MOD>DK<ION I <GD<N DN ?@ADI@? OJ GJJK JQ@M OC@ @Q@ION $SKGD>DO EJDIN <M@ ?@>G<M@?

<GJIB RDOC < ?<O@ AD@G? <I? NK@>D<G KMJ>@NN@N (O PN@N I@<MGT <GG JA OC@ A@<OPM@N ?@ADI@? <=JQ@ function agenda_declarer_tables_interfaces($interface){ // 'spip_' dans l'index de $tables_principales $interface['table_des_tables']['evenements']='evenements'; //-- Joins --------------------------------------------------$interface['tables_jointures']['spip_evenements'][]= 'mots'; // to be inserted before the join on articles $interface['tables_jointures']['spip_articles'][]= 'evenements'; $interface['tables_jointures']['spip_evenements'][] = 'articles';

151


$interface['tables_jointures']['spip_mots'][]= 'mots_evenements'; $interface['tables_jointures']['spip_evenements'][] = 'mots_evenements'; $interface['tables_jointures']['spip_evenements'][] = 'evenements_participants'; $interface['tables_jointures']['spip_auteurs'][] = 'evenements_participants'; $interface['table_des_traitements']['LIEU'][]= 'propre(%s)'; // used for critiria such as racine, meme_parent, id_parent

$interface['exceptions_des_tables']['evenements']['id_parent']='id_evenem

$interface['exceptions_des_tables']['evenements']['id_rubrique']=array('s 'id_rubrique'); $interface['table_date']['evenements'] = 'date_debut'; return $interface; }

declarer_tables_objets_surnoms 2CDN KDK@GDI@ >M@<O@N < M@G<ODJINCDK =@OR@@I <I J=E@>O OTK@ <I? DON >JMM@NKJI?DIB 1/* O<=G@ !T ?@A<PGO <I fNf DN <??@? OJ OC@ @I? JA OC@ J=E@>O OTK@ I<H@ @ B OC@ f<MOD>G@f J=E@>O H<KN OJ < O<=G@ ><GG@? f<MOD>G@Nf .DK@GDI@ ><GG $surnoms = pipeline('declarer_tables_objets_surnoms', array( 'article' => 'articles', 'auteur' => 'auteurs', //... ));

2C@N@

M@G<ODJINCDKN

@I<=G@

objet_type() OJ RJMF OJB@OC@M

152

OC@

API>ODJIN

table_objet()

<I?


# Extending SPIP // type... $type = objet_type('spip_articles'); // article $type = objet_type('articles'); // article // table... $objet = table_objet('article'); // articles $table = table_objet_sql('article'); // spip_articles // id... $_id_objet = id_table_objet('articles'); // id_article $_id_objet = id_table_objet('spip_articles'); // id_article $_id_objet = id_table_objet('article'); // id_article

Example : 2C@ KGPBDI E@PS PN@N function jeux_declarer_tables_objets_surnoms($surnoms) { $surnoms['jeu'] = 'jeux'; return $surnoms; }

declarer_tables_principales 2CDN KDK@GDI@ ?@>G<M@N <??DODJI<G O<=G@N JM AD@G?N 2C@ 1/* OTK@ JA @<>C AD@G? DN NK@>DAD@? <GJIB RDOC OC@ KMDH<MT F@TN <I? NJH@ODH@N OC@ N@>JI?<MT F@TN PN@? AJM EJDIN =@OR@@I O<=G@N 2C@ >JI>@MI@? O<=G@N <M@ OC@ KMDI>DK<G JI@N =@><PN@ OC@T H<DIGT >JI>@MI @?DOJMD<G >JIO@IO RC@M@<N <PSDGD<MT O<=G@N K >JI>@MI GDIFN =@OR@@I KMDI>DK<G O<=G@N 2C@N@ ?@>G<M<ODJIN <M@ PN@? =T 1.(. OJ \ H<I<B@ OC@ ?DNKG<T JA GJJKN @Q@I DA DOfN JKODJI<G =@><PN@ 1.(. ><I B@O OC@ 1/* ?@N>MDKODJI JA < O<=G@ OC<O C<NIfO =@@I ?@>G<M@?

\ >M@<O@ O<=G@N JM I@R AD@G?N ?PMDIB OC@ DINO<GG<ODJI JA 1.(. JM < KGPBDI

\ =<>FPK <I? M@NOJM@ OC@N@ O<=G@N RDOC OC@ ?@A<PGO =<>FPK H<I<B@M DI 1.(.fN KMDQ<O@ <M@< 2C@ API>ODJI M@>@DQ@N <N <MBPH@ION OC@ GDNO JA OC@ O<=G@N <GM@<?T ?@>G<M@? <I? M@OPMIN OCDN N<H@ <MM<T IJR NPKKG@H@IO@? (I OCDN <MM<T @<>C O<=G@ DN ?@>G<M@? RDOC <I <NNJ>D<ODQ@ <MM<T JA F@TN

153


$tables_principales['spip_nom'] = array( 'field' => array('champ'=>'SQL creation code'), 'key' => array('type' => 'name(s) of the field(s)'), 'join' => array('champ'=>'join field') // Optional key );

1.(. PN@N OCDN KDK@GDI@ DI OC@ G<NO K<MO JA OC@ ?@>G<M<ODJI JA OC@ O<=G@N OC<O RDGG =@ PN@?

Example 2C@ KGPBDI <B@I?< ?@>G<M@N < O<=G@ JA @Q@ION NKDK;@Q@I@H@ION RDOC < IPH=@M JA AD@G?N (O ?@>G<M@N OC@ KMDH<MT F@T id_evenement DI?D>@N date_debut date_fin <I? id_article <N R@GG <N ORJ KJNND=G@ F@TN AJM PN@ DI EJDIN id_evenement @O id_article OC@ JM?@M JA OC@N@ ?@>G<M@? F@TN ?@O@MHDI@N OC@DM KMDJMDOT RC@I @NO<=GDNCDIB EJDIN (O <GNJ ?@>G<M@N <I <B@I?< AD@G? DI OC@ spip_rubriques O<=G@ function agenda_declarer_tables_principales($tables_principales){ //-- Table EVENEMENTS ------------------$evenements = array( "id_evenement" => "bigint(21) NOT NULL", "id_article" => "bigint(21) DEFAULT '0' NOT NULL", "date_debut" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", "date_fin" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", "titre" => "text NOT NULL", "descriptif" => "text NOT NULL", "lieu" => "text NOT NULL", "adresse" => "text NOT NULL", "inscription" => "tinyint(1) DEFAULT 0 NOT NULL", "places" => "int(11) DEFAULT 0 NOT NULL", "horaire" => "varchar(3) DEFAULT 'oui' NOT NULL", "id_evenement_source" => "bigint(21) NOT NULL", "maj" => "TIMESTAMP" );

154


# Extending SPIP $evenements_key = array( "PRIMARY KEY" => "id_evenement", "KEY date_debut" => "date_debut", "KEY date_fin" => "date_fin", "KEY id_article" => "id_article" ); $tables_principales['spip_evenements'] = array( 'field' => &$evenements, 'key' => &$evenements_key, 'join'=>array( 'id_evenement'=>'id_evenement', 'id_article'=>'id_article' )); $tables_principales['spip_rubriques']['field']['agenda'] = 'tinyint(1) DEFAULT 0 NOT NULL'; return $tables_principales; }

declarer_url_objets 2CDN KDK@GDI@ DN PN@? OJ B@I@M<O@ NO<I?<M? 1.(. 30*N AJM OC@ NK@>DAD@? J=E@>ON

<I? OJ ><G>PG<O@ OC@ >JMM@NKJI?@I>@ =@OR@@I < NO<I?<M? 30* <I? DON H<O>CDIB J=E@>O 2C@N@ 30*N H<T O<F@ OC@ AJMH \ spip.php?objcetXX NKDK KCK <MOD>G@ \ ?objectXX <MOD>G@ \ JM OC@ N<H@ RDOC .html <O OC@ @I? 5DOC OC@ .htaccess ADG@ <N NPKKGD@? RDOC 1.(. <I? <>ODQ<O@? 30*N H<T <GNJ =@ GDF@ \ objectXX <MOD>G@ \ objectXX.html <MOD>G@ COHG 2C@ 30* ><G>PG<O@? RC@I@Q@M R@ PN@ 1.(.fN 30* ><G>PG<ODJI API>ODJIN OC@ #URL_ O<B JM OC@ generer_url_entite API>ODJI ?@K@I? JI OC@ 30* JKODJIN N@G@>O@? RDOCDI OC@ 1.(. >JIADBPM<ODJI K<B@N

155


2CDN KDK@GDI@ DN ><GG@? DI @>MDM@ DI> PMGN KCK RDOC < GDNO JA KM@?@ADI@? J=E@>ON (O <>>@KON DIKPO K<M<H@O@MN <I? KMJ?P>@N JPOKPO JA < O<=G@ JA OC@ GDNO JA OC@ J=E@>ON OC<O ><I =@ PN@? DI < 30* $url_objets = pipeline('declarer_url_objets', array('article', 'breve', 'rubrique', 'mot', 'auteur', 'site', 'syndic'));

2C@ #URL_nom O<B M@OPMIN < 30* AJM < BDQ@I J=E@>O OTK@ <I? NK@>DAD> J=E@>O D?@IODAD@M IJ I@@? AJM ?@>G<M<ODJIN OJ ?J OCDN 2CDN KDK@GDI@ DN PN@? OJ ?@>J?@ < NO<I?<M? 30* <I? OJ D?@IODAT OC@ J=E@>O OTK@ <I? J=E@>O J?@IODAD@M OJ RCD>C DO <KKGD@N -I>@ <I J=E@>O I<H@ C<N =@@I ?@>G<M@? ?nameXX DI OC@ 30* RDGG @I<=G@ 1.(. OJ ><G>PG<O@ OC<O OC@ J=E@>O OTK@ DN I<H@ OC<O OC@ D?;I<H@ D?@IODAD@M DN @LP<G OJ 66 <I? OC<O 1.(. NCJPG? OC@M@AJM@ OMT OJ GJ<? OC@ name.html O@HKG<O@ AJM OC@ D?@IODAD@M DI LP@NODJI 2C@ PN@ JA OCDN KDK@GDI@ ><I =@ >JPKG@? RDOC OC@ ?@>G<M<ODJI JA O<=G@;ODOG@ DI OC@ ?@>G<M@M;O<=G@N;DIO@MA<>@N K KDK@GDI@ 2CDN DI?D><O@N RCD>C 1/* >JGPHI JA OC@ J=E@>O NCJPG? =@ M@GD@? JI OJ >M@<O@ < H@<IDIBAPG 30*

Example 2C@ &M<KK@N KGPBDI PN@N OCDN KDK@GDI@ H<FDIB DO KJNND=G@ OJ >M@<O@ 30*N AJM OC@ I@R J=E@>O #URL_GRAPPE >M@<O@N < 30* HJ?DA@? AJM OC@ J=E@>O OTK@ 1.(. RDGG OC@I FIJR RCD>C O@HKG<O@ OJ M@A@M OJ RC@I NP>C < 30* DN M@LP@NO@? grappe.html function grappes_declarer_url_objets($array){ $array[] = 'grappe'; return $array; }

2C@ DIO@MA<>@ KDK@GDI@ <GNJ ?@>G<M@N OC@ ODOG@ AD@G? AJM H@<IBDIBAPG 30*N function grappes_declarer_tables_interfaces($interface){ // [...] // Titles for URLs $interface['table_titre']['grappes'] = "titre, '' AS lang"; return $interface;

156


# Extending SPIP }

definir_session 5C@I@Q@M < O@HKG<O@ M@LP@NON OJ PN@ #AUTORISER #SESSION JM <IT JOC@M O<B RCD>C M@LPDM@N OC@ >M@<ODJI JA < ?DAA@M@IO ><>C@ AJM @<>C N@NNDJI < NK@>D<G D?@IODAD@M DN ><G>PG<O@? RDOC OC@ N@NNDJI DIAJMH<ODJI FIJRI <=JPO OC@ QDNDOJM =T OC@ spip_session API>ODJI 2CDN D?@IODAD@M DN PN@? OJ I<H@ OC@ ><>C@ ADG@N 5C@I IJ DIAJMH<ODJI DN FIJRI <=JPO OC@ QDNDOJM OC@ D?@IODAD@M M@OPMI@? DN IPGG 2C@ definir_session KDK@GDI@ DN PN@? OJ >JHKG@O@ OC@ DIAJMH<ODJI PN@? OJ >M@<O@ OCDN D?@IODAD@M (O DN <GNJ KJNND=G@ OJ >JHKJN@ PIDLP@ ><>C@N M@GTDIB JI JOC@M K<M<H@O@MN M<OC@M OC<I ?<O< M@G<ODIB OJ OC@ QDNDOJM 2C@ KDK@GDI@ M@>@DQ@N <I? M@OPMIN < >C<M<>O@M NOMDIB (O DN ><GG@? <N DI OC@ ADG@ @>MDM@ DI> PODGN KCK $s = pipeline('definir_session', $GLOBALS['visiteur_session'] ? serialize($GLOBALS['visiteur_session']) . '_' . @$_COOKIE['spip_session'] : '' );

Remarks: OC@ N@NNDJI ?<O< ><I =@ M@LPDM@? Q@MT @<MGT JI DI 1.(.fN JK@M<ODJIN

NJ DO DN =@NO OJ ?@>G<M@ OC@ OC@ KDK@GDI@ API>ODJI AJM < KGPBDI ?DM@>OGT DI OC@ JKODJIN ADG@ 2C@ ?@>G<M<ODJI DI OC@ plugin.xml ADG@ ?J@N IJO I@@? OJ ?@ADI@ OC@ 6+* O<B <inclure> DI NP>C >DM>PHNO<I>@N <options>prefixPlugin_options.php</options> <pipeline> <nom>definir_session</nom> </pipeline>

157


Example 2C@ %<>@!JJF *JBDI KGPBDI ?@ADI@N < ><>C@ I<H@ RCD>C DN <GNJ ?@K@I?@IO JI OC@ %<>@=JJF <POC@IOD><ODJI DA OC<O C<N =@@I Q<GD?<O@? function fblogin_definir_session($flux){ $flux .= (isset($_SESSION['fb_session']) ? serialize(isset($_SESSION['fb_session'])) : ''); return $flux; }

2C@ %JMHN 2<=G@N KGPBDI <GNJ ?@ADI@N < NK@>DAD> ><>C@ RC@I >JJFD@N GDIF@? OJ DON AJMHN <M@ ?DN>JQ@M@? function forms_definir_session($session){ foreach($_COOKIE as $cookie=>$value){ if (strpos($cookie,'cookie_form_')!==FALSE) $session .= "-$cookie:$value"; } return $session; }

5@ NCJPG? IJO@ OC<O OC@ #FORMS ?TI<HD> O<B AJM OCDN KGPBDI M@LP@NON OC@ >M@<ODJI JA < ><>C@ K@M N@NNDJI =T <NNDBIDIB true OJ OC@ session JKODJI JA OC@ O<B function balise_FORMS ($p) { $p->descr['session'] = true; return calculer_balise_dynamique($p, 'FORMS', array('id_form', 'id_article', 'id_donnee','id_donnee_liee', 'class')); }

delete_statistiques 2CDN KDK@GDI@ DN ><GG@? EPNO =@AJM@ @S@>PODIB OC@ JK@M<ODJI OJ ?@G@O@ OC@ NO<ODNOD>N AMJH RDOCDI OC@ KMD><O@ UJI@ JI OC@ ecrire/?exec=admin_effacer K<B@ 2CDN DN < OMDBB@M < KDK@GDI@ RCD>C JIGT M@KJMON <I @Q@IO RDOCJPO K<NNDIB <IT K<M<H@O@MN N NP>C

OCDN KDK@GDI@ HDBCO =@ M@I<H@? <N trig_delete_statistiques DI OC@ APOPM@

158


# Extending SPIP pipeline('delete_statistiques', '');

(O C<N IJO T@O =@@I PN@? DI <IT KGPBDI <Q<DG<=G@ JI OC@ 1.(. 8JI@ 2CDN KDK@GDI@ NCJPG? =@ PN@? OJ ?@G@O@ OC@ 1/* NO<ODNOD>N O<=G@N OC<O HDBCO =@ <??@? =T <IT JOC@M KGPBDIN

delete_tables 2CDN KDK@GDI@ DN ><GG@? EPNO =@AJM@ @S@>PODIB OC@ API>ODJI OJ OJO<GGT ?@G@O@ OC@ ?<O<=<N@ O<=G@N AMJH RDOCDI OC@ KMDQ<O@ UJI@ QD< OC@ ecrire/ ?exec=admin_effacer K<B@ (O DN < OMDBB@M < KDK@GDI@ RCD>C NDHKGT O<F@N IJO@ JA <I @Q@IO RDOCJPO <IT K<M<H@O@MN =@DIB K<NN@? N NP>C OCDN KDK@GDI@ HDBCO =@ M@I<H@? <N trig_delete_tables DI OC@ APOPM@ pipeline('delete_tables', '');

2C@M@ DNIfO <IT K<MOD>PG<MGT DIO@M@NODIB <KKGD><ODJI JA OCDN KDK@GDI@ RDOCDI OC@ KGPBDIN <Q<DG<=G@ JI 1.(. 8JI@ (O HDBCO =@ KJNND=G@ OJ PN@ DO OJ @S@>PO@ KMJ>@NN@N JI <I @SO@MI<G ?<O<=<N@ RC@I < 1.(. NDO@ DN M@DIDOD<GDN@? PNDIB OC@ <?HDI K<B@ JM <GNJ OJ N@I? IJODAD><ODJIN JA OC@ KPMB@ <>ODJI <I? K@MC<KN OC@ >PMM@IO <?HDI PN@MfN >JII@>ODJI ?@O<DGN OJ >@MO<DI IJHDI<O@? M@>DKD@ION

editer_contenu_objet 2CDN KDK@GDI@ DN ><GG@? ?PMDIB OC@ ?DNKG<T JA < =<>F@I? AJMH AJM < 1.(. J=E@>O (O DN PN@? OJ >C<IB@ OC@ '2+* >JIO@IO JA OC<O AJMH 2CDN KDK@GDI@ DN ><GG@? <N < "42 AJMH GJ<?DIB K<M<H@O@M K $contexte['_pipeline'] = array('editer_contenu_objet', array('type'=>$type, 'id'=>$id));

2C@ KDK@GDI@ K<NN@N \ OC@ OTK@ type OC@ J=E@>O D?@IODAD@M id <I? OC@ >JHKDG<ODJI >JIO@SO OC@ contexte O<=G@ PNDIB OC@ args O<=G@ \ OC@ '2+* >J?@ DI OC@ data F@T

159


Example 2C@ -K@I(# KGPBDI <??N < ?<O< @IOMT AD@G? DIOJ OC@ <POCJM >M@<ODJI AJMH function openid_editer_contenu_objet($flux){ if ($flux['args']['type']=='auteur') { $openid = recuperer_fond('formulaires/incopenid', $flux['args']['contexte']); $flux['data'] = preg_replace('%(<li class="editer_email(.*?)</li>)%is', '<!--extra->'."\n".$openid, $flux['data']); } return $flux; }

formulaire_charger 2C@ formulaire_charger KDK@GDI@ DN PN@? OJ HJ?DAT OC@ O<=G@ JA Q<GP@N OC<O K<NN@? AMJH OC@ charger API>ODJI AMJH < "42 AJMH (O DN OC@M@AJM@ ><GG@? RC@I ?DNKG<TDIB < AJMH AMJH OC@ @>MDM@ =<GDN@ AJMHPG<DM@; KCK ADG@ (O DN K<NN@? < K<M<H@O@M JA OC@ AJMH I<H@ <N R@GG <N OC@ K<M<H@O@MN K<NN@? OJ OC@ AJMH DI OC@ charger verifier <I? traiter API>ODJIN (O M@OPMIN OC@ O<=G@ JA Q<GP@N OJ =@ GJ<?@? $valeurs = pipeline( 'formulaire_charger', array( 'args'=>array('form'=>$form,'args'=>$args), 'data'=>$valeurs) );

Example 2C@ IJ1K<H KGPBDI PN@N OCDN KDK@GDI@ OJ <?? < OJF@I DI?D><ODIB < Q<GD?DOT K@MDJ? AJM OC@ AJMHN IJHDI<O@? DI < BGJ=<G Q<MD<=G@ $GLOBALS['formulaires_no_spam'][] = 'forum'; //

160


# Extending SPIP function nospam_formulaire_charger($flux){ $form = $flux['args']['form']; if (in_array($form, $GLOBALS['formulaires_no_spam'])){ include_spip("inc/nospam"); $jeton = creer_jeton($form); $flux['data']['_hidden'] .= "<input type='hidden' name='_jeton' value='$jeton' />"; } return $flux; }

formulaire_traiter 2CDN KDK@GDI@ DN ><GG@? DI @>MDM@ KP=GD> <DBPDGG@M KCK <AO@M OC@ KMJ>@NN@N K C<Q@ MPI AJM < "42 AJMH (O DN PN@? OJ NPKKG@H@IO OC@ M@NKJIN@ O<=G@ JM OJ K@MAJMH <IT <??DODJI<G KMJ>@NN@N (O <>>@KON OC@ N<H@ <MBPH@ION <N OC@ AJMHPG<DM@;>C<MB@M K JM AJMHPG<DM@;Q@MDAD@M K KDK@GDI@N (O M@OPMIN OC@ O<=G@ JA ?<O< OC<O <M@ OC@ M@NPGON JA KMJ>@NNDIB @MMJM H@NN<B@ NP>>@NN H@NN<B@ M@?DM@>ODJI @?DO<=G@ AJMH M@AM@NC $rev = pipeline( 'formulaire_traiter', array( 'args' => array('form'=>$form, 'args'=>$args), 'data' => $rev) );

Example 2C@ *D>@I>@ KGPBDI RCD>C JAA@MN OC@ JKKJMOPIDOT OJ <NNDBI < PN<B@ GD>@I>@ OJ <MOD>G@N PN@N OCDN KDK@GDI@ OJ N<Q@ OC@ ?@A<PGO GD>@I>@ Q<GP@ DI OC@ >JIADBPM<ODJI ?@O<DGN RC@I@Q@M < I@R <MOD>G@ DN >M@<O@? function licence_formulaire_traiter($flux){

161


// if creating a new article, assign it the config default licence if ($flux['args']['form'] == 'editer_article' AND $flux['args']['args'][0] == 'new') { $id_article = $flux['data']['id_article']; $licence_defaut = lire_config('licence/ licence_defaut'); sql_updateq('spip_articles', array('id_licence' => $licence_defaut), 'id_article=' . intval($id_article)); } return $flux; }

,JO@N \ OC@ lire_config() .'. API>ODJI =@GJIBN OJ OC@ >JIADBPM<ODJI KGPBDI "%& \ DI 1.(. DO RDGG =@ HJM@ M@G@Q<IO OJ PN@ OC@ KM@;DIN@MODJI K KDK@GDI@ AJM OCDN NK@>DAD> @S<HKG@

formulaire_verifier 2CDN KDK@GDI@ DN ><GG@? AMJH @>MDM@ KP=GD> <DBPDGG@M KCK ?PMDIB OC@ Q@MDAD><ODJI JA ?<O< NP=HDOO@? AMJH < "42 AJMH (O DN PN@? OJ >JHKG@O@ OC@ O<=G@ JA @MMJMN M@OPMI@? =T OC@ Q@MDAD@M K API>ODJI AJM OC@ AJMH DI LP@NODJI (O DN K<NN@? OC@ N<H@ <MBPH@IO K<M<H@O@MN <N OC@ AJMHPG<DM@;>C<MB@M K KDK@GDI@ OCJN@ =@DIB OC@ AJMH I<H@ <N R@GG <N OC@ K<M<H@O@MN K<NN@? DI OC@ OC@ charger verifier <I? traiter API>ODJIN (O M@OPMIN OC@ O<=G@ JA @MMJMN <N JPOKPO $verifier = charger_fonction("verifier","formulaires/$form/",true); $post["erreurs_$form"] = pipeline('formulaire_verifier', array( 'args' => array( 'form'=>$form, 'args'=>$args), 'data'=>$verifier ? call_user_func_array($verifier, $args)

162


# Extending SPIP : array()));

Example 2C@ -K@I(# KGPBDI PN@N OCDN KDK@GDI@ OJ Q@MDAT OC<O OC@ KMJQD?@? -K@I(# 30* DN Q<GD? RC@I <I <POCJM @?DON CDN ?@O<DGN <I? DA IJO DO KMJQD?@N <I @MMJM H@NN<B@ O<BB@? AJM OC@ AD@G? DI LP@NODJI function openid_formulaire_verifier($flux){ if ($flux['args']['form'] == 'editer_auteur'){ if ($openid = _request('openid')){ include_spip('inc/openid'); $openid = nettoyer_openid($openid); if (!verifier_openid($openid)) $flux['data']['openid'] = _T('openid:erreur_openid'); } } // [...] return $flux; }

header_prive 2C@ header_prive KDK@GDI@ DN PN@? OJ <?? >JIO@IO DIOJ OC@ <head> N@>ODJI JA K<B@N DI OC@ KMDQ<O@ UJI@ (O RJMFN GDF@ OC@ DIN@MO;C@<? K KDK@GDI@ 2C@ KDK@GDI@ <>>@KON < K<M<H@O@M <I? M@OPMIN <N JPOKPO OC@ >JIO@ION JA OC@ '$ # N@>ODJI function prefixPlugin_header_prive($flux){ $flux .= "<!-- a comment for no reason at all! -->\n"; return $flux; }

163


Example 2C@ ,JO<ODJIN KGPBDI PN@N OCDN CJJF OJ <?? "11 ?@>G<M<ODJIN AJM =JOC KMDQ<O@ <I? KP=GD> K<B@N DO <GNJ PN@N insert_head function notation_header_prive($flux){ $flux = notation_insert_head($flux); return $flux; } function notation_insert_head($flux){ $flux .= '<link rel="stylesheet" href="' . _DIR_PLUGIN_NOTATION .'css/notation.v2.css" type="text/ css" media="all" />'; return $flux; }

2C@ -K@I *<T@MN KGPBDI @I<=G@N OC@ PN@ JA f-K@I 1OM@@O +<Kf H<KN <I? PN@N OCDN API>ODJI OJ GJ<? OC@ I@>@NN<MT )<Q<1>MDKO >J?@ function openlayer_insert_head_prive($flux){ $flux .= '<script type="application/javascript" src="http://www.openlayers.org/api/ OpenLayers.js"></script> <script type="application/javascript" src="' . _DIR_PLUGIN_OPENLAYER . 'js/openlayers.js"></script> <script type="application/javascript" src="http://openstreetmap.org/openlayers/ OpenStreetMap.js"></script>'; return $flux; }

insert_head 2C@ KDK@GDI@ insert_head <??N NJH@ >JIO@IO DIOJ OC@ <head> N@>ODJI JA <I '2+* K<B@ \ RC@M@ #INSERT_HEAD DN PN@?

\ JOC@MRDN@ EPNO =@AJM@ </head> DA OC@ API>ODJI f_insert_head DN ><GG@? DI OC@ <AAD>C<B@;ADI<G K KDK@GDI@ AJM @S<HKG@ RDOC OCDN GDI@ DI mes_options.php

164


# Extending SPIP $spip_pipeline['affichage_final'] .= '|f_insert_head';

*@ KDK@GDI@ <>>@KON OC@ >JIO@ION OJ =@ <??@? <I? M@OPMIN OC@ >JHKG@O@? >JIO@ION function prefixPlugin_insert_head($flux){ $flux .= "<!-- A comment for nothing ! -->\n"; return $flux; }

Example ?? DI < E/P@MT API>ODJI ><GG DI OCDN ><N@ OJ ?DNKG<T < OJJG=<M AJM textarea O<BN DI OC@ "M<TJIN AJMHN RDOC OC@ KGPBDI .JMO@ .GPH@ function documentation_insert_head($flux){ $flux .= <<<EOF <script type="text/javascript"> <!-(function($){ $(document).ready(function(){ /* Add a porte plume toobar into crayons */ function barrebouilles_crayons(){ $('.formulaire_crayon textarea.crayonactive').barre_outils('edition'); } barrebouilles_crayons(); onAjaxLoad(barrebouilles_crayons); }); })(jQuery); --> </script> EOF; return $flux; }

2C@ )<Q<1>MDKO API>ODJI onAjaxLoad DN PN@? OJ KMJQD?@ OC@ BDQ@I API>ODJI <N < K<M<H@O@M ?PMDIB OC@ ) 6 GJ<? JA < K<B@ @G@H@IO

165


jquery_plugins 2CDN KDK@GDI@ H<F@N DO @<NT OJ <?? NJH@ )<Q<N>MDKO >J?@ RCD>C RDGG =@ DIN@MO@? DIOJ @Q@MT KP=GD> <I? KMDQ<O@ K<B@ RCD>C PN@N OC@ O<B (,1$02;'$ # K (O M@>@DQ@N <I? M@OPMIN <I <MM<T OC<O >JIO<DIN OC@ K<OCN OC@N@ K<OCN RDGG =@ >JHKG@O@? =T OC@ API>ODJI ADI?;DI;K<OC K JA OC@ ADG@N OJ =@ DIN@MO@? $scripts = pipeline('jquery_plugins', array( 'javascript/jquery.js', 'javascript/jquery.form.js', 'javascript/ajaxCallback.js' ));

Example : ?? OC@ N>MDKO ELP@MT >T>G@ EN OJ @Q@MT K<B@ function pluginPrefix_jquery_plugins($scripts){ $scripts[] = "javascript/jquery.cycle.js"; return $scripts; }

lister_tables_noerase 2CDN KDK@GDI@ DN PN@? OJ NK@>DAT OC@ 1/* O<=G@N IJO OJ =@ @HKOD@? EPNO =@AJM@ < M@NOJM@ (O DN ><GG@? =T OC@ lister_tables_noerase API>ODJI DI OC@ @>MDM@ =<N@ ?PHK KCK ADG@ (O <>>@KON <N K<M<H@O@M <I? M@OPMIN <N JPOKPO < O<=G@ >JIO<DIDIB OC@ GDNO JA O<=G@N IJO OJ =@ KPMB@? $IMPORT_tables_noerase = pipeline('lister_tables_noerase', $IMPORT_tables_noerase);

lister_tables_noexport 2CDN KDK@GDI@ DN PN@? OJ ?@>G<M@ 1/* O<=G@N RCD>C RDGG IJO =@ DI>GP?@? DI OC@ 1.(. =<>F PKN

166


# Extending SPIP (O DN ><GG@? AMJH OC@ lister_tables_noexport API>ODJI DI OC@ @>MDM@ =<N@ ?PHK KCK ADG@ (O <>>@KON < K<M<H@O@M <I? M@OPMIN <N JPOKPO < O<=G@ >JIO<DIDIB OC@ GDNO JA O<=G@N IJO OJ =@ =<>F@? PK $EXPORT_tables_noexport = pipeline('lister_tables_noexport', $EXPORT_tables_noexport);

!T ?@A<PGO >@MO<DI 1.(. O<=G@N <M@ <GM@<?T @S>GP?@? OC@N@ =@DIB OC@ O<=G@N PN@? AJM NO<ODNOD>N N@<M>C@N <I? M@QDNDJIN

Example 2C@ &YJBM<KCD@ KGPBDI PN@N OCDN KDK@GDI@ OJ IJHDI<O@ IJO OJ @SKJMO DON 1/* O<=G@N OC<O >JIO<DI OC@ B@JBM<KCD><G ?<O< OC@N@ <M@ Q@MT G<MB@ function geographie_lister_tables_noexport($liste){ $liste[] = 'spip_geo_communes'; $liste[] = 'spip_geo_departements'; $liste[] = 'spip_geo_regions'; $liste[] = 'spip_geo_pays'; return $liste; }

lister_tables_noimport 2CDN KDK@GDI@ DN PN@? OJ NK@>DAT OC@ 1/* O<=G@N IJO OJ =@ DHKJMO@? ?PMDIB OC@ M@NOJM@ JA <I DIO@MI<G 1.(. =<>FPK (O DN ><GG@? =T OC@ lister_tables_noimport API>ODJI DI OC@ @>MDM@ =<N@ ?PHK KCK ADG@ (O <>>@KON <N K<M<H@O@M <I? M@OPMIN <N JPOKPO < O<=G@ >JIO<DIDIB OC@ GDNO JA O<=G@N IJO OJ =@ DHKJMO@? $IMPORT_tables_noimport = pipeline('lister_tables_noimport', $IMPORT_tables_noimport);

167


optimiser_base_disparus "<GG@? AMJH @>MDM@ B@ID@ JKODHDN@M KCK OCDN KDK@GDI@ DN PN@? OJ NPKKG@H@IO OC@ >G@<IDIB JK@M<ODJIN AJM JMKC<I@? DO@HN =T ?@G@ODIB NP>C DO@HN ?PMDIB NO<I?<M? K@MDJ?D> O<NF N>C@?PGDIB $n = pipeline('optimiser_base_disparus', array( 'args'=>array( 'attente' => $attente, 'date' => $mydate), 'data'=>$n ));

N K<M<H@O@MN DO M@>@DQ@N OC@ @SK@>O@? DIO@M JK@M<ODJI ?@G<T <OO@IO@ <N R@GG <N OC@ >JMM@NKJI?DIB @SKDMT ?<O@ 2C@ ?<O< <MBPH@IO <MM<T NOJM@N OC@ IPH=@M JA DO@HN ?@G@O@? 2C@ optimiser_sansref()API>ODJI DN PN@? OJ H<I<B@ OC@ ?@G@ODJI JA OC@ M@>JM?N =T KMJQD?DIB <MBPH@IO K<M<H@O@MN \ OC@ O<=G@

\ OC@ KMDH<MT F@T

\ <I 1/* LP@MT M@NPGO >JIO<DIDIB JIGT <I D? >JGPHI GDNODIB OC@ D?@IODAD@MN O<MB@O@? AJM ?@G@ODJI

Example 2J ?@G@O@ AJMPHN OC<O =@GJIB OJ <I J=NJG@O@? N@>ODJI OC@ %JMPH KGPB PN@N OCDN KDK@GDI@ <N NCJRI =@GJR function forum_optimiser_base_disparus($flux){ $n = &$flux['data']; # forums linked to a non-existent id_rubrique (section) $res = sql_select("forum.id_forum AS id", "spip_forum AS forum LEFT JOIN spip_rubriques AS rubriques ON forum.id_rubrique=rubriques.id_rubrique", "rubriques.id_rubrique IS NULL AND forum.id_rubrique>0"); $n+= optimiser_sansref('spip_forum', 'id_forum', $res); // [...] return $flux;

168


# Extending SPIP }

post_typo 2C@ post_typo KDK@GDI@ DN PN@? OJ HJ?DAT O@SO <AO@M 1.(. C<N <KKGD@? DON IJMH<G OTKJBM<KCD><G KMJ>@NN@N <I? OC@M@AJM@ <GNJ <AO@M OC@ KM@;OTKJ K KDK@GDI@ (O DN ><GG@? =T OC@ corriger_typo() API>ODJI DI @>MDM@ DI> O@SO@ KCK

< API>ODJI RCD>C DON@GA DN ><GG@? RC@I PNDIB OC@ propre() JM typo() API>ODJIN $letexte = pipeline('post_typo', $letexte);

Example 2C@ 2TKJ &PDGG@H@ON KGPBDI M@KG<>@N LPJO<ODJI H<MFN " DI < KD@>@ JA @IO@M@? O@SO RDOC OC@ <KKMJKMD<O@ @LPDQ<G@IO ?@K@I?DIB JI OC@ G<IBP<B@ >J?@ NP>C <N PNDIB ÂŤ <I? Âť AJM %M@I>C O@SON 2J ?J OCDN DO <I<GTN@N OC@ O@SO AJM OTKJBM<KCD><G NCJMO >PON OC<O C<Q@ =@@I <KKGD@? <N NCJRI =@GJR function typo_guillemets_post_typo($texte) { // ... switch ($GLOBALS['spip_lang']) { case 'fr': $guilles="«  »"; //LRTEUIN break; // ... } // escape any " found in the tags; // note <!--extra--> is the character chr(1), and <!-extra--> represents the tag $texte = preg_replace(',<[^>]*"[^>]*(>|$),msSe', "str_replace('\"','<!--extra-->', \"<!--extra-->\")", $texte); // We correct any remaining quotes, which are by definition not within tags // A quote is not processed if it follows a non-space character, or // if it is followed by a word (letter, digit)

169


$texte = preg_replace('/(^|\s)"\s?([^"]*?)\s?"(\W|$)/ S', '<!--extra-->'.$guilles.'', $texte); // and put back the quotes in any tags return str_replace("<!--extra-->", '"', $texte); }

pre_boucle 2C@ KDK@GDI@ pre_boucle HJ?DAD@N OC@ 1/* LP@MD@N OC<O M@NPGO AMJH OC@ DIO@MKM@O<ODJI JA OC@ GJJKN JA 1.(. (O DN ><GG@? <O @<>C >JHKDG<ODJI KC<N@

<AO@M OC@ >JHKDG@M C<N <GM@<?T O<F@I DIOJ <>>JPIO OC@ N@G@>ODJI >MDO@MD< OC@ critere_NAME() API>ODJIN <I? =@AJM@ OC@ ><GG OJ OC@ boucle_NAME() API>ODJIN (O M@>@DQ@N <N <MBPH@IO < !JP>G@ J=E@>O OC<O >JIO<DIN OC@ ?<O< DNNP@? AMJH OC@ KM@QDJPN >JHKDG<ODJI NO@KN AJM OC@ >PMM@IO GJJK (O DN OC@M@AJM@ KJNND=G@ OJ O<F@ <>ODJIN =<N@? JI OC@ >MDO@MD< OC<O <M@ K<NN@? OJ OC@ GJJK GDF@ HJ?DATDIB OC@ N@G@>ODJI K<M<H@O@MN JM OC@ RC@M@ >JI?DODJI AJM OC@ GJJKfN 1/* LP@MT Example: 2C@ KGPBDI HJON O@>CIDLP@N <??N < O@>CID><G AD@G? OJ OC@ BMJPKN JA F@TRJM?N JA 1.(. 5C@I OC@M@ DN IJ {technique} >MDO@MD< K<NN@? OJ OC@ GJJK &0-3.$;+-21

OC@ GJJK <POJH<OD><GGT ADGO@MN DON M@NPGON M@OPMIDIB JIGT OCJN@ RC@M@ OC@ AD@G? {technique} DN @HKOT 2CDN N<H@ A@<OPM@ >JPG? <GNJ =@ DHKG@H@I@O@? =T >M@<ODIB < API>ODJI ><GG@? =JP>G@;&0-3.$1;+-21 function mots_techniques_pre_boucle($loop){ if ($loop->type_requete == 'groupes_mots') { $table_name = $loop->id_table; $technical_kw = $table_name .'.technique'; // Select only the loop without the "technical" keyword if (!isset($loop>modificateur['criteres']['technique']) &&

170


# Extending SPIP !isset($loop->modificateur['tout'])) { $loop->where[]= array("'='", "'$technical_kw'", "'\"\"'"); } } return $loop; }

2C@ <MM<T $loop->where[] >JIO<DIN <MM<TN RDOC @IOMD@N NP>>@NNDQ@GT =@DIB OC@ JK@M<OJM OC@ AD@G? <I? OC@ Q<GP@ '@M@ R@ <?? OJ OC@ LP@MT OC@ NOMDIB {$table_name}.technique='' RDOC $boucle->where[]= array("'='", "'$technical_kw'", "'\"\"'");

pre_insertion 2CDN KDK@GDI@ DN PN@? OJ <?? ?@A<PGO >JIO@IO RC@I < I@R @?DOJMD<G @G@H@IO DN =@DIB DIN@MO@? DIOJ OC@ ?<O<=<N@ 5C@I <I @?DOJMD<G DO@H DN M@LP@NO@? OJ =@ N<Q@? DO C<N IJO T@O =@@I <GGJ><O@? < PIDLP@ D?@IODAD@M DHKGTDIB DO DN < I@R DO@H NJ <I D?@IODAD@M DN <POJH<OD><GGT >M@<O@? AJM OC<O DO@H PNDIB OC@ insert_xx API>ODJIN RC@M@ SS DN OC@ I<H@ JA OC@ DIO@I?@? J=E@>O 2CDN DIN@MODJI KDK@GDI@ C<N OC@ NDHKG@ BJ<G JA M@OPMIDIB <I D?@IODAD@M <I? N<QDIB OC@ DO@HfN ?@A<PGO Q<GP@N 2C@ KDK@GDI@ DN ><GG@? AMJH OC@N@ insert_xx API>ODJIN -I>@ OC@ D?@IODAD@M C<N =@@I @NO<=GDNC@? OC@ IJMH<G HJ?DAD><ODJI O<NFN <M@ K@MAJMH@? PNDIB OC@ xx_set <I? modifier_contenu API>ODJIN RCD>C ><GG OC@ pre_edition <I? post_edition KDK@GDI@N 2CJN@ O<NFN <M@ OC@ JI@N OC<O RDGG N<Q@ OC@ ?<O< @IO@M@? =T OC@ PN@M <I? RCD>C RDGG OC@M@AJM@ ?J NJ @Q@I AJM I@R DO@HN 2CDN KDK@GDI@ K<NN@N OC@ O<=G@ I<H@ <I? <I <MM<T JA AD@G?N <I? ?@A<PGO Q<GP@N OJ =@ DIN@MO@? $champs = pipeline('pre_insertion', array( 'args' => array( 'table' => 'spip_rubriques',

171


), 'data' => $champs ) );

Example 2C@ %JMPH KGPBDI <??N OC@ AJMPH NO<OPN Q<GP@ AJM <I <MOD>G@ RC@I DO DN >M@<O@? PNDIB OC@ >J?@ =@GJR function forum_pre_insertion($flux){ if ($flux['args']['table']=='spip_articles'){ $flux['args']['data']['accepter_forum'] = substr($GLOBALS['meta']['forums_publics'], 0, 3); } return $flux; }

pre_liens 2C@ KM@;GD@IN KDK@GDI@ DN PN@? OJ KMJ>@NN OTKJBM<KCD><G NCJMO>PON M@G<ODIB OJ GDIFN JA OC@ AJMH[title->url] (O DN ><GG@? =T OC@ expanser_liens() @SK<I?;GDIF API>ODJI RCD>C DN DON@GA ><GG@? =T OC@ propre() API>ODJI $texte = pipeline('pre_liens', $texte);

1.(. DON@GA H<F@N PN@ JA OCDN @IOMT KJDIO OJ @S@>PO@ KMJ>@NN@N OC<O DI>GP?@ API>ODJIN DI OC@ ?@ADIDODJI JA OC@ KDK@GDI@ DI OC@ @>MDM@ DI>;Q@MNDJI KCK ADG@

?@ADI@? RDOCDI @>MDM@ DI> GD@I KCK \ traiter_raccourci_liens <POJH<OD><GGT B@I@M<O@N GDIFN AJM < KD@>@ JA O@SO OC<O GJJFN GDF@ < 30*

\ traiter_raccourci_glossaire B@I@M<O@N [?title] NCJMO>PON KJDIODIB OJ < BGJNN<MT K \ traiter_raccourci_ancre O<F@N ><M@ JA [<-anchor name] NCJMO>PON OC<O >M@<O@ < I<H@? <I>CJM KJDIO

172


# Extending SPIP Example 2C@ ?J>PH@IO<ODJI KGPBDI RCD>C H<I<B@N OCDN N<H@ ?J>PH@IO<ODJI

PN@N OCDN KDK@GDI@ OJ <POJH<OD><GGT <?? < title <OOMD=PO@ JI DIO@MI<G GDIF NCJMO>PON JA OC@ AJMH [->art30] OM<INAJMHDIB OC@H DIOJ [|art30->art30] OCDN RJMF<MJPI? N@MQ@N OJ ?DNKG<T OC@ K<B@ IPH=@M M@G<ODIB OJ OC@ GDIF RC@I @SKJMODIB OC@ >JIO@ION JA OC@ ?J>PH@IO<ODJI DI .#% AJMH<O function documentation_pre_liens($texte){ // only for the public site if (test_espace_prive()) return $texte; $regs = $match = array(); // for each link if (preg_match_all(_RACCOURCI_LIEN, $texte, $regs, PREG_SET_ORDER)) { foreach ($regs as $reg) { // if the shortcut is of the form "art40" if (preg_match(_RACCOURCI_URL, $reg[4], $match)) { $title = '|' . $match[1] . $match[2]; // if this title doesn't already exist if (false === strpos($reg[0], $title)) { $lien = substr_replace($reg[0], $title, strpos($reg[0], '->'), 0); $texte = str_replace($reg[0], $lien, $texte); } } } } return $texte; }

pre_typo 2C@ pre_typo KDK@GDI@ DN PN@? OJ HJ?DAT OC@ O@SO =@AJM@ OC@ OTKJBM<KCD><G KMJ>@NN@N @IQDN<B@? =T 1.(. <M@ @S@>PO@? (O DN ><GG@? =T OC@ corriger_typo() API>ODJI DI @>MDM@ DI> O@SO@ KCK < API>ODJI RCD>C DN DON@GA ><GG@? RC@I PNDIB OC@ propre() JM typo() API>ODJIN

173


$letexte = pipeline('pre_typo', $letexte);

2C@ HJ?DAD><ODJIN KMJKJN@? HPNO JIGT <KKGT KMJ>@NN@N OJ OC@ @G@H@ION OC<O ><I =@ ?DNKG<T@? JI < NDIBG@ inline GDI@ %JM KMJ>@NN@N OC<O HJ?DAT JM >M@<O@ =GJ>FN JM K<M<BM<KCN TJP HPNO PN@ OC@ pre_propre KDK@GDI@

Example 2C@ $IGPHDIPM@N 2TKJBM<KCDLP@N KGPBDI <POJH<OD><GGT HJ?DAD@N CJR NJH@ >C<M<>O@M NOMDIBN <M@ ?DNKG<T@? @ B OM<INAJMHDIB > DIOJ ] function typoenluminee_pre_typo($texte) { // ... $chercher_raccourcis = array( // ... /* 19 */ "/\(c\)/Si", /* 20 */ "/\(r\)/Si", /* 21 */ "/\(tm\)/Si", /* 22 */ "/\.\.\./S", ); $remplacer_raccourcis = array( // ... /* 19 */ "©", /* 20 */ "®", /* 21 */ "™", /* 22 */ "…", ); // ... $texte = preg_replace($chercher_raccourcis, $remplacer_raccourcis, $texte); // ... return $texte; }

174


# Extending SPIP

rechercher_liste_des_jointures 2CDN KDK@GDI@ DN PN@? DI @>MDM@ DI> M@>C@M>C@M KCK 5C@I < N@<M>C >JI>@MIN < O<=G@ OCDN KDK@GDI@ ><I DI?D><O@ JOC@M O<=G@N RC@M@ OC@ N@<M>C NCJPG? <GNJ =@ ?JI@ %JM @S<HKG@ < N@<M>C AJM <I <POCJM I<H@ JI <I 02("*$1 GJJK M@OPMIN OC@ <MOD>G@N OC<O OCDN <POCJM C<N RMDOO@I RDOC OC@ O<=G@ spip_auteurs_articles 2CDN KDK@GDI@ M@>@DQ@N <I <MM<T JA O<=G@N >JIO<DIDIB <I <MM<T JA O<=G@ AD@G?

R@DBCODIB OMDKG@ON GDF@ OC@ KDK@GDI@ M@>C@M>C@M;GDNO@;?@N;>C<HKN K

Example +J?DAD><ODJIN JA OC@ O<=G@ spip_articles function pluginPrefix_rechercher_liste_des_jointures($tables){ // search in the BIO of the authors when we search in the articles $tables['article']['auteur']['bio'] = 2; // search in the text of the keywords $tables['article']['mot']['texte'] = 2; // do not search in the documents unset($tables['article']['document']); return $tables; }

(I 1.(. OCDN KDK@GDI@ DN PN@? OJ N@<M>C AJM @G@H@ION PNDIB OC@DM GDIF@? F@TRJM?N JM <POCJMN

recuperer_fond 2C@ M@>PK@M@M;AJI? KDK@GDI@ DN PN@? OJ <?? OJ JM HJ?DAT OC@ >JHKDG<ODJI M@NPGON JA < BDQ@I O@HKG<O@ ADG@ N DIKPO DO <>>@KON OC@ I<H@ JA OC@ N@G@>O@? AJI? JM HJ?@G O@HKG<O@ <I? OC@ >JHKDG<ODJI >JIO@SO RDOCDI OC@ args O<=G@

<N R@GG <N OC@ O<=G@ ?@N>MD=DIB OC@ M@NPGON DI OC@ data O<=G@ $page = pipeline('recuperer_fond', array( 'args'=>array( 'fond'=>$fond,

175


'contexte'=>$contexte, 'options'=>$options, 'connect'=>$connect), 'data'=>$page));

4@MT JAO@I JIGT OC@ texte F@T DI OC@ data O<=G@ RDGG =@ HJ?DAD@? .G@<N@ M@A@M OJ OC@ M@>PK@M@M;AJI? K <MOD>G@ AJM < APGG ?@N>MDKODJI JA OCDN O<=G@

Example 2C@ A=GJBDI KGPBDI DN PN@? OJ D?@IODAT QDNDOJMN RDOC OC@DM %<>@=JJF >M@?@IOD<GN (O <??N < =POOJI OJ 1.(.fN IJMH<G D?@IODAD><ODJI AJMH 2C@ NJ>D<G;GJBDI;GDIFN KDK@GDI@ DI OC@ N<H@ KGPBDI M@OPMIN OC@ '2+* >J?@ AJM < GDIF KJDIODIB OJ OC@ %<>@=JJF D?@IODAD><ODJI K<B@ function fblogin_recuperer_fond($flux){ if ($flux['args']['fond'] == 'formulaires/login'){ $login = pipeline('social_login_links', ''); $flux['data']['texte'] = str_replace('</form>', '</form>' . $login, $flux['data']['texte']); } return $flux; }

rubrique_encours 2CDN DN PN@? OJ <?? >JIO@ION DIOJ OC@ .MJKJN@? AJM KP=GD><ODJI K<I@G ?DNKG<T@? AJM N@>ODJIN 2CDN K<I@G RDGG JIGT =@ ?DNKG<T@? RC@I OC@M@ DN <O G@<NO JI@ @G@H@IO <MOD>G@ NDO@ I@RN DO@H DI OC<O N@>ODJI OC<O C<N =@@I KMJKJN@? AJM KP=GD><ODJI (O DN ><GG@? AMJH @>MDM@ @S@> I<QDBP@M KCK pipeline('rubrique_encours', array( 'args' => array('type' => 'rubrique', 'id_objet' => $id_rubrique), 'data' => $encours));

176


# Extending SPIP Example 2C@ %JMPH KGPBDI PN@N OCDN KDK@GDI@ OJ <?? < KCM<N@ @I>JPM<BDIB >JHH@ION AJM OC@ <MOD>G@N KMJKJN@? AJM KP=GD><ODJI function forum_rubrique_encours($flux){ if (strlen($flux['data']) AND $GLOBALS['meta']['forum_prive_objets'] != 'non') $flux['data'] = _T('texte_en_cours_validation_forum') . $flux['data']; return $flux; }

styliser 2CDN KDK@GDI@ HJ?DAD@N OC@ R<T DI RCD>C 1.(. N@<M>C@N AJM OC@ O@HKG<O@ OJ PN@ OJ >JHKPO@ < K<B@ <I? AJM @S<HKG@ OJ >C<IB@ DO AJM < NK@>DAD> N@>ODJI 7JP ><I PN@ DO GDF@ OCDN // pipeline styliser $template = pipeline('styliser', array( 'args' => array( 'id_rubrique' => $sectionId, 'ext' => $ext, 'fond' => $initialTemplate, 'lang' => $lang, 'connect' => $connect ), 'data' => $template, ));

(O M@>@DQ@N NJH@ <MBPH@ION AJPI? DI OC@ @IQDMJIH@IO >JIO@SO <I? M@OPMIN OC@ I<H@ JA OC@ O@HKG<O@ OC<O RDGG =@ PN@? =T OC@ >JHKDG<ODJI (A OC@ PMG DN spip.php?article18 OC@ <MBPH@ION RDGG =@ \ \ \ \

D?;MP=MDLP@ DA OC@ <MOD>G@ DN DI N@>ODJI IPH=@M @SO fCOHGf OC@ ?@A<PGO @SO@INDJI AJM O@HKG<O@N AJI? f<MOD>G@f I<H@ JA OC@ O@HKG<O@ DIDOD<GGT PN@? G<IB fAMf

177


\ >JII@>O ff 1/* >JII@>ODJI I<H@ Example : 2C@ KGPBDI 1KDK "G@<M PN@N OCDN KDK@GDI@ OJ ><GG NJH@ NK@>DAD> O@HKG<O@N AJM OC@ ?DAA@M@IO =M<I>C@N JA OC@ =GJB // defines the template to use for a section of Spip-Clear function spipclear_styliser($flux){ // article or section ? if (($fond = $flux['args']['fond']) AND in_array($fond, array('article','rubrique'))) { $ext = $flux['args']['ext']; // [...] if ($section_id = $flux['args']['id_rubrique']) { // calculates the branch $branch_id = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($section_id)); // comparason of the branch with the config of Spip-Clear if (in_array($branch_id, lire_config('spipclear/ secteurs', 1))) { // if the template $fond_spipclear exists if ($template = test_squelette_spipclear($fond, $ext)) { $flux['data'] = $template; } } } } return $flux; } // returns a template $fond_spipclear.$ext when it exists function test_squelette_spipclear($fond, $ext) { if ($template = find_in_path($fond."_spipclear.$ext")) { return substr($template, 0, -strlen(".$ext")); } return false; }

178


# Extending SPIP

taches_generales_cron 2CDN KDK@GDI@ DN PN@? OJ ?@>G<M@ API>ODJIN OC<O RDGG =@ K@MDJ?D><GGT @S@>PO@? =T 1.(. (O DN ><GG@? DI OC@ @>MDM@ DI> B@ID@ KCK ADG@ =T OC@ taches_generales API>ODJI <>>@KODIB < K<M<H@O@M <I? M@OPMIDIB JPOKPO JA < F@T@? O<=G@ PNDIB API>ODJI I<H@N <N OC@ F@T <I? OC@ ODH@ =@OR@@I @S@>PODJI MPIN <N OC@ Q<GP@ return pipeline('taches_generales_cron', $taches_generales);

.G@<N@ M@<? OC@ N@>ODJI JI OC@ 5DU<M? K AJM APMOC@M DIAJMH<ODJI

Example IT KGPBDI RC<ONJ@Q@M >JPG? ?@>G<M@ < >G@<IDIB API>ODJI OJ =@ MPI @Q@MT R@@F function carte_postale_taches_generales_cron($taches){ $taches['nettoyer_cartes_postales'] = 7*24*3600; // every week return $taches; }

2CDN

API>ODJI

DN

>JIO<DI@?

DI

OC@

genie/

nettoyer_cartes_postales.php ADG@ (O ?@G@O@N <GG OC@ ADG@N DI < BDQ@I ?DM@>OJMT OC<O <M@ JG?@M OC<I ?<TN =T PNDIB OC@ purger_repertoire API>ODJI function genie_nettoyer_cartes_postales_dist($t){ // Purge postcards that are older than 30 days include_spip('inc/invalideur'); purger_repertoire(_DIR_IMG . 'cartes_postales/', array( 'atime' => (time() - (30 * 24 * 3600)), )); return 1; }

179


trig_supprimer_objets_lies 2CDN KDK@GDI@ DN < OMDBB@M M@OPMIN IJ JPOKPO RCD>C DN ><GG@? RC@I >@MO<DI J=E@>ON <M@ ?@G@O@? (O H<F@N DO KJNND=G@ OJ ?@G@O@ ?<O< NOJM@? DI GDIF<B@ O<=G@N <O OC@ N<H@ ODH@ <N <I J=E@>O DN ?@G@O@? (O DN K<NN@? <I <MM<T JA OC@ Q<MDJPN ?@G@ODJIN OJ =@ H<?@ >JIO<DIDIB OC@ ?@G@O@? J=E@>O OTK@ <I? D?@IODAD@M pipeline('trig_supprimer_objets_lies', array( array('type'=>'mot', 'id'=>$id_mot) ));

2CDN KDK@GDI@ DN ><GG@? AJM ?@G@ODJI JA < F@TRJM? <I? AJM < H@NN<B@

Example 2C@ %JMPH KGPBDI PN@N OCDN KDK@GDI@ OJ ?@G@O@ GDIFN RDOC AJMPH H@NN<B@N OC<O <M@ <NNJ>D<O@? RDOC < ?@G@O@? F@TRJM? JM H@NN<B@ AMJH OC@ H<DG=JS function forum_trig_supprimer_objets_lies($objets){ foreach($objets as $objet){ if ($objet['type']=='message') sql_delete("spip_forum", "id_message=" . sql_quote($objet['id'])); if ($objet['type']=='mot') sql_delete("spip_mots_forum", "id_mot=" . intval($objet['id'])); } return $objets; }

... and the rest of them 2C@M@ <M@ < C<I?APG JA KDK@GDI@N OC<O C<Q@ IJO T@O =@@I ?J>PH@IO@? 2C@T <M@ GDNO@? C@M@ AJM DIAJMH<ODJI KPMKJN@N JIGT <AAD>C@;AJMHPG<DM@;GJBDI <AAD>C@M;IJH=M@;J=E@ON;<NNJ>D@N;< <AAD>C@M;M@QDNDJI;J=E@O <M=J;>M@@M;>C<DI@;PMG <B@I?<;M@I?P;@Q@I@H@IO =<N@;<?HDI;M@K<DM

180


# Extending SPIP

><G>PG@M;MP=MDLP@N @S@>;DIDO AJMHPG<DM@;<?HDI GD=@GG@;<NNJ>D<ODJI;HJON HJON;DI?@S<ODJI I@OOJT@M;M<>>JPM>DN;OTKJ IJODAD><ODJIN J=E@O;>JHKO@;@IA<ION K<B@;DI?DNKJID=G@ KJNO;=JP>G@ KJNO;DH<B@;ADGOM@M KM@;KMJKM@ KJNO;KMJKM@ KM@;@?DODJI KJNO;@?DODJI KM@;NTI?D><ODJI KJNO;NTI?D><ODJI KM@;DI?@S<ODJI KMJKM@N;>M@@M;>C<DI@;PMG M@LP@O@;?D>J OMDB;><G>PG@M;KMJ>C<DI;KJNO?<O@ OMDB;KMJK<B@M;G@N;N@>O@PMN

181


Tags 2C@ =<GDN@ ?DM@>OJMT NOJM@ OC@ ?@>G<M<ODJIN JA ?TI<HD> O<BN <I? 1.(.fN B@I@MD> O<BN

Dynamic tags #TI<HD> O<B <M@ O<BN RCD>C <M@ M@><G>PG<O@? every time OC<O OC@ K<B@ DN ?DNKG<T@? <N JKKJN@? OJ NO<OD> O<BN RCD>C <M@ ><G>PG<O@? JIGT RC@I OC@ K<B@ DN M@><G>PG<O@? @DOC@M H<IP<GGT =T < NDO@ <?HDIDNOM<OJM JM <POJH<OD><GGT =@><PN@ OC@ K<B@ ><>C@ C<N @S>@@?@? DON @SKDMT ?<O@ ODH@ 2C@N@ ?TI<HD> O<BN OC@M@AJM@ NOJM@ DI OC@ B@I@M<O@? ><>C@ ADG@N < N@>ODJI JA .'. RCD>C RDGG =@ @S@>PO@? RC@I OC@ K<B@ DN ?DNKG<T@? (I KMDI>DKG@ OC@T <M@ @NN@IOD<GGT PN@? AJM ?DNKG<TDIB R@= AJMHN ?TI<HD> O<B BDG@ H<T >JIO<DI PK OJ @NN@IOD<G API>ODJIN balise_NOM_dist() balise_NOM_stat() balise_NOM_dyn()

The balise_NAME_dist function 2C@ ADMNO API>ODJI AJM < ?TI<HD> O<B DN OC@ N<H@ API>ODJI PN@? AJM NO<OD> O<BN

OC<O DN < API>ODJI RDOC OC<O O<BfN <>OP<G I<H@ balise_NAME_dist() 2CDN API>ODJI DINO@<? JA DIN@MODIB < NO<OD> >J?@ RDGG ><GG < API>ODJI B@I@M<ODIB < ?TI<HD> >J?@ calculer_balise_dynamique() &@I@M<GGT NK@<FDIB OC@ >JIO@ION JA OC@ API>ODJI >JIODI@ RDOC ><GGDIB OC@ ?TI<HD> ><G>PG<ODJI <N RDOC OCDN AJGGJRDIB O<B @S<HKG@ AJM #LOGIN_PRIVE function balise_LOGIN_PRIVE ($p) { return calculer_balise_dynamique($p, 'LOGIN_PRIVE', array('url')); }

2C@ O<B API>ODJI DN K<NN@? OC@ $p Q<MD<=G@ >JIO<DIDIB OC@ ?<O< JMDBDI<ODIB AMJH OC@ <I<GTNDN JA OC@ O@HKG<O@ DI LP@NODJI <MBPH@ION ADGO@MN OJ RCD>C GJJK DO =@GJIBN @O>

182


# Extending SPIP 2C@ calculer_balise_dynamique API>ODJI O<F@N <MBPH@ION \ OC@ $p ?@N>MDKODJI \ OC@ I<H@ JA OC@ ?TI<HD> O<B OJ @S@>PO@ IJMH<GGT OC@ N<H@ I<H@ <N OC@ O<B \ <I <MM<T JA <MBPH@ION OJ =@ M@OMD@Q@? AMJH OC@ K<B@ >JIO@SO O OCDN KJDIO

OC@ ?TI<HD> O<B M@LP@NON OC@ M@OMD@Q<G JA <I url K<M<H@O@M JMDBDI<ODIB AMJH OC@ >JIO@SO OC@ >GJN@NO GJJK JM OC@ O@HKG<O@ >JHKDG<ODJI @IQDMJIH@IO (A OC@M@ DN IJ K<M<H@O@M OJ =@ M@OMD@Q@? AMJH OC@ >JIO@SO

OC@I DO HPNO =@ K<NN@? <I @HKOT array()

The balise_NAME_stat() function (A DO @SDNON OC@ balise_NAME_stat() API>ODJI RDGG H<F@ DO KJNND=G@ OJ ><G>PG<O@ OC@ <MBPH@ION OJ =@ K<NN@? OJ OC@ AJGGJRDIB _dyn() API>ODJI (I DON <=N@I>@

JIGT OC@ <MBPH@ION NK@>DAD@? DI OC@ calculer_balise_dynamique() API>ODJI <M@ K<NN@? DI OC@ JM?@M JA OC@ <MM<T 2C@ stat API>ODJI RDGG H<F@ DO KJNND=G@ OJ <??DODJI<GGT K<NN OC@ K<M<H@O@MN JMDBDI<ODIB AMJH <MBPH@ION JM ADGO@MN K<NN@? OJ OC@ O<B 2C@ API>ODJI DN K<NN@? <MBPH@ION $args <I? $filtres \ $args >JIO<DIN OC@ <MBPH@ION M@LPDM@? =T OC@ calculer_balise_dynamique() API>ODJI DI <??DODJI OJ OC@ <MBPH@ION K<NN@? OJ OC@ O<B \ $filtres >JIO<DIN OC@ GDNO JA ADGO@MN |filter K<NN@? OJ OC@ O<B 3N@? DI KM@QDJPN Q@MNDJIN RC@M@ 1.(. PN@? OC@ ADGO@MN OJ K<NN <MBPH@ION <I @S<HKG@ RCD>C DN IJ GJIB@M Q<GD? RDOC 1.(. [(#LOGIN_PUBLIC|spip.php?article8)] IJR M@KG<>@? =T #LOGIN_PUBLIC{#URL_ARTICLE{8}}

Example 0@A@MMDIB <B<DI OJ OC@ #LOGIN_PUBLIC @S<HKG@ DO RJMFN RDOC @DOC@M JM <MBPH@ION OC@ ADMNO DN OC@ M@?DM@>ODJI 30* <AO@M =@DIB >JII@>O@? OC@ N@>JI? DN OC@ ?@A<PGO PN@M I<H@ AJM OC@ K@MNJI OJ =@ >JII@>O@? !JOC JA OC@N@ <M@ JKODJI<G

183


5@ ><I OC@M@AJM@ K<NN < M@?DM@>ODJI <MBPH@IO OJ OC@ O<B #LOGIN_PUBLIC{#SELF} JM #LOGIN_PUBLIC{#URL_ARTICLE{8}}

=PO DI OC@ <=N@I>@ JA <I <MBPH@IO R@ RJPG? GDF@ OC<O OC@ M@?DM@>ODJI =@ H<?@ OJ <I @IQDMJIH@IO url K<M<H@O@M DA OC@M@ DN JI@ -I>@ C<QDIB M@LP@NO@? OJ M@OMD@Q@ OCDN <MBPH@IO DO DN AJPI? DI $args[0] RDOC $args[1] NOJMDIB OC@ >JIO@ION JA OC@ ADMNO <MBPH@IO K<NN@? OJ OC@ O<B DO <??N DON@GA DIOJ OC@ $args <MM<T <AO@M OC@ GDNO JA <MBPH@ION <POJH<OD><GGT M@OMD@Q@? 2CDN @I?N PK RDOC function balise_LOGIN_PRIVE_stat($args, $filtres) { return array( isset($args[1]) ? $args[1] : $args[0], (isset($args[2]) ? $args[2] : '') ); }

(A $args[1] @SDNON DO DN K<NN@? JOC@MRDN@ $args[0] (I OC@ N<H@ H<II@M DA $args[2] @SDNON DO DN <GNJ K<NN@? JOC@Mff 2C@ _dyn() API>ODJI RDGG =@ K<NN@? OC@N@ <MBPH@ION function balise_LOGIN_PRIVE_dyn($url, $login) { ... }

The balise_NAME_dyn() function 2CDN API>ODJI DN PN@? OJ @S@>PO@ OC@ KMJ>@NN@N OJ =@ K@MAJMH@? RC@I < AJMH C<N =@@I NP=HDOO@? 2C@ API>ODJI H<T M@OPMI < >C<M<>O@M NOMDIB RCD>C RDGG =@ ?DNKG<T@? JI OC@ M@LP@NODIB K<B@ JM < K<M<H@O@M <MM<T RCD>C DI?D><O@N OC@ I<H@ JA OC@ O@HKG<O@ OJ M@OMD@Q@ <I? OC@ >JHKDG<ODJI >JIO@SO

The processes 2CDN <MOD>G@ RDGG IJO <??M@NN OC@N@ JK@M<ODJIN AJM M@<NJIN

184


# Extending SPIP \ OC@ JMDBDI<G <POCJM JA OCDN <MOD>G@ <I? OC@ OM<ING<OJM ?J@N IJO >JHKG@O@GT PI?@MNO<I? CJR DO RJMFN

\ DO DN IJO Q@MT PN@APG NDI>@ 1.(. DI>GP?@N < NDHKG@M H@>C<IDNH ><GG@? "42 AJMHN "C<MB@M 4YMDAD@M 2M<DO@M DI $IBGDNC *J<? 4@MDAT .MJ>@NN RCD>C <GNJ M@GD@N JI OCDN API>ODJI =PO DI < OM<INK<M@IO H<II@M

The display 5C<O@Q@M OC@ API>ODJI M@OPMIN DN OC@I ?DNKG<T@? JI OC@ K<B@ I <MM<T DI?D><O@N < O@HKG<O@ OJ =@ ><GG@? (O B@I@M<GGT GJJFN GDF@ OCDN return array("template_address", 3600, // cache duration array( // context 'id_article' => $id_article, ) );

Generic tags IJOC@M >G@Q@M 1.(. H@>C<IDNH DN OC@ KMJQDNDJIDIB JA O<BN OC<O HDBCO =@ O@MH@? <N B@I@MD> (I A<>O DO DN KJNND=G@ OJ PN@ < NDIBG@ O<B ?@>G<M<ODJI AJM < RCJG@ BMJPK JA O<BN KM@ADS@? RDOC <I D?@IOD><G I<H@ N NP>C < O<B I<H@? #PREFIX_NAME ><I PN@ < ADG@ ><GG@? balise/ prefix_.php <I? ?@G><M@ < API>ODJI balise_PREFIX__dist() RCD>C RDGG OC@I =@ PN@? DA OC@M@ DN IJ balise_PREFIX_NAME_dist($p) API>ODJI KM@N@IO 2C@ B@I@MD> API>ODJI RCD>C <>>@KON O<B <OOMD=PO@N DI OC@ $p Q<MD<=G@ ><I PN@ $p->name_field OJ J=O<DI OC@ I<H@ JA OC@ M@LP@NO@? O<B DI OCDN ><N@ .0$%(6;, +$ !T <I<GTNDIB OCDN I<H@ DO ><I OC@I @S@>PO@ OC@ <KKMJKMD<O@ <>ODJIN

Example 2CDN @S<HKG@ DA PN@? =T OC@ B@I@MD> O<BN #FORM_NAME RCD>C <M@ <GNJ ?TI<HD> AD@G?N DI OC@ ADG@ @>MDM@ =<GDN@ AJMHPG<DM@; KCK

185


function balise_FORM__dist($p) { preg_match(",^FORM_(.*)?$,", $p->name_field, $regs); $form = $regs[1]; return calculer_balise_dynamique($p,"FORM_$form",array()); }

Retrieving the object and id_object 2CDN <MOD>G@ RDGG NCJR CJR OJ M@OMD@Q@ OC@ OTK@ J=E@>O <I? D?@IODAD@? JA < GJJK

NJ OC<O OC@T ><I =@ PN@? DI OC@ ><G>PG<ODJIN JA < O<B

Static tags 5DOC OC@ K<M<H@O@MN AJM OC@ O<B K DO DN Q@MT NDHKG@ OJ M@OMD@Q@ =JOC object <I? id_object function balise_DEMO($p){ // take the name of the object's primary key to calculate its value $_id_objet = $p->boucles[$p->id_boucle]->primary; $id_objet = champ_sql($_id_objet, $p); $objet = $p->boucles[$p->id_boucle]->id_table; $p->code = "calculer_balise_DEMO('$objet', $id_objet)"; return $p; } function calculer_balise_DEMO($objet, $id_objet){ $objet = objet_type($objet); return "Objet : $objet, id_objet : $id_objet"; }

,JO@ OC<O OC@M@ <M@ ORJ API>ODJIN C@M@ 2C@ ADMNO PN@N OC@ ?@N>MDKODJI JA OC@ O<B OJ M@OMD@Q@ OC@ I<H@ JA DON K<M@IO GJJK <I? OC@ I<H@ JA OC@ KMDH<MT F@T

<I? M@LP@NON OJ M@OMD@Q@ OC@ Q<GP@ JA OC@ KMDH<MT F@T PNDIB OC@ champ_sql() API>ODJI ,JO@ RC<O DN M@OMD@Q@? DI OC@ $id_object Q<MD<=G@ DN < >J?@ RCD>C HPNO =@ @Q<GP<O@? PNDIB .'. RCD>C DN IJ GJI@M < IPH@MD> Q<GP@ -I>@ OC@N@ K<M<H@O@MN C<Q@ =@@I M@OMD@Q@? R@ OC@I <?? < .'. >J?@ OJ =@ @Q<GP<O@? DI OC@ >J?@ B@I@M<O@? =T OC@ O@HKG<O@ >JHKDG<ODJI OCDN >J?@ RDGG =@ ><>C@? 2CDN DN RC<O DN <??@? DIOJ $p->code 2C<O >J?@ RDGG =@ I@SO =@ @Q<GP<O@? ?PMDIB OC@ >M@<ODJI JA OC@ ><GG@? K<B@ ><>C@

186


# Extending SPIP 2C@ calculer_balise_DEMO() API>ODJI DN OC@I K<NN@? OC@ ORJ ?@NDM@? <MBPH@ION <I? M@OPMIN < O@SO RCD>C ?DNKG<TN OC@H JI OC@ K<B@ <BOUCLE_a(ARTICLES){0,2}> #DEMO<br /> </BOUCLE_a> <hr /> <BOUCLE_r(RUBRIQUES){0,2}> #DEMO<br /> </BOUCLE_r>

2CDN O@HKG<O@ OC@I @I<=G@N OC@ M@NPGO OJ =@ N@@I OC@ #DEMO O<B DN K<NN@? OC@ Q<MDJPN ?<O< ?@K@I?DIB JI OC@ >JIO@SO DI RCD>C DO DN AJPI? Object Object ---Object Object

: article, id_object : 128 : article, id_object : 7 : rubrique, id_object : 1 : rubrique, id_object : 2

Dynamic tags %JM < ?TI<HD> O<B DON JK@M<ODJI @Q@I KM@Q@ION OC@ NDHKG@ M@OMD@Q<G JA OC@ OTK@ <I? D?@IODAD@M JA OC@ GJJK DI RCD>C DO C<N =@@I RMDOO@I $Q@I NJ RC@I DO DN I@@?@? AJM @S<HKG@ DI >M@<ODJI JA "42 AJMHN RCD>C HJ?DAT OC@DM KMJ>@NN@N ?@K@I?DIB JI OC@ OTK@ JA GJJK DO DN I@>@NN<MT OJ K<NN OC@ J=E@>O OTK@ <I? >PMM@IO GJJK D?@IODAD@M OJ OC@ _dyn() API>ODJI <I? >JIN@LP@IOGT OJ "42fN GJ<? Q@MDAT <I? KMJ>@NN API>ODJIN 2C@ ><GG OJcalculer_balise_dynamique() H<F@N DO KJNND=G@ OJ M@OMD@Q@ OC@ >JHKDG<ODJI >JIO@SO @G@H@ION (A R@ <NF OJ M@OMD@Q@ fD?;<MOD>G@f R@ RDGG >@MO<DIGT B@O JI@ AMJH RDOCDI <I ARTICLES GJJK =PO IJO DA R@ <M@ DI < RUBRIQUES GJJK 2J =@ HJM@ NK@>DAD> RC@I R@ M@LP@NO <I fD?;<MOD>G@f Q<GP@

1.(. <>ON <N DA DO DN M@OMD@QDIB OC@ M@NPGO AMJH < #ID_ARTICLE O<B NJ DO OC@I GJJFN AJM OC@ Q<GP@ DI OC@ >GJN@NO GJJK JOC@MRDN@ DO GJJFN DI OC@ >JIO@SO <I? DO <GNJ ?@K@I?N JI OC@ O<BN RCD>C C<Q@ =@@I NK@>DAD><GGT ?@>G<M@?

187


5@ >JPG? <NF OJ ><G>PG<O@ id_object LPDO@ @<NDGT =PO object RDGG M@LPDM@ K<NNDIB < O<B M@OPMIDIB OC@ object Q<GP@ 2CDN O<B ?J@N IJO @SDNO =T ?@A<PGO RDOCDI 1.(. NJ DO HPNO =@ >M@<O@? RDOC < DEMODYN_OBJET RCD>C BDQ@N PN function balise_DEMODYN($p){ // primary key $_id_objet = $p->boucles[$p->id_boucle]->primary; return calculer_balise_dynamique( $p, 'DEMODYN', array('DEMODYN_OBJET', $_id_objet) ); } function balise_DEMODYN_OBJET($p) { $objet = $p->boucles[$p->id_boucle]->id_table; $p->code = $objet ? objet_type($objet) : "balise_hors_boucle"; return $p; } function balise_DEMODYN_dyn($objet, $id_objet){ return "Objet : $objet, id_objet : $id_objet"; }

188


# Extending SPIP

Creating pages in the private zone 2C@ K<B@N DI OC@ KMDQ<O@ UJI@ ><I =@ NPKKG@H@IO@? =T >M@<ODIB I@R ADG@N OJ <GO@M OC@H 2C@M@ <M@ ORJ ?DAA@M@IO R<TN OJ DINO<GG NP>C K<B@N \ (I OC@ exec ?DM@>OJMT RC@M@ OC@T ><I =@ RMDOO@I PNDIB .'. \ (I OC@ prive/exec ?DM@>OJMT RC@M@ OC@T ><I =@ RMDOO@I PNDIB 1.(. O@HKG<O@ >J?@

The contents of a (template) exec file ><GG AMJH RDOCDI OC@ KMDQ<O@ UJI@ JA < ?exec=name K<B@ <POJH<OD><GGT GJ<?N < O@HKG<O@ GJ><O@? DI prive/exec/name.html (I HJNO ><N@N DO DN M@>JHH@I?@? OJ PN@ OCDN H@OCJ? M<OC@M OC<I < .'. ADG@ 2C@ J=E@>ODQ@ =@DIB OC<O 1.(.fN KMDQ<O@ UJI@ DON@GA <GNJ =@ RMDOO@I <N < O@HKG<O@

<I? OC@M@AJM@ =@ @<ND@M OJ >PNOJHDN@ 2CDN OC@I H<F@N DO KJNND=G@ OJ PN@ GJJKN

DI>GP?@N O<BN <I? <POCJMDN<ODJIN EPNO GDF@ <IT JOC@M M@BPG<M 1.(. O@HKG<O@ Example of an empty private page template: <!--#hierarchie--> <ul id="chemin"> <li>A list of pages constituting a breadcrumb path</li> </ul> <!--/#hierarchie--> <h1>A private page directly coded in a template file</h1> <p>Some page content</p> <!--#navigation--> <div class='cadre-info'> Some information in a navigation column. </div> <!--/#navigation--> <!--#extra--> Some extra content in the extra column. <!--/#extra-->

189


2C@ <!--#hierarchie--> <!--#navigation--> <I? <!--#extra--> AM<H@ O<BN N@MQ@ OJ N@K<M<O@ OC@ K<B@fN H<EJM N@>ODJIN 1.(.fN KMDQ<O@ UJI@ RDGG <POJH<OD><GGT M@GJ><O@ @<>C JA OC@N@ N@>ODJIN DIOJ OC@ <KKMJKMD<O@ '2+* O<BN (A OC@ O@HKG<O@ JIGT M@OPMIN <I @HKOT M@NPGO OC@I 1.(. RDGG <POJH<OD><GGT B@I@M<O@ <I <POCJMDN<ODJI @MMJM %MJH < O@>CID><G KJDIO JA QD@R OC@N@ O@HKG<O@N <M@ KMJ>@NN@? =T OC@ @>MDM@ @S@> AJI? KCK ADG@ 2C@ AJGGJRDIB KDK@GDI@N <M@ <POJH<OD><GGT <??@? <AAD>C@;B<P>C@ K <AAD>C@;?MJDO@ K @O <AAD>C@;HDGD@P K =T K<NNDIB OC@ exec K<M<H@O@M I<H@ <N < K<M<H@O@M echo pipeline('affiche_milieu', array('args' => array('exec' => $exec), 'data' => ''));

(I <??DODJI OC@ KMDQ<O@ K<B@ ODOG@ DN ><G>PG<O@? =T @SOM<>ODIB OC@ >JIO@ION JA OC@ ADMNO '2+*<h1> JM <hn> O<B OC<O DN AJPI?

Example 2C@ %JMHD?<=G@ KGPBDI PN@N 1.(. O@HKG<O@N OJ >JINOMP>O DON K<B@N AJM OC@ KMDQ<O@ UJI@ 2J ?DNKG<T M@NKJIN@N DI < AJMH DO PN@N OC@ AJGGJRDIB O@HKG<O@ >J?@ <BOUCLE_formulaire(FORMULAIRES){id_formulaire}> <BOUCLE_autoriser(CONDITION){si #AUTORISER{voir, formulaires_reponse}}>

<!--#hierarchie--> <ul id="chemin"> <li> <a href="#URL_ECRIRE{formulaires_tous}" class="racine"><:formidable:formulaires_tous:></a> </li> <li> <span class="bloc"> <em>></em> <a class="on" href="[(#URL_ECRIRE{formulaires_voir}

190


# Extending SPIP |parametre_url{id_formulaire, #ID_FORMULAIRE})]">#TITRE</a> </span> </li> </ul> <!--/#hierarchie--> <div class="fiche_objet"> <a href="[(#URL_ECRIRE{formulaires_voir} |parametre_url{id_formulaire, #ID_FORMULAIRE})]" class="icone36" style="float:left;"> <img width="24" height="24" src="#CHEMIN{images/ formulaire-24.png}" /> <span><:retour:></span> </a> <:formidable:voir_reponses:> <h1>#TITRE</h1> <div class="nettoyeur"></div> </div> <INCLURE{fond=prive/liste/ formulaires_reponses}{id_formulaire} {titre=<:formidable:reponses_liste_publie:>}{ajax} />

<!--#navigation--> <div class="cadre infos cadre-info"> <div class="numero"> <:formidable:voir_numero:> <p>#ID_FORMULAIRE</p> </div> <div class="hover"> <a href="#SELF" class="cellule-h"> [<img src="(#CHEMIN{images/formulairereponses-24.png})" style="vertical-align:middle;" alt="" />] <span style="verticalalign:middle;"><:formidable:reponses_liste:></span> </a> </div> <div> <a href="[(#URL_ECRIRE{formulaires_analyse}

191


|parametre_url{id_formulaire, #ID_FORMULAIRE})]" class="cellule-h"> [<img src="(#CHEMIN{images/formulaireanalyse-24.png})" style="vertical-align:middle;" alt="" />] <span style="verticalalign:middle;"><:formidable:reponses_analyse:></span> </a> </div> </div> <!--/#navigation--> </BOUCLE_autoriser> </BOUCLE_formulaire>

Notes: \ GG JA OCDN DN DI>GP?@? RDOCDI < GJJK OC<O >C@>FN AJM OC@ @SDNO@I>@ JA OC@ AJMH DA OC@ AJMH ?J@N IJO @SDNO OC@ O@HKG<O@ OC@I M@OPMIN IJOCDIB <I? KMJQD?@N <I @MMJM H@NN<B@ DINO@<? \ (I OC@ N<H@ H<II@M DO DN NPMMJPI?@? RDOC <I 32-0(1$0 K O@NO OJ >C@>F OC<O OC@ >PMM@IO K@MNJI C<N OC@ MDBCON OJ N@@ OC@ M@NKJIN@N (I OCDN ><N@ R@ PN@ OC@ CONDITION GJJK AMJH OC@ !JIPS KGPBDI DI JM?@M OJ =@ <=G@ OJ >JIODIP@ OJ M@<? 1.(. GJJKN OC<O GD@ DIND?@ OC@ >JI?DODJI \ 2C@ <!--#hierarchie--> >J?@ N@>ODJI ?DNKG<TN < NPDO<=G@ K<OC AMJH <HJIBNO OC@ KMDQ<O@ K<B@N JA OC@ KGPBDI

The contents of a (PHP) exec file (I OC@ <=N@I>@ JA < prive/exec/name.html 1.(. O@HKG<O@ ADG@ < ><GG AMJH OC@ KMDQ<O@ UJI@ OJ < ?exec=name K<B@ GJ<?N < exec_name_dist() API>ODJI DI < exec/name.php >J?@ ADG@ 1P>C API>ODJIN <M@ HJNOGT =MJF@I ?JRI <N AJGGJRN OC@ ><GG OJ OC@ NO<MO JA OC@ K<B@ OC@ ?@>G<M<ODJI JA < G@AO >JGPHI < MDBCO >JGPHI <I? < K<B@ >@IOM@ 2C@M@ <M@ NJH@ KDK@GDI@N OC<O @SDNO NJ OC<O KGPBDIN RDGG =@ <=G@ OJ <?? ?<O< OJ OC@N@ K<B@ =GJ>FN Example of an empty "name" page

192


# Extending SPIP <?php if (!defined("_ECRIRE_INC_VERSION")) return; include_spip('inc/presentation'); function exec_nom_dist(){ // if not authorised: error message if (!autoriser('voir', 'nom')) { include_spip('inc/minipres'); echo minipres(); exit; } // initialisation pipeline pipeline('exec_init', array('args'=>array('exec'=>'nom'),'data'=>'')); // headers $commencer_page = charger_fonction('commencer_page', 'inc'); // titre, partie, sous_partie (pour le menu) echo $commencer_page(_T('plugin:titre_nom'), "editer", "editer"); // title echo "<br /><br /><br />\n"; // outch ! aie aie aie ! au secours ! echo gros_titre(_T('plugin:titre_nom'),'', false); // left column echo debut_gauche('', true); echo pipeline('affiche_gauche', array('args'=>array('exec'=>'nom'),'data'=>'')); // right column echo creer_colonne_droite('', true); echo pipeline('affiche_droite', array('args'=>array('exec'=>'nom'),'data'=>'')); // centre echo debut_droite('', true); // contents // ... echo "display whatever you want to here!"; // ... // end of contents echo pipeline('affiche_milieu', array('args'=>array('exec'=>'nom'),'data'=>'')); echo fin_gauche(), fin_page();

193


} ?>

The information panel 2J <?? < K<B@ ?@N>MDKODJI JM < ?@N>MDKODJI JA OC@ J=E@>O D?;J=E@>O >PMM@IOGT =@DIB NCJRI < OTK@ JA DIN@MO K<I@G C<N =@@I @IQDN<B@? =JDO@;DIAJN DIAJ;=JS (O DN JAO@I PN@? DI < R<T OJ <?? < API>ODJI DIOJ OC@ G@AO >JGPHI // left column echo debut_gauche('', true); echo cadre_nom_infos(); echo pipeline('affiche_gauche', array('args'=>array('exec'=>'nom'),'data'=>''));

2CDN API>ODJI ><GGN OC@ KDK@GDI@ <I? M@OPMIN DON >JIO@ION DI < K<I@G // display the page information function cadre_champs_extras_infos() { $boite = pipeline ('boite_infos', array('data' => '', 'args' => array( 'type'=>'nom', // possibly the object's ID and the SQL line // $row = sql_fetsel('*', 'spip_nom', 'id_nom='.sql_quote($id_nom)); 'id' => $id_nom, 'row' => $row, ) )); if ($boite) return debut_boite_info(true) . $boite . fin_boite_info(true); }

2C@ KDK@GDI@ <POJH<OD><GGT GJ<?N < O@HKG<O@ RDOC OC@ >JIO@SO NPKKGD@? =T OC@ args <MM<T JA OC@ N<H@ I<H@ OJ OC@ OTK@ K<M<H@O@M DI OC@ KMDQ@ DIAJN ?DM@>OJMT D @ prive/infos/nom.html (O HPNO OC@I =@ >M@<O@? RDOC OC@ ?@NDM@? >JIO@IO

194


Functionalities 2CDN >C<KO@M ?@Q@GJKN NJH@ JA 1.(.fN API>ODJI<GDOD@N DI APMOC@M ?@O<DG <POCJMDN<ODJIN <>ODJIN <POC@IOD><ODJI OC@ ><>C@N OC@ >JHKDG@M

195


Authorisations 2RJ @NN@IOD<G @G@H@ION H<F@ DO KJNND=G@ OJ H<I<B@ <>>@NN OJ OC@ <>ODJIN <I? K<B@N ?DNKG<T@? AMJH 1.(. OC@ <POCJMDN<ODJIN RDOC OC@ fonction autoriser() API>ODJI <I? <>ODJIN N@>PM@? =T <POCJM RDOC OC@ fonction securiser_action() API>ODJI

The "autoriser" library 1.(. C<N <I @SO@I?<=G@ autoriser() API>ODJI @I<=GDIB OC@ Q@MDAD><ODJI JA <POCJMDN<ODJIN 2CDN API>ODJI <>>@KON <MBPH@ION -IGT OC@ ADMNO DN I@>@NN<MT

<I? OC@ JOC@MN <M@ <GG JKODJI<G autoriser($faire, $type, $id, $qui, $opt);

2C@ API>ODJI M@OPMIN true JM false ?@K@I?DIB JI OC@ <POCJMDN<ODJI M@LP@NO@? <I? OC@ PN@M @?DOJM RCJDN >JII@>O@? JM OC@ M@LP@NO@? PN@M K<NN@? <N <I @SKGD>DO K<M<H@O@M '@M@ <M@ RC<O O@C ?DAA@M@IO <MBPH@ION <M@ PN@? AJM \ $faire >JMM@NKJI?N OJ OC@ <>ODJI M@LP@NO@? %JM @S<HKG@ HJ?DAD@M HJ?DAT JM QJDM QD@R

\ $type B@I@M<GGT PN@? OJ ?@ADI@ OC@ J=E@>O OTK@ AJM @S<HKG@ <PO@PM <POCJM JM <MOD>G@

\ $id PN@? OJ KMJQD?@ OC@ D?@IODAD@M JA OC@ M@LP@NO@? J=E@>O AJM @S<HKG@ <N <I <MOD>G@ IPH=@M

\ $qui DN PN@? OJ @ILPDM@ JM <NNDBI <POCJMDN<ODJI AJM < NK@>DAD> <POCJM 5C@I IJO KMJQD?@? DO <NNPH@N OC@ >PMM@IOGT >JII@>O@? <POCJM 2C@ <MBPH@IO DN OTKD><GGT <I id_auteur IPH=@M

\ $opt DN <I <MM<T JA JKODJIN PNP<GGT @HKOT 5C@I <I <POCJMDN<ODJI M@LPDM@N <??DODJI<G <MBPH@ION OJ =@ K<NN@? OC@T <M@ @IO@M@? DI OCDN <MM<T

Example if (autoriser('modifier','article',$id_article)) { // ... actions }

196


# Functionalities

The #AUTORISER tag 2C@ #AUTORISER O<B DN PN@? OJ M@LP@NO <POCJMDN<ODJIN RDOCDI < O@HKG<O@ 2C@ @SDNO@I>@ JA OCDN O<B <N RDOC OC@ @SDNO@I>@ JA OC@ #SESSION O<B >M@<O@N < O@HKG<O@ ><>C@ AJM @<>C D?@IODAD@? QDNDOJM <I? < NDIBG@ ><>C@ AJM <GG PID?@IODAD@? QDNDOJMN 2CDN O<B <>>@KON OC@ N<H@ <MBPH@ION <N OC@ autoriser() API>ODJI

Example [(#AUTORISER{modifier,article,#ID_ARTICLE}) ... actions ]

Processes in the autoriser() function 1.(.fN ?@A<PGO <POCJMDN<ODJIN <M@ H<?@ PNDIB OC@ @>MDM@ DI> <POJMDN@M KCK ADG@ 5C@I 1.(. DN M@LP@NO@? AJM <I autoriser($faire,

$type) OTK@

<POCJMDN<ODJI DO BJ@N OJ GJJF AJM < API>ODJI OJ C<I?G@ OCDN M@LP@NO@? <POCJMDN<ODJI (O GJJFN AJM OC@ I<H@? API>ODJI DI OC@ AJGGJRDIB JM?@M \ autoriser_$type_$faire

\ autoriser_$type

\ autoriser_$faire

\ autoriser_defaut

\ <I? OC@I OC@ N<H@ GDNO RDOC OC@ _dist NPAADS <OO<>C@?

Example autoriser('modifier','article',$id_article);

5DGG M@OPMI OC@ ADMNO API>ODJI AJPI? <I? @S@>PO@ DO 2CDN =@DIB function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt){

197


... }

2C@ API>ODJI DN K<NN@? OC@ N<H@ K<M<H@O@MN <N OC@ autoriser() API>ODJI (IND?@ DO $qui DN K<NN@? OC@ >PMM@IO <POCJM DA <I <POCJM R<N IJO K<NN@? <N <I <MBPH@IO DI OC@ ><GG OJ autoriser()

Creating or overloading the authorisations 2J >M@<O@ <I <POCJMDN<ODJI TJP JIGT I@@? OJ >M@<O@ OC@ NPKKJMODIB API>ODJIN function autoriser_documentation_troller_dist($faire, $type, $id, $qui, $opt) { return false; // no trolls permitted! and no exceptions! }

#@>G<MDIB OCDN API>ODJI H<F@N DO KJNND=G@ OJ autoriser('troller','documentation') API>ODJI

PN@ JM

OC@ OC@

#AUTORISER{troller, documentation} O<B

New functions, but not everywhere! 2C@ autoriser() API>ODJI RC@I ADMNO ><GG@? GJ<?N < KDK@GDI@ RDOC OC@ N<H@ I<H@ 2CDN ><GG OJ OC@ <POJMDN@M KDK@GDI@ K DN PN@? OJ GJ<? OC@ <POCJMDN<ODJI ADG@N AJM < O@HKG<O@ ?DM@>OJMT JM < KGPBDI

Example In a template: (I OC@ config/mes_options.php ADG@ R@ <?? OC@ ><GG OJ < API>ODJI AJM JPM <POCJMDN<ODJIN <?php $GLOBALS['spip_pipeline']['autoriser'] .= "|mes_autorisations"; function mes_autorisations(){ include_spip('inc/mes_autorisations'); } ?>

198


# Functionalities 1J OC@I RC@I OC@ autoriser KDK@GDI@ DN ><GG@? DO GJ<?N OC@ inc/ mes_autorisations.php ADG@ 5@ ><I OC@I >M@<O@ OCDN ?DM@>OJMT <I? ADG@ RCD>C >JIO<DIN OC@ DIO@I?@? <POCJMDN<ODJI API>ODJIN DI DON squelettes/ ?DM@>OJMT In a plugin: %JM < KGPBDI DOfN <GHJNO @S<>OGT OC@ N<H@ TJP C<Q@ OJ ?@>G<M@ OC@ PN@ JA OC@ KDK@GDI@ DIND?@ TJPM plugin.xml <pipeline> <nom>autoriser</nom> <inclure>inc/prefixePlugin_autoriser.php</inclure> </pipeline>

I? >M@<O@ OC@ ADG@ DI LP@NODJI <I? <=NJGPO@GT H<F@ NPM@ OJ <?? DI OC@ prefixePlugin_autoriser() API>ODJI DIOJ OC@ ADG@ OC<O OC@ KDK@GDI@ ><GGN <?php if (!defined("_ECRIRE_INC_VERSION")) return; // function for the pipeline, nothing to do function prefixePlugin_autoriser(){} // declarations of authorisations function autoriser_documentation_troller_dist($faire, $type, $id, $qui, $opt) { return false; // no trolls permitted! and no exceptions! } ?>

Secured actions 1@>PM@? <>ODJIN KMJQD?@ < H@OCJ? JA @INPMDIB OC<O OC@ M@LP@NO@? <>ODJI DI?@@? JMDBDI<O@N AMJH OC@ <POCJM RCJ >GD>F@? JM Q<GD?<O@? < AJMH 2C@ autoriser() API>ODJI ?J@N IJO KMJQD?@ OCDN API>ODJI<GDOT %JM @S<HKG@

DO ><I Q@MDAT RC<O OTK@ JA <POCJM <?HDIDNOM<OJM @?DOJM C<N OC@ MDBCO OJ K@MAJMH RCD>C <>ODJIN !PO DO ><I IJO Q@MDAT RCD>C <>ODJI C<N =@@I @AA@>ODQ@GT M@LP@NO@? =T RCD>C DI?DQD?P<G

199


2CDN DN RC@M@ N@>PM@? <>ODJIN <M@ <KKGD@? (I A<>O OC@T H<F@ DN KJNND=G@ OJ >M@<O@ 30*N AJM GDIFN JM AJMHN RCD>C K<NN < K<MOD>PG<M F@T 2CDN F@T DN B@I@M<O@? =<N@? JI N@Q@M<G ?<O< < M<I?JH IPH=@M B@I@M<O@? JI @<>C >JII@>ODJI =T <I <POCJM <I? NOJM@? <GJIBND?@ OC@ <POCJMfN K@MNJI<G ?<O< OC@ <POCJM D?@IODAD@M OC@ I<H@ JA OC@ <>ODJI <I? <MBPH@ION JA OC<O <>ODJI DA OC@M@ <M@ <IT 3NDIB OCDN K<NN@? F@T RC@I OC@ <POCJM >GD>FN JI OC@ GDIF JM OC@ AJMH OC@ <>ODJI =@DIB ><GG@? ><I >JIADMH OC<O DO DN <>OP<GGT OC@ >PMM@IOGT >JII@>O@? <POCJM RCJ C<N M@LP@NO@? OC@ <>ODJI OJ =@ K@MAJMH@? <I? IJO NJH@ H<GD>DJPN DI?DQD?P<G JM MJ=JO @S@>PODIB <I '2+* LP@MT RDOC NOJG@I >M@?@IOD<GN

How secured actions work 3NDIB N@>PM@? <>ODJIN DN < NO@K KMJ>@NN 7JP HPNO ADMNO B@I@M<O@ < GDIF RDOC OC@ N@>PMDOT F@T <I? OC@I G<O@M Q@MDAT OC<O F@T RC@I OC@ PN@M >GD>FN JI OC@ <>ODJI OC<O RDGG @S@>PO@ < ADG@ API>ODJI DI OC@ action/ ?DM@>OJMT

The securiser_action() function 2CDN

securiser_action

API>ODJI

NOJM@?

DI

OC@

@>MDM@ DI>

N@>PMDN@M;<>ODJI KCK ADG@ >M@<O@N JM Q@MDAD@N <I <>ODJI #PMDIB >M@<ODJI

?@K@I?DIB JI OC@ $mode <MBPH@IO DO RDGG >M@<O@ < 30* < AJMH JM NDHKGT M@OPMI <I <MM<T RDOC OC@ M@LP@NO@? K<M<H@O@MN <I? OC@ B@I@M<O@? F@T #PMDIB Q@MDAD><ODJI DO >JHK<M@N OC@ @G@H@ION NP=HDOO@? RDOC < &$2 30* JM .-12 AJMH <I? FDGGN OC@ N>MDKO RDOC <I @MMJM H@NN<B@ <I? exits DA OC@ F@T ?J@N IJO H<O>C OC@ >PMM@IO <POCJM

Generating a key 2J B@I@M<O@ < F@T TJP I@@? OJ ><GG OC@ API>ODJI RDOC OC@ MDBCO K<M<H@O@MN $securiser_action = charger_fonction('securiser_action','inc'); $securiser_action($action, $arg, $redirect, $mode);

2C@N@ AJPM K<M<H@O@MN <M@ OC@ H<DI JI@N PN@? \ $action DN OC@ I<H@ JA OC@ <>ODJI ADG@ <I? OC@ >JMM@NKJI?DIB <>ODJI action/name.php <I? OC@ <NNJ>D<O@? API>ODJI action_name_dist()

200


# Functionalities \ $arg DN < K<NN@? <MBPH@IO AJM @S<HKG@ supprimer/article/3 RCD>C RDGG =@ PN@? <HJIB JOC@M OCDIBN OJ B@I@M<O@ OC@ N@>PMDOT F@T \ $redirect DN < 30* AJM M@?DM@>ODJI <AO@M OC@ <>ODJI C<N =@@I K@MAJMH@? \ $mode DI?D><O@N RC<O NCJPG? =@ M@OPMI@? g false < 30* g -1 <I <MM<T JA K<M<H@O@MN g < >JIO@IO O@SO < AJMH OJ =@ NP=HDOO@? OC@ >JIO@IO DN OC@I <??@? DIOJ OC@ AJMH

Inside an action, verifying and retrieving the argument 5DOCDI <I <>ODJI API>ODJI action_name_dist() R@ Q@MDAT OC@ N@>PMDOT F@T =T ><GGDIB OC@ API>ODJI RDOCJPO <I <MBPH@IO (O M@OPMIN OC@ <MBPH@IO JOC@MRDN@ ?DNKG<TN <I @MMJM <I? FDGGN OC@ N>MDKO $securiser_action = charger_fonction('securiser_action','inc'); $arg = $securiser_action(); // from here on, we know that the author is the right person!

Secured actions’ predefined functions 1@>PM@? <>ODJIN <M@ M<M@GT ?DM@>OGT B@I@M<O@? =T ><GGDIB OC@ securiser_action() API>ODJI =PO HJM@ AM@LP@IOGT =T ><GGDIB < API>ODJI RCD>C DON@GA OC@I ><GGN OC@ N@>PMDOT API>ODJI 2C@ @>MDM@ DI> <>ODJIN KCK ADG@ >JIO<DIN < G<MB@ IPH=@M JA OC@N@ API>ODJIN

generer_action_auteur() (I K<MOD>PG<M OC@ generer_action_auteur() API>ODJI ?DM@>OGT ><GGN OC@ securiser_action API>ODJI K<NNDIB < N@>PM@? 30* =T ?@A<PGO

redirige_action_auteur() 2CDN API>ODJI O<F@N ORJ K<M<H@O@MN DINO@<? JA OC@ M? M@?DM@>ODJI <MBPH@IO OC@ I<H@ JA <I @S@> ADG@ <I? OC@ <MBPH@ION OJ =@ K<NN@? 1.(. OC@I >M@<O@N OC@ M@?DM@>ODJI 30* <POJH<OD><GGT

redirige_action_post() 1<H@ <N OC@ KM@QDJPN API>ODJI @S>@KO OC<O DO B@I@M<O@N < .-12 AJMH =T ?@A<PGO

201


Example &@I@M<O@ < GDIF OJ >C<IB@ OC@ ?DNKG<T KM@A@M@I>@N DI OC@ KMDQ<O@ <M@< $url = generer_action_auteur('preferer',"display:1", $self);

0PI <I <>ODJI RC@I @?DODIB < I@RN DO@H OC@I M@?DM@>O OJ OC@ I@RN DO@H QD@R $href = redirige_action_auteur('editer_breve',$id_breve,'breves_voir', "id_breve=$id_breve");

.JNO < AJMH OC@I M@?DM@>O OJ OC@ <?HDI;KGPBDI K<B@ $corps >JIO<DIN OC@ >JIO@ION JA OC@ AJMH OJ <>ODQ<O@ < KGPBDI echo redirige_action_post('activer_plugins','activer', 'admin_plugin','', $corps);

Action URLs in a template 2C@ #URL_ACTION_AUTEUR O<B DN PN@? OJ B@I@M<O@ N@>PM@? <>ODJI 30*N AMJH DIND?@ < O@HKG<O@ ADG@ #URL_ACTION_AUTEUR{action,argument,redirection}

Example #@G@ODIB OC@ AJMPH >JHH@IO M@LP@NO@? DA OC@ <POCJM <>OP<GGT C<N OC@ autoriser('configurer') MDBCON DN >@MO<DIGT Q<BP@ =PO DO DN <KKGD@? DI OC@ KMDQ<O@ <M@< DI @>MDM@ @S@> AJMPH;<?HDI KCK: [(#AUTORISER{configurer}) <a href="#URL_ACTION_AUTEUR{instituer_forum,#ID_FORUMoff,#URL_ARTICLE}"><:supprimer:></a> ]

202


# Functionalities

Actions and processes 2C@ action/ ?DM@>OJMT DN DIO@I?@? AJM C<I?GDIB OC@ <>ODJIN <AAA@>ODIB OC@ >JIO@ION JA OC@ ?<O<=<N@ 2C@N@ <>ODJIN <M@ OC@M@AJM@ HJNOGT N@>PM@?

The contents of an action file I <>ODJI ADG@ KMJQD?@N <O G@<NO JI@ API>ODJI H<O>CDIB DON JRI ADG@I<H@ ADG@ ><GG@? action/laugh.php NCJPG? OC@M@AJM@ ?@>G<M@ < API>ODJI ><GG@? action_laugh_dist() <?php if (!defined("_ECRIRE_INC_VERSION")) return; function action_laugh_dist(){ } ?>

Operation of the function (I B@I@M<G OC@ H<DI API>ODJI DN ?DQD?@? DIOJ N@>ODJIN Q@MDAD><ODJI JA <POCJMDN<ODJIN OC@I @S@>PODJI JA OC@ M@LP@NO@? KMJ>@NN

The verifications The right author +JNO 1.(. <>ODJIN JIGT Q@MDAT OC<O OC@ >PMM@IO <POCJM DN DI?@@? OC@ N<H@ <N OC@ JI@ RCJ >GD>F@? AJM OC@ <>ODJI 2CDN DN ?JI@ RDOC $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action();

2C@ N@>PMDOT API>ODJI FDGGN OC@ N>MDKO DA OC@ >PMM@IO <POCJM DN IJO OC@ JI@ M@LP@NODIB OC@ <>ODJI JOC@MRDN@ DO RDGG M@OPMI OC@ M@LP@NO@? <MBPH@IO DI OCDN ><N@ OCMJPBC $arg

The right argument 2C@I B@I@M<GGT NK@<FDIB OC@ $arg Q<MD<=G@ M@>@DQ@? DN Q@MDAD@? OJ N@@ DA DO DN >JIAJMH<IO RDOC RC<O R<N @SK@>O@? (O JAO@I O<F@N OC@ AJMH D?;J=E@>O

NJH@ODH@N J=E@>O D?;J=E@>O JM HJM@ >JHKG@S JI@N GDF@ ?<O@ @G@H@ION

203


if (!preg_match(",^\W*(\d+)\W(\w*)$,", $arg, $r)) { spip_log("action_dater_dist $arg pas compris"); return; }

And authorisation 1JH@ <>ODJIN <GNJ Q@MDAT OC<O OC@ <POCJM DN <>OP<GGT <KKMJQ@? OJ @S@>PO@ OC<O <>ODJI =PO DI B@I@M<G OCDN <POCJMDN<ODJI C<N <GM@<?T =@@I >JIADMH@? =@AJM@ OC@ GDIF OC<O ADM@N OC@ <>ODJI RDGG IJO IJMH<GGT =@ QDND=G@ DA OC@ <POCJM ?J@N IJO C<Q@ OC@ <KKMJKMD<O@ MDBCON %JM @S<HKG@ >C@>FDIB OJ N@@ DA OC@ >PMM@IO <POCJM C<N OC@ MDBCO OJ HJ?@M<O@ OC@ AJMPH AJM OC@ BDQ@I <MOD>G@ if (!autoriser('modererforum', 'article', $id_article)) return; // which could also be written with a debug-type message: if (!autoriser('modererforum', 'article', $id_article)) { include_spip('inc/minipres'); minipres('Moderation',"Vous n'avez pas l'autorisation de régler la modération du forum de cet article"); exit; }

The processes 5C@I <GG OC@ Q@MDAD><ODJIN C<Q@ =@@I H<?@ OC@ KMJ>@NN@N <M@ OC@I @S@>PO@? 4@MT JAO@I OC@N@ KMJ>@NN@N ><GG API>ODJIN OC<O @SDNO DI OC@ N<H@ ADG@ JM API>ODJIN DI < GD=M<MT DI OC@ inc/ ?DM@>OJMT 1JH@ODH@N OC@ <>ODJI RDGG =@ OJ NDHKGT @S@>PO@ OC@ ADG@fN JRI H<DI API>ODJI

Example of assigning moderation rights to an article // Modifier le reglage des forums publics de l'article x // Modify the moderation rights for the public form on article x function action_regler_moderation_dist() { include_spip('inc/autoriser'); $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); if (!preg_match(",^\W*(\d+)$,", $arg, $r)) {

204


# Functionalities spip_log("action_regler_moderation_dist $arg pas compris"); return; } $id_article = $r[1]; if (!autoriser('modererforum', 'article', $id_article)) return; // traitements - processes $statut = _request('change_accepter_forum'); sql_updateq("spip_articles", array("accepter_forum" => $statut), "id_article=". $id_article); if ($statut == 'abo') { ecrire_meta('accepter_visiteurs', 'oui'); } include_spip('inc/invalideur'); suivre_invalideur("id='id_forum/a$id_article'"); }

2C@ KMJ>@NN@N @S@>PO@? HJ?DAT OC@ spip_articles O<=G@ DI OC@ ?<O<=<N@ OJ <NNDBI < I@R H<I<B@H@IO NO<OPN AJM AJMPH H<I<B@H@IO 5C@I < AJMPH DN M@LP@NO@? JI NP=N>MDKODJI RCD>C H@<IN TJP HPNO =@ GJBB@? DI OJ KJNO R@ HPNO <=NJGPO@GT =@ NPM@ OC<O OC@ NDO@ <>OP<GGT <>>@KON QDNDOJM M@BDNOM<ODJIN RCD>C DN >C@>F@? =T ><GGDIB ecrire_meta('accepter_visiteurs', 'oui'); I? ADI<GGT < ><GG OJ DIQ<GD?<O@ OC@ ><>C@? ADG@N DN @S@>PO@? =T ><GGDIB OC@ suivre_invalideur() API>ODJI GG JA OC@ ><>C@ RDGG =@ M@>M@<O@? IJO@ OC<O PI?@M 1.(. RCD>C R<N IJO OC@ ><N@ KM@QDJPNGT JIGT OC@ M@G@Q<IO N@>ODJI JA OC@ ><>C@ R<N DIQ<GD?<O@?

Automatic redirections O OC@ @I? JA <I <>ODJI <AO@M OC@ M@OPMI JA OC@ API>ODJI 1.(. M@?DM@>ON OC@ K<B@ OJ < M@?DM@>ODJI 30* K<NN@? DI OC@ redirect Q<MD<=G@ 2C@ API>ODJIN OJ B@I@M<O@ OC@ GDIFN OJ OC@ N@>PM@? <>ODJIN GDF@ generer_action_auteur()

C<Q@ < K<M<H@O@M OJ M@>@DQ@ OCDN M@?DM@>ODJI GDIF

Forcing a redirection 1JH@ <>ODJIN CJR@Q@M ><I AJM>@ < ?DAA@M@IO M@?DM@>ODJI JM ?@ADI@ < ?@A<PGO M@?DM@>ODJI 2J ?J OCDN TJP HPNO ><GG OC@ redirige_par_entete() API>ODJI

RCD>C @I<=G@N M@?DM@>ODIB OC@ =MJRN@M OJ < ?DAA@M@IO K<B@

205


Example: 1DHKGT M@?DM@>O OJ OC@ M@?DM@>ODJI 30* M@LP@NO@? if ($redirect = _request('redirect')) { include_spip('inc/headers'); redirige_par_entete($redirect); }

editer_objet actions >ODJIN RCD>C RMDO@ ?<O< C<Q@ < NK@>D<G K@>PGD<MDOT "<GG@? =T AJMHN OC<O RMDO@ ?<O< AJM 1.(. J=E@>ON DI OC@ prive/formulaires/ ?DM@>OJMT AMJH OC@ @>MDM@ DI> @?DO@M KCK ADG@ OC@T ?J IJO M@>@DQ@ M@?DM@>ODJI DINOMP>ODJIN <I? HPNO M@OPMI

DI NP>C ><N@N < ?<O< K<DM JA D?@IODAD@M @MMJM 2C@ "42 AJMH KMJ>@NN DON@GA H<I<B@N OC@ NP=N@LP@IO M@?DM@>ODJI %JM OCDN M@<NJI OC@ action/editer_xx.php ADG@N RC@M@ SS DN OC@ J=E@>O OTK@ DI OC@ NDIBPG<M H<T M@OPMI < O<=G@ if ($redirect) { include_spip('inc/headers'); redirige_par_entete($redirect); } else { return array($id_auteur,''); }

206


# Functionalities

Authentications *@ MYK@MOJDM@ <POC >JIOD@IO G@N ?DAAYM@ION N>MDKON KJPM BYM@M G< >JII@SDJI ?@N PODGDN<O@PMN #@PS NJIO AJPMIDN ?<IN 1.(. K<M ?YA<PO 1.(. KJPM PI@ >JII@SDJI OJPO X A<DO IJMH<G@ @O *# . KJPM PI@ >JII@SDJI ?@N PODGDN<O@PMN QD< >@O <IIP<DM@ 2C@ <POC ?DM@>OJMT >JIO<DIN OC@ Q<MDJPN N>MDKON PN@? OJ B@I@M<O@ OC@ PN@M >JII@>ODJIN 2RJ <M@ NPKKGD@? DI 1.(. =T ?@A<PGO 1.(. AJM OC@ >JHKG@O@GT JM?DI<MT >JII@>ODJIN <I? *# . AJM >JII@>ODIB PN@MN RDOC <I *# . <POC@IOD><ODJI N@MQ@M

The contents of an auth file 2C@ Q<MDJPN <POC@IOD><ODJI >C@>FN <M@ ><GG@? ?PMDIB GJBDI OCMJPBC OC@ KMDQ@ AJMHPG<DM@N GJBDI KCK ADG@ 2C@ ADMNO RCD>C Q<GD?<O@N <I <POC@IOD><ODJI H<F@N DO KJNND=G@ OJ <>>JHHJ?<O@ NJH@JI@ RCJ DN DI OC@ KMJ>@NN JA D?@IODATDIB OC@HN@GA 2C@ GDNO JA OC@ Q<MDJPN <POC@IOD><ODJIN DN ?@ADI@? =T < BGJ=<G Q<MD<=G@ $GLOBALS['liste_des_authentifications'] ,JI@OC@G@NN OC@ <POC@IOD><ODJI KMJ>@NN@N <M@ M@G<ODQ@GT >JHKG@S M@LPDMDIB N@Q@M<G N<A@OT >C@>FN 2C@ PN@M GJBDI <I? K<NNRJM? <M@ K<NN@? OJ OC@ Q@MDAD><ODJI API>ODJIN @I>MTKO@? RDOC NC< K<DM@? RDOC < M<I?JH IPH=@M JM DI OC@ >G@<M DI OC@ RJMNO JA ><N@N RC@I DO DN IJO KJNND=G@ OJ NOJM@ >JJFD@N

The primary identification function auth/nom.php ADG@ HPNO C<Q@ < auth_nom_dist() API>ODJI 2CDN API>ODJI M@OPMIN < O<=G@ ?@N>MD=DIB OC@ <POCJM DA OC<O <POCJM DN <POC@IOD><O@? if (!defined("_ECRIRE_INC_VERSION")) return; // Authenticates and if ok, return the table for the user's SQL row // If a security risk affects the installation, return False function auth_spip_dist ($login, $pass, $md5pass="", $md5next="") { ... }

207


Compilation of the templates 2CDN N@>ODJI @SKG<DIN NJH@ JA OC@ ?@O<DGN JA CJR < O@HKG<O@ DN >JHKDG@?

The syntax of the templates 1.(. PN@N < NTIO<S OJ RMDO@ O@HKG<O@N RCD>C C<N < GDHDO@? QJ><=PG<MT =PO RCD>C DN <GNJ @SOM@H@GT MD>C <I? HJ?PG<M DI I<OPM@ 2CDN NTIO<S ?@ADI@? @SKGD>DOGT DI OC@ @>MDM@ KP=GD> KCM<N@M;COHG KCK ADG@N >JIO<DIN @G@H@ION NP>C <N \ OC@ GJJK =JP>G@ DI %M@I>C <B_loopname> ... before content <BOUCLE_loopname(TABLE){criteria}> ... for each matching element </BOUCLE_loopname> ... after content </B_loopname> ... else content <//B_loopname>

\ OC@ AD@G? JM O<B >C<HK <I? =<GDN@ DI %M@I>C [ before (#TAG{criteria}|filters) after ]

\ OC@ <MBPH@IO {args} |filter JM |filter{args} JI O<BN \ >MDO@MD< {criteria=param} PN@? JI GJJKN \ >J?@ DI>GPNDJI <INCLURE{fond=included_code_segment_name}>

\ KG<>@CJG?@MN D?DJH@ DI %M@I>C G<IBP<B@ NK@>DAD> >C<M<>O@M NOMDIBN <:type:string_code_name:>

\ KJGTBGJON KJGTBGJOO@ DI %M@I>C <multi> PN@? OCMJPBCJPO O@HKG<O@N <I? DI PN@M O@SO <multi>[fr]franรงais[en]English</multi>

208


# Functionalities

Analysing a template 5C@I 1.(.fN K<MN@M <I<GTN@N < O@HKG<O@ DO OM<ING<O@N OC@ NTIO<S DIOJ < QJ><=PG<MT FIJRI <I? PI?@MNOJJ? =T OC@ >JHKDG@M 5@ HDBCO OC@I N<T OC<O OC@ K<MN@M DN OM<ING<ODIB < K<MOD>PG<M G<IBP<B@ OC@ 1.(. NTIO<S OC<O R@ M@A@M OJ <N < >JI>M@O@ NTIO<S DIOJ < KM@>DN@ G<IBP<B@ OC<O R@ M@A@M OJ <N <I <=NOM<>O NTIO<S 2CDN DN ?@ADI@? =T .'. J=E@>ON DI OC@ @>MDM@ KP>GD> DIO@MA<>@N KCK ADG@ 5DOC OCDN K<B@ <I<GTNDN OC@ K<MN@M >M@<O@N < O<=G@ ?@N>MD=DIB DO N@LP@IOD<GGT <I? M@>PMNDQ@GT =T PNDIB OC@ QJ><=PG<MT DI>GP?@? =T OC@ >JHKDG@M OC@ J=E@>ON >JIO<DIDIB 2@SO %D@G?N *JJKN "MDO@MD< .G<>@CJG?@MN (I>GP?@N .JGTBGJON 2J H<F@ OCDIBN < GDOOG@ >G@<M@M G@OfN GJJF <O RC<O O<=G@ DN B@I@M<O@? =T < A@R O@HKG<O@ @S<HKG@N

A text Template : Simple text

Generated table: JPOKPO =T < print_r array ( 0 => Texte::__set_state(array( 'type' => 'texte', 'texte' => 'Simple text ', 'avant' => NULL, 'apres' => '', 'ligne' => 1, )), )

2C@ O<=G@ NK@>DAD@N OC<O OC@ ADMNO @G@H@IO M@<? JI OC@ K<B@ F@T DN < 2@SO@ @G@H@IO NO<MODIB JI GDI@ <I? CJG?DIB OC@ O@SO NOMDIB 1DHKG@ O@SO

A tag Template: [avant(#VAL)après]

209


5@ ><I M@<? AMJH OC@ B@I@M<O@? O<=G@ =@GJR OC<O OC@ ADMNO @G@H@IO M@<? JI OC@ K<B@ DN < %D@G? >C<HK DI %M@I>C < O<B OC<O DOfN I<H@ DN 4 * OC<O DO DN IJO RDOCDI < GJJK JOC@MRDN@ OC@ D?;GJJK RJPG? =@ ?@ADI@? <I? OC<O RC<O DN DI OC@ JKODJI<G N@>ODJI =@AJM@ OC@ O<B DN < 2@SO@ @G@H@IO RDOC OC@ O@SO NOMDIB =@DIB <Q<IO Generated table: array ( 0 => Champ::__set_state(array( 'type' => 'champ', 'nom_champ' => 'VAL', 'nom_boucle' => '', 'avant' => array ( 0 => Texte::__set_state(array( 'type' => 'texte', 'texte' => 'avant', 'avant' => NULL, 'apres' => '', 'ligne' => 1, )), ), 'apres' => array ( 0 => Texte::__set_state(array( 'type' => 'texte', 'texte' => 'après', 'avant' => NULL, 'apres' => '', 'ligne' => 1, )), ), 'etoile' => '', 'param' => array ( ), 'fonctions' => array ( ), 'id_boucle' => NULL,

210


# Functionalities 'boucles' => NULL, 'type_requete' => NULL, 'code' => NULL, 'interdire_scripts' => true, 'descr' => array ( ), 'ligne' => 1, )), 1 => Texte::__set_state(array( 'type' => 'texte', 'texte' => ' ', 'avant' => NULL, 'apres' => '', 'ligne' => 1, )), )

A loop *@OfN GJJF <O JI@ HJM@ @S<HKG@ JA < GJJK PNDIB < O<B RCD>C DN < GDOOG@ HJM@ >JHKGD><O@? NDI>@ DO DHKGD@N < >DM>PG<M M@A@M@I>@ DI OC@ B@I@M<O@? O<=G@ *JJF <O OCDN NDHKG@ O@HKG<O@ N@BH@IO Template: <BOUCLE_a(ARTICLES){id_article=3}> #TITRE </BOUCLE_a>

2CDN GJJK N@G@>ON <MOD>G@ <I? NCJPG? ?DNKG<T OC@ ODOG@ JA OC@ <MOD>G@ 2C@ K<B@ O<=G@ DA R@ R@M@ OJ OMT OJ ?DNKG<T DO RJPG? @I? PK B@I@M<ODIB < M@>PMNDJI @MMJM 2C@ DGGPNOM<ODJI NCJRN OC<O OC@ N@>JI? @G@H@IO M@<? DI OC@ GJJK DN < %D@G? >C<HK DI %M@I>C JM O<B I<H@? 2(20$ 2CDN AD@G? >JIO<DIN < M@A@M@I>@ OJ OC@ GJJK RCD>C DO DN ?@ADI@? RDOCDI 'boucles'=>array(...) 2CDN GJJK >JIO<DIN OC@ O<B RCD>C =@GJIBN OJ OC@ GJJK >JIO<DIDIB OC@ O<B RCD>C =@GJIBN OJ OC@ GJJK Excerpt of the generated table array (

211


0 => Boucle::__set_state(array( 'type' => 'boucle', 'id_boucle' => '_a', 'id_parent' => '', 'avant' => array ( ), 'milieu' => array ( 0 => Texte::__set_state(array( 'type' => 'texte', 'texte' => ' ', 'avant' => NULL, 'apres' => '', 'ligne' => 1, )), 1 => Champ::__set_state(array( 'type' => 'champ', 'nom_champ' => 'TITRE', 'nom_boucle' => '', 'avant' => NULL, 'apres' => NULL, 'etoile' => '', 'param' => array ( ), 'fonctions' => array ( ), 'id_boucle' => '_a', 'boucles' => array ( '_a' => Boucle::__set_state(array( 'type' => 'boucle', 'id_boucle' => '_a', 'id_parent' => '', 'avant' => array ( ), 'milieu' =>

212


# Functionalities array ( 0 => Texte::__set_state(array( 'type' => 'texte', 'texte' => ' ', 'avant' => NULL, 'apres' => '', 'ligne' => 1, )), 1 => Champ::__set_state(array( 'type' => 'champ', 'nom_champ' => 'TITRE', 'nom_boucle' => '', 'avant' => NULL, 'apres' => NULL, 'etoile' => '', 'param' => array ( ), 'fonctions' => array ( ), 'id_boucle' => '_a', 'boucles' => array ( '_a' => Boucle::__set_state(array( ...

Why use such references? /PDO@ NDHKGT =@><PN@ OC@T <M@ OC@I PN@? AJM ><G>PG<ODIB OC@ O<BN 5C@I < O<B DN ><G>PG<O@? < K<MO JA OCDN O<=G@ DN K<NN@? <N < K<M<H@O@M OC@ A<HJPN $p OC<O R@ RDGG H@@O JAO@I 2CDN K<MO NDHKGT M@G<O@N OJ OC@ O<BfN KMJK@MOD@N 2J M@OMD@Q@ KMJK@MOD@N AMJH OC@ @I>GJNDIB GJJK <GG OC<O DN M@LPDM@? OC<IFN OJ OC@N@ M@A@M@I>@N DN OJ ><GG OC@ K<M<H@O@M $p->boucles[$p->id_boucle]

The assembly processes 2C@ KMJ?P>ODJI JA < K<B@ =T OC@ >JHKDG@M DN K@MAJMH@? DI OC@ @>MDM@ KP=GD> <NN@H=G@M KCK ADG@

213


2CDN ADG@ ><GGN API>ODJIN OJ <I<GTN@ RC<O C<N =@@I M@LP@NO@? M@OMD@Q@ OC@ HJ?DAD@? O@HKG<O@ OM<ING<O@ DO DIOJ .'. <I? M@OPMI OC@ M@NPGON JA OC@ .'. >J?@ @Q<GP<ODJIN I? ?J <GG OCDN RCDGNO H<I<BDIB OC@ Q<MDJPN ADG@ ><>C@N 1.(. B@I@M<GGT PN@N OC@ recuperer_fond() API>ODJI OJ M@OMD@Q@ OC@ M@NPGO JA < O@HKG<O@ =PO DO <GNJ ?DM@>OGT ><GGN OC@ assembler() API>ODJI AMJH OC@ ecrire/public.php ADG@

Function call sequence 2C@ recuperer_fond() API>ODJI ><GGN evaluer_fond() RCD>C ><GGN inclure_page() RCD>C ><GGN OC@ cacher() API>ODJI DI OC@ @>MDM@ KP=GD> ><>C@M KCK ADG@ 2CDN DN OC@ N<H@ cacher() API>ODJI RCD>C <GNJ ><GGN assembler()

Determining the cache 2C@ @>MDM@ KP=GD> ><>C@M KCK ADG@ DN PN@? AJM H<I<BDIB OC@ ADG@N NOJM@? DI OC@ ><>C@ 2C@ cacher() API>ODJI M@OMD@Q@N OC@ I<H@ <I? ?<O@ JA < ><>C@? K<B@ DA DO @SDNON ?@K@I?DIB JI OC@ >JIO@SO OC<O DN DN KMJQD?@? (A DO DN <GNJ K<NN@? < ADG@ <??M@NN OC@I OC@ ><>C@ ADG@ DN >M@<O@? N NP>C OCDN API>ODJI ><I =@ ><GG@? DI R<TN \ OC@ ADMNO ODH@ OJ ?@O@MHDI@ OC@ I<H@ JA OC@ ><>C@ ADG@ <I? OJ DI?D><O@ DA < Q<GD? ><>C@ @SDNON AJM OC@ M@LP@NO@? K<B@ \ < N@>JI? ODH@ RC@I OC@M@ DN IJ Q<GD? ><>C@ 2C@ K<B@ DN OC@I ><G>PG<O@? =T OC@ parametrer() API>ODJI <I? OC@I OC@ cacher() API>ODJI DN OC@I ><GG@? OCDN ODH@ OJ NOJM@ OC@ M@NPGON DI OC@ ><>C@ // This function is used twice $cacher = charger_fonction('cacher', 'public'); // The last four parameters are modified by the function: // location, validity, and, if valid, contents & age $res = $cacher($GLOBALS['contexte'], $use_cache, $chemin_cache, $page, $lastmodified);

214


# Functionalities

Parameters determining the name of the template 2C@ @>MDM@ KP=GD> K<M<H@OM@M KCK ADG@ H<F@N DO KJNND=G@ OJ >M@<O@ OC@ K<M<H@O@MN RCD>C RDGG =@ I@>@NN<MT OJ M@OMD@Q@ OC@ I<H@ <I? ?@O<DGN JA OC@ O@HKG<O@ OJ =@ >JHKDG@? PNDIB styliser() <I? OC@I M@LP@NO DON ><G>PG<ODJI PNDIB composer() 2CDN DN CJR OC@ parametrer() API>ODJI ><G>PG<O@N OC@ M@LP@NO@? G<IBP<B@ <N R@GG <N OC@ IPH=@M JA OC@ >PMM@IO N@>ODJI MP=MDLP@ DA OC<O DN KJNND=G@ 2C@N@ K<M<H@O@MN OC@I @I<=G@ OC@ I<H@ <I? <??M@NN >JMM@NKJI?DIB OJ OC@ M@LP@NO@? K<B@ OJ =@ ?@O@MHDI@? 2CDN DN ?JI@ =T ><GGDIB OC@ styliser() API>ODJI RCD>C DN K<NN@? OC@ <MBPH@ION DI LP@NODJI

Determining the template file 2C@ @>MDM@ KP=GD> NOTGDN@M KCK ADG@ ?@O@MHDI@N OC@ I<H@ <I? OTK@ JA OC@ O@HKG<O@ ?@K@I?DIB JI OC@ <MBPH@ION RCD>C <M@ K<NN@? OJ DO $styliser = charger_fonction('styliser', 'public'); list($skel,$mime_type, $gram, $sourcefile) = $styliser($fond, $id_rubrique_fond, $GLOBALS['spip_lang'], $connect);

OC <MBPH@IO H<F@N DO KJNND=G@ OJ M@LP@NO < K<MN@M < >JI>M@O@ NTIO<S <I? OC@I >JIN@LP@IOGT <I @SO@INDJI AJM OC@ Q<MDJPN O@HKG<O@ ADG@N !T ?@A<PGO OC@ K<MN@M <I? OC@M@AJM@ OC@ @SO@INDJI <KKGD@? DN html 2C@ API>ODJI N@<M>C@N AJM < O@HKG<O@ I<H@? $fond.$ext DI 1.(.fN path (A DO ?J@N IJO @SDNO DO M@OPMIN <I @MMJM JOC@MRDN@ DO <O@HKON OJ ADI? < HJM@ NK@>DAD> O@HKG<O@ DI OC@ N<H@ ?DM@>OJMT <N OC@ O@HKG<O@ AJPI? ?@K@I?DIB JI OC@ id_rubrique <I? lang K<M<H@O@MN 1OTGDN@M OC@I N@<M>C@N ADG@N GDF@ nom=8.html nom-8.html nom-8.en.html JM nom.en.html DI OC@ AJGGJRDIB JM?@M \ $fond=$id_rubrique \ $fond-$id_rubrique \ $fond-$id_rubrique_parent_recursivement

215


\ OC@I RCD>C@Q@M DO C<N AJPI? JM IJO O@MHDI<O@? RDOC .$lang 2C@ API>ODJI OC@I M@OPMIN < O<=G@ JA @G@H@ION JA RC<O DO C<N AJPI? array($squelette, $ext, $ext, "$squelette.$ext") \ \ \ \

NO K<M<H@O@M OC@ I<H@ JA OC@ O@HKG<O@

I? DON @SO@INDJI M? DON BM<HH<M OC@ OTK@ JA K<MN@M OC OC@ APGG I<H@

2C@N@ K<M<H@O@MN <M@ PN@? =T OC@ >JHKJN@M <I? DON composer() API>ODJI

A clean composition 2C@ @>MDM@ KP=GD> >JHKJN@M KCK ADG@ DN DIO@I?@? OJ M@OMD@Q@ OC@ O@HKG<O@ OM<ING<O@? DIOJ .'. <I? OJ @S@>PO@ DO DI OC@ M@LP@NO@? >JIO@SO (A OC@ O@HKG<O@ C<N <GM@<?T =@@I OM<ING<O@? DIOJ .'. OC@I OC@ M@NPGO DN M@OMD@Q@? AMJH < ><>C@ ADG@ <I? PN@? JOC@MRDN@ 1.(. ><GGN DON >JHKDG<ODJI API>ODJI compiler() OJ OM<ING<O@ OC@ >JI>M@O@ NTIO<S DIOJ <=NOM<>O NTIO<S <I? OC@I DIOJ >J?@ OC<O DN @S@>PO<=G@ =T .'. 2C@ composer.php ADG@ <GNJ GJ<?N OC@ API>ODJIN I@>@NN<MT AJM @S@>PODIB OC@ .'. ADG@N JPOKPO =T OC@ >JHKDG<ODJI JA OC@ O@HKG<O@N

The compilation 2C@ 1.(. >JHKDG@M DI OC@ @>MDM@ KP=GD> >JHKDG@M KCK ADG@ DN ><GG@? PNDIB OC@ compiler() API>ODJI AMJH RDOCDI OC@ parametrer() API>ODJI "JHKDG<ODJI NO<MON =T ><GGDIB OC@ <KKMJKMD<O@ K<MN@M ?@K@I?DIB JI OC@ BM<HH<M M@LP@NO@? OC@ >JI>M@O@ NTIO<S JA OC@ O@HKG<O@ 1J DO DN OC@ phraser_html() K<MN@M RCD>C DN ><GG@? DI OC@ @>MDM@ KP=GD> KCM<N@M;COHG KCK ADG@ (O OM<INAJMHN OC@ NTIO<S JA OC@ O@HKG<O@ DIOJ < O<=G@ $boucles JA GDNON JA .'. J=E@>ON AJMHDIB OC@ >JI>M@O@ NTIO<S OC<O RDGG <I<GTN@ OC@ >JHKDG<ODJI API>ODJI %JM @<>C GJJK AJPI? 1.(. K@MAJMHN < >@MO<DI IPH=@M JA KMJ>@NN@N NO<MODIB =T GJJFDIB AJM RCD>C 1/* O<=G@N >JMM@NKJI? <I? RCD>C EJDIN C<Q@ =@@I ?@>G<M@? AJM OC@N@ O<=G@N

216


# Functionalities (O OC@I ><G>PG<O@N OC@ >MDO@MD< <KKGD@? JI OC@ GJJKN ?@>G<M@? DI @>MDM@ KP=GD> >MDO@M@N KCK JM QDN KGPBDIN <I? OC@I OC@ >JIO@IO JA OC@ GJJKN RCD>C C<Q@ O<BN ?@ADI@? AJM NJH@ JA OC@H DI @>MDM@ KP=GD> =<GDN@N KCK (O OC@I KMJ>@@?N OJ ><G>PG<O@ OC@ @G@H@ION JA O@HKG<O@ JPOND?@ JA < GJJK %DI<GGT DO MPIN OC@ GJJK API>ODJIN OC<O <M@ ?@>G<M@? DI OC@ @>MDM@ KP=GD> =JP>G@N KCK ADG@ 2C@ M@NPGO JA <GG OCDN =PDG?N <I @S@>PO<=G@ .'. >J?@ RDOC < .'. API>ODJI AJM @<>C GJJK <I? <I JQ@M<GG .'. API>ODJI AJM OC@ O@HKG<O@ (O DN OC@I OCDN @S@>PO<=G@ >J?@ RCD>C OC@ >JHKDG@M M@OPMIN 2CDN >J?@ RDGG =@ NOJM@? DI OC@ ><>C@ OC@I @S@>PO@? =T OC@ >JHKJN@M RDOC OC@ >JIO@SOP<G K<M<H@O@MN OC<O C<Q@ =@@I K<NN@? 2C@ M@NPGO DA OC@ >J?@ AJM OC@ M@LP@NO@? K<B@ RCD>C RDGG =@ NOJM@? DI ><>C@ =T ><GGDIB OC@ cacher() API>ODJI < N@>JI? ODH@ DI OC@ assembler.php ADG@ <I? OC@I N@IO JPO OJ OC@ =MJRN@M JM DA DO DN <I DI>GPNDJI <??@? OJ < K<B@ AM<BH@IO (O H<T NODGG >JIO<DI .'. RC@I >@MO<DI ?@O<DGN HPNO ?DNKG<T ?@K@I?DIB JI OC@ K@MNJI QDNDODIB OC@ K<B@ NP>C <N RDOC ?TI<HD> AJMHN

217


The cache *fPN<B@ ?@ ?DAAYM@ION ><>C@N @NO PI@ K<MOD@ DIOMDINZLP@ ?@ 1.(. K@MH@OO<IO ?@ BYIYM@M G@N ?DAAYM@IO@N K<B@N <PS QDNDO@PMN KGPN M<KD?@H@IO ?<IN PI@ JKODLP@ ?@ K@MAJMH<I>@ JI B<M?@ X KJMOY@ ?@ H<DI G@N ?JIIY@N LPD NJIO NJPQ@IO <>>Y?Y@N JP GJIBP@N X ><G>PG@M 3NDIB OC@ Q<MDJPN ><>C@N DN <I DIOMDIND> >JHKJI@IO JA 1.(. OC<O <GGJRN OC@ Q<MDJPN K<B@N OJ =@ B@I@M<O@? A<NO@M AJM OC@ NDO@ QDNDOJM OC@M@=T DHKMJQDIB NDO@ M@NKJIN@ <I? K@MAJMH<I>@ IT ?<O< OC<O DN AM@LP@IOGT <>>@NN@? JM RCD>C O<F@N GJIB@M ODH@N OJ ><G>PG<O@ <M@ F@KO <O OC@ M@<?T NJ OC@T ?J IJO I@@? OJ =@ B@I@M<O@? JI OC@ AGT

The template cache 2C@M@ <M@ Q<MDJPN ?DAA@M@IO ><>C@N PN@? RDOCDI 1.(. <I? JOC@MN <M@ <GNJ KMJQD?@? RDOC Q<MDJPN KGPBDIN NP>C <N +YHJDN<ODJI %<NO><>C@ $SKM@NNJ JM "<>C@ "JJG -I@ JA OC@ HJNO DHKJMO<IO ><>C@N DN OC@ JI@ H<DIO<DI@? AJM OC@ O@HKG<O@N RC@I@Q@M < O@HKG<O@ ADG@ DN >JHKDG@? <I? OC@ M@NPGO<IO .'. >J?@ B@I@M<O@?

OC@I OC@N@ M@NPGON <M@ NOJM@? DI ><>C@ DI OC@ temp/cache/skel ?DM@>OJMT 2CDN ><>C@ DN >JIADBPM@? OJ C<Q@ < Q<GD?DOT K@MDJ? OC<O DN PIGDHDO@? %DG@N DI OCDN ><>C@ <M@ JIGT M@B@I@M<O@? AJM @<>C O@HKG<O@ ADG@ RC@I \ OC@ JMDBDI<G O@HKG<O@ ADG@ C<N =@@I HJ?DAD@? RCD>C DN =<N@? JI OC@ ADG@fN NOJM<B@ ?<O@ JI ?DNF

\ @DOC@M JA OC@ ADG@N mes_options.php JM mes_fonctions.php C<Q@ =@@I HJ?DAD@?

\ OC@ ><>C@ DN @HKOD@? H<IP<GGT =T <I <?HDIDNOM<OJM

The page cache N@>JI? G@Q@G JA ><>CDIB DN H<DIO<DI@? AJM K<B@N M@LP@NO@? =T NDO@ QDNDOJMN 2C@N@ K<B@ M@NPGON <M@ N<Q@? DI < N@MD@N JA ?DM@>OJMD@N I<H@? tmp/cache/0 OCMJPBC tmp/cache/f <I? @<>C ><>C@ ADG@ C<N DON JRI Q<GD?DOT K@MDJ? 2C@N@ ><>C@ ADG@N <M@ >M@<O@? RC@I

218


# Functionalities \ OC@ Q<GD?DOT K@MDJ? C<N @SKDM@? <I? OC@ K<B@ DN M@LP@NO@? <I@R OC@ K@MDJ? DN ?@ADI@? DI OC@ O@HKG<O@N PNDIB OC@ #CACHE O<B JM <=N@IO NP>C < NK@>DAD> O<B OCMJPBC OC@ NTNO@H >JINO<IO _DUREE_CACHE_DEFAUT

\ OC@ @?DOJMD<G >JIO@IO DI OC@ ?<O<=<N@ C<N =@@I >C<IB@? 1.(. M@GD@N JI OC@ M@BDNO@M@? ?<O@ JA G<NO HJ?DAD><ODJI OJ ?@O@MHDI@ DA OCDN C<N C<KK@I@? $GLOBALS['meta']['derniere_modif'] <N KMJQD?@? =T OC@ API>ODJI suivre_invalideur() ?@ @>MDM@ DI> DIQ<GD?@PM KCK

\ OC@ K<M<H@O@M var_mode=calcul DN @SKGD>DOGT K<NN@? OJ 1.(. DI OC@ 30* NP>C <N DN OC@ ><N@ RC@I PNDIB OC@ 0@AM@NC OCDN K<B@ =POOJI JI OC@ KP=GD> NDO@ RC@I TJP <M@ >PMM@IOGT GJBB@? DI

The SQL cache 1.(. NOJM@N >@MO<DI ?<O<=<N@ @G@H@ION DI < ><>C@ DI JM?@M OJ KM@Q@IO JQ@M RJMFDIB OC@ 1/* N@MQ@M <I? NJ OC<O OC@ KP=GD> K<B@N <GM@<?T ><>C@? ><I =@ ?DNKG<T@? DA OC@ ?<O<=<N@ N@MQ@M ?J@NIfO RJMF AJM NJH@ M@<NJI 2C@M@ <M@ ORJ NP>C ><>C@N >M@<O@? AJM OC@N@ KPMKJN@N

Cache of the meta data 2C@ ADMNO ><>C@ DN < >JHKG@O@ @SKJMO JA OC@ 1/* O<=G@ spip_meta 2CDN O<=G@ NOJM@N OC@ K<M<H@O@MN PN@? AJM >JIADBPMDIB <I? MPIIDIB 1.(. 2C@N@ ?<O< <M@ NOJM@? =JOC DI OC@ BGJ=<G Q<MD<=G@ $GLOBALS['meta'] <I? @S>@KO AJM N@INDODQ@ ?<O< PN@? AJM <POC@IOD><ODJI DI OC@ ADG@ I<H@? tmp/ meta_cache.php

2CDN

ADG@

C<N

<

Q<GD?DOT

K@MDJ?

?@ADI@?

=T

_META_CACHE_TIME (O DN M@RMDOO@I RC@I ><GGN <M@ H<?@ OJ ecrire_meta() JM effacer_meta() 2C@ API>ODJI lire_metas() M@><G>PG<O@N OC@ >JIO@ION JA OCDN ><>C@ $GLOBALS['meta'] PNDIB OC@ >PMM@IO ?<O< DI OC@ ?<O<=<N@

Cache of SQL descriptions 2C@ N@>JI? ><>C@ >JI>@MIN OC@ ?@N>MDKODJIN JA OC@ ?<O<=<N@ 1/* O<=G@N 2C@N@ ?@N>MDKODJIN <M@ NOJM@? DI OC@ tmp/cache/sql_desc*.txt ADG@N

<GJIB RDOC < ADG@ AJM @<>C ?<O<=<N@ >JII@>OJM 2CDN ADG@ DN >M@<O@? <I? PN@? =T OC@ API>ODJI base_trouver_table_dist() RCD>C DN PN@? =T Q<MDJPN .'. API>ODJIN AJM 1/* ?@N>MDKODJIN GDF@ table_objet() id_table_objet()

<I? objet_type() 2J >M@<O@ OCDN ><>C@ ADG@ DO DN I@>@NN<MT OJ @SKGD>DOGT ><GG OC@ API>ODJI trouver_table() RDOCJPO <IT <MBPH@ION

219


$trouver_table = charger_fonction('trouver_table','base'); $trouver_table();

The plugins cache 2C@M@ <M@ NJH@ ><>C@ ADG@N NK@>DAD> OJ KGPBDIN RCD>C <M@ <GNJ >M@<O@? DI tmp/ JM DI tmp/cache/

plugin_xml.cache 2C@ M@NPGON AMJH <I<GTNDIB OC@ Q<MDJPN plugin.xml ADG@N DN NOJM@? DI < ><>C@ DI OC@ tmp/plugin_xml_cache.gz ADG@ 2CDN ADG@ DN >M@<O@? RC@I OC@ GDNO JA <>ODQ@ KGPBDIN DN >C<IB@? =T OC@ API>ODJI ecrire_plugin_actifs()

RCD>C ><GGN OC@ API>ODJI plugins_get_infos_dist() AMJH @>MDM@ KGPBDIN B@O;DIAJN KCK OJ H<I<B@ OC@ M@OMD@Q<G JA ?<O< AJM < KGPBDI 2C@ ADG@ ><I <GNJ =@ ?@G@O@? <N AJM IPH@MJPN ><>C@ ADG@N RC@I PK?<O@N <M@ H<?@ OJ OC@ ?<O<=<N@ NOMP>OPM@

Plugin load files .GPBDIN OTKD><GGT ?@>G<M@ ADG@N AJM JKODJIN API>ODJIN <I? <>ODJIN OJ =@ @S@>PO@? AJM KDK@GDI@ ><GGN GG JA OC@ ADG@N OJ =@ GJ<?@? <M@ >JHKDG@? DIOJ ADG@N

M@><G>PG<O@? RC@I@Q@M OC@ KGPBDI H<I<B@H@IO K<B@ DN <>>@NN@? <O ecrire/ ?exec=admin_plugin RC@I OC@ ><>C@ DN H<IP<GGT @HKOD@? JM RC@I OC@M@ DN <I PK?<O@ OJ OC@ ?<O<=<N@ NOMP>OPM@ \ tmp/cache/charger_plugins_options.php >JIO<DIN OC@ GDNO JA JKODJI ADG@N OJ =@ GJ<?@?

\ tmp/cache/charger_plugins_fonctions.php >JIO<DIN OC@ GDNO JA API>ODJI ADG@N

\ tmp/cache/charger_plugins_pipelines.php >JIO<DIN OCJN@ ADG@N PN@? AJM OC@ API>ODJIN OJ =@ @S@>PO@? AJM @<>C KDK@GDI@

220


# Functionalities

The path cache 1.(. PN@N Q<MDJPN AJG?@MN OJ GJJF AJM OC@ ADG@N OC<O DO I@@?N OJ JK@M<O@ +JM@ JI OCDN NP=E@>O C@M@ 2C@ >JI>@KO JA K<OC K 5C@I DO PN@N OC@ API>ODJI find_in_path b < API>ODJI RCD>C DN @NN@IOD<G AJM OCM@@ JOC@M API>ODJIN include_spip charger_fonction recuperer_fond OJ GJJF AJM < ADG@ OJ =@ DI>GP?@? =T < O@HKG<O@ JM DA DO PN@N OC@ #CHEMIN O<= b OC@I <GG JA OC@ K<OCN <M@ N@<M>C@? OCMJPBC PIODG OC@ NJPBCO <AO@M ADG@ DN GJ><O@? 2C@N@ IPH@MJPN N@<M>C@N >M@<O@ AM@LP@IO M@K@ODODQ@ ?DNF <>>@NN@N RCD>C RJPG? =@ =@OO@M OJ =@ M@NOMD>O@? DI IPH=@M DA KJNND=G@ %JM OCDN M@<NJI 1.(. PN@N OC@ tmp/cache/chemin.txt ADG@ OJ ><>C@ <GG JA OC@ H<O>C@N =@OR@@I < M@LP@NO@? ADG@ <I? DON <>OP<G GJBD><G GJ><ODJI <N AJPI? DI JI@ JA OC@ K<OCfN N@LP@I>@? ?DM@>OJMD@N 5DOC OCDN <>>JHKGDNC@? RC@I@Q@M < ADG@ DN M@LP@NO@? 1.(. ADMNO >C@>FN OJ N@@ DA OC@ K<OC AJM OC<O ADG@ DN DI OC@ ><>C@ (A DOfN IJO <GM@<?T OC@M@ OC@I 1.(. KMJ>@@?N OJ ><G>PG<O@ DON GJ><ODJI <I? PK?<O@N OC@ >JMM@NKJI?@I>@ O<=G@ RDOC < I@R @IOMT AJM OC@ I@RGT GJ><O@? ADG@ 2CDN ><>C@ ADG@ DN M@>M@<O@? RC@I ><GGDIB RDOC OC@ var_mode=recalcul K<M<H@O@M DI OC@ 30* JM <N < ?DM@>O >JIN@LP@I>@ JA H<IP<GGT @HKOTDIB OC@ ><>C@ DI OC@ <?HDIDNOM<ODQ@ DIO@MA<>@

The CSS and JavaScript caches 2C@ "JHKM@NN@PM @SO@INDJI DI 1.(. DN PN@? OJ >JHKM@NN OC@ Q<MDJPN "11 <I? )<Q<N>MDKO @G@H@ION OJ M@NOMD>O OC@ IPH=@M JA ><GGN OJ OC@ N@MQ@M <I? OC@ NDU@ JA OC@ B@I@M<O@? ADG@N 2CDN >JHKM@NNDJI DN <>ODQ@ =T ?@A<PGO DI OC@ KMDQ<O@ UJI@ <I? ><I =@ ?@<>ODQ<O@? PNDIB OC@ >JINO<IO _INTERDIRE_COMPACTE_HEAD_ECRIRE define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true);

2CDN >JHKM@NNDJI ><I =@ <>ODQ<O@? JI OC@ KP=GD> UJI@ ?@K@I?DIB JI OC@ >JIADBPM<ODJI N@G@>O@? 1.(. RDGG >M@<O@ < >JHKM@NN@? "11 ADG@ AJM @<>C H@?D< OTK@ N>M@@I KMDIO <I? < >JHKM@NN@? )<Q<1>MDKO ADG@ AJM <GG JA OC@ @SO@MI<G N>MDKON ?@ADI@? DI OC@ '$ # JA OC@ '2+* K<B@

221


2C@N@ ADG@N <M@ ><>C@? DI local/cache-js/ <I? local/cache-css/ 2C@N@ ><>C@N <M@ M@><G>PG<O@? RC@I@Q@M OC@ var_mode=recalcul K<M<H@O@M DN K<NN@? DI OC@ 30*

The image processing cache 1.(. C<N < GD=M<MT JA BM<KCD><G ADGO@MN OC<O <M@ PN@? =T ?@A<PGO OJ @<NDGT C@GK M@NDU@ DH<B@N 2C@N@ API>ODJIN <M@ ?@ADI@? DI ?@O<DG DI @>MDM@ DI> ADGOM@N;DH<B@N;HDID KCK 2C@ %DGOM@N (H<B@N @O "JPG@PMN @SO@INDJI RCD>C DN <>ODQ@ =T ?@A<PGO JAA@MN IPH@MJPN JOC@M ADGO@MN <N R@GG GDF@ >M@<ODIB O@SO DH<B@N JM PNDIB H<NFN H@MBDIB DH<B@N >JGJPM H<IDKPG<ODJI @O> (I JM?@M OJ <QJD? M@><G>PG<ODIB OC@ N<H@ Q@MT ODH@ >JINPHDIB KMJ>@NN@N JQ@M <I? JQ@M 1.(. NOJM@N OC@ M@NPGON JA OC@N@ FDI?N JA KMJ>@NN@N DI OC@ local/ cache-gd2 <I? local/cache-vignettes ?DM@>OJMD@N 2C@N@ ><>C@? DH<B@N RDGG JIGT =@ ?@G@O@? RC@I OC@ DH<B@ ><>C@ DN H<IP<GGT @HKOD@? AMJH 1.(.fN <?HDIDNOM<ODJI HJ?PG@ JM RC@I OC@ K<M<H@O@M var_mode=images DN DI>GP?@? DI OC@ 30*

Refreshing the cache #PMDIB IJMH<G PN<B@ JA < 1.(. NDO@ RDOC KP=GD> QDNDOJMN <I? I@R <MOD>G@N =@DIB KP=GDNC@? OC@ ><>C@ <I? OC@ PK?<ODIB JA ?<O< DN C<I?G@? >JMM@>OGT !T ?@A<PGO <GOCJPBC NJH@ KGPBDIN <M@ <=G@ OJ <GO@M OCDN =@C<QDJPM <N NJJI <N 1.(. =@>JH@N <R<M@ JA >C<IB@N OJ OC@ @?DOJMD<G >JIO@IO DI OC@ ?<O<=<N@ DO DIQ<GD?<O@N OC@ RCJG@ K<B@ ><>C@ M@LP@NO@? K<B@ RDGG OC@I =@ ><G>PG<O@? <B<DI AMJH =@AJM@ JM <AO@MR<M?N DA PNDIB OC@ "<>C@ "JJG KGPBDI =@DIB N@MQ@? PK OJ OC@ NDO@ QDNDOJM (O DN JAO@I I@>@NN<MT OJ H<IP<GGT @HKOT OC@ ><>C@ RC@I H<FDIB HJ?DAD><ODJIN ?DM@>OGT JI >JIO@IO ADG@N @NK@>D<GGT RC@I PK?<ODIB < NOTG@NC@@O JM < )<Q<1>MDKO N>MDKO RCD>C DN ><G>PG<O@? =T < 1.(. O@HKG<O@ DA OC@ >JHKM@NNDJI JKODJIN C<Q@ =@@I <>ODQ<O@? 0@H@H=@M OC<O \ var_mode=calcul DI OC@ 30* PK?<O@N OC@ K<B@fN ><>C@

222


# Functionalities \ var_mode=recalcul AJM <?HDIDNOM<OJMN DI OC@ 30* M@>JHKDG@N OC@ O@HKG<O@ <I? OC@I PK?<O@N OC@ K<B@ ><>C@ \ @IO@MDIB OC@ KGPBDI H<I<B@H@IO K<B@ ecrire/?exec=admin_plugin M@><G>PG<O@N OC@ ><>C@ ADG@N tmp/cache/charger_*.php AJM OC@ KGPBDIN RCD>C H<T =@ GDNON JA ADG@N AJM JKODJIN API>ODJIN JM KDK@GDI@N \ OC@ =MJRN@M C<N DON JRI KMDQ<O@ ><>C@ RCD>C H<T =@ AJM RCJG@ K<B@N JM AJM ) 6 @G@H@ION 2C@ NDO@ QDNDOJM <I? <IT <?HDIDNOM<OJM NCJPG? <GNJ OCDIF <=JPO @HKOTDIB OCDN ><>C@ DO DN IJO I@>@NN<MDGT 1.(. RCD>C DN M@OPMIDIB < K<MOD>PG<M PI@SK@>O@? M@NPGO <N DO H<T =@ OC@ =MJRN@M M@OPMIDIB ?<O< AMJH DON JRI ><>C@ 4<MDJPN DINOMP>ODJIN AJM @HKOTDIB < =MJRN@MfN GJ><G ><>C@ <M@ NK@>DAD> OJ @<>C =MJRN@M <I? @<>C KG<OAJMH KG@<N@ >JINPGO TJPM <KKMJKMD<O@ PN@M BPD?@

Configuring the cache 2C@M@ <M@ N@Q@M<G K<M<H@O@MN PN@? OJ ADI@GT OPI@ 1.(.fN K<B@ ><>C@

Cache longevity (O DN @NN@IOD<GGT < PN@G@NN <>O OJ KMJQD?@ @Q@MT 1.(. O@HKG<O@ < NK@>DAD> ><>C@ ?PM<ODJI =T PNDIB OC@ " "'$ H<MFPK O<B 2CDN O<B DN CJR@Q@M PN@APG AJM ?@ADIDIB < Q<GD?DOT ?PM<ODJI OC<O DN ?DAA@M@IO AMJH 1.(.fN ?@A<PGO Q<GP@ (I >JI>M@O@ O@MHN < KD@>@ JA DI>GP?@ >J?@ OC<O GDNON I@RN DO@HN AMJH JOC@M NTI?D><O@? NDO@N RDGG =@I@ADO AMJH =@DIB M@AM@NC@? HJM@ M@BPG<MGT OC<I OC@ ?@A<PGO AJM OC@ M@NO JA OC@ NDO@ K@MC<KN JI>@ @Q@MT CJPM AJM @S<HKG@ (I HJNO ><N@N DOfN =@OO@M OJ PN@ < GJIB@M ><>C@ ?PM<ODJI =T ?@A<PGO NDI>@ 1.(. RDGG <POJH<OD><GGT J=NJG@O@ OC@ ><>C@ RC@I >C<IB@N C<Q@ =@@I H<?@ OJ <IT >JIO@IO 2C@ K<B@ ><>C@ DN ?@ADI@? <N CJPMN RCD>C ><I =@ HJ?DAD@? =T >C<IBDIB OC@ >JINO<IO _DUREE_CACHE_DEFAUT <N DI OCDN @S<HKG@ RC@M@ DO DN <NNDBI@? OJ JI@ HJIOC ?<TN define('_DUREE_CACHE_DEFAUT', 24*3600*30);

223


Cache size 1.(. JMB<IDN@N DON@GA NJ OC<O OC@ ><>C@ ?J@N IJO @S>@@? < >@MO<DI KM@?@O@MHDI@? H<SDHPH NDU@ N@O OJ +! =T ?@A<PGO 2C@ BGJ=<G Q<MD<=G@ $GLOBALS['quota_cache'] DN PN@? OJ >C<IB@ OCDN ?@A<PGO Q<GP@ <N NCJRI DI OCDN @S<HKG@ RCD>C N@ON OC@ PKK@M GDHDO OJ +! $GLOBALS['quota_cache'] = 100;

Cache validity ADI<G A<>DGDOT DN KMJQD?@? AJM ?@Q@GJKH@IO JM ?@=PBBDIB M@<NJIN RCD>C ><I =@ PN@? OJ HJ?DAT OC@ JK@M<ODJI JM PN<B@ JA OC@ ><>C@ >JINO<IO I<H@? _NO_CACHE DN PN@? AJM OCDN KPMKJN@ JM NDHKGT PN@ OC@ ,J"<>C@ KGPBDI // never use the cache // and don't even create the cache files define('_NO_CACHE', -1); // do not use the cache file, // but store the results of the calculation in the file cache define('_NO_CACHE', 1); // always use the cache files if they exist // if they don't, then calculate them define('_NO_CACHE', 0);

224


# Functionalities

Periodic tasks (cron) 2C@ BYID@ ?DM@>OJMT %M@I>C AJM RDU<M? <HJIB JOC@M OCDIBN DN PN@? OJ NOJM@ OC@ K@MDJ?D> O<NFN HJM@ B@I@M<GGT M@A@MM@? OJ <N >MJI O<NFN

How cron jobs are run (O HPNO =@ NOM@NN@? OC<O NP>C >MJI EJ=N RDGG IJO MPI <O <GG DA IJ JI@ @Q@M QDNDON OC@ K<B@N OC<O C<Q@ OC@ #SPIP_CRON O<B @H=@??@? OC@T <M@ IJO >MJI EJ=N N>C@?PG@? JI OC@ N@MQ@M <N HDBCO =@ <NNPH@? OC@T <M@ NDHKGT KMJ>@?PM@N OC<O <M@ MPI DIO@MHDOO@IOGT <I? OMDBB@M@? =T OC@ <>ODQDOT JA QDNDON OJ OC@ R@=NDO@ K<B@N OC@HN@GQ@N 2C@ O<NFN OJ =@ @S@>PO@? <M@ ><GG@? @<>C ODH@ < NDO@ QDNDOJM QD@RN OC@ K<B@ QDNDOJMfN QD@RDIB JA < K<B@ JIGT @S@>PO@N < NDIBG@ >MJI O<NF AJM @<>C K<B@ ><GG@? DA OC@M@ DN <>OP<GGT JI@ OJ =@ KMJ>@NN@? 'JR@Q@M AJM O<NFN OJ =@ ><GG@? OC@ #SPIP_CRON O<B HPNO =@ KM@N@IO DI OC@ K<B@ O@HKG<O@ 2CDN O<B M@OPMIN <I @HKOT DH<B@ =PO RDGG MPI OC@ O<NF KMJ>@NNDIB N>MDKO O@SO =MJRN@M <GNJ MPIN OC@ K@MDJ?D> O<NFN DA OC@ O<B DN IJO KM@N@IO 2J ><GG OC@ cron TJP JIGT I@@? OJ @S@>PO@ OC@ cron() API>ODJI 2CDN API>ODJI O<F@N <I <MBPH@IO NK@>DATDIB OC@ IPH=@M JA N@>JI?N RCD>C HPNO @G<KN@ =@AJM@ <IJOC@M O<NF ><I =@ G<PI>C@? N@>JI?N =T ?@A<PGO "<GGN PNDIB #SPIP_CRON <M@ <KKGD@? @Q@MT N@>JI?N RDOC OC@ AJGGJRDIB >J?@ cron(2);

Declaring a cron task 2J ?@>G<M@ < O<NF TJP I@@? OJ NK@>DAT DON I<H@ <I? AM@LP@I>T DI N@>JI?N PNDIB OC@ taches_generales_cron KDK@GDI@ function myplugin_general_cron_jobs($taches){ $taches['nom'] = 24*3600; // once per day, every day }

225


2CDN O<NF RDGG =@ ><GG@? <O OC@ <KKMJKMD<O@ ODH@ 2C@ KMJ>@NN@N <M@ KG<>@? DI < ADG@ DI OC@ genie/ ?DM@>OJMT RDOC OC@ N<H@ I<H@ <N OC@ name.php O<NF <I? DI>GP?DIB < genie_name_dist() API>ODJI 2C@ API>ODJI DN K<NN@? OC@ ?<O@ <O RCD>C DN G<NO K@MAJMH@? OC<O O<NF <N <I <MBPH@IO (O HPNO M@OPMI < IPH=@M \ IPGG DA OC@ O<NF C<N IJOCDIB OJ ?J \ KJNDODQ@ DA OC@ O<NF C<N =@@I MPI \ I@B<ODQ@ DA OC@ O<NF NO<MO@? =PO >JPG? IJO >JHKG@O@ 2CDN H<F@N DO KJNND=G@ OJ MPI O<NFN DI =<O>C@N OJ <QJD? timeouts JI .'. N>MDKO @S@>PODJIN =@><PN@ OC@ KMJ>@NN@N MPI OJJ GJIB (I NP>C ><N@N OC@ I@B<ODQ@ IPH=@M DI?D><O@? >JMM@NKJI?N OJ OC@ IPH=@M JA N@>JI?N JA DIO@MQ<G =@AJM@ OC@ I@SO N>C@?PG@? O<NF MPI

Example 2CDN @S<HKG@ DN NDHKG@ JMDBDI<ODIB AMJH 1.(.fN H<DIO@I<I>@ O<NFN DI OC@ genie/maintenance.php ADG@ NDI>@ DO @S@>PO@N API>ODJIN <I? <GR<TN M@OPMIN 1 DI?D><ODIB OC<O OC@ <>ODJI C<N =@@I MPI // Various maintenance tasks function genie_maintenance_dist ($t) { // (re)set .htaccess with deny from all // for the two nominated directories are inaccessible through http include_spip('inc/acces'); verifier_htaccess(_DIR_ETC); verifier_htaccess(_DIR_TMP); // Confirm that neither table crashed if (!_request('reinstall')) verifier_crash_tables(); return 1; }

226


Forms 1.(. KMJQD?@N < NDHKG@ <I? KJR@MAPG KMJ>@NN OJ H<I<B@ AJMHN ><GG@? "42 "C<MB@M 4YMDAD@M 2M<DO@M D @ *J<? 4@MDAT .MJ>@NN (O =M@<FN ?JRI < AJMH DIOJ AJPM K<MON \ < QD@R RCD>C DN =<ND><GGT < 1.(. O@HKG<O@ >JIO<DIDIB OC@ '2+* >J?@ JA OC@ AJMH >JMM@NKJI?DIB OJ formulaires/{nom}.html

\ <I? OCM@@ .'. API>ODJIN OJ GJ<? OC@ AJMHfN Q<MD<=G@N Q@MDAT OC@ NP=HDOO@? @G@H@ION <I? KMJ>@NN OC@ AJMH ?@>G<M@? DI OC@ formulaires/{nom}.php ADG@

227


HTML structure %JMHN <M@ NOJM@? DI OC@ formulaires/

NK@>D<G '2+* NTIO<S <GGJRN @<NT

>PNOJHDN<ODJI <I? M@PN@ JA AJMHN

Displaying the form ADG@ formulaires/joli.html DN ><GG@? AMJH < O@HKG<O@ ADG@ PNDIB OC@ NTIO<S #FORMULAIRE_JOLI RCD>C OC@I ><GGN <I? ?DNKG<TN OC@ AJMH 2C@ '2+* JA OC@ AJMH AJGGJRN < NO<I?<M? AJMH<O AJM <GG 1.(. AJMHN 2C@ AD@G?N JA OC@ AJMH <M@ NPMMJPI?@? DI < GDNO JA @G@H@ION PNDIB ul/li '2+* H<MFPK <div class="formulaire_spip formulaire_demo"> <form action="#ENV{action}" method="post"><div> #ACTION_FORMULAIRE{#ENV{action}} <ul> <li class="editer_la_demo obligatoire"> <label for="la_demo">La demo</label> <input type='text' name='la_demo' id='la_demo' value="#ENV{la_demo}" class="text" /> </li> </ul> <p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p> </div></form> </div>

%JM OC@ AJMH OJ RJMF KMJK@MGT OC@ action <OOMD=PO@ HPNO =@ KMJQD?@? =T OC@ #ENV{action} Q<MD<=G@ RCD>C DN <POJH<OD><GGT ><G>PG<O@? =T 1.(. (I OC@ N<H@ A<NCDJI OC@ #ACTION_FORMULAIRE{#ENV{action}} O<B HPNO =@ KM@N@IO <N DO ><G>PG<O@N <I? <??N OC@ N@>PMDOT F@T RCD>C RDGG =@ <POJH<OD><GGT Q@MDAD@? RC@I OC@ AJMH DN M@>@DQ@? A few comments: 2C@ AJMH DN NPMMJPI?@? =T < "11 >G<NN ><GG@? formulaire_spip <I? =T < N@>JI? RDOC DON JRI I<H@ DI OCDN ><N@ formulaire_demo 2C@ I<H@ ><I =@ M@>JQ@M@? HJM@ @<NDGT PNDIB OC@ >JIO@SO API>ODJI $,4form JM ?DM@>OGT RDOC %-0+ RCD>C >JPG? B@I@M<O@

228


# Forms

Handling errors returned 2C@ verifier() API>ODJI JA OC@ AJMH ><I M@OPMI @MMJMN DA OC@ NP=HDOO@? AD@G? >JIO@ION <M@ IJO >JMM@>O RCD>C R@ RDGG N@@ DI HJM@ ?@O<DG G<O@M 2J ?DNKG<T OC@N@ @MMJMN DI OC@ AJMHfN '2+* OC@M@ <M@ "11 >G<NN@N <I? < I<HDIB NTNO@H RCD>C <M@ @HKGJT@? O OC@ OJK JA OC@ AJMH OC@M@ <M@ B@I@M<G @MMJMN JM NP>>@NN H@NN<B@N [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]

%JM @<>C AD@G? OC@M@ DN < H@NN<B@ <I? < "11 >G<NN JI OC@ GDNO DO@H OJ QDNP<GGT O<B OC@ @MMJM 2C@ AD@G? H@NN<B@ DN ><G>PG<O@? PNDIB OC@ #ENV{erreurs} Q<MD<=G@ RCD>C KMJQD?@N <GG OC@ AD@G? @MMJMN #SET{erreurs,#ENV**{erreurs}|table_valeur{xxx}} <li class="editer_xxx obligatoire[ (#GET{erreurs}|oui)erreur]"> [<span class='erreur_message'>(#GET{erreurs})</span>] </li>

2CDN >JH=DI@N RDOC OC@ KM@QDJPN AJMH OJ BDQ@ <div class="formulaire_spip formulaire_demo"> [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] <form action="#ENV{action}" method="post"><div> #ACTION_FORMULAIRE{#ENV{action}} <ul> #SET{erreurs,#ENV**{erreurs}|table_valeur{la_demo}} <li class="editer_la_demo obligatoire[ (#GET{erreurs}|oui)erreur]"> <label for="la_demo">La demo</label> [<span class='erreur_message'>(#GET{erreurs})</span>] <input type='text' name='la_demo' id='la_demo' value="#ENV{la_demo}" /> </li>

229


</ul> <p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p> </div></form>

Field separation using fieldset 5C@I < AJMH >JIO<DIN < G<MB@ IPH=@M JA AD@G?N OC@T <M@ B@I@M<GGT =MJF@I PK DIOJ Q<MDJPN =GJ>FN @<>C FIJRI <N < fieldset DI '2+* 1P>C =GJ>FN JA AD@G?N <M@ N@LP@I>@? DIOJ ul/li OTK@ GDNON [...] <form method="post" action="#ENV{action}"><div> #ACTION_FORMULAIRE{#ENV{action}} <ul> <li class="fieldset"> <fieldset> <h3 class="legend">Section A</h3> <ul> <li> ... </li> <li> ... </li> ... </ul> </fieldset> </li> <li class="fieldset"> <fieldset> <h3 class="legend">Section B</h3> <ul> <li> ... </li> <li> ... </li> ... </ul> </fieldset> </li> </ul> <p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p> </div></form>

230


# Forms 2CDN @S<HKG@ NCJRN OC<O TJP ><I C<Q@ @H=@??@? GDNON RDOC OC@ ADMNO <li> C<QDIB OC@ "11 >G<NN JA AD@G?N@O (INO@<? JA KMJQD?DIB <legend> '2+* O<BN

< ?DAA@M@IO AJMH<O DN KMJQD?@? PNDIB <h3 class="legend"> RCD>C JAA@MN < GJO HJM@ JKKJMOPIDOT AJM "11 O<B NOTGDIB

Radio and checkbox fields 2J ?DNKG<T @G@H@IO GDNON JA M<?DJ JM >C@>F=JS >JIOMJGN OC@ NTIO<S KMJQD?@? AJM RM<KKDIB OC@ @G@H@ION PN@N < <div class="choix"></div> 2CDN AJMH<OODIB H<F@N DO KJNND=G@ OJ C<Q@ =POOJIN ?DNKG<T =@AJM@ OC@ G<=@GN JM OJ KMJQD?@ < CJMDUJIO<G M<?DJ GDNO PNDIB "11 NO<O@H@ION <li class="editer_syndication"> <div class="choix"> <input type='radio' class="radio" name='syndication' value='non' id='syndication_non'[ (#ENV{syndication}|=={non}|oui)checked="checked"] /> <label for='syndication_non'><:bouton_radio_non_syndication:></label> </div> <div class="choix"> <input type='radio' class="radio" name='syndication' value='oui' id='syndication_oui'[ (#ENV{syndication}|=={oui}|oui)checked="checked"] /> <label for='syndication_oui'><:bouton_radio_syndication:></label> </div> </li>

2J H<F@ OC@ GDNO ?DNKG<T DI CJMDUJIO<G HJ?@ PNDIB "11 EPNO H<F@ OC@ >CJDS ?DQN ?DNKG<T <N inline .formulaire_spip .editer_syndication .choix {display display:inline;}

Explaining input fields (O DN JAO@I I@>@NN<MT OJ KMJQD?@ <I @SKG<I<ODJI NJ OC<O OC@ PN@M FIJRN CJR OJ >JMM@>OGT ADGG JPO K<MOD>PG<M AD@G?N DI < AJMH 1.(. JAA@MN AJMH<ON OJ ?J OCDN =T DIN@MODIB < <p> JM <em> O<B RDOC < NK@>D<G "11 >G<NN

231


\ explicaation JI < <p> @G@H@IO DN PN@? OJ KMJQD?@ < HJM@ ?@O<DG@? @SKG<I<ODJI OC<I OC@ G<=@G JA OC@ AD@G? DI LP@NODJI \ attention JI <I <em> @G@H@IO CDBCGDBCON < ?@N>MDKODJI OC<O C<N =@@I KMJQD?@? 2J =@ PN@? RDOC HJ?@M<ODJI 2C@N@ ORJ ?@N>MDKODJIN <M@ OC@M@AJM@ <??DODJI<G OJ OC@ JOC@M JKODJIN <GM@<?T KMJQD?@? AJM <I erreur @MMJM JM < obligatoire H<I?<OJMT AD@G?

Example #SET{erreurs,#ENV**{erreurs}|table_valeur{nom}} <li class="editer_nom obligatoire[ (#GET{erreurs}|oui)erreur]"> <label for="nom"><:titre_cadre_signature_obligatoire:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] <p class='explication'><:entree_nom_pseudo:></p> <input type='text' class='text' name='nom' id='nom' value="[(#ENV**{nom})]" /> </li>

Conditional displays 2C@ charger() JM traiter() API>ODJIN ><I DI?D><O@ DA OC@ AJMH DN @?DO<=G@ JM IJO DI OC@DM M@NKJIN@N 2CDN KMJQD?@N < H@<IN JA M@>@DQDIB <I editable K<M<H@O@M DI OC@ O@HKG<O@ RCD>C ><I =@ PN@? OJ CD?@ JM ?DNKG<T OC@ AJMH <N ?@NDM@? =PO IJO OC@ @MMJM JM NP>>@NN H@NN<B@N (O DN PN@? GDF@ OCDN [(#ENV{editable}) ... contents of the <form> ... ] <div class="formulaire_spip formulaire_demo"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> #ACTION_FORMULAIRE{#ENV{action}}

232


# Forms <ul> ... </ul> <p class='boutons'><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>

For any loops in the form (A OC@M@ DN < 1.(. GJJK DIND?@ OC@ >J?@ [(#ENV{editable}) ... ] JM <IT JOC@M O<B OC@ 1.(. >JHKDG@M M@OPMIN <I @MMJM JM DI>JMM@>OGT ?DNKG<TN OC@ K<B@ NDI>@ OCDN A@<OPM@ C<N IJO =@@I @IQDN<B@? DI OC@ >PMM@IO Q@MNDJI JA OC@ O@HKG<O@ G<IBP<B@ 2J M@H@?D<O@ OCDN TJP I@@? OJ @DOC@M \ KPO OC@ GJJK DI <I DI>GP?@ <I? OC@I ><GG DO PNDIB <I <INCLURE{fond=mon/inclusion} /> \ JM PN@ OC@ !JIPS KGPBDI <I? DON "-,#(2(-, GJJK <N AJGGJRN <div class="formulaire_spip formulaire_demo"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] <BOUCLE_editable(CONDITION){si #ENV{editable}}> <form method='post' action='#ENV{action}'><div> #ACTION_FORMULAIRE{#ENV{action}} <ul> ... </ul> <p class='boutons'><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> </BOUCLE_editable> </div>

PHP processing 2C@ formulaires/{nom}.php ADG@N >JIO<DI OC@ OCM@@ >JM@ API>ODJIN M@G<O@? OJ OC@ "42 AJMHN DI 1.(. \ formulaires_{nom}_charger_dist GJ<?DIB

233


\ formulaires_{nom}_verifier_dist Q@MDATDIB <I? \ formulaires_{nom}_traiter_dist KMJ>@NNDIB

Passing arguments to the CVT functions 2C@ charger() verifier() <I? traiter() API>ODJIN OJ IJO M@>@DQ@ <IT K<M<H@O@MN =T ?@A<PGO function formulaires_x_charger_dist(){‌} function formulaires_x_verifier_dist(){‌} function formulaires_x_traiter_dist(){‌}

%JM OC@N@ API>ODJIN OJ M@>@DQ@ K<M<H@O@MN OC@T I@@? OJ =@ NP=HDOO@? <N <MBPH@ION @SKGD>DOGT RC@I ><GGDIB OC@ AJMH #FORMULAIRE_X{argument, argument, ‌}

2C@ .'. API>ODJIN M@>@DQ@ OC@ K<M<H@O@MN DI OC@ N<H@ JM?@M function formulaires_x_charger_dist($arg1, $arg2, ‌){‌} function formulaires_x_verifier_dist($arg1, $arg2, ‌){‌} function formulaires_x_traiter_dist($arg1, $arg2, ‌){‌}

,JO@ OC<O OC@M@ DN < NPKKG@H@IO<MT KJNND=DGDOT OJ PN@ OC@ API>ODJIN AJM ?TI<HD> O<BN RCD>C H<F@ DO KJNND=G@ OJ K<NN K<M<H@O@MN <POJH<OD><GGT

Example 2C@ "JHKJNDODJI KGPBDI >JIO<DIN < AJMH RCD>C M@LPDM@N < OTK@ <I? <I D?@IODAD@M (O DN ><GG@? <N AJGGJRN [(#FORMULAIRE_EDITER_COMPOSITION_OBJET{#ENV{type}, #ENV{id}})]

2C@ KMJ>@NNDIB API>ODJIN OC@M@AJM@ M@>@DQ@ OC@N@ ORJ K<M<H@O@MN function formulaires_editer_composition_objet_charger($type, $id){‌}

234


# Forms

Loading values into the forms 2C@ charger() API>ODJI H<F@N DO KJNND=G@ OJ NK@>DAT RCD>C AD@G?N NCJPG? =@ M@OMD@Q@? RC@I OC@ AJMH DN NP=HDOO@? <I? <GNJ H<F@N DO KJNND=G@ OJ ?@ADI@ OC@ ?@A<PGO Q<GP@N AJM NP>C AD@G?N 2CDN API>ODJI LPDO@ NDHKGT M@OPMIN < K<DM@? O<=G@ JA AD@G? I<H@ ?@A<PGO Q<GP@ K<DMN function formulaire_nom_charger_dist() { $valeurs = array( "field" => "default value", "another field" => "", ); return $valeurs; }

GG OC@ F@TN NK@>DAD@? RDGG =@ K<NN@? DIOJ OC@ AJMHfN '2+* O@HKG<O@ @IQDMJIH@IO 2C@N@ ?<O< <M@ OC@I M@OMD@Q@? PNDIB #ENV{field} M@A@M@I>@N N NJJI <N OC@ AJMH DN KJNO@? DO RDGG =@ OC@ Q<GP@N @IO@M@? =T OC@ PN@M RCD>C O<F@ KMDJMDOT JQ@M OC@ ?@A<PGO Q<GP@N 2C@M@ DN IJ I@@? OJ KMJO@>O OC@ NTNO@H AMJH Q<GP@N @IO@M@? OC<O >JIO<DI LPJO<ODJI H<MFN <N 1.(. <GM@<?T O<F@N ><M@ JA OC@N@ <POJH<OD><GGT ,JI@OC@G@NN AD@G?N NO<MODIB RDOC <I PI?@MN>JM@ ; <M@ IJO NP=E@>O OJ OCDN <POJH<OD> KMJ>@NNDIB RCD>C H<F@N OC@H PN@APG AJM K<NNDIB >JHKG@S Q<MD<=G@N

Authorise the display or hiding of a form %JMHN <M@ ?DNKG<T@? =T ?@A<PGO =PO DO DN KJNND=G@ OJ M@NOMD>O OCDN ?DNKG<T ?@K@I?DIB JI >@MO<DI <NNDBI@? <POCJMDNDIB ?<O< 2RJ KJNND=DGDOD@N @SDNO \ @DOC@M TJP ?JIfO R<IO OJ ?DNKG<T OC@ AJMHPG< <O <GG NJ OC@I M@OPMI < false function formulaire_nom_charger_dist() { $valeurs = array(); if (!autoriser("webmestre")) { return false; }

235


return $valeurs; }

\ JM NDHKG@ C?D@ < K<MO JA OC@ AJMH JAO@I OC@ @?DO<=G@ K<MO =T PNDIB OC@ @?DO<=G@ Q<MD<=G@ RCD>C DN OC@I C<I?G@? DI OC@ AJMH O@HKG<O@ function formulaire_nom_charger_dist() { $valeurs = array(); if (!autoriser("webmestre")) { $valeurs['editable'] = false; } return $valeurs; }

Example 2C@ >>ZN M@NOM@DIO GDHDO@? <>>@NN KGPBDI C<N < AJMH AJM <NNDBIDIB UJI@N OJ <I <POCJM DO K<NN@N OC@ AD@G?N OJ =@ M@OMD@Q@? <I? OC@DM ?@A<PGO Q<GP@N DIOJ OC@ @IQDMJIH@IO OC@ UJI@ D?@IODAD@M OC@ >JII@>O@? <POCJM <I? OC@ <POCJM OJ =@ <NNDBI@? OJ OC@ UJI@ (I <??DODJI DA OC@ <POCJM ?J@N IJO C<Q@ <?@LP<O@ MDBCON OC@ @?DO<=G@ Q<MD<=G@ DN K<NN@? <N A<GN@ function formulaires_affecter_zones_charger_dist($id_auteur){ $valeurs = array( 'zone'=>'', 'id_auteur'=>$id_auteur, 'id'=>$id_auteur ); include_spip('inc/autoriser'); if (!autoriser('affecterzones','auteur',$id_auteur)){ $valeurs['editable'] = false; } return $valeurs; }

Other preloading options 4<MDJPN JOC@M NK@>D<G K<M<H@O@MN ><I =@ N@IO OJ OC@ AJMH RC@I DO DN GJ<?@? OJ HJ?DAT DON JMDBDI<G =@C<QDJPM

236


# Forms message_ok, message_erreur 2C@ NP>>@NN H@NN<B@ DN B@I@M<GGT NPKKGD@? =T OC@ traiter API>ODJI OC@M @MMJM H@NN<B@ DN NPKKGD@? =T OC@ verifier JM traiter API>ODJIN (O DN IJI@OC@G@NN KJNND=G@ OJ NPKKGT OC@H PNDIB OC@ charger API>ODJI DI @S>@KODJI<G >DM>PHNO<I>@N

action 2CDN Q<GP@ NK@>DAD@N OC@ 30* OJ RCD>C OC@ AJMH DN KJNO@? !T ?@A<PGOH DO DN OC@ N<H@ 30* <N OC@ >PMM@IO K<B@ RCD>C H<F@N DO KJNND=G@ OJ M@?DNKG<T OC@ AJMH DA @MMJMN <M@ ?@O@>O@? %JM JOC@M Q@MT NK@>D<G PN@ ><N@N OCDN 30* ><I =@ <GO@M@?

_forcer_request 5C@I < AJMH DN NP=HDOO@? 1.(. D?@IODAD@N DO NJ <N OJ =@ <=G@ OJ C<Q@ N@Q@M<G AJMHN JA OC@ N<H@ OTK@ JI < NDIBG@ K<B@ <I? OJ JIGT KMJ>@NN OC@ JI@ OC<O C<N =@@I NP=HDOO@? 2CDN Q@MDAD><ODJI DN =<N@? JI OC@ GDNO JA <MBPH@ION K<NN@? OJ OC@ %-0+3* (0$;666 O<B (I NJH@ ><N@N RC@M@ OC@N@ <MBPH@ION >C<IB@ <AO@M ?<O< @IOMT 1.(. ><I H<F@ < HDNO<F@ <I? <NNPH@ OC<O OC@ ?<O< >JH@N AMJH <IJOC@M AJMH 1@I?DIB _forcer_request <N true DI?D><O@N OJ 1.(. OC<O DO NCJPG? IJO K@MAJMH OCDN Q@MDAD><ODJI <I? JPBCO OJ KMJ>@NN OC@ @IOMT ?<O< DI @Q@MT >DM>PHNO<I>@

_action (A OC@ KMJ>@NNDIB JA OC@ AJMH HPNO ><GG < ?DM@>OJMT API>ODJI actions/ KMJO@>O@? =T securiser_action() DO DN PN@APG OJ NK@>DAT OC@ I<H@ JA OC@ <>ODJI NJ OC<O 1.(. <POJH<OD><GGT NPKKGD@N OC@ >JMM@NKJI?DIB KMJO@>ODJI C<NC

_hidden 2C@ Q<GP@ JA OCDN AD@G? RDGG =@ <??@? ?DM@>OGT OJ OC@ '2+* JA OC@ B@I@M<O@? AJMH DO DN JAO@I PN@? OJ <?? CD??@I OTK@ DIKPO AD@G?N RCD>C NCJPG? =@ RMDOO@I JPO @SKGD>DOGT $valeurs['_hidden'] = "<input type='hidden' name='secret' value='shhhhh !' />";

237


Pipelines used for loading formulaire_charger 2CDN KDK@GDI@ H<F@N DO KJNND=G@ OJ HJ?DAT OC@ O<=G@ JA Q<GP@N M@OPMI@? =T OC@ charger API>ODJI AJM < AJMH DO DN ?@N>MD=@? DI OC@ ><KO@M <=JPO KDK@GDI@N AJMHPG<DM@;>C<MB@M K

paramètre _pipeline 2CDN K<M<H@O@M H<F@N DO KJNND=G@ OJ HJ?DAT OC@ '2+* >J?@ KP=GDNC@? =T H<F@ DN K<NN OCMJPBC < BDQ@I KDK@GDI@ 2CDN ?<O< N@IO DI OC@ GJ<?DIB O<=G@ H<F@N DO KJNND=G@ OJ NK@>DAT OC@ I<H@ JA < KDK@GDI@ <I? OC@ <MBPH@ION OJ =@ K<NN@? OJ DO (O RDGG =@ ><GG@? <O OC@ ODH@ OC@ AJMH O@SO DN ?DNKG<T@?

Example 1.(. PN@N OC@ K<M<H@O@M DI < B@I@MD> A<NCDJI =T H<FDIB <GG KP=GD><ODJI AJMHN OC<O ><GG OC@ formulaires_editer_objet_charger() API>ODJI K<NN OCMJPBC < KDK@GDI@ I<H@? editer_contenu_objet 2CDN KDK@GDI@ DN ?@N>MD=@? DI DON JRI NK@>D<G <MOD>G@ @?DO@M;>JIO@IP;J=E@O K $contexte['_pipeline'] = array('editer_contenu_objet', array('type'=>$type, 'id'=>$id));

2C@ "%& KGPBDI PN@N OCDN K<M<H@O@M OJ H<F@ <GG OC@ "%& AJMHN RMDOO@I <N "42 AJMHN K<NN OCMJPBC OC@ editer_contenu_formulaire_cfg KDK@GDI@ $valeurs['_pipeline'] = array('editer_contenu_formulaire_cfg', 'args'=>array( 'nom'=>$form, 'contexte'=>$valeurs, 'ajouter'=>$config->param['inline']) );

2C@ KDK@GDI@ OC<O "%& OC@I PN@N OJ >JGG@>O OC@ >JIO@ION IJO I@>@NN<MT DI OC@ OM<INHDOO@? '2+* // pipeline onf the display of content // to delete the CFG parameters from the form

238


# Forms function cfg_editer_contenu_formulaire_cfg($flux){ $flux['data'] = preg_replace('/(<!-- ([az0-9_]\w+)(\*)?=)(.*?)-->/sim', '', $flux['data']); $flux['data'] .= $flux['args']['ajouter']; return $flux; }

Checking the submitted values 2C@ verifier() API>ODJI DN PN@? OJ <I<GTN@ OC@ Q<GP@N KJNO@? <I? M@OPMI @MMJMN OC<O H<T @SDNO >JI>@MIDIB OC@ ?<O< @IO@M@? 2J ?J OCDN OC@ API>ODJI M@OPMIN < K<DM@? AD@G? @MMJM H@NN<B@ <MM<T JA OC@ JAA@I?DIB AD@G?N <I? <GNJ KJNND=GT < B@I@M<G H@NN<B@ AJM OC@ RCJG@ JA OC@ AJMH PNDIB OC@ H@NN<B@;@MM@PM F@T 2C@ AJMH KMJ>@NNDIB API>ODJI RDGG =@ ><GG@? JI -,*7 DA OC@ O<=G@ M@OPMI@? DN @HKOT (A DO DN IJO OC@ AJMH DN M@?DNKG<T@? RDOC OC@ Q<MDJPN @MMJM H@NN<B@N OC<O C<Q@ =@@I K<NN@? function formulaire_nom_verifier_dist() { $erreurs = array(); foreach(array('titre','texte') as $champ) { if (!_request($champ)) { $erreurs[$champ] = "This data is mandatory!"; } } if (count($erreurs)) { $erreurs['message_erreur'] = "An error occured in your data entry"; } return $erreurs; }

2C@ AJMHPG<DM@;Q@MDAD@M K KDK@GDI@ DN PN@? OJ NPKKG@H@IO OC@ GDNO JA M@OPMI@? @MMJMN

239


Example 2C@ HDN %MD@I?N KGPBDI C<N < AJMH AJM DIQDODIB K@JKG@ OJ =@>JH@ TJPM AMD@I? 2C@ verifier() API>ODJI >C@>FN OC<O OC@ H<DG <??M@NN JA OC@ K@MNJI =@DIB DIQDO@? DN >JMM@>OGT AJMH<OO@? function formulaires_inviter_ami_verifier_dist(){ $erreurs = array(); foreach(array('email') as $obli) if (!_request($obli)) $erreurs[$obli] = (isset($erreurs[$obli])?$erreurs[$obli]:'') . _T('formulaires:info_obligatoire_rappel'); if ($e=_request('email')){ if (!email_valide($e)) $erreurs['email'] = (isset($erreurs['email'])?$erreurs['email']:'') . _T('formulaires:email_invalide'); } return $erreurs; }

Executing the processes 5C@I@Q@M OC@ Q@MDAD><ODJI API>ODJI K ?J@NIfO M@OPMI <I @MMJM OC@ AJMH OC@I HJQ@N JI OJ OC@ traiter() KMJ>@NNDIB API>ODJI (O DN DI OCDN API>ODJI OC<O OC@ ?@NDM@? JK@M<ODJIN NCJPG? =@ K@MAJMH@? RDOC OC@ ?<O< AMJH OC@ AJMH N@I? <I @H<DG PK?<O@ OC@ ?<O<=<N@ @O> 2C@ API>ODJI HPNO M@OPMI <I <NNJ>D<ODQ@ O<=G@ function formulaires_nom_traiter(){ // Execute the processes // Return values return array( 'message_ok' => 'Excellent !', // or perhaps 'message_erreur' => 'Sorry, an error has occurred.' ); }

240


# Forms Important values '@M@ <M@ NJH@ JA OC@ Q<GP@N AM@LP@IOGT M@OPMI@? \ message_ok DN PN@? OJ M@OPMI < KG@<N<IO H@NN<B@ OJ OC@ PN@M DI?D><ODIB OC<O @Q@MTOCDIB KMJ>@NN@? IJMH<GGT \ message_erreur JI OC@ JOC@M C<I? DN PN@? OJ M@OPMI <I @MMJM H@NN<B@ RC@I OC@ KMJ>@NNDIB ?D?IfO RJMF >JMM@>OGT \ editable <N AJM GJ<?DIB OCDN DN PN@? OJ ?DNKG<T JM CD?@ OC@ @?DO<=G@ KJMODJI JA OC@ AJMH !T ?@A<PGO DO DN N@O OJ false =PO TJP H<T <NNDBI DO < Q<GP@ JA true DA TJPM AJMH ><I =@ PN@? N@Q@M<G ODH@N DI < MJR \ redirect DN < 30* RCD>C DN PN@? OJ O@GG 1.(. RCD>C K<B@ DO NCJPG? M@?DM@>O OJ <AO@M KMJ>@NNDIB OC@ AJMH !T ?@A<PGO OC@ K<B@ RDGG GJJK =<>F OJ DON@GA

The formulaire_traiter (form_process) pipeline -I>@ OC@ formulaires_nom_traiter API>ODJI C<N >JHKG@O@? OC@ AJMHPG<DM@;OM<DO@M K KDK@GDI@ DN @S@>PO@? OC@M@=T @I<=GDIB JOC@M KGPBDIN OJ >JHKG@O@ OC@ KMJ>@NN@N AJM OCDN AJM

Processing without AJAX (A < AJMH DN ><GG@? PNDIB ) 6 =PO OC@I M@?DM@>ON OJ <IJOC@M K<B@ <AO@M ADIDNCDIB DON KMJ>@NN@N OCDN RJPG? M@LPDM@ )<Q<N>MDKO OMD>FN H<I<B@? =T 1.(. OJ ><KOPM@ OC<O M@?DM@>ODJI <I? @AA@>ODQ@GT N@I? OC@ =MJRN@M OJ <IJOC@M 30* DINO@<? JA OC@ IJMH<G M@NKJIN@ 5C@I@Q@M < M@?DM@>ODJI DN >@MO<DI DO DN KJNND=G@ OJ KM@Q@IO ) 6 AJM OC@ AJMHfN KMJ>@NNDIB RCDG@ NODGG H<DIO<DIDIB DO AJM OC@ Q@MDAD><ODJI KC<N@ 2CDN H@<IN OC<O OC@ AJMH RJPG? =@ M@GJ<?@? DI OC@ @Q@IO JA <I @MMJM DI verifier() =PO DA OC@ KMJ>@NNDIB DN @S@>PO@? OC@I OC@ RCJG@ K<B@ RDGG =@ DHH@?D<O@GT M@GJ<?@? 2J ?J OCDN

TJP HPNO ><GG OC@ refuser_traiter_formulaire_ajax()API>ODJI right at the start JA OC@ KMJ>@NN@N function formulaires_nom_traiter(){ // Prevent AJAX processing since we know that the form will redirect elsewhere refuser_traiter_formulaire_ajax(); // Execute the processes

241


// Return values return array( 'redirect' => 'Another URL' ); }

Examples +<I<B@H@IO JA OC@ "42 AJMHN ?@N@MQ@N NJH@ ?@?D><O@? @S<HKG@N JA DON JRI

Translate anything 2CDN NDHKG@ @S<HKG@ RDGG >M@<O@ < NH<GG AJMH OC<O ><GGN <I @SO@MI<G OM<ING<ODJI N@MQD>@ OJ OM<ING<O@ OC@ >JIO@IO @IO@M@? JI OC<O AJMH 2C@ M@NPGO RDGG =@ ?DNKG<T@? PI?@MI@<OC OC@ NJPM>@ O@SO OC<O R<N @IO@M@? 2C@ AJMH RDGG =@ ><GG@? OM<ING<O@;<ITOCDIB <I? ><I OC@I =@ ><GG@? DI < M@BPG<M 1.(. O@HKG<O@ ADG@ PNDIB OC@ O<B #FORMULAIRE_TRANSLATE_ANYTHING JM RDOCDI <I <MOD>G@ =T PNDIB <formulaire|translate_anything> N RDOC HJNO "42 AJMHN DO JK@M<O@N PNDIB ORJ ADG@N \ formulaires/translate_anything.html AJM OC@ '2+* N@>ODJI \ formulaires/translate_anything.php AJM OC@ .'. <I<GTNDN <I? KMJ>@NNDIB API>ODJIN

The HTML template 2C@ O@HKG<O@ AJM OC@ AJMH RDGG M@>@DQ@ ORJ ?<O< @IOMT AD@G?N JA OC@ textarea OTK@ OC@ ADMNO AJM RMDODIB OC@ >JIO@IO OJ =@ OM<ING<O@? <I? OC@ N@>JI? OJ ?DNKG<T OC@ M@NPGON JA OC@ OM<ING<ODJI JI>@ OC@ ><G>PG<ODJI C<N =@@I K@MAJMH@? 2CDN N@>JI? AD@G? DN JIGT ?DNKG<T@? RC@I DO C<N >JIO@IO <div class="formulaire_spip formulaire_#FORM"> [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] <form action="#ENV{action}" method="post"><div> #ACTION_FORMULAIRE{#ENV{action}} <ul>

242


# Forms

[(#SET{erreurs,[(#ENV**{erreurs}|table_valeur{traduire})]})] <li class="editer_traduire obligatoire[ (#GET{erreurs}|oui)erreur]"> <label for="traduire">Source text</label> [<span class='erreur_message'>(#GET{erreurs})</span>] <textarea name='traduire' id='champ_traduire'>#ENV{traduire}</textarea> </li> [ [(#SET{erreurs,[(#ENV**{erreurs}|table_valeur{traduction})]})] <li class="editer_traduction[ (#GET{erreurs}|oui)erreur]"> <label for="traduction">Translated text</label> [<span class='erreur_message'>(#GET{erreurs})</span>] <textarea name='traduction' id='champ_traduction'>(#ENV{traduction})</textarea> </li> ] </ul> <p class="boutons"><input type="submit" class="submit" value="Translate" /></p> </div></form> </div>

2C@ ORJ AD@G?N I<H@? OM<?PDM@ <I? OM<?P>ODJI NJPM>@ <I? ?@NODI<ODJI AJM OC@ OM<ING<ODJ, 2C@ N<H@ O@HKG<O@ >JPG? =@ RMDOO@I PNDIB OC@ 1<DND@N KGPBDI RDOC OC@ >JIO@IO =@OR@@I <ul> <I? </ul> M@KM@N@IO@? <N AJGGJRN <ul> [(#SAISIE{textarea, traduire, obligatoire=oui, label=Traduire})] [(#ENV{traduction}|oui) [(#SAISIE{textarea, traduction, label=Traduction})] ] </ul>

243


Loading, verifying and processing 2C@

GJ<?DIB

JA

OC@

AJMH

?@>G<M@?

DI

OC@

formulaires/

translate_anything.php ADG@ HPNO NK@>DAT OC<O DN DN <??DIB OC@ ORJ OM<?PDM@ <I? OM<?P>ODJI AD@G?N DIOJ OC@ O@HKG<O@fN >JIO@SO function formulaires_translate_anything_charger_dist() { $contexte = array( 'traduire' => '', 'traduction' => '', ); return $contexte; }

2C@ Q@MDAT API>ODJI NDHKGT I@@?N OJ O@NO DA OC@M@ C<N <>OP<GGT =@@I NJH@ >JIO@IO @IO@M@? DIOJ OC@ OM<?PDM@ AD@G? <I? M@OPMI <I @MMJM DN OC@M@ C<NIfO function formulaires_translate_anything_verifier_dist() { $erreurs = array(); if (!_request('traduire')) { $erreurs['message_erreur'] = "You have not entered any text to translate - is your keyboard broken?"; $erreurs['traduire'] = "Normally that is how you enter text, isn't it?"; } return $erreurs; }

(O DN RDOC OC@ KMJ>@NN API>ODJI OC<O OCDIBN IJR B@O < GDOOG@ >JHKGD><O@? 2C@ >JIO@IO I@@?N OJ =@ N@IO OJ < M@HJO@ N@MQD>@ R@ PN@ Google Translate DI OCDN @S<HKG@ OC@ M@OPMI ?<O< M@OMD@Q@? <I? KMJ>@NN@? <I? OC@I ?DNKG<T@? JI JPM AJMH 2J ?J <GG OCDN OC@ N>MDKON NO<MON =T ><G>PG<ODIB OC@ 30* AJM OC@ M@HJO@ N@MQD>@ =<N@? JI OC<O N@MQD>@fN KP=GDNC@? .( 5@ PN@ 1.(.fN parametre_url .'. API>ODJI OJ >G@<IGT <?? OC@ Q<MD<=G@N OJ OC@ N@MQD>@fN 30* 2C<IFN OJ <IJOC@M API>ODJI recuperer_page RCD>C DN PN@? OJ M@OMD@Q@ OC@ >J?@ M@OPMI@? =T < ><GG OJ <I 30* OC@ N@MQD>@fN M@OPMI@? ?<O< DN NOJM@? DI OC@ $trad Q<MD<=G@

244


# Forms 2C@ N@MQD>@ M@OPMIN OC@ ?<O< AJMH<OO@? DI )1-, AJMH<O NJ DO HPNO =@ @SOMD><O@? PNDIB OC@ json_decode API>ODJI ?@K@I?DIB JI OC@ DIAJMH<ODJI M@OPMI@? OC@ OM<ING<ODJI RDGG =@ ?@O@MHDI@? <N C<QDIB =@@I NP>>@NNAPG JM IJO 2C@ H@NN<B@ <?<KON ?@K@I?DIB JI OCDN JPO>JH@ // http://ajax.googleapis.com/ajax/services/language/ translate?v=1.0&q=hello%20world&langpair=en%7Cit define('URL_GOOGLE_TRANSLATE', "http://ajax.googleapis.com/ ajax/services/language/translate"); function formulaires_translate_anything_traiter_dist() { // create the google api URL $texte = _request('traduire'); $url = parametre_url(URL_GOOGLE_TRANSLATE, 'v', '1.0', '&'); $url = parametre_url($url, 'langpair', 'fr|en', '&'); $url = parametre_url($url, 'q', $texte, '&'); // load the text as translated by google (returned as JSON code) include_spip('inc/distant'); $trad = recuperer_page($url); // warning: uses PHP 5.2 $trad = json_decode($trad, true); // true = retour array et non classe // retrieve the results if OK if ($trad['responseStatus'] != 200) { set_request('traduction', ''); return array( "editable" => true, "message_erreur" => "Bad luck, Google couldn't help!" ); } // send the data to be loaded set_request('traduction', $trad['responseData']['translatedText']); // message return array( "editable" => true, "message_ok" => "And here's the translation!", ); }

245


2C@ set_request() API>ODJIN AJM>@N OC@ N<QDIB JA < Q<MD<=G@ Q<GP@ OC<O ><I OC@I G<O@M =@ M@OMD@Q@? PNDIB _request() 2CDN <GGJRN OC@ I@SO GJ<?DIB JA OC@ AJMH OJ M@OMD@Q@ OC@ Q<GP@ JA OC@ OM<?P>ODJI AD@G? OJ N@I? DO DIOJ OC@ O@HKG<O@fN >JIO@SO Note: (O DN KJNND=G@ OC<O < >G@<I@M H@OCJ? >JPG? =@ ?@Q@GJK@? AJM APOPM@ Q@MNDJIN JA 1.(. DI JM?@M OJ OM<INDO OC@ ?<O< =@OR@@I OC@ KMJ>@NNDIB <I? GJ<?DIB KC<N@N PNDIB < I@R K<M<H@O@M DI OC@ KMJ>@NNDIB M@OPMI O<=G@

Calculating the day-of-the-year 2CDN NCJMO @S<HKG@ H<F@N DO KJNND=G@ OJ ><G>PG<O@ <I? ?DNKG<T OC@ ?<T JA OC@ T@<M AJM < ?<O@ @IO@M@? JI < AJMH 2CDN AJMH RDGG =@ I<H@? ><G>PG<O@;?JT <I? ><I OC@I =@ ><GG@? AMJH RDOCDI < 1.(. O@HKG<O@ ADG@ RDOC #FORMULAIRE_CALCULATE_DOY JM RDOCDI OC@ O@SO JA <I <MOD>G@ =T PNDIB <formulaire|calculate_doy>

Implementation 2C@ ORJ ADG@N I@>@NN<MT RDGG =@ >M@<O@? <N AJGGJRN \ formulaires/calculate_doy.html AJM OC@ '2+* N@>ODJI \ formulaires/calculate_doy.php AJM OC@ .'. <I<GTNDN <I? KMJ>@NNDIB "42 API>ODJIN

The HTML template file 2C@ formulaires/calculate_doy.html ADG@ >JIO<DIN OC@ AJGGJRDIB >J?@

M@NK@>ODIB OC@ M@>JHH@I?@? '2+* NOMP>OPM@ <I? "11 >G<NN@N <div class="formulaire_spip formulaire_#FORM"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}|oui) <form name="formulaire_#FORM" action="#ENV{action}" method="post"><div> #ACTION_FORMULAIRE{#ENV{action}} <ul> <li class="editer_date_jour obligatoire[ (#ENV**{erreurs}|table_valeur{message}|oui)erreur]">

246


# Forms <label for="champ_date_jour">Date (dd/mm/yyyy) :</label> [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{message})</span>] <input type="text" id="champ_date_jour" name="date_jour" value="[(#ENV{date_jour})]" /> </li> </ul> <p class="boutons"> <input type="submit" name="ok" value="Calculate" /> </p> </div></form> ] </div>

,JO@ OC<O OC@ 1<DND@N KGPBDI ><I =@ PN@? OJ RMDO@ OC@ AJMHfN AD@G?N PNDIB < #SAISIE O<B <I? NK@>DATDIB OC@ OTK@ <I? I<H@ JA OC@ Q<MD<=G@ PN@? AJGGJR@? =T RCD>C@Q@M JKODJI<G K<M<H@O@MN <M@ PN@APG #JDIB NJ RJPG? KMJ?P>@ OC@ >J?@ N@>ODJI =@OR@@I <ul> <I? </ul> <ul> [(#SAISIE{input, date_jour, obligatoire=oui, label="Date (dd/ mm/yyyy) :"})] </ul>

Loading, verifying and processing 2C@ formulaires/calculate_doy.php ADG@ >JIO<DIN OC@ OCM@@ AJGGJRDIB API>ODJIN 2C@ GJ<?DIB ADG@ GDNON OC@ Q<MD<=G@N RCD>C RDGG =@ K<NN@? DIOJ OC@ O@HKG<O@ @IQDMJIH@IO <I? DIDOD<GDN@N OC@DM ?@A<PGO Q<GP@N 2C@M@ DN IJ ?@A<PGO ?<O@ C@M@

=PO DO RJPG? =@ KJNND=G@ OJ NK@>DAT JI@ DA TJP R<IO@? function formulaires_calculate_doy_charger_dist (){ $valeurs = array( 'date_jour' => '' ); return $valeurs; }

247


2C@ Q@MDAT API>ODJI >C@>FN OJ H<F@ NPM@ OC@ >JHKPGNJMT AD@G?N <M@ @IO@M@? <I? OC<O OC@ ?<O@ AJMH<O <KK@<MN OJ =@ >JMM@>O function formulaires_calculate_doy_verifier_dist (){ $erreurs = array(); // compulsory fields foreach(array ('date_jour') as $obligatoire) { if (!_request($obligatoire)) $erreurs[$obligatoire] = 'This field is compulsory'; } // correct date format if (!isset($erreurs['date_jour'])) { list($jour, $mois,U $annee) = explode('/', _request('date_jour')); if (!intval($jour) or !intval($mois) or !intval($annee)) { $erreurs['date_jour'] = "Unknown date format."; } } if (count($erreurs)) { $erreurs['message_erreur'] = 'Your data contains errors!'; } return $erreurs; }

(A OC@ Q@MDAD><ODJIN <M@ >JMM@>O IJ @MMJMN AJPI? OC@I OC@ KMJ>@NN API>ODJI DN @S@>PO@? 2C@ AJMH DN ?@>G<M@? <N M@ @?DO<=G@ RCD>C H@<IN OC<O < I@R ?<O@ Q<GP@ ><I =@ @IO@M@? <B<DI DHH@?D<O@GT <AO@M OC@ Q<GD?<ODJI function formulaires_calculate_doy_traiter_dist (){ $date_jour = _request('date_jour'); $retour = array('editable' => true); if ($doy = calculate_doy($date_jour)) { $retour['message_ok'] = "The day of the year for $date_jour is $doy"; } else { $retour['message_erreur'] = "DOY calculation error!"; } return $retour; }

248


# Forms -A >JPMN@ OCDN NODGG JHDON OC@ API>ODJI PN@? OJ ><G>PG<O@ OC@ ?<T JA OC@ T@<M =PO < A@R NDHKG@ GDI@N JA .'. RDGG ADS OC<O 2CDN API>ODJI ><I =@ DHKG@H@IO@? DI OC@ N<H@ ADG@ <N OC@ OCM@@ KM@QDJPN API>ODJIN function calculate_doy($date_jour) { list($jour, $mois, $annee) = explode('/', $date_jour); if ($time = mktime( 0, 0, 0, $mois, $jour, $annee)) { return date('z', $time); } return false; }

249



SQL access 1.(. ><I M@<? RMDO@ <I? =@ =<N@? JI OC@ AJGGJRDIB ?<O<=<N@ H<I<B@H@IO NTNO@HN +T1/* .JNO&M@N <I? 1/*DO@ GOCJPBC OC@DM LP@MT NTIO<S DN IJO OC@ N<H@ OC<IFN OJ < N@O JA NK@>D<G 1/* <=NOM<>O API>ODJIN 1.(. <GGJRN OC@ ?@Q@GJKH@IO JA ?<O<=<N@ DIO@M<>ODJIN DI?@K@I?@IO JA OC@ NTNO@HN

251


Modification of the SQL manager 1.(. @NN@IOD<GGT <KKGD@N OC@ 1/* NO<I?<M?N =PO RDGG <GNJ PI?@MNO<I? < G<MB@ KJMODJI JA OC@ +T1/* K<MOD>PG<MDOD@N OC<O DO RDGG OC@I OM<ING<O@ AJM O@C 1/*DO@ JM .JNO&M@N ?<O<=<N@ H<I<B@MN RC@I I@>@NN<MT 1.(. ?J@N IJO I@@? <IT NK@>D<G ?@>G<M<ODJI JOC@M OC<I OC@ KM@N@I>@ JA OC@ >JII@>ODJI ADG@ I@>@NN<MT AJM OC@ ?<O<=<N@ DI LP@NODJI DI JM?@M OJ M@<? <I? @SOM<>O ?<O< AMJH NP>C ?<O<=<N@N M@B<M?G@NN JA RC@OC@M OCDN DN OCMJPBC OC@ PN@ JA O@HKG<O@N JM QD< .'. OCMJPBC OC@ 1/* <=NOM<>ODJI API>ODJIN @IQDN<B@? <I? KM@ADS@? RDOC sql_

Declaring table structures (I >@MO<DI ><N@N K<MOD>PG<MGT AJM KGPBDIN RCD>C <?? O<=G@N DIOJ OC@ ?<O<=<N@ JM <?? >JGPHIN DIOJ < O<=G@ DO DN I@>@NN<MT OJ ?@>G<M@ OC@ 1/* NOMP>OPM@ JA OC@ O<=G@ NDI>@ DO DN =<N@? JI OC@N@ ?@>G<M<ODJIN OC<O 1.(. >JINOMP>ON DON LP@MD@N OJ >M@<O@ JM PK?<O@ OC@ O<=G@N 1.(. RDGG OC@M@AJM@ <OO@HKO OJ HJ?DAT OC@ ?@>G<M<ODJI OJ OC@ ?<O<=<N@ H<I<B@M =@DIB PN@? =T >JIQ@MODIB >@MO<DI NTIO<S OC<O DN K<MOD>PG<M OJ +T1/* N NP>C DA TJP ?@>G<M@ < O<=G@ RDOC <I <POJ DI>M@H@IO JI OC@ KMDH<MT F@T <N KMJN>MD=@? =T 1.(. <N DI @>MDM@ =<N@ N@MD<G KCK <I? @>MDM@ =<N@ <PSDGD<DM@N KCK =T PNDIB OC@ 1.(. NK@>DAD> KDK@GDI@N ?@>G<M@M;O<=G@N;KMDI>DK<G@N K <I? ?@>G<M@M;O<=G@N;<PSDGD<DM@N K 1.(. RDGG OC@I OM<ING<O@ OC@ <POJ DI>M@H@IO NTIO<S NJ OC<O DO DN <KKMJKMD<O@GT <>>JHHJ?<O@? RC@I PNDIB .JNO&M@N JM 1/*DO@ (I OC@ N<H@ A<NCDJI < ?@>G<M<ODJI AJM <I $,3+ AD@G? NK@>DAD> OJ +TNLG RDGG C<Q@ OC@ N<H@ API>ODJI<GDOT PI?@M .& JM 1/*DO@ 2C@ DIQ@MN@ JI OC@ JOC@M C<I? DN IJO OMP@ .JNO&M@N NK@>DAD> ?@>G<M<ODJIN RDGG IJO =@ PI?@MNOJJ? =T OC@ JOC@M ?<O<=<N@N

252


# SQL access

Table updates and installation 5C@I 1.(. DINO<GGN DON@GA DO PN@N K<MOD>PG<M API>ODJIN OJ DINO<GG JM PK?<O@ DON O<=G@N .GPBDIN H<T <GNJ PN@ OC@N@ API>ODJIN DI OC@DM JRI DINO<GG<ODJI MJPODI@N 2C@N@ API>ODJIN <M@ ?@>G<M@? DI OC@ @>MDM@ =<N@ >M@<O@ KCK ADG@

Creating tables 2C@ creer_base($connect='') API>ODJI >M@<O@N O<=G@N HDNNDIB DI OC@ ?<O<=<N@ RCD>C C<N OC@ >JII@>ODJI ADG@ NK@>DAD@? DI $connect !T ?@A<PGO OCDN DN OC@ KMDI>DK<G >JII@>ODJI 2CDN API>ODJI >M@<O@N OC@ HDNNDIB O<=G@N JA >JPMN@ OC@T HPNO C<Q@ <GM@<?T =@@I ?@ADI@? =PO ?J@N IJOCDIB AJM HJ?DATDIB <I @SDNODIB O<=G@ (A OC@ O<=G@ DN ?@>G<M@? <N < KMDI>DK<G O<=G@ <I? IJO <I <PSDGD<MT O<=G@ <I? DA OC@ KMDH<MT F@T DN <I DIO@B@M OC@I 1.(. RDGG <POJH<OD><GGT <NNDBI <I f<POJ DI>M@H@IOf OTK@ OJ OCDN KMDH<MT F@T

Updating tables 2C@ maj_tables($tables,

$connect='') API>ODJI PK?<O@N @SDNODIB

O<=G@N (O RDGG JIGT >M@<O@ AD@G?N OC<O <M@ HDNNDIB IJ AD@G? ?@G@ODJI RDGG =@ K@MAJMH@? 2C@ O<=G@ I<H@ >C<M<>O@M NOMDIB JM GDNO JA O<=G@ I<H@N O<=G@ HPNO =@ KMJQD?@? OJ OC@ API>ODJI 2C@M@ <B<DI DO DN KJNND=G@ OJ NK@>DAT < ?DAA@M@IO >JII@>ODJI ADG@ JOC@M OC<I OC@ KMDI>DK<G ?<O<=<N@ (A < O<=G@ OJ =@ PK?<O@? ?J@N IJO @SDNO DO RDGG =@ >M@<O@? AJGGJRDIB OC@ N<H@ KMDI>DKG@ <N creer_base() ?J@N AJM OC@ <POJ DI>M@H@IO Examples: include_spip('base/create'); creer_base(); maj_tables('spip_rubriques'); maj_tables(array('spip_rubriques','spip_articles'));

The SQL API 1.(.fN 1/* <=NOM<>ODJI API>ODJIN >JINODOPO@ <I AJGGJRDIB API>ODJIN

.( RCD>C >JIO<DIN OC@

253


Name

Description

"JHHJI @G@H@ION 1TNO@H K<M<H@O@MN <I? JKODJIN K NLG;<GGA@ON@G K

0@OPMIN < O<=G@ RDOC <GG JA OC@ M@NPGON AMJH < N@G@>ODJI

NLG;<GGO<=G@ K 0@OPMIN < O<=G@ JA OC@ @SDNODIB 1/* O<=G@N NLG;<GO@M K

+J?DAT OC@ NOMP>OPM@ JA <I 1/* O<=G@

NLG;>JPIO K

"JPIO OC@ IPH=@M JA MJRN DI < N@G@>ODJI M@NJPM>@

NLG;>JPION@G K

"JPIO OC@ IPH=@M JA M@NPGON

NLG;>M@<O@ K

"M@<O@ < O<=G@ <>>JM?DIB OJ OC@ N>C@H< KMJQD?@?

NLG;>M@<O@;=<N@ K

"M@<O@ < ?<O<=<N@

NLG;>M@<O@;QD@R K

"M@<O@ < QD@R

NLG;?<O@;KMJ>C@ K

0@OPMIN < ?<O@ >JHK<MDNJI @SKM@NNDJI =<N@? JI < ?<O@ ><G>PG<ODJI

NLG;?@G@O@ K

#@G@O@ ?<O<=<N@ M@>JM?N

NLG;?MJK;O<=G@ K

#@G@O@ < O<=G@

NLG;?MJK;QD@R K

#@G@O@ < QD@R

NLG;@MMIJ K

0@OPMIN OC@ IPH=@M >J?@ AJM OC@ G<NO 1/* @MMJM

NLG;@MMJM K

0@OPMIN OC@ G<NO 1/* @MMJM

NLG;@SKG<DI K $SKG<DIN CJR OC@ 1/* N@MQ@M RDGG KMJ>@NN < M@LP@NO

254

NLG;A@O>C K

0@OPMIN < MJR AMJH < N@G@>ODJI M@NJPM>@

NLG;A@O>C;<GG K

0@OPMIN < O<=G@ RDOC <GG OC@ M@NPGON AMJH < LP@MT

NLG;A@ON@G K

1@G@>ON <I? M@OPMIN OC@ ADMNO MJR JA M@NPGON

NLG;AM@@ K

0@G@<N@ < M@NJPM>@

NLG;B@OA@ON@G K

0@OMD@Q@N OC@ NDIBG@ >JGPHI M@LP@NO@? AMJH OC@ ADMNO MJR DI OC@ N@G@>ODJI

NLG;B@O;>C<MN@O K

0@LP@NON DA < K<MOD>PG<M >C<M<>O@M @I>J?DIB DN <Q<DG<=G@ JI OC@ N@MQ@M


# SQL access Name

Description

NLG;B@O;N@G@>O K

0@OPMIN OC@ N@G@>ODJI LP@MT

NLG;C@S K

0@OPMIN < IPH@MD> Q<GP@ AJM < C@S<?@>DH<G >C<M<>O@M NOMDIB

NLG;DI K

"JINOMP>O < >JI?DODJI PNDIB OC@ (, JK@M<OJM

NLG;DIN@MO K

(IN@MO >JIO@IO DI OC@ ?<O<=<N@

NLG;DIN@MOL K

(IN@MO >JIO@IO DIOJ < ?<O<=<N@ <POJH<OD><GGT ADGO@M@?

NLG;DIN@MOL;HPGOD K

3N@? OJ DIN@MO N@Q@M<G ?<O<=<N@ MJRN DI < NDIBG@ JK@M<ODJI

NLG;DI;N@G@>O K

0@OPMIN <I sql_in >JI?DODJI AMJH OC@ M@NPGON JA <I

NLG;GDNO?=N K

*DNON OC@ ?<O<=<N@N <Q<DG<=G@ AJM < BDQ@I >JII@>ODJI

NLG;HPGOD K

$SOM<>O HPGODGDIBP<G >JIO@IO

NLG;JKODHDU@ K

-KODHDN@ < ?@NDBI<O@? O<=G@

NLG;LP@MT K

$S@>PO@ < NK@>DAD> LP@MT

NLG;LPJO@ K

%DGO@MN JM @N><K@N <I 1/* K<M<H@O@M

NLG;M@K<DM K

0@K<DM < ?<H<B@? O<=G@

sql_select

NLG;M@KG<>@ K (IN@MO JM HJ?DAT < M@>JM? NLG;M@KG<>@;HPGOD K

(IN@MO JM M@KG<>@ N@Q@M<G M@>JM?N

NLG;N@@F K

.JNDODJI < N@G@>ODJI M@NJPM>@ <O OC@ ?@NDBI<O@? MJR IPH=@M

NLG;N@G@>O K

1@G@>ODIB >JIO@IO

NLG;N@G@>O?= K

1@G@>ON OC@ M@LP@NO@? ?<O<=<N@

NLG;N@MQ@PM K 2C@ .(fN KMDI>DK<G OM<INK<M@IO API>ODJI NLG;N@O;>C<MN@O K

0@LP@NON OC@ PN@ JA OC@ NK@>DAD@? >C<M<>O@M @I>J?DIB

NLG;NCJR=<N@ K

0@OPMIN < M@NJPM>@ JA OC@ GDNO JA ?<O<=<N@ O<=G@N

NLG;NCJRO<=G@ K

0@OPMIN < ?@N>MDKODJI JA OC@ O<=G@

255


Name

Description

NLG;PK?<O@ K 3K?<O@ < ?<O<=<N@ M@>JM? NLG;PK?<O@L K

3K?<O@ ?<O<=<N@ >JIO@IO <I? ADGO@M OC@ ?<O< <B<DINO 1/* DIE@>ODJI <OO<>FN

NLG;Q@MNDJI K 0@OPMIN OC@ Q@MNDJI IPH=@M JA OC@ ?<O<=<N@ H<I<B@M

Common elements 5DOCDI OC@ N@O JA sql_* API>ODJIN >@MO<DI K<M<H@O@MN <M@ NTNO@H<OD><GGT <Q<DG<=G@ <I? <M@ PN@? OJ ?@IJO@ OC@ N<H@ DIAJMH<ODJI 2C@N@ K<M<H@O@MN <M@ <GG ?@N>MD=@? C@M@ KMDI>DK<GGT NJ OC<O OC@T <M@ IJO M@K@<O@? <? DIADIDOPH DI HPGODKG@ <MOD>G@N \ $serveur JM $connect DN OC@ I<H@ JA OC@ 1/* >JII@>ODJI ADG@ DI OC@ config/ ?DM@>OJMT 5C@I IJO ?@ADI@? JM @HKOT OC@I OC@ >JII@>ODJI ADG@ ?@ADI@? ?PMDIB 1.(. DINO<GG<ODJI RDGG =@ PN@? ,JMH<GGT DO DN OC@ K@IPGODH<O@ G<NO =PO JI@ K<M<H@O@M AJM OC@ 1/* <=NOM<>ODJI API>ODJIN \ $options @LP<GN true =T ?@A<PGO <I? DN PN@? OJ NK@>DAT <I JKODJI<G >C<M<>O@M RDOC DON PN<B@ 2CDN K<M<H@O@M DN IJMH<GGT OC@ G<NO AJM OC@ 1/* <=NOM<>ODJI API>ODJIN (O H<T C<Q@ OC@ AJGGJRDIB Q<GP@N g true <IT API>ODJI DI OC@ 1/* .( <I? IJO AJPI? DI OC@ 1/* DINOMP>ODJI N@O JA OC@ M@LP@NO@? N@MQ@M RDGG ><PN@ < A<O<G @MMJM g 'continue' IJ A<O<G @MMJM DA OC@ API>ODJI DN IJO AJPI? g <I? false OC@ 1/* N@O API>ODJI ?J@N IJO MPI OC@ LP@MT RCD>C C<N =@@I ><G>PG<O@? =PO NCJPG? M@OPMI DO DINO@<? R@ OC@M@AJM@ J=O<DI < O@SO NOMDIB OC<O DN < Q<GD? 1/* LP@MT AJM OC@ ?<O<=<N@ H<I<B@M M@LP@NO@? 1JH@ JOC@M K<M<H@O@MN <M@ JAO@I KM@N@IO AMJH JI@ API>ODJI OJ <IJOC@M

K<MOD>PG<MGT NJ AJM <GG API>ODJIN RCD>C <M@ NDHDG<M OJ sql_select() =T M@PNDIB <GG JM NJH@ JA DON K<M<H@O@MN \ $select O<=G@ JA 1/* >JGPHIN OJ =@ M@OMD@Q@?

\ $from O<=G@ JA 1/* O<=G@N OJ =@ PN@?

\ $where O<=G@ JA >JGPHI >JINOM<DION RC@M@ @<>C @G@H@IO DI OC@ O<=G@ RDGG =@ >JH=DI@? RDOC < GJBD><G AND

\ $groupby O<=G@ JA BMJPKDIBN JA OC@ M@NPGON

\ $orderby O<=G@ ?@ADIDIB OC@ JM?@MDIB JA OC@ M@NPGON

\ $limit NOMDIB DI?D><ODIB OC@ H<SDHPH IPH=@M JA M@NPGON OJ M@OPMI

256


# SQL access \ $having O<=G@ JA KJNO >JINOM<DION AJM OC@ <BBM@B<ODJI API>ODJIN %JM API>ODJIN PN@? OJ HJ?DAT >JIO@IO OC@M@ DN <IJOC@M >JHHJI K<M<H@O@M \ $desc RCD>C DN < O<=G@ JA >JGPHI ?@N>MDKODJIN AJM OC@ 1/* O<=G@ @HKGJT@? (A DO DN JHDOO@? OC@ ?@N>MDKODJI RDGG =@ <POJH<OD><GGT ><G>PG<O@? DA OC@ ><GGDIB API>ODJIN C<Q@ I@@? JA DO

Coding principles G<MB@ IPH=@M JA K<M<H@O@MN <M@ OJG@M<IO DI M@NK@>O JA OC@ OTK@ JA <MBPH@IO RCD>C DN K<NN@? OJ OC@H JAO@I <>>@KODIB O<=G@N JM O@SO NOMDIBN 2CDN DN OC@ ><N@ AJM @S<HKG@ AJM OC@ sql_select() K<M<H@O@MN (ON ADMNO K<M<H@O@M DN $select RCD>C >JMM@NKJI?N OJ OC@ GDNO JA 1/* >JGPHIN OJ =@ M@OMD@Q@? '@M@ <M@ OC@ API>ODJI<G >J?DIB H@OCJ?N AJM OCDN K<M<H@O@M // 1 element sql_select('id_article', 'spip_articles'); sql_select(array('id_article'), 'spip_articles'); // 2 elements sql_select('id_article, titre', 'spip_articles'); sql_select(array('id_article', 'titre'), 'spip_articles');

-PO JA >JIQ@IODJI RCD>C DHKJN@N IJ J=GDB<ODJIN JI <ITJI@ R@ B@I@M<GGT KM@A@M OJ PN@ OC@ O<=PG<M AJMH RC@I@Q@M OC@M@ DN HJM@ OC<I JI@ @G@H@IO < >J?DIB H@OCJ? RCD>C DN @<ND@M OJ <I<GTN@ =T OC@ API>ODJIN RCD>C OM<ING<O@ OC@N@ <=NOM<>O@? >J?DIB H@OCJ?N DIOJ 1/* LP@MD@N

sql_allfetsel 2C@ sql_allfetsel() API>ODJIN M@OMD@Q@N < O<=G@ RDOC <GG JA OC@ M@NPGON JA < N@G@>ODJI (O <>>@KON OC@ N<H@ K<M<H@O@MN <N OC@ sql_select() API>ODJI <I? DN < >JH=DI@? NCJMO>PO OJ M@KG<>@ ><GGDIB sql_select() <I? sql_fetch_all() N DO NOJM@N <GG JA OC@ M@NPGON DI < .'. O<=G@ =@ ><M@APG IJO OJ @S>@@? OC@ H@HJMT GDHDO <GGJR@? OJ .'. DA TJP <M@ ?@<GDIB RDOC G<MB@ ?<O< QJGPH@N (O <>>@KON K<M<H@O@MN $select

$from

$where

257


$groupby

$orderby

$limit

$having

$serveur

$option 2C@ sql_allfetsel() API>ODJI DN PN@? <N NCJRI =@GJR $all = sql_allfetsel('column', 'table'); // $all[0]['column'] is the column in the first line retrieved

Example 1@G@>O <GG JA OC@ objet id_objet K<DMN <NNJ>D<O@? RDOC < K<MOD>PG<M ?J>PH@IO if ($liens = sql_allfetsel('objet, id_objet', 'spip_documents_liens', 'id_document=' . intval($id))) { foreach ($liens as $l) { // $l['objet'] and $l['id_objet'] } }

2C@ "JIO<>O <Q<I>Y KGPBDI N@G@>ON <GG JA OC@ @H<DGN AJM OC@ M@>DKD@ION JA < H@NN<B@ <N NCJRI =@GJR // Retrieve who it was sent to $destinataire = _request('destinataire'); if (!is_array($destinataire)) { $destinataire = array($destinataire); } $destinataire = array_map('intval', $destinataire); $mail = sql_allfetsel('email', 'spip_auteurs', sql_in('id_auteur', $destinataire));

258


# SQL access

sql_alltable 2C@ sql_alltable() API>ODJI M@OPMIN < O<=G@ GDNODIB OC@ Q<MDJPN 1/* O<=G@N OC<O @SDNO DI OC@ ?<O<=<N@ DO <>>@KON OC@ N<H@ K<M<H@O@MN <N NLG;NCJR=<N@ K $spip @HKOT =T ?@A<PGO OC@ K<M<H@O@M DN PN@? OJ GDNO JIGT OC@ O<=G@N PNDIB OC@ KM@ADS ?@ADI@? AJM 1.(. O<=G@N 3N@ '%' DINO@<? DA TJP R<IO OJ GDNO ** O<=G@N

$serveur

$option 3N<B@ $tables = sql_alltable(); sort($tables); // $tables[0] : spip_articles

sql_alter 2C@ sql_alter() API>ODJI DN PN@? OJ N@I? <I ALTER OTK@ 1/* >JHH<I? OJ OC@ ?<O<=<N@ N@MQ@M OJ HJ?DAT OC@ NOMP>OPM@ JA OC@ ?<O<=<N@ 2C@ API>ODJI <>>@KON K<M<H@O@MN $q DN OC@ LP@MT NOMDIB RDOCJPO OC@ O@MH *2$0 OJ =@ @S@>PO@? $serveur

$option Note: 2CDN API>ODJI ?DM@>OGT <NNPH@N <I 1/* AJMH<OO@? >JHH<I? NJ DO DN DHKJMO<IO OJ M@NK@>O OC@ 1/* NO<I?<M?N (O DN KJNND=G@ OC<O DI APOPM@ Q@MNDJIN JA 1.(. OC<O OC@ $q K<M<H@O@M RDGG <>>@KO < HJM@ NOMP>OPM@? O<=G@ <N DIKPO DI JM?@M OJ NDHKGDAT KJMODIB OJ JOC@M NTNO@HN 2C@ API>ODJI DN PN@? <N NCJRI DI OCDN @S<HKG@ sql_alter("TABLE sql_alter("TABLE optional keyword sql_alter("TABLE DEFAULT '0'"); sql_alter("TABLE

table ADD COLUMN column_name INT"); table ADD column_name INT"); // COLUMN is an for this SQL command table CHANGE column_name column_name INT table ADD INDEX column_name (column_name)");

259


sql_alter("TABLE table DROP INDEX column_name"); sql_alter("TABLE table DROP COLUMN column_name"); sql_alter("TABLE table DROP column_name"); // COLUMN is an optional keyword for this command // You may pass several actions, but careful about portings: sql_alter("TABLE table DROP column_nameA, DROP column_nameB");

2C@ sql_alter() API>ODJI DN K<MOD>PG<MGT PN@? ?PMDIB PK?<O@N JA KGPBDIN DI OC@ {plugin_name}_upgrade() API>ODJIN AJM OC@ Q<MDJPN KGPBDIN TJP H<T C<Q@ DINO<GG@?

Example ?? < >JHKJNDODJI >JGPHI OJ OC@ spip_articles O<=G@ KGPBDI "JHKJNDODJI sql_alter("TABLE spip_articles ADD composition varchar(255) DEFAULT '' NOT NULL");

?? >NN OJ OC@ KDK;H@IPN O<=G@ KGPBDI +@IPN sql_alter("TABLE spip_menus ADD COLUMN css tinytext DEFAULT '' NOT NULL");

2C@ 2M<?0P= KGPBDI DI>GP?@N DI DON DINO<GG<ODJI KMJ>@?PM@ <I DINOMP>ODJI OJ <?? OC@ D?;OM<? >JGPHI OJ OC@ spip_rubriques O<=G@ =T PNDIB OC@ maj_tables() API>ODJI KMJQD?@? AJM NP>C < KPMKJN@ OC@I <??N <I DI?@S JI OC<O N<H@ >JGPHI PNDIB sql_alter() function tradrub_upgrade($nom_meta_base_version, $version_cible){ $current_version = 0.0; if ( (!isset($GLOBALS['meta'][$nom_meta_base_version]) ) || (($current_version = $GLOBALS['meta'][$nom_meta_base_version]) != $version_cible)) { include_spip('base/tradrub');

260


# SQL access if ($current_version==0.0){ include_spip('base/create'); maj_tables('spip_rubriques'); // index on the new field sql_alter("TABLE spip_rubriques ADD INDEX (id_trad)"); ecrire_meta($nom_meta_base_version, $current_version=$version_cible, 'non'); } } }

sql_count 2C@ sql_count() API>ODJI M@OPMIN OC@ IPH=@M JA MJRN AJM < N@G@>ODJI M@NJPM>@ JK@I@? RDOC sql_select() (O <>>@KON K<M<H@O@MN $res DN OC@ M@NJPM>@ D?@IODAD@M AJM < N@G@>ODJI

$serveur

$option (O DN PN@? <N NCJRI =@GJR $res = sql_select('column', 'table'); if ($res and sql_count($res)>2) { // checks to see if there are at least 3 rows in the results! }

Example .JNND=G@ <KKGD><ODJI ?DNKG<T < >JPIO JA OC@ OJO<G IPH=@M JA @G@H@ION if ($res = sql_select('titre', 'spip_rubriques', 'id_parent=0')) { $n = sql_count($res); $i = 0; while ($r = sql_fetch($res)) {

261


echo "Section " . ++$i . " / $n : $r[titre]<br />"; // e.g. Section 3 / 12 : La fleur au vent } }

sql_countsel 2C@ sql_countsel() API>ODJIN M@OPMIN OC@ IPH=@M JA MJRN AJM < ?@NDM@? N@G@>ODJI (O DN HJM@ JM G@NN sql_select('COUNT(*)', ...)

<

NCJMO

R<T

JA

RMDODIB

(O <>>@KON OC@ N<H@ <MBPH@ION <N sql_select() @S>@KO AJM OC@ ADMNO IJMH<GGT OC@ >JGPHIN $from

$where

$groupby

$orderby

$limit

$having

$serveur

$option (O DN PN@? <N NCJRI DI OCDN @S<HKG@ $nomber = sql_countsel("table");

Example "JPIO OC@ IPH=@M JA F@TRJM?N DI < BDQ@I F@TRJM? BMJPK $groupe = sql_countsel("spip_mots", "id_groupe=$id_groupe");

0@OPMI false DA < N@>ODJI C<N <IT <MOD>G@N ,-2 DI OC@ OM<NC

262


# SQL access if (sql_countsel('spip_articles', array( "id_rubrique=$id_rubrique", "statut <> 'poubelle'" ))) { return false; }

(A OC@ spip_notations_objets O<=G@ DI OC@ ,JO<ODJIN O<=G@ ?J@N IJO T@O C<Q@ <IT @IOMT AJM OC@ J=E@>O D?@IODAD@? NK@>DAD@? OC@I K@MAJMH < ?<O<=<N@ DIN@MO JOC@MRDN@ K@MAJMH <I PK?<O@ // Update or insert? if (!sql_countsel("spip_notations_objets", array( "objet=" . sql_quote($objet), "id_objet=" . sql_quote($id_objet), ))) { // Insert a record for the object notation sql_insertq("spip_notations_objets", ...); // ... } else { // Update if there already is a record sql_updateq("spip_notations_objets", ...); // ... }

sql_create 2C@ sql_create() API>ODJI DN PN@? OJ >M@<O@ <I 1/* O<=G@ <>>JM?DIB OJ OC@ N>C@H< KMJQD?@? (O <>>@KON K<M<H@O@MN \ $nom DN OC@ I<H@ JA OC@ O<=G@ OJ >M@<O@ \ $champs DN < O<=G@ JA >JGPHI ?@N>MDKODJIN \ $clefs DN < O<=G@ JA F@T ?@N>MDKODJIN \ $autoinc DN < AD@G? DN < KMDH<MT F@T <I? IPH@MD> OC@I OC@ <POJ DI>M@H@IO KMJK@MOT RDGG =@ <??@? false =T ?@A<PGO \ $temporary DN OCDN < O@HKJM<MT O<=G@ #@A<PGO Q<GP@ false \ $serveur

\ $option

263


(O DN PN@? <N NCJRI =@GJR sql_create("spip_tables", array( "id_table" => "bigint(20) NOT NULL default '0'", "column1"=> "varchar(3) NOT NULL default 'oui'", "column2"=> "text NOT NULL default ''" ), array( 'PRIMARY KEY' => "id_table", 'KEY column1' => "column1" ) );

N < B@I@M<G MPG@ KGPBDIN NCJPG? ?@>G<M@ OC@DM 1/* O<=G@N PNDIB OC@ KDK@GDI@N DIO@I?@? AJM OC@ KPMKJN@ ?@>G<M@M;O<=G@N;KMDI>DK<G@N K <I? ?@>G<M@M;O<=G@N;<PSDGD<DM@N K <I? PN@ OC@ creer_base() JO maj_tables('spip_tables') API>ODJIN ?PMDIB DINO<GG<ODJI JA @<>C KGPBDI

RCD>C RDGG ><GG OC@ sql_create() API>ODJI RC@I I@>@NN<MT 0@<? HJM@ JI OCDN OJKD> C@M@ 2<=G@ PK?<O@N <I? DINO<GG<ODJI K

Example $S<HKG@ JA >M@<ODIB < NKDK;HJON;OJM?PN O<=G@ RCD>C RDGG =@ < GDIF RDOC NKDK;OJM?PN ,JO@ OC<O OC@ KMDH<MT F@T DN >JHKJN@? AMJH >JGPHIN

sql_create("spip_mots_tordus", array( "id_mot" => "bigint(20) NOT NULL default '0'", "id_tordu"=> "bigint(20) NOT NULL default '0'" ), array( 'PRIMARY KEY' => "id_tordu,id_mot" ) );

264


# SQL access

sql_create_base 2C@ sql_create_base() API>ODJI <OO@HKON OJ >M@<O@ < ?<O<=<N@@ RDOC OC@ I<H@ KMJQD?@? 2C@ API>ODJI M@OPMIN false DA <I @MMJM J>>PMN (O <>>@KON K<M<H@O@MN \ $nom DN OC@ I<H@ JA OC@ ?<O<=<N@ OJ >M@<O@

\ $serveur

\ $option 2CDN API>ODJI DN JIGT PN@? ?PMDIB OC@ DINO<GG<ODJI JA 1.(. OJ >M@<O@ < ?<O<=<N@ <N M@LP@NO@? AJM < BDQ@I ?<O<=<N@ H<I<B@M sql_create_base($sel_db, $server_db);

5C@I PNDIB 1/*DO@ OC@ ?<O<=<N@ I<H@ >JMM@NKJI?N OJ OC@ ADG@ I<H@ RDOCJPO OC@ ADG@ OTK@ @SO@INDJI .sqlite RDGG =@ <??@? <POJH<OD><GGT <I? OC@ ADG@ RDGG =@ NOJM@? DI OC@ ?DM@>OJMT ?@ADI@? =T OC@ _DIR_DB >JINO<IO RCD>C =T ?@A<PGO DN N@O OJ config/bases/

sql_create_view 2C@ sql_create_view() API>ODJI >M@<O@N < QD@R AJM OC@ N@G@>ODJI LP@MT KMJQD?@? 2C@ QD@R ><I OC@I =@ PN@? =T 1.(. GJJKN JM =T JOC@M N@G@>ODJI >JHH<I?N (O <>>@KON K<M<H@O@MN $nom DN OC@ I<H@ JA OC@ QD@R >M@<O@?

$select_query DN OC@ N@G@>ODJI LP@MT

$serveur

$option (O ><I =@ PN@? DI >JIEPI>ODJI RDOC OC@ NLG;B@O;N@G@>O K API>ODJI OJ M@OMD@Q@ OC@ ?@NDM@? N@G@>ODJI $selection = sql_get_select('column', 'table'); sql_create_view('myview', $selection); // utilisation $result = sql_select('column', 'myview');

265


Note: 5C@I@Q@M < N@G@>ODJI >JGPHI PN@N OC@ 'name.column' IJO<ODJI TJP <=NJGPO@GT HPNO ?@>G<M@ <I <GD<N AJM OC@ >JGPHI JOC@MRDN@ >@MO<DI ?<O<=<N@ KJMON 1/*DO@ DI K<MOD>PG<M RDGG IJO >M@<O@ OC@ @SK@>O@? QD@R @ B 'name.column AS column'

Example 2CDN NH<GG @S<HKG@ ?@HJINOM<O@N CDN API>ODJI =T >M@<ODIB < M<OC@M PN@G@NN O<=G@ AMJH >JGPHIN DI < N@>ODJI $select = sql_get_select(array( 'r.titre AS t', 'r.id_rubrique AS id' ), array( 'spip_rubriques AS r' )); // create the view sql_create_view('spip_short_rub', $select); // use it: $titre = sql_getfetsel('t', 'spip_short_rub', 'id=8');

2C@ QD@R >JPG? <GNJ =@ PN@? RDOCDI < 1.(. O@HKG<O@ ADG@ <N DI <BOUCLE_view(spip_short_rub) {id=8}> <h3>#T</h3> </BOUCLE_view>

sql_date_proche 2C@ sql_date_proche() API>ODJI DN PN@? OJ M@OPMI < >JI?DODJI<G @SKM@NNDJI AJM < >JGPHI DI M@G<ODJI OJ < ?<O@ (O <>>@KON K<M<H@O@MN $champ DN OC@ 1/* >JGPHI OJ =@ >JHK<M@?

$interval DN OC@ >JHK<MDNJI DIO@MQ<G Q<GP@ $unite DN OC@ PIDON JA M@A@M@I>@ f# 7f f+-,2'f f7$ 0f $serveur

$option

266


# SQL access (O DN PN@? <N NCJRI =@GJR $ifdate = sql_date_proche('column', -8, 'DAY'); $res = sql_select('column', 'table', $ifdate);

Example IJOC@M PN@ AJM < N@G@>ODJI LP@MT NP>C <N DGGPNOM<O@? =@GJR DN OJ NOJM@ OC@ =JJG@<I M@NPGO DI <I <GD<N 2C@ <GD<N ici DI?D><O@N RC@OC@M JM IJO <I <POCJM C<N GJBB@? DI ?PMDIB OC@ G<NO ?<TN $row = sql_fetsel( array("*", sql_date_proche('en_ligne', -15, 'DAY') . " AS ici"), "spip_auteurs", "id_auteur=$id_auteur"); // $row['ici'] : true / false

sql_delete 2C@ sql_delete() API>ODJI DN PN@? OJ ?@G@O@ M@>JM?N AMJH <I 1/* O<=G@ <I? M@OPMIN OC@ IPH=@M JA M@>JM?N OC<O R@M@ <GG ?@G@O@? (O C<N K<M<H@O@MN $table DN OC@ I<H@ JA OC@ 1/* O<=G@

$where

$serveur

$option (O DN PN@? <N NCJRI =@GJR sql_delete('table', 'id_table = ' . intval($id_table));

Example #@G@O@ OC@ GDIF =@OR@@I <GG N@>ODJIN <I? < BDQ@I F@TRJM?

267


sql_delete("spip_mots_rubriques", "id_mot=$id_mot");

-I@ JA 1.(.fN NO<I?<M? K@MDJ?D><G O<NFN DN OJ ?@G@O@ JG? <MOD>G@N OC<O C<Q@ =@@I KPO DI OC@ ?PNO=DI KJP=@GG@ <N ?@O<DG@? =@GJR function optimiser_base_disparus($attente = 86400) { $mydate = date("YmdHis", time() - $attente); // ... sql_delete("spip_articles", "statut='poubelle' AND maj < $mydate"); }

sql_drop_table 2C@ sql_drop_table() API>ODJI ?@G@ON <I 1/* O<=G@ AMJH OC@ ?<O<=<N@ (O M@OPMIN true DA NP>>@NNAPG <I? false DA IJO (O <>>@KON K<M<H@O@MN $table DN OC@ I<H@ JA OC@ O<=G@

$exist DN PN@? OJ M@LP@NO Q@MDAD><ODJI JA OC@ O<=G@fN @SDNO@I>@ AJM OC@ ?@G@ODJI RCD>C OM<ING<O@N DIOJ <??DIB IF EXISTS OJ OC@ 1/* >JHH<I? !T ?@A<PGO '' DO K<NN@N true OJ >JIADMH OC@ O<=G@ DN OC@M@ =@AJM@ OMTDIB OJ ?@G@O@ DO

$serveur

$option 2CDN sql_drop_table() API>ODJI DN PN@? <N NCJRI =@GJR sql_drop_table('table'); sql_drop_table('table', true);

Example .GPBDIN JAO@I PN@? OCDN API>ODJI AJM >JHKG@O@ M@HJQ<G ?<O< DI>GP?@? JA < KGPBDI RC@I NJ M@LP@NO@? =T OC@ <?HDIDNOM<OJM <N NCJRI DI OCDN @S<HKG@ AMJH OC@ &YJBM<KCD@ KGPBDI

268


# SQL access function geographie_vider_tables($nom_meta_base_version) { sql_drop_table("spip_geo_pays"); sql_drop_table("spip_geo_regions"); sql_drop_table("spip_geo_departements"); sql_drop_table("spip_geo_communes"); effacer_meta($nom_meta_base_version); ecrire_metas(); }

sql_drop_view 2C@ sql_drop_view() API>ODJI ?@G@O@N < ?<O<=<N@ QD@R (O <>>@KON OC@ N<H@ K<M<H@O@MN <N sql_drop_table() <I? M@OPMIN true DA NP>>@NNAPG <I? false DA IJO (ON K<M<H@O@MN <M@ $table DN OC@ I<H@ JA OC@ QD@R

$exist PN@? OJ M@LP@NO Q@MDAD><ODJI JA OC@ @SDNO@I>@ JA OC@ QD@R =@AJM@ ?@G@ODJI OCDN OM<ING<O@N DIOJ OC@ <??DODJI JA IF EXISTS OJ OC@ 1/* >JHH<I? !T ?@A<PGO '' DO DI>GP?@N true OJ M@LP@NO OC@ Q@MDAD><ODJI

$serveur

$option 2C@ sql_drop_view() API>ODJI DN PN@? <N AJGGJRN sql_drop_view('view'); sql_drop_view('view', true);

sql_errno 2C@ sql_errno() API>ODJIN M@OPMIN OC@ IPH=@M >J?@ AJM OC@ HJNO M@>@IO 1/* @MMJM OC<O C<N J>>PMM@? 2CDN API>ODJI DN PN@? DI 1.(. OJ <POJH<OD><GGT M@>JM? OC@ ?@O<DGN DI OC@ DI>D?@IO GJBN B@I@M<O@? AJM 1/* <>ODJIN RCD>C <M@ >@IOM<GGT H<I<B@? =T OC@ spip_sql_erreur() API>ODJI DI @>MDM@ =<N@ >JII@>O;NLG KCK

269


sql_error 2C@ sql_error() API>ODJI M@OPMIN OC@ HJNO M@>@IO 1/* @MMJM OC<O C<N J>>PMM@? 2CDN API>ODJI DN PN@? RDOCDI 1.(. OJ <POJH<OD><GGT M@>JM? ?@O<DGN AJM OC@ DI>D?@IO GJBN B@I@M<O@? AJM 1/* <>ODJIN RCD>C <M@ >@IOM<GGT H<I<B@? =T OC@ spip_sql_erreur() API>ODJI DI @>MDM@ =<N@ >JII@>O;NLG KCK

sql_explain 2C@ sql_explain() API>ODJI DN PN@? OJ M@OPMI <I @SKG<I<ODJI JA CJR OC@ 1/* N@MQ@M RDGG KMJ>@NN < M@LP@NO 2CDN API>ODJI DN PN@? =T OC@ ?@=PBB@M OJ KMJQD?@ DIAJMH<ODJI M@G<ODIB OJ OC@ B@I@M<O@? 1/* >JHH<I?N 2C@ API>ODJI <>>@KON K<M<H@O@MN $q DN OC@ 1/* LP@MT

$serveur

$option -I@ KJNND=G@ PN<B@ HDBCO =@ $query = sql_get_select('column', 'table'); $explain = sql_explain($query);

sql_fetch 2C@ sql_fetch() API>ODJI M@OPMIN < MJR DI OC@ AJMH JA <I <NNJ>D<ODQ@ O<=G@

AMJH OC@ M@NPGON JA < N@G@>ODJI (O M@OPMIN false DA OC@M@ <M@ IJ HJM@ MJRN OJ =@ M@OMD@Q@? (O <>>@KON K<M<H@O@MN JIGT OC@ ADMNO JA RCD>C DN H<I?<OJMT $res DN OC@ M@NJPM>@ B@I@M<O@? =T <I NLG;N@G@>O

$serveur

$option 2CDN API>ODJI DN PN@? DI NOMD>O >JIEPI>ODJI RDOC sql_select() JAO@I PN@? DI OC@ AJGGJRDIB H<II@M if ($res = sql_select('column', 'table')) { while ($r = sql_fetch($res)) {

270


# SQL access // use the results with $r['column'] } }

Example *DNO OC@ <MOD>G@N KMJKJN@? AJM KP=GD><ODJI $result = sql_select("id_article, id_rubrique, titre, statut", "spip_articles", "statut = 'prop'", "", "date DESC"); while ($row = sql_fetch($result)) { $id_article=$row['id_article']; if (autoriser('voir', 'article', $id_article)) { // actions } }

2C@ "JIO<>O <Q<I>Y KGPBDI ><I N<Q@ H@NN<B@N DI OC@ spip_messages O<=G@ 5C@I JI@ JA OC@N@ H@NN<B@N DN ?@G@O@? DO <GNJ ?@G@O@N <IT ?J>PH@ION OC<O HT =@ GDIF@? OJ DO function action_supprimer_message() { $securiser_action = charger_fonction('securiser_action', 'inc'); $id_message = $securiser_action(); // Check if we have any documents if ($docs = sql_select('id_document', 'spip_documents_liens', 'id_objet=' . intval($id_message) . ' AND objet="message"')) { include_spip('action/documenter'); while ($id_doc = sql_fetch($docs)) { supprimer_lien_document($id_doc['id_document'], "message", $id_message); } } sql_delete("spip_messages", "id_message=" . sql_quote($id_message)); sql_delete("spip_auteurs_messages", "id_message=" . sql_quote($id_message));

271


}

2C@ calculer_rubriques_publiees() API>ODJI RDOCDI ecrire/ inc/rubriques.php DN PN@? OJ M@><G>PG<O@ OC@ NO<OPN@N <I? ?<O@N AJM N@>ODJIN DI JM?@M OJ ADI? JPO RCD>C C<Q@ OC@ NO<OPN JA KP=GDY KP=GDNC@? 5DOCDI OC@ API>ODJI < >J?@ N@BH@IO N@G@>ON OC@ N@>ODJIN RCD>C C<Q@ KP=GDNC@? ?J>PH@ION <I? OC@M@AJM@ NJ ?J@N OC@ N@>ODJI <I? <NNDBIN < O@HKJM<MT >JGPHI AJM OC@ I@R NO<OPN <I? I@R ?<O@ -I>@ OC@ PK?<O@N <M@ >JHKG@O@? OC@ O@HKJM<MT >JGPHI DN N<Q@? DIOJ OC@ M@<G >JGPHI // Set the counters to zero sql_updateq('spip_rubriques', array( 'date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prive')); // [...] // Publish and date the sections which have a published *document* $r = sql_select( array( "rub.id_rubrique AS id", "max(fille.date) AS date_h"), array( "spip_rubriques AS rub", "spip_documents AS fille", "spip_documents_liens AS lien"), array( "rub.id_rubrique = lien.id_objet", "lien.objet='rubrique'", "lien.id_document=fille.id_document", "rub.date_tmp <= fille.date", "fille.mode='document'", "rub.id_rubrique")); while ($row = sql_fetch($r)) { sql_updateq('spip_rubriques', array( 'statut_tmp'=>'publie', 'date_tmp'=>$row['date_h']), "id_rubrique=" . $row['id']); } // [...] // Save the modifications sql_update('spip_rubriques', array( 'date'=>'date_tmp',

272


# SQL access 'statut'=>'statut_tmp'));

sql_fetch_all 2C@ sql_fetch_all() API>ODJI M@OPMIN < O<=G@ >JIO<DIDIB <GG JA OC@ MJRN AJM < N@G@>ODJI M@NJPM>@ 1DI>@ <GG JA OC@ M@NPGON RDGG =@ NOJM@? DI >PMM@IO H@HJMT

TJP NCJPG? =@ ><M@APG IJO OJ N@G@>O OJJ HP>C >JIO@IO <O JI>@ 2C@ sql_fetch_all() API>ODJI <>>@KON K<M<H@O@MN $res DN OC@ M@NJPM>@ J=O<DI@? PNDIB <I NLG;N@G@>O

$serveur

$option (O DN PN@? <N DI OC@ @S<HKG@ =@GJR $res = sql_select('column', 'table'); $all = sql_fetch_all($res); // $all[0]['column'] is the first row

'JR@Q@M OCDN API>ODJI DN IJO JAO@I PN@? NDI>@ OC@ sql_allfetsel() API>ODJI ><I @S@>PO@ HP>C OC@ N<H@ JK@M<ODJI =PO <GNJ RDOC N@G@>ODJI K<M<H@O@MN $all = sql_allfetsel('column', 'table'); // $all[0]['column'] is the first row

sql_fetsel 2C@ sql_fetsel API>ODJI M@OPMIN OC@ ADMNO MJR JA M@NPGON AJM < N@G@>ODJI (O <>>@KON OC@ N<H@ K<M<H@O@MN <N OC@ sql_select() API>ODJI <I? DN < NCJMO >PO AJM OC@ >JH=DI@? ><GG JA sql_select() <I? sql_fetch() (ON K<M<H@O@MN <M@ $select

$from

$where

$groupby

$orderby

273


$limit

$having

$serveur

$option (O DN PN@? <N NCJRI =@GJR $r = sql_fetsel('colonne', 'table'); // $r['colonne']

Example 1@G@>O OC@ D?;OM<? <I? D?;MP=MDLP@ >JGPHIN JA < BDQ@I <MOD>G@ $row = sql_fetsel("id_trad, id_rubrique", "spip_articles", "id_article=$id_article"); // $row['id_trad'] and $row['id_rubrique']

1@G@>O <GG OC@ >JGPHIN AJM < BDQ@I I@RN DO@H $row = sql_fetsel("*", "spip_breves", "id_breve=$id_breve");

sql_free 2C@ sql_free() API>ODJI DN PN@? OJ M@G@<N@ <I 1/* M@NJPM>@ JK@I@? PNDIB < ><GG OJ OC@ sql_select() API>ODJI (?@<GGT OCDN API>ODJI JPBCO OJ =@ ><GG@? <AO@M ADIDNCDIB PNDIB @<>C M@NJPM>@ (O <>>@KO K<M<H@O@MN $res DN OC@ M@NJPM>@ AJM < N@G@>ODJI

$serveur

$option 2C@ sql_free() API>ODJI DN OC@M@AJM@ PN@? <N NCJRI =@GJR $res = sql_select('column', 'table');

274


# SQL access // operations using the sql_fetch($res) and similar functions ... // then close the resource sql_free($res);

,JO@ OC<O OC@ .( API>ODJIN ><GG OCDN API>ODJI <POJH<OD><GGT 2CDN DN OC@ ><N@ AJM \ sql_fetsel <I? sql_getfetsel

\ sql_fetch_all <I? sql_allfetsel

\ sql_in_select

sql_getfetsel 2C@ sql_getfetsel() API>ODJI M@OMD@Q@N OC@ NDIBG@ >JGPHI M@LP@NO@? AMJH OC@ ADMNO MJR JA OC@ N@G@>ODJI (O <>>@KON OC@ N<H@ K<M<H@O@MN <N OC@ sql_select() API>ODJI <I? DN < NCJMO >PO AJM OC@ >JH=DI<ODJI JA ><GGDIB sql_fetsel() <I? array_shift() (ON K<M<H@O@MN <M@ $select IJHDI<ODIB OC@ ?@NDM@? >JGPHI

$from

$where

$groupby

$orderby

$limit

$having

$serveur

$option (O DN PN@? <N NCJRI =@GJR $colonne = sql_getfetsel('colonne', 'table', 'id_table=' . intval($id_table));

,JO@ OC<O <I <GD<N ><I <GNJ =@ ?@ADI@? <N NCJRI C@M@ $alias = sql_getfetsel('colonne AS alias', 'table', 'id_table=' . intval($id_table));

275


Example %DI? JPO OC@ N@>OJM AJM < N@>ODJI MP=MDLP@ $id_secteur = sql_getfetsel("id_secteur", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));

2C@ )J= /P@P@ KGPBDI H<I<B@N < GDNO JA N>C@?PG@? O<NFN NJ R@ ><I ADI? JPO OC@ ?<O@ JA OC@ I@SO O<NF OJ =@ K@MAJMH@? RDOC OCDN >J?@ $date = sql_getfetsel('date', 'spip_jobs', '', '', 'date', '0,1');

sql_get_charset 2C@ sql_get_charset() API>ODJI DN PN@? OJ >C@>F DA OC@ PN<B@ JA OC@ K<MOD>PG<M >C<M<>O@M @I>J?DIB DN <Q<DG<=G@ JI OC@ ?<O<=<N@ N@MQ@M sql_get_charset() <>>@KON OCM@@ K<M<H@O@MN RDOC JIGT OC@ ADMNO =@DIB H<I?<OJMT $charset DN OC@ >C<MN@O =@DIB M@LP@NO@? NP>C <N POA $serveur

$options

sql_get_select 2C@ sql_get_select() API>ODJI M@OPMIN OC@ LP@MT AJM OC@ M@LP@NO@? N@G@>ODJI 2CDN DN <I <GD<N AJM OC@ sql_select() API>ODJI =PO RCD>C K<NN@N OC@ $option <MBPH@IO N@O OJ false NJ OC<O OC@ 1/* LP@MT DN M@OPMI@? M<OC@M OC<I =@DIB @S@>PO@? (O <>>@KON OC@ N<H@ <MBPH@ION <N sql_select() @S>@KO AJM OC@ G<NO RCD>C DN KMJQD?@? =T OC@ API>ODJI $select

$from

$where

$groupby

276


# SQL access $orderby

$limit

$having

$serveur (O DN <KKGD@? <N NCJRI DI OCDN @S<HKG@ $request = sql_get_select('column', 'table'); // returns "SELECT column FROM table" (for a MySQL database)

2CDN API>ODJI OC@M@AJM@ M@OPMIN < 1/* LP@MT RCD>C DN Q<GD? AJM OC@ ?<O<=<N@ H<I<B@M DI PN@ N OCDN LP@MT DN >G@<I DO ><I =@ ?DM@>OGT PN@? =T OC@ sql_query() API>ODJI =PO HJM@ JAO@I OC<I IJO DO DN PN@? OJ >M@<O@ HJM@ >JHKG@S LP@MD@N DI >JIEPI>ODJI RDOC sql_in() // list of identifiers $ids = sql_get_select('id_table', 'tableA'); // selection based on that prior selection $resultats = sql_select('titre', 'tableB', sql_in('id_table', $ids)));

Example 2J ADI? JPO OC@ ODOG@N JA OC@ N@>ODJIN RCD>C C<Q@ <MOD>G@ D?@IODAD@MN BM@<O@M OC<I JI@ JA OC@ KJNND=G@ H@OCJ?N R@ >JPG? <GNJ PN@ < EJDI DN OJ PN@ sql_get_select() // create the selection query to find the list of sections $ids = sql_get_select('DISTINCT(id_rubrique)', 'spip_articles', array('id_article > 200')); // select the titles of those sections $res = sql_select('titre', 'spip_rubriques', sql_in('id_rubrique', $ids)); while ($r = sql_fetch($res)) { // display each title. echo $r['titre'] . '<br />'; }

277


"JIND?@M<=GT HJM@ >JHKGD><O@? R@ >JPG? N@<M>C AJM @S<HKG@N DI >@MO<DI >MDO@MD< API>ODJIN AJM @S<HKG@ RDOC OC@ {noeud} >MDO@MD< JA OC@ 1.(. !JIPS KGPBDI RCD>C >M@<O@N < NP= LP@MT OJ M@OMD@Q@ OC@ GDNO JA J=E@>ON RCD>C C<Q@ >CDG? M@>JM?N function critere_noeud_dist($idb, &$boucles, $crit) { // [...] // this construction with IN will make the compiler request // the use of the sql_in() functions $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"); if ($crit->not) $where = array("'NOT'", $where); $boucle->where[]= $where; }

sql_hex 2C@ sql_hex() API>ODJI M@OPMIN < IPH@MD> Q<GP@ AJM < C@S<?@>DH<G @SKM@NNDJI OM<INAJMHDIB 09af DIOJ 0x09af AJM +T1/* <I? 1/*DO@ 2CDN DN KMDI>DK<GGT PN@? OJ RMDO@ C@S<?@>DH<G >JIO@IO DIOJ < IPH@MD><GGT OTK@? 1/* >JGPHI (O <>>@KON K<M<H@O@MN $val DN OC@ >C<M<>O@M NOMDIB OJ =@ OM<ING<O@?

$serveur

$option 3N<B@ $hex = sql_hex('0123456789abcdef'); sql_updateq('table', array('column'=>$hex), 'id_table=' . $id_table);

278


# SQL access

sql_in 2C@ sql_in() API>ODJI DN PN@? OJ >M@<O@ < >JGPHI >JI?DODJI PNDIB OC@ IN 1/* F@TRJM? (O @HKGJTN K<M<H@O@MN $val DN OC@ I<H@ JA OC@ >JGPHI

$valeurs DN OC@ GDNO JA Q<GP@N DI OC@ AJMH JA < O<=G@ JM < >JHH< N@K<M<O@? N@LP@I>@ JA NOMDIBN 2C@N@ Q<GP@N RDGG =@ <POJH<OD><GGT ADGO@M@? PNDIB sql_quote

$not DN PN@? OJ KMJQD?@ I@B<ODJI !T ?@A<PGO DO DN @HKOT '' <NNDBI 'NOT' OJ @S@>PO@ < NOT IN >JI?DODJI

$serveur

$option (O ><I =@ PN@? <N AJGGJRN $vals = array(2, 5, 8); // where $vals = "2, 5, 8"; $ids = sql_in('id_table', $vals); if ($res = sql_select('column', 'table', $in)) { // ... }

Example 2C@ 2D>F@ON KGPBDI PN@N sql_in() OJ J=O<DI OC@ ODOG@ JA < OD>F@O JIGT DA DO C<N < NO<OPN H<O>CDIB JI@ JA OCJN@ GDNO@? function inc_ticket_forum_extraire_titre_dist($id_ticket){ $titre = sql_getfetsel('titre', 'spip_tickets', array( 'id_ticket = ' . sql_quote($id_ticket), sql_in('statut', array('ouvert', 'resolu', 'ferme')) )); return $titre; }

279


sql_insert 2C@ sql_insert() API>ODJI DN PN@? OJ DIN@MO >JIO@IO DIOJ < ?<O<=N@ 2C@ 1/* KJMON H<T @SK@MD@I>@ KMJ=G@HN RC@I PNDIB OCDN API>ODJI <I? DA NJ OC@T NCJPG? PN@ OC@ sql_insertq() API>ODJI DINO@<? 2CDN API>ODJI DN ?@N>MD=@? C@M@ JIGT OJ @INPM@ NPKKJMO AJM M@NOJMDIB JG? =<>FPKN <I? AJM OM<INDODJIDIB JG? N>MDKON 2C@ API>ODJI <>>@KON K<M<H@O@MN $table DN OC@ 1/* O<=G@

$noms DN OC@ GDNO JA >JGPHIN <AA@>O@?

$valeurs DN OC@ G<NO JA Q<GP@N OJ =@ NOJM@?

$desc

$serveur

$option 3N<B@ @SH<KG@ sql_insert('table', '(column)', '(value)');

Example (IN@MO < GDIF OJ < F@TRJM? AJM <I <MOD>G@ $id_mot = intval($id_mot); $article = intval($article); sql_insert("spip_mots_articles", "(id_mot, id_article)", "($id_mot, $article)");

$S<HKG@ JA HDBM<ODIB OJ sql_insertq() sql_insertq("spip_mots_articles", array( "id_mot" => $id_mot, "id_article" => $article));

280


# SQL access

sql_insertq 2C@ sql_insertq() API>ODJI DN PN@? OJ K@MAJMH < M@>JM? DIN@MO DIOJ OC@ ?<O<=<N@ ,JI IPH@MD> Q<GP@N RDGG =@ ADGO@M@? PNDIB API>ODJIN HJ?DAD@? AJM @<>C ?<O<=<N@ H<I<B@M DI JM?@M OJ >JMM@>OGT C<I?G@ <KJNOMJKC@N 5C@I KJNND=G@

OC@ API>ODJI M@OPMIN OC@ D?@IODATDIB IPH=@M AJM OC@ DIN@MO@? KMDH<MT F@T 2C@ API>ODJI <>>@KON K<M<H@O@MN $table DN OC@ I<H@ JA OC@ 1/* O<=G@

$couples DN <I <MM<T O<=G@ JA I<H@ Q<GP@ K<DMN

$desc

$serveur

$option (O DN PN@? <N NCJRI =@GJR $id = sql_insertq('table', array('column1'=>'value1', 'column2'=>'value2'));

Example 2C@ insert_xx() API>ODJIN GDF@ insert_article() ?@N>MD=@? DI @>MDM@ <>ODJI @?DO@M;<MOD>G@ KCK <M@ PN@? OJ >M@<O@ ?<O<=<N@ DIN@MON AJM OC@ J=E@>ON DI LP@NODJI =T H<I<BDIB OC@ ?@A<PGO Q<GP@N <I? ><GGDIB OC@ KM@;DIN@MODJI K <KKMJKMD<O@ KDK@GDI@ 2C@N@ API>ODJIN M@OPMI OC@ D?@IODAD@M JA OC@ >M@<O@? M@>JM? 2C@N@ API>ODJIN OC@M@AJM@ MPI OC@ sql_insertq() API>ODJI <AO@M OC@ pre_insertion KDK@GDI@ (A <I <POCJM DN D?@IODAD<=G@ ?PMDIB OC@ KMJ>@NN

OC@I OC@ <MOD>G@ DN GDIF@? OJ OC<O <POCJM $id_article = sql_insertq("spip_articles", $champs); // check that the server doesn't return an error if ($id_article > 0 AND $GLOBALS['visiteur_session']['id_auteur']) { sql_insertq('spip_auteurs_articles', array( 'id_auteur' => $GLOBALS['visiteur_session']['id_auteur'], 'id_article' => $id_article)); }

281


sql_insertq_multi 2C@ sql_insertq_multi() API>ODJI DN PN@? OJ DIN@MO DI JI@ NDIBG@ <>ODJI

N@Q@M<G @G@H@ION RDOC D?@IOD><G N>C@H<N DIOJ < ?<O<=<N@ O<=G@ 5C@I ?<O<=<N@ H<I<B@M KJMON <GGJR DO OC@T RDGG OC@I PN@ < NDIBG@ 1/* >JHH<I? OJ DHKG@H@IO OC@ DIN@MO +JM@ NK@>DAD><GGT < NDIBG@ 1/* >JHH<I? AJM @<>C =<O>C JA @G@H@ION DI JM?@M OJ <QJD? H@HJMT >JIB@NODJI 2C@ API>ODJI C<N OC@ N<H@ K<M<H@O@MN <N sql_insertq() =PO OC@ N@>JI? K<M<H@O@M AJM OCDN API>ODJI DN < O<=G@ JA < O<=G@ JA K<DMN <I? IJO EPNO ?DM@>OGT < O<=G@ JA K<DMN $table DN OC@ I<H@ JA OC@ 1/* O<=G@

$couples DN < O<=G@ JA <NNJ>D<ODQ@ O<=G@N JA I<H@ Q<GP@ K<DMN

$desc

$serveur

$option 2C@ >JGPHIN PN@? DI OCDN >JHH<I? <=NJGPO@GT HPNO =@ OC@ N<H@ N@O AJM <GG JA OC@ DIN@MON 2C@ >JHH<I? DN PN@? <N NCJRI =@GJR $id = sql_insertq_multi('table', array( array('column' => 'valeur'), array('column' => 'valeur2'), array('column' => 'valeur3'), );

Example 1@<M>C@N H<?@ PNDIB 1.(. PN@ OC@ spip_resultats O<=G@ OJ NOJM@ NJH@ @G@H@ION PN@? <N < ><>C@ =T O<FDIB ><M@ OJ PN@ OC@ O<=G@ AJM OC@ 1/* >JII@>ODJI $tab_couples >JIO<DIN <GG JA OC@ ?<O< OJ =@ DIN@MO@? // insert the results in the results cache table if (count($points)){ $tab_couples = array(); foreach ($points as $id => $p){ $tab_couples[] = array( 'recherche' => $hash, 'id' => $id, 'points' => $p['score']

282


# SQL access ); } sql_insertq_multi('spip_resultats', $tab_couples, array(), $serveur); }

2C@ .JGTCD@M<M>CD@ KGPBDI PN@N OCDN API>ODJI OJJ AJM DIN@MODIB OC@ GDNO JA N@>ODJIN EPNO M@>@IOGT GDIF@? OJ < BDQ@I J=E@>O $ins = array(); foreach($id_parents as $p){ if ($p) { $ins[] = array( 'id_parent' => $p, 'id_objet' => $id_objet, 'objet' => $objet); } if (count($ins)) { sql_insertq_multi("spip_rubriques_liens", $ins, "", $serveur); }

sql_in_select 2C@ API>ODJI sql_in_select() M@OPMIN < sql_in AMJH OC@ M@NPGO JA < sql_select (O <>>@KON OC@ N<H@ <MBPH@ION <N sql_select KGPN JI@ <??DODJI<G K<M<H@O@M DI ADMNO KG<>@ $in DN OC@ I<H@ JA OC@ >JGPHI JI RCD>C OC@ IN RDGG =@ <KKGD@?

$select

$from

$where

$groupby

$orderby

$limit

$having

$serveur

$option

283


7JP ><I PN@ DO GDF@ OCDN $where = sql_in_select("column", "column", "tables", "id_parent = $id_parent")); // $where: column IN (3, 5, 7) if ($res = sql_select('column', 'another_table', $where)) { // ... }

Example #@G@O@ @Q@MT GDIF =@OR@@I <I <MOD>G@ <I? OC@ F@TRJM?N JA < BDQ@I F@TRJM? BMJPK sql_delete("spip_mots_articles", array( "id_article=" . $id_article, sql_in_select("id_mot", "id_mot", "spip_mots", "id_groupe = $id_groupe"));

sql_listdbs 2C@ sql_listdbs() API>ODJI GDNON OC@ Q<MDJPN ?<O<=<N@N OC<O <M@ <Q<DG<=G@ AJM < K<MOD>PG<M >JII@>ODJI (O M@OPMIN < N@G@>ODJI M@NJPM>@ JM ?DM@>OGT < .'. O<=G@ JA OC@ Q<MDJPN ?<O<=<N@N <N DN OC@ ><N@ AJM 1/*DO@ (O <>>@KON K<M<H@O@MN $serveur

$option 1.(. PN@N OCDN API>ODJI ?PMDIB OC@ DINO<GG<ODJI MJPODI@ OJ K@MHDO OC@ N@G@>ODJI

RC@I JI@ ><I =@ H<?@ JA RCD>C ?<O<=<N@ OJ PN@ AMJH OCJN@ OCJN@ <POCJMDN@? =T OC@ ?<O<=<N@ H<I<B@M $result = sql_listdbs($server_db);

284


# SQL access

sql_multi 2C@ sql_multi() API>ODJI <KKGD@N <I 1/* @SKM@NNDJI OJ < >JGPHI OC<O >JIO<DIN < HPGOD GDIBP<G @SKM@NNDJI K <multi> DI JM?@M OJ @SOM<>O OC@ KJMODJI >JMM@NKJI?DIB OJ < IJHDI<O@ G<IBP<B@ AMJH DO (O M@OPMIN < >C<M<>O@M NOMDIBN OTK@? <N expression AS multi 2CDN JK@M<ODJI DN @NN@IOD<GGT PN@? OJ NDHPGO<I@JPNGT M@LP@NO < NJMO JI OCDN >JGPHI (O <>>@KON K<M<H@O@MN $sel DN OC@ I<H@ JA OC@ >JGPHI

$lang DN OC@ G<IBP<B@ >J?@ fAMf f@Nf

$serveur

$option (O DN PN@? <N NCJRI =@GJR $multi = sql_multi('column', 'language'); $select = sql_select($multi, 'table');

,JO@ OC<O DI < O@HKG<O@ ADG@ OC@ GJJK >MDO@MD< {par multi xx} RC@M@ xx DN OC@ I<H@ JA OC@ >JGPHI OJ =@ NJMO@? RDGG <GNJ ><GG OCDN API>ODJI DI JM?@M OJ NJMO <>>JM?DIB OJ OC@ >PMM@IO G<IBP<B@

Example 1.(. PN@N OCDN API>ODJI OJ NJMO OC@ GDNON <>>JM?DIB OJ OC@ ODOG@ JA <I @G@H@IO <I? <>>JM?DIB OJ OC@ NDO@ QDNDOJfM IJHDI<O@? G<IBP@B $select = array( 'id_mot', 'id_groupe', 'titre', 'descriptif', sql_multi ("titre", $GLOBALS['spip_lang'])); if ($results = sql_select($select, 'spip_mots', "id_groupe=$id_groupe", '', 'multi')) { while ($r = sql_fetch($results)) { // $r['titre'] $r['multi'] } }

(I NDHDG<M A<NCDJI OC@ &M<KK@N KGPBDI PN@N DO C@M@

285


$grappes = sql_allfetsel("*, ".sql_multi ("titre", "$spip_lang"), "spip_grappes", "", "", "multi"); foreach ($grappes as $g) { // $g['multi'] }

sql_optimize 2C@ sql_optimize() API>ODJI DN PN@? OJ JKODHDN@ <I 1/* O<=G@ 2CDN API>ODJI DN ><GG@? =T OC@ optimiser_base_une_table() API>ODJI RCD>C DN K@MDJ?D><GGT ><GG@? =T OC@ >MJI H@>C<IDNH .G@<N@ M@A@M OJ OC@ OPTIMIZE TABLE JM VACUUM >JHH<I?N AJM OC@ <KKMJKMD<O@ 1/* ?<O<=<N@ H<I<B@M OJ PI?@MNO<I? OC@ ?@O<DGN JA RC<O DN =@DIB @S@>PO@? =T OC@N@ >JHH<I?N 2C@ API>ODJI <>>@KON K<M<H@O@MN $table DN OC@ I<H@ JA OC@ O<=G@ OJ =@ JKODHDN@?

$serveur

$option 3N<B@ sql_optimize('table');

Note: 1/*DO@ ><I IJO JKODHDN@ JI@ O<=G@ <O < ODH@ =PO JKODHDN@N OC@ @IODM@ ?<O<=<N@ DI JI@ CDO (I OCDN ><N@ DA OC@ sql_optimize() API>ODJI DN ><GG@? HPGODKG@ ODH@N DI < MJR OC@I OC@ JK@M<ODJI RDGG <>OP<GGT JIGT =@ K@MAJMH@? EPNO JI>@ AJM OC@ ADMNO ><GG

sql_query 2C@ sql_query() API>ODJI @S@>PO@ OC@ LP@MT K<NN@? OJ DO <N < K<M<H@O@M (O DN OC@ G@<NO KJMO<=G@ JA OC@ 1/* DINOMP>ODJI >JHH<I? N@O DO NCJPG? OC@M@AJM@ =@ <QJD?@? RC@M@Q@M KJNND=G@ DI KM@A@M@I>@ OJ OC@ JOC@M HJM@ NK@>DAD> 1/* .( API>ODJIN (O <>>@KON K<M<H@O@MN $ins DN OC@ 1/* LP@MT

286


# SQL access $serveur

$option 3N<B@ $res = sql_query('SELECT * FROM spip_meta'); // but we would prefer you used this instead: $res = sql_select('*', 'spip_meta');

sql_quote 2C@ sql_quote() API>ODJI DN PN@? OJ N@>PM@ JM ADGO@M ?<O< >JIO@IO RDOC <KJNOMJKC@N DI JM?@M OJ <QJD? 1/* DIE@>ODJI <OO<>FN 2CDN API>ODJI DN Q@MT DHKJMO<IO <I? HPNO =@ PN@? RC@I@Q@M >JIO@IO DN KMJQD?@? =T PN@M ?<O< @IOMT 2C@ sql_insertq sql_updateq <I? sql_replace API>ODJIN <POJH<OD><GGT <KKGT OCDN ADGO@MDIB AJM <IT DIN@MO@? ?<O< =PO IJO AJM OC@ JOC@M K<M<H@O@MN GDF@ $where RCD>C JPBCO OJ =@ ADGO@M@? IJI@OC@G@NN <ITR<T (O <>>@KON K<M<H@O@MN $val DN OC@ @SKM@NNDJI OJ =@ ADGO@M@?

$serveur

$type JKODJI<G DN OC@ OTK@ JA Q<GP@ @SK@>O@? 2CDN RJPG? @LP<G int AJM <I DIO@B@M Q<GP@ (O DN PN@? <N NCJRI =@GJR $charstring = sql_quote("David's car"); $fieldname = sql_quote($fieldname); sql_select('column', 'table', 'titre=' . sql_quote($titre)); sql_updateq('table', array('column'=>'value'), 'titre=' . sql_quote($titre));

5C@I@Q@M < IPH@MD> D?@IODAD@M DN @SK@>O@? RCD>C DN JAO@I OC@ ><N@ AJM KMDH<MT F@TN OC@ ADGO@MDIB H<T NDHKGT <KKGT OC@ intval() .'. API>ODJI OC@ Q<GP@ U@MJ RDGG =@ M@OPMI@? DA OC@ >JIO@IO K<NN@? DN IJO IPH@MD> $id_table = intval(_request('id_table')); sql_select('column', 'table', 'id_table=' . intval($id));

287


Example 2C@ url_delete() API>ODJI ?@G@O@N 30*N AMJH OC@ 1/* O<=G@ OC<O NOJM@N OC@ 30*N AJM 1.(. @?DOJMD<G J=E@>ON (O ADGO@MN OC@ NOMDIBN PNDIB sql_quote() <I? PN@N intval() JI OC@ D?@IODAD@M function url_delete($objet, $id_objet, $url=""){ $where = array( "id_objet=" . intval($id_objet), "type=" . sql_quote($objet) ); if (strlen($url)) { $where[] = "url=" . sql_quote($url); } sql_delete("spip_urls", $where); }

sql_repair 2C@ sql_repair() API>ODJI DN PN@? OJ M@K<DM < ?<H<B@? 1/* O<=G@ (O DN ><GG@? =T 1.(. RC@I <I <?HDIDNOM<OJM <OO@HKON OJ M@K<DM < ?<O<=<N@ PNDIB OC@ ecrire/?exec=admin_tech K<B@ (O <>>@KON K<M<H@O@MN $table DN OC@ O<=G@ RCD>C DN M@LP@NO@? OJ =@ M@K<DM@?

$serveur

$option 3N<B@ sql_repair('table');

Note: .JNO&M@N <I? 1/*DO@ ?<O<=<N@ H<I<B@MN DBIJM@ OCDN DINOMP>ODJI

288


# SQL access

sql_replace 2C@ sql_replace() API>ODJI DIN@MON JM PK?<O@N < M@>JM? DI <I 1/* O<=G@ 2C@ KMDH<MT F@T N HPNO @SDNO <HJIBNO OC@ DIN@MO@? ?<O< 2C@ API>ODJI <POJH<OD><GGT N@>PM@N OC@ ?<O< (O DN M@>JHH@I?@? OJ PN@ OC@ NK@>DAD> sql_insertq() <I? sql_updateq() DINO@<? JA OCDN API>ODJI OJ =@ HJM@ KM@>DN@ <O G@<NO RC@M@ NP>C DN KJNND=G@ (ON K<M<H@O@MN <M@ $table DN OC@ 1/* O<=G@ DI LP@NODJI

$couples >JIO<DIN OC@ >JGPHI Q<GP@ K<DMN OJ =@ HJ?DAD@?

$desc

$serveur

$option (O DN PN@? <N NCJRI =@GJR sql_replace('table', array( 'column' => 'value', 'id_table' => $id ));

sql_replace_multi 2C@ sql_replace_multi() API>ODJI DN PN@? OJ DIN@MO JM M@KG<>@ N@Q@M<G MJRN RCD>C C<Q@ OC@ N<H@ N>C@H< AJM <I 1/* O<=G@ DI < NDIBG@ JK@M<ODJI 2C@ Q<GP@N <M@ <POJH<OD><GGT ADGO@M@? <B<DINO 1/* DIE@>ODJI <OO<>FN (O DN I@>@NN<MT OC<O OC@ >JGPHIN JA DIN@MO@? K<DMN >JIO<DI OC@ KMDH<MT F@T N AJM OC<O O<=G@ (O DN M@>JHH@I?@? OJ PN@ OC@ NK@>DAD> API>ODJIN sql_insertq_multi() <I? sql_updateq() DINO@<? JA OCDN API>ODJI OJ =@ HJM@ KM@>DN@ <O G@<NO RC@M@ NP>C DN KJNND=G@ (O C<N OC@ N<H@ K<M<H@O@MN <N NLG;M@KG<>@ K $table DN OC@ 1/* O<=G@ DI LP@NODJI

$couples DN < O<=G@ JA >JGPHI Q<GP@ K<DMN OJ =@ HJ?DAD@?

$desc

$serveur

289


$option (O DN PN@? <N NCJRI =@GJR sql_replace_multi('table', array( array( 'column' => 'value1', 'id_table' => $id1 ), array( 'column' => 'value2', 'id_table' => $id2 ) ));

sql_seek 2C@ sql_seek() API>ODJI KJNDODJIN < N@G@>ODJI M@NJPM>@ JMDBDI<ODIB AMJH < sql_select() <O OC@ ?@NDBI<O@? MJR IPH=@M (O <>>@KON K<M<H@O@MN $res OC@ M@NJPM>@

$row_number OC@ MJR IPH=@M

$serveur

$option (O DN PN@? <N NCJRI =@GJR if ($res = sql_select('column', 'table')) { if (sql_seek($res, 9)) { // go to number 10 $r = sql_fetch($res); // $r['column'] of the 10th result } // return back to the start sql_seek($res, 0); }

290


# SQL access

sql_select 2C@ sql_select() API>ODJI N@G@>ON >JIO@IO AJMH OC@ ?<O<=<N@ <I? M@OPMIN <I 1/* M@NJPM>@ RC@I NP>>@NNAPG JM false DI OC@ @Q@IO JA <I @MMJM (O <>>@KON PK OJ K<M<H@O@MN OC@ ADMNO =@DIB H<I?<OJMT <I? N@LP@I>@? DI OC@ N<H@ ?@N>MDKODQ@ JM?@M <N < NO<I?<M? 1/* LP@MT $<>C K<M<H@O@M RDGG KM@A@M<=GT <>>@KO < O<=G@ <N DIKPO ?<O< =PO RDGG <GNJ <>>@KO >C<M<>O@M NOMDIBN RDOC @G@H@ION N@K<M<O@? =T >JHH<N $select

$from

$where

$groupby

$orderby

$limit

$having

$serveur

$option 2C@ sql_select() API>ODJI DN JAO@I >JPKG@? RDOC <I sql_fetch() NP>C <N NCJRI C@M@ =@GJR // selection if ($resultats = sql_select('column', 'table')) { // loop for the reults while ($res = sql_fetch($resultats)) { // use the results // $res['column'] } }

2C@ $select <I? $from K<M<H@O@MN <>>@KO OC@ ?@>G<M<ODJI JA <GD<N@N 2CDN JAA@MN OC@ AJGGJRDIB OTK@ JA >JINOMP>ODJI if ($r = sql_select( array( 'a.column AS colA', 'b.column AS colB', 'SUM(b.number) AS total' ), array( 'tableA AS a',

291


'tableB AS b' ))) { while ($ligne = sql_fetch($r)) { // we now have access to: // $ligne['colA'] $ligne['colB'] }

$ligne['total']

}

Example 1@G@>ODIB OC@ MJJO N@>ODJIN D?;K<M@IO DI OC@ NKDK;MP=MDLP@N O<=G@ NJMO@? =T M<IF 9 K : OC@I DI <GKC<IPH@MD> JM?@M <I? M@LP@NODIB <GG JA OC@ >JGPHIN OJO<G N@G@>ODJI RDOC f f $result = sql_select('*', "spip_rubriques", "id_parent=0", '', '0+titre,titre'); while ($row = sql_fetch($result)){ $id_rubrique = $row['id_rubrique']; // ... }

1@G@>ODIB ><ON =PO IJO ?JBN DI OC@ ODOG@ AJM <MOD>G@N DI N@>OJM $champs = array('titre', 'id_article', 'id_rubrique'); $where = array( 'id_secteur = 3', 'titre LIKE "%chat%" ', 'titre NOT LIKE "%chien%"' ); $result = sql_select($champs, "spip_articles", $where);

1@G@>ODIB OC@ ODOG@N <I? @SO@INDJIN M@>JBIDN@? AJM ?J>PH@ION <I? NOJM@ OC@ M@NPGO DI < O<=G@ $types = array(); $res = sql_select(array("extension", "titre"), "spip_types_documents"); while ($row = sql_fetch($res)) { $types[$row['extension']] = $row; }

292


# SQL access 2CDN N@G@>ODJI >JPG? <GNJ =@ RMDOO@I <N $res = sql_select("extension, titre", "spip_types_documents");

1@G@>ODIB OC@ ?J>PH@ION GDIF@? OJ < N@>ODJI RDOC OC@ ODOG@ JA OC@ N@>ODJI DI LP@NODJI <I? NJMO@? =T M@Q@MN@ ?<O@ JM?@M $result = sql_select( array( "docs.id_document AS id_doc", "docs.extension AS extension", "docs.fichier AS fichier", "docs.date AS date", "docs.titre AS titre", "docs.descriptif AS descriptif", "R.id_rubrique AS id_rub", "R.titre AS titre_rub"), array( "spip_documents AS docs", "spip_documents_liens AS lien", "spip_rubriques AS R"), array( "docs.id_document = lien.id_document", "R.id_rubrique = lien.id_objet", "lien.objet='rubrique'", "docs.mode = 'document'"), "", "docs.date DESC"); while ($row=sql_fetch($result)) { $titre=$row['titre']; // ... // and with the previous table: $titre_extension = $types[$row['extension']]['titre']; }

9 K : +<T=@ JI@ JA OC@N@ ?<TN OC@M@ RDGG =@ < B@IPDI@GT ?@?D><O@? >JGPHI AJM OCDN

293


sql_selectdb 2C@ sql_selectdb() API>ODJI DN PN@? OJ N@G@>O < >JII@>ODJI OJ < ?<O<=<N@ N@MQ@M OC<O JAA@MN < ?<O<=<N@ AJM PN@ 2C@ API>ODJI M@OPMIN true JA OC@ JK@M<ODJI DN NP>>@NNAPG JOC@MRDN@ DO M@OPMIN false 2C@ sql_selectdb() API>ODJI C<N K<M<H@O@MN $nom =@DIB OC@ I<H@ JA OC@ ?<O<=<N@ OJ PN@

$serveur

$option 2CDN API>ODJI DN PN@? =T 1.(. ?PMDIB OC@ DINO<GG<ODJI MJPODIB OJ OMT OJ KM@ N@G@>O OC@ I<H@ JA OC@ ?<O<=<N@ OJ =@ PN@? =T H@<IN JA <OO@HKODIB OJ N@G@>O < ?<O<=<N@ RDOC OC@ N<H@ I<H@ <N OC@ GJBDI $test_base = $login_db; $ok = sql_selectdb($test_base, $server_db);

sql_serveur 2C@ sql_serveur() API>ODJI DN PN@? OJ =JOC >JII@>O OJ OC@ ?<O<=<N@ N@MQ@M DA OC<O C<N IJO T@O <GM@<?T =@@I ?JI@ <I? OJ J=O<DI OC@ M@<G I<H@ JA OC@ API>ODJI OC<O RDGG =@ @S@>PO@? AJM < M@LP@NO@? OM<IN<>ODJI 2CDN API>ODJI DN ><GG@? OM<INK<M@IOGT =T H@<IN JA <GD<N@N (O DN OC@M@AJM@ IJMH<GGT IJO < PN@APG JK@M<ODJI OJ @HKGJT DO ?DM@>OGT sql_serveur() <>>@KON OCM@@ K<M<H@O@MN RDOC JIGT OC@ ADMNO =@DIB >MDOD><G $ins_sql DN OC@ I<H@ JA OC@ API>ODJI M@LP@NO@? AMJH <HJIBNO OC@ GDNO JA API>ODJIN OC<O OC@ .( PI?@MNO<I?N NP>C <N N@G@>O PK?<O@

PK?<O@L 5C@I G@AO ?@GD=@M<O@GT @HKOT DO DN OC@I NDHKGT M@LP@NODIB OC<O < >JII@>ODJI =@ H<?@ OJ OC@ ?<O<=<N@ N@MQ@M DA NP>C C<N IJO <GM@<?T =@@I ?JI@ $serveur

$continue ?@ADI@N RC<O NCJPG? C<KK@I RC@I@Q@M OC@ 1/* .( DINOMP>ODJI DN IJO AJPI? =T OC@ M@LP@NO@? ?<O<=<N@ H<I<B@M 1@O =T ?@A<PGO OJ false OC@ NTNO@H M@OPMIN < A<O<G @MMJM =PO DO DN KJNND=G@ OJ >JIODIP@ KMJBM<HH@ @S@>PODJI =T N@OODIB OCDN K<M<H@O@MfN Q<GP@ OJ =@ true

294


# SQL access 2CDN API>ODJI DN OTKD><GGT PN@? <N =@GJR // calculate the function name $f = sql_serveur('select'); // execution of the function as per the determined API $f($arg1, $arg2, ... );

(A TJP <M@ M@LP@NODIB OC@ select DINOMP>ODJI DI OC@ DINOMP>ODJI N@O ?@O@MHDI@? AJM +T1/* <I? @SDNODIB DI OC@ @>MDM@ M@L HTNLG KCK ADG@ OC@I OC@ $f Q<MD<=G@ RDGG @LP<G spip_mysql_select "JMM@G<ODJI =@R@@I OC@ DINOMP>ODJIN <I? OC@ API>ODJI DN ?@ADI@? DI OC<O N<H@ ADG@ RDOC < BGJ=<G Q<MD<=G@ spip_mysql_functions_1 HTNLG DN OC@ OTK@ JA N@MQ@M DN OC@ Q@MNDJI JA OC@ DINOMP>ODJI N@O

Using aliases to make things simple .M<>OD><GGT <GG JA OC@ sql_*

.( API>ODJIN <M@ <GD<N@N RCD>C OC<O ><G>PG<O@

< API>ODJI PNDIB sql_serveur <I? OC@I @S@>PO@ DO (I OCDN R<T ><GGDIB OC@ sql_select API>ODJI K@MAJMHN HJM@ JM G@NN @S<>OGT OC@ N<H@ JK@M<ODJI <N OC@ KM@QDJPN >J?@ (O DN OC@N@ DINOMP>ODJIN OC<O JPBCO OJ =@ PN@? sql_select($arg1, $arg2, ...);

sql_set_charset 2C@ sql_set_charset() API>ODJI M@LP@NON OC@ PN<B@ JA OC@ NK@>DAD@? @I>J?DIB AJM OM<IN<>ODJIN =@OR@@I .'. <I? OC@ ?<O<=<N@ H<I<B@M sql_set_charset() <>>@KON OCM@@ K<M<H@O@MN -IGT OC@ ADMNO DN M@LPDM@? $charset DN OC@ M@LP@NO@? >C<MN@O NP>C <N POA $serveur

$options 2CDN API>ODJI DN ><GG@? DHH@?D<O@GT <AO@M @<>C >JII@>ODJI OJ OC@ ?<O<=<N@ N@MQ@M DI JM?@M OJ NK@>DAT OC@ >C<MN@O OJ =@ @HKGJT@? 2CDN @I>J?DIB N@G@>ODJI DN ?@ADI@? @GN@RC@M@ DI OC@ charset_sql_connexion H@O< Q<MD<=G@ >M@<O@? ?PMDIB OC@ DINO<GG<ODJI JA 1.(.

295


sql_showbase 2C@ sql_showbase() API>ODJI DN PN@? OJ J=O<DI < M@NJPM>@ OC<O ><I =@ PN@? RDOC sql_fetch() ?@O<DGDIB OC@ O<=G@N OC<O @SDNO DI OC@ ?<O<=<N@ (O <>>@KON K<M<H@O@MN $spip @HKOT =T ?@A<PGO OC@ K<M<H@O@M DN PN@? OJ GDNO JIGT OC@ O<=G@N PNDIB OC@ KM@ADS ?@ADI@? AJM 1.(. O<=G@N 3N@ '%' DINO@<? DA TJP R<IO OJ GDNO ** O<=G@N

$serveur

$option 3N<B@ if ($q = sql_showbase()) { while ($t = sql_fetch($q)) { $table = array_shift($t); // ... }

2C@ NLG;<GGO<=G@ K @NO API>ODJI DN B@I@M<GGT @<ND@M OJ PN@ NDI>@ DO ?DM@>OGT M@OPMIN < .'. O<=G@ GDNODIB OC@ Q<MDJPN ?<O<=<N@ O<=G@N

sql_showtable 2C@ sql_showtable() API>ODJIN M@OPMIN < ?@N>MDKODJI JA <I 1/* O<=G@ DI <I <NNJ>D<ODQ@ O<=G@ OC<O GDNON OC@ >JGPHIN <I? OC@DM 1/* AD@G? ?@N>MDKODJIN <I? <GNJ GDNODIB OC@ F@TN 5C@I@Q@M < EJDI ?@>G<M<ODJI @SDNON AJM OC@ O<=G@ ?@>G<M@? DI tables_principales JM tables_auxiliaires OC@ O<=G@ RDGG <GNJ M@OPMI <I @IOMT AJM OC@ EJDI F@T (ON K<M<H@O@MN <M@ $table DN OC@ I<H@ JA OC@ O<=G@ OJ DIQ@NODB<O@

$table_spip DN PN@? OJ <POJH<OD><GGT M@KG<>@ NKDK =T OC@ O<=G@fN M@<G KM@ADS DO @LP<GN false =T ?@A<PGO

$serveur

$option 3N<B@

296


# SQL access $desc = sql_showtable('spip_articles', true); // $desc['field']['id_article'] = "bigint(21) NOT NULL AUTO_INCREMENT" // $desc['key']['PRIMARY KEY'] = "id_article" // $desc['join']['id_article'] = "id_article"

(I HJNO NDOP<ODJIN DO RJPG? =@ =@OO@M OJ PN@ OC@ OMJPQ@M;O<=G@ K API>ODJI

RCD>C C<N < ><>C@ JI OC@ ?<O< NOMP>OPM@ PN@ OC@ sql_showtable() API>ODJI <I? <?? NJH@ NPKKG@H@IO<MT DIAJMH<ODJI $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table('spip_articles');

sql_update 2C@ sql_update() API>ODJI PK?<O@N JI@ JM N@Q@M<G M@>JM?N DI <I 1/* O<=G@ 2C@ @G@H@ION K<NN@? <M@ IJO <POJH<OD><GGT ADGO@M@? <B<DINO 1/* DIE@>ODJI <OO<>FN <N RDOC sql_updateq() NJ TJP HPNO R<O>C JPO AJM 1/* DIE@>ODJI <OO<>FN <I? PN@ sql_quote() API>ODJIN OJ N@>PM@ OC@ >JIO@IO RC@I I@>@NN<MT 2C@ API>ODJI <>>@KO K<M<H@O@MN $table DN OC@ 1/* O<=G@ DI LP@NODJI

$exp >JIO<DIN OC@ HJ?DAD><ODJIN OJ =@ H<?@

$where

$desc

$serveur

$option 2CDN API>ODJI DN KMDI>DK<GGT PN@? OJ HJ?DAT Q<GP@N RCD>C PN@ OC@ N<H@ Q<GP@ <N OC@ >JGPHI =@DIB PK?<O@? @ B // increment the column by 1 sql_update('table', array('column' => 'column + 1'));

5C@I@Q@M ?<O< <??@? RDOC OCDN API>ODJI <M@ GDF@GT OJ DI>GP?@ <KJNOMJKC@N JM JMDBDI<O@ AMJH PN@M ?<O< @IOMT DO DN DHKJMO<IO OJ N@>PM@ OC@ DIN@MO RDOC OC@ PN@ JA OC@ sql_quote() API>ODJI

297


sql_update('table', array('column' => sql_quote($value)));

Example 3K?<O@ OC@ D?;N@>O@PM >JGPHI RDOC OC@ D?@IODAD@M AJM N@>ODJIN OC<O ?JIfO C<Q@ < K<M@IO // assign the id_secteur value for root sections sql_update('spip_rubriques', array('id_secteur'=>'id_rubrique'), "id_parent=0");

?? < N@O IPH=@M JA QDNDON OJ OC@ NO<ODNOD><G ?<O< AJM >@MO<DI <MOD>G@N $article_set = sql_in('id_article', $liste); sql_update('spip_visites_articles', array('visites' => "visites+$n"), "date='$date' AND $article_set");

sql_updateq 2C@ sql_updateq() API>ODJI DN PN@? OJ PK?<O@ >JIO@IO DI <I 1/* O<=G@ 2C@ >JIO@IO K<NN@? OJ OC@ API>ODJI DN <POJH<OD><GGT ADGO@M@? (ON K<M<H@O@MN <M@ OC@ N<H@ <N AJM sql_update() $table DN OC@ 1/* O<=G@ DI LP@NODJI

$exp >JIO<DIN OC@ HJ?DAD><ODJIN OJ =@ H<?@

$where

$desc

$serveur

$option (O DN PN@? <N NCJRI =@GJR sql_updateq('table', array('column' => $value), 'id_table=' . intval($id_table));

298


# SQL access Example 2C@ modifier_contenu() API>ODJI DI @>MDM@ DI> HJ?DAD@M KCK DN ><GG@? RC@I <I @?DOJMD<G J=E@>O DN HJ?DAD@? <I? O<F@N ><M@ JA ><GGDIB OC@ pre_edition <I? post_edition KDK@GDI@N

PNDIB OC@ sql_updateq() API>ODJI OJ PK?<O@ OC@ >JGG@>O@? ?<O< sql_updateq($spip_table_objet, $champs, "$id_table_objet=$id", $serveur);

sql_version 2C@ sql_version() API>ODJI NDHKGT M@OPMIN OC@ Q@MNDJI IPH=@M JA OC@ ?<O<=<N@ H<I<B@M (O <>>@KON JKODJI<G K<M<H@O@MN $serveur

$option 3N<B@ $x = sql_version(); echo $x; // depending on the type of server, we might see: // for MySQL: 5.1.37-1ubuntu5.1 // for SQLite2: 2.8.17 // for SQLite3: 3.6.16

299



Creating your own plugins .GPBDIN <M@ < >JIQ@ID@IO R<T OJ <?? @SO@INDJIN OJ 1.(. 2C@T PNP<GGT >JH@ <N < >JHKM@NN@? AJG?@M DI 8(. AJMH<O <I? C<Q@ OJ =@ @SOM<>O@? DI OC@ KGPBDIN ?DM@>OJMT OJ =@ >M@<O@? DA I@@? =@ JM OJ =@ DINO<GG@? ?DM@>OGT =T @IO@MDIB OC@ >JHKM@NN@? ADG@fN 30* DI OC@ KGPBDIN <?HDIDNOM<ODJI K<B@ DI OC@ KMDQ<O@ <M@<

301


The basic principle of plugins .GPBDIN <?? A@<OPM@N JM API>ODJIN OJ 1.(. RCD>C H<T =@ < N@O JA NO<I?<M?DN@? O@HKG<O@ ADG@N < HJ?DAD><ODJI JA @SDNODIB API>ODJI<GDOT >M@<ODJI JA I@R @?DO<=G@ ?<O<=<N@ J=E@>ON 2C@T C<Q@ OC@ <?Q<IO<B@ JA @I<=GDIB OC@ H<I<B@H@IO JA O<NFN OJ =@ ><MMD@? JPO RC@I OC@T <M@ DINO<GG@? JM PIDINO<GG@? <>ODQ<O@? JM ?@<>ODQ<O@? 2C@T ><I <GNJ C<I?G@ DIO@M?@K@I?@I>D@N RDOC JOC@M KGPBDIN GG JA OC@ 1.(. AJG?@MN <I? @G@H@ION OC<O ><I =@ JQ@MGJ<?@? ><I =@ M@>M@<O@? DI OC@ AJG?@M JA < KGPBDI DI OC@ N<H@ A<NCDJI <N DN ?JI@ DI TJPM JRI KMDQ<O@ ^NLP@G@OO@N_ AJG?@M 2C@ @NN@IOD<G ?DAA@M@I>@ DN OC@ @SDNO@I>@ JA <I 6+* ADG@ RCD>C ?@N>MD=@N OC@ KGPBDI PIDAJMHGT I<H@? plugin.xml

The minimal plugin.xml 2C@ plugin.xml ADG@ HPNO =@ >M@<O@? DI OC@ MJJO ?DM@>OJMT JA TJPM KGPBDI (O >JIO<DIN OC@ ?@N>MDKODJI JA OC@ KGPBDI <I? <GGJRN DO OJ ?@ADI@ >@MO<DI <>ODJIN 2C@ HDIDHPH >JIO@IO JA OC@ KGPBDI ADG@ HDBCO =@ <N AJGGJRN IJI 1"(( >C<M<>O@MN <M@ @N><K@? <plugin> <nom>Porte plume - Une barre d'outil pour bien écrire</nom> <auteur>Matthieu Marcillaud</auteur> <licence>GNU/GLP</licence> <version>1.2.1</version> <description> "Porte plume" est une barre d'outil géniale pour SPIP [...] </description> <etat>stable</etat> <prefix>porte_plume</prefix> </plugin>

2C@N@ <OOMD=PO@N <M@ @<NT OJ PI?@MNO<I? =PO <M@ ?@N>MD=@? =@GJR IJI@OC@G@NN \ nom I<H@ JA OC@ KGPBDI

302


# Creating your own plugins \ auteur <POCJM N JA OC@ KGPBDI

\ licence GD>@IN@ N AJM OC@ KGPBDI

\ version Q@MNDJI JA OC@ KGPBDI 2CDN ?@O<DG DN ?DNKG<T@? DI OC@ KMDQ<O@ <M@< RC@I M@LP@NODIB DIAJMH<ODJI <=JPO OC@ KGPBDI <I? DO <GNJ N@MQ@N AJM C<I?GDIB ?@K@I?@I>D@N =@OR@@I KGPBDIN RC@I >JPKG@? RDOC OC@ KM@ADS IJOC@M <OOMD=PO@ IJO OJ =@ >JIAPN@? RDOC OCDN JI@ DN OC@ fQ@MNDJI;=<N@f RCD>C DN PN@? RC@I OC@ KGPBDI >M@<O@N O<=G@N JM AD@G?N DI OC@ ?<O<=<N@

\ description KM@OOT J=QDJPN \ etat OC@ NO<O@ JA ?@Q@GJKH@IO JA OC@ KGPBDI K@MC<KN ?@Q DI ?@Q@GJKH@IO O@NO PI?@M O@NODIB JM NO<=G@ \ prefix < PIDLP@ KM@ADS ?DNODIBPDNCDIB OCDN KGPBDI AMJH <IT JOC@MN ,J IPH@M<GN <M@ K@MHDOO@? C@M@ <I? DO HPNO =@ DI GJR@M ><N@

plugin.xml, other common attributes Options and functions 2C@ ADG@N AJM OC@ JKODJIN <I? API>ODJIN KMJQD?@? =T OC@ KGPBDI <M@ ?@>G<M@? ?DM@>OGT RDOCDI OC@ plugin.xml ADG@ PNDIB OC@ options <I? fonctions <OOMD=PO@N <options>porte_plume_options.php</options> <fonctions>inc/barre_outils.php</fonctions> <fonctions>autre_fichier.php</fonctions>

1@Q@M<G API>ODJI ADG@N H<T =@ GJ<?@? DN I@>@NN<MT =T GDNODIB OC@H DI NP>>@NNDJI

Documentation link 2C@ lien <OOMD=PO@ DN PN@? OJ KMJQD?@ <I <??M@NN AJM ?J>PH@IO<ODJI <=JPO OC@ KGPBDI <lien>http://documentation.magraine.net/-PortePlume-</lien>

Plugin icon 2C@ icon <OOMD=PO@ DN PN@? OJ NK@>DAT <I DH<B@ OJ =@ PN@? OJ QDNP<GGT M@KM@N@IO OC@ KGPBDI <icon>imgs/logo-bugs.png</icon>

303


Handling dependencies .GPBDIN ><I DI?D><O@ DA OC@T ?@K@I? PKJI >@MO<DI >JI?DODJIN DI JM?@M AJM OC@H OJ RJMF >JMM@>OGT 2RJ <OOMD=PO@N <M@ PN@? OJ NK@>DAT OCDN necessite <I? utilise (I OC@ ADMNO ><N@ OC@ ?@K@I?@I>T DN < NOMJIB JI@ < KGPBDI OC<O M@LPDM@N < M@NJPM>@ < >@MO<DI Q@MNDJI JA 1.(. JM <IJOC@M K<MOD>PG<M KGPBDI ><I IJO =@ <>ODQ<O@? DA OC<O M@NJPM>@ DN IJO KM@N@IO <I? <>ODQ@ I @MMJM RDGG =@ B@I@M<O@? DA R@ OMT OJ <>ODQ<O@ OC@ KGPBDI RDOCJPO OC<O ?@K@I?@I>T =@DIB APGADGG@? (I OC@ N@>JI? ><N@ OC@ ?@K@I?@I>T DN R@<F <I? OC@ KGPBDI ><I =@ <>ODQ<O@? <I? K@MC<KN @Q@I RJMF @Q@I DA OC<O ?@K@I?@I>T DN IJO APGADGG@?

Necessite <necessite id="prefixe" version="[version_min;version_max]" />

\ id DN OC@ I<H@ JA OC@ KGPBDIfN KM@ADS JM 1.(. AJM < ?DM@>O ?@K@I?@I>T JI 1.(. DON@GA

\ version PN@? JKODJI<GGT ><I DI?D><O@ OC@ HDIDIPH <I? JM H<SDHPH Q@MNDJI JA < KGPBDI 1LP<M@ =M<>F@ON <M@ PN@? OJ DI?D><O@ OC<O OC@ Q@MNDJI <N NK@>DAD@? DN DI>GP?@? K<M@IOC@N@N OJ DI?D><O@ OC<O OC@ Q@MNDJI NK@>DAD@? DN IJO DI>GP?@?

Utilise 3ODGDN@ DN OC@M@AJM@ PN@? OJ ?@>G<M@ JKODJI<G ?@K@I?@I>D@N RDOC @S<>OGT OC@ N<H@ NTIO<S <N AJM necessite utilise <I? necessite <GNJ OC@M@AJM@ H<F@ DO KJNND=G@ OJ JQ@MMD?@ OC@ ADG@N AJM OC@ KGPBDI OC<O OC@T M@A@M OJ <N OC@T C<Q@ KMDJMDOT DI OC@ ADG@ K<OC

Example // requires at least SPIP 2.0 <necessite id="SPIP" version="[2.0;)" /> // requires SPIP < 2.0 <necessite id="SPIP" version="[;2.0)" /> // requires SPIP >= 2.0, and <= 2.1 <necessite id="SPIP" version="[2.0;2.1]" />

304


# Creating your own plugins

// requires spip_bonux at least at version 1.2 <necessite id="spip_bonux" version="[1.2;]" />

"@MO<DI KGPBDIN H<T DI?D><O@ OC<O DO DN KJNND=G@ OJ HJ?DAT OC@DM >JIADBPM<ODJIN DA OC@ "%& KGPBDI DN GJ<?@? =PO RDOCJPO <>OP<GGT =@DIB <I DI?DNK@IN<=G@ M@LPDM@H@IO AJM OC@ KGPBDI OJ RJMF // configuration plugin <utilise id="cfg" version="[1.10.5;]" />

Installing external libraries .GKPBDIN H<T <GNJ M@LPDM@ @SO@MI<G GD=M<MD@N OC<O OC@T <M@ ?@K@I?@IO PKJI OJ =@ ?JRIGJ<?@? 2CDN M@LPDM@N N@Q@M<G OCDIBN < NK@>DAD> ?@>G<M<ODJI DI OC@ plugin.xml ADG@ <I? OC@ @SDNO@I>@ JA < /lib ?DM@>OJMT OC<O DN RMDO@ <>>@NND=G@ DI OC@ 1.(. MJJO ?DM@>OJMT DIOJ RCD>C OC@ GD=M<MT RDGG =@ <POJH<OD><GGT JM H<IP<GGT GJ<?@? <necessite id="lib:nom" src="address of the zip file" />

\ nom NK@>DAD@N OC@ I<H@ JA OC@ UDKfN PI>JHKM@NN@? AJG?@M \ src DN OC@ <??M@NN JA OC@ GD=M<MT <M>CDQ@ DI UDK AJMH<O

Example KGPBDI ><GG@? GJPK@ KCJOJ PN@N < E<Q<N>MDKO GD=M<MT OC<O DO DINO<GGN <N < GD=M<MT OC@M@AJM@ JPOND?@ JA OC@ KGPBDI DON@GA DI OCDN H<II@M <necessite id="lib:tjpzoom" src="http://valid.tjp.hu/ tjpzoom/tjpzoom.zip" />

(I OC@ KGPBDI OC@ I<H@N JA OC@ ADG@N OC<O OC@ KGPBDI PN@N <M@ GDNO@? GDF@ OCDN $tjp = find_in_path('lib/tjpzoom/tjpzoom.js');

305


2C@ -K@I (# KGPBDI <GNJ PN@N < GD=M<MT OC<O DN @SO@MI<G OJ OC@ KGPBDI (O GJ<?N DO DI OC@ AJGGJRDIB H<II@M <necessite id="lib:php-openid-2.1.2" src="http://openidenabled.com/files/php-openid/packages/ php-openid-2.1.2.zip" />

I? OC@I PN@N OC<O GD=M<MT <N =@GJR // options if (!defined('_DIR_LIB')) define('_DIR_LIB', _DIR_RACINE . 'lib/'); define('_DIR_OPENID_LIB', _DIR_LIB . 'phpopenid-2.1.2/'); // usage (somewhat more complicated!) function init_auth_openid() { // ... $cwd = getcwd(); chdir(realpath(_DIR_OPENID_LIB)); require_once "Auth/OpenID/Consumer.php"; require_once "Auth/OpenID/FileStore.php"; require_once "Auth/OpenID/SReg.php"; chdir($cwd); // ... }

Using pipelines 2J PN@ OC@ KDK@GDI@N JA 1.(. JM JA < KGPBDI OC@PM PN<B@ HPNO =@ @SKGD>DOGT ?@ADI@? DI OC@ plugin.xml ADG@ <pipeline> <nom>name_of_the_pipeline</nom> <action>name of the function to load</action> <inclure>directory/file.php</inclure> </pipeline>

306


# Creating your own plugins 2C@ action K<M<H@O@M DN JKODJI<G <I? =T ?@A<PGO DO C<N OC@ N<H@ I<H@ <N OC@ KDK@GDI@ 2CDN ?@>G<M<ODJI DI?D><O@N < K<MOD>PG<M ADG@ OJ GJ<? RC@I ><GGDIB OC@ KDK@GDI@ ?@O@MHDI@? =T OC@ inclure <I? GJ<?DIB < API>ODJI GDF@ prefixPlugin_action() ,JO@ OC<O OC@ action K<M<H@O@M DN JIGT M<M@GT KMJQD?@? 1@Q@M<G KDK@GDI@N ><I =@ NK@>DAD@? =T GDNODIB OC@H <N ?@HJINOM<O@? =@GJR <pipeline> <nom>name_of_the_pipeline</nom> <inclure>directory/file.php</inclure> </pipeline> <pipeline> <nom>another_name</nom> <inclure>directory/file.php</inclure> </pipeline>

Example 2C@ KDK@GDI@ DIN@MO;C@<? K <??N >JIO@IO DIOJ OC@ <head> N@>ODJI JA KP=GDNC@? K<B@N 2C@ +@NN<B@MD@ KGPBDI PNDIB H@NN<B@MD@ <N < KM@ADS PN@N DO AJM <??DIB "11 NOTG@N <pipeline> <nom>insert_head</nom> <inclure>messagerie_pipelines.php</inclure> </pipeline>

I? DI OC@ messagerie_pipelines.php ADG@ function messagerie_insert_head($texte){ $texte .= '<link rel="stylesheet" type="text/css" href="'.find_in_path('habillage/messagerie.css').'" media="all" />'."\n"; return $texte; }

307


Defining buttons 2J <?? =POOJIN DIOJ OC@ KMDQ<O@ UJI@ <GG OC<O DN I@@?@? DN OJ KMJQD?@ < bouton <OOMD=PO@ DI OC@ plugin.xml ADG@N <N AJGGJRN <bouton id="identifier" parent="name of parent identifier"> <icone>icon path</icone> <titre>title language description</titre> <url>name of the exec</url> <args>arguments passed</args> </bouton>

#@N>MDKODJI \ id CJG?N OC@ PIDLP@ D?@IODAD@M JA OC@ =POOJI RCD>C DN PN@? <HJIBNO JOC@M OCDIBN =T NP= H@IPN OJ DI?D><O@ OC@ I<H@ JA OC@DM K<M@IO =POOJI /PDO@ JAO@I OC@ I<H@ JA OC@ exec ADG@ PN@? OJ ?DNKG<T OC@ K<B@ DN OC@ N<H@ <N OC@ D?@IODAD@M I<H@

\ parent JKODJI<G PN@? OJ NK@>DAT OC<O OC@ =POOJI DN < NP= @G@H@IO JA < K<M@IO =POOJI (O OC@M@AJM@ NOJM@N OC@ D?@IODAD@M JA OC@ K<M@IO =POOJI =N@IO <IT Q<GP@ DO DN < OJK G@Q@G @G@H@IO OC<O RDGG =@ >M@<O@? <GJIBND?@ OC@ *<PI>C K<? <I? 1DO@ @?DO =POOJIN

\ icone <GNJ JKODJI<G OJ NK@>DAT OC@ D>JI K<OC

\ titre =POOJI O@SO H<T <GNJ =@ < KG<>@CJG?@M KGPBDI KG<>@CJG?@MI<H@

\ url NK@>DAD@N OC@ @S@> ADG@ I<H@ OC<O DN GJ<?@? RC@I TJP >GD>F JI OC@ =POOJI (A IJO DI?D><O@? DO RDGG =@ OC@ D?@IODAD@M I<H@ OC<O DN PN@? \ args JKODJI<G PN@? OJ K<NN <MBPH@ION OJ OC@ 30* @S<HKG@ <args>criteria=start</args>

Authorisations 2C@ =POOJIN <M@ ?DNKG<T@? =T ?@A<PGO AJM <GG K@MNJIN >JI@I>ODIB OJ OC@ KMDQ<O@ UJI@ 2J >C<IB@ OCDN >JIADBPM<ODJI NK@>DAD> <POCJMDN<ODJIN HPNO =@ >M@<O@? AJM OC@ =POOJIN <I? OC@I PN@ OC@ <POCJMDN<ODJI KDK@GDI@ OJ GJ<? OC@ I@R KGPBDI <POCJMDN<ODJIN function autoriser_identifiant_bouton_dist($faire, $type, $id, $qui, $opt) { return true; // or false }

308


# Creating your own plugins Example 1O<ODNOD>N AJM 1.(. a >PMM@IOGT PI?@M ?@Q@GJKH@IO a RDGG =@ DI < N@K<M<O@ KGPBDI O KM@N@IO DO M@KMJ?P>@N OC@ =POOJIN <N =@GJR

<pipeline> <nom>autoriser</nom> <inclure>stats_autoriser.php</inclure> </pipeline> <bouton id="statistiques_visites"> <icone>images/statistiques-48.png</icone> <titre>icone_statistiques_visites</titre> </bouton> <bouton id='statistiques_repartition' parent='statistiques_visites'> <icone>images/rubrique-24.gif</icone> <titre>icone_repartition_visites</titre> </bouton> <bouton id='statistiques_lang' parent='statistiques_visites'> <icone>images/langues-24.gif</icone> <titre>onglet_repartition_lang</titre> </bouton> <bouton id='statistiques_referers' parent='statistiques_visites'> <icone>images/referers-24.gif</icone> <titre>titre_liens_entrants</titre> </bouton>

2C@ <POCJMDN<ODJIN <M@ ?@ADI@? DI < NK@>DAD> ADG@ <?php function stats_autoriser(){} // View the stats ? = all admins function autoriser_voirstats_dist($faire, $type, $id, $qui, $opt) { return (($GLOBALS['meta']["activer_statistiques"] != 'non') AND ($qui['statut'] == '0minirezo')); } // Button authorisation

309


function autoriser_statistiques_visites_bouton_dist($faire, $type, $id, $qui, $opt) { return autoriser('voirstats', $type, $id, $qui, $opt); } function autoriser_statistiques_repartition_bouton_dist($faire, $type, $id, $qui, $opt) { return autoriser('voirstats', $type, $id, $qui, $opt); } function autoriser_statistiques_lang_bouton_dist($faire, $type, $id, $qui, $opt) { return ($GLOBALS['meta']['multi_articles'] == 'oui' OR $GLOBALS['meta']['multi_rubriques'] == 'oui') AND autoriser('voirstats', $type, $id, $qui, $opt); } function autoriser_statistiques_referers_bouton_dist($faire, $type, $id, $qui, $opt) { return autoriser('voirstats', $type, $id, $qui, $opt); } ?>

Defining page tabs #@>G<MDIB OC@ O<BN AJM OC@ exec K<B@N DI OC@ KMDQ<O@ UJI@ AJGGJRN @S<>OGT OC@ N<H@ NTIO<S <N AJM OC@ =POOJIN 2C@ I<H@ JA OC@ K<M@IO CJR@Q@M DN H<I?<OJMT C@M@ <I? >JMM@NKJI?N OJ < K<M<H@O@M K<NN@? DI OC@ ><GG API>ODJI AJM OC@ O<= DI OC@ exec ADG@ <onglet id='identifier' parent='tab bar identifier'> <icone>icon_path</icone> <titre>placeholder title</titre> <url>exec filename</url> <args>arguments</args> </onglet>

310


# Creating your own plugins N AJM OC@ =POOJIN DA OC@ 30* DN IJO KMJQD?@? OC@I OC@ D?@IODAD@M I<H@ DN PN@? <N OC@ I<H@ JA OC@ ADG@ OJ =@ GJ<?@?

Authorisations B<DI <N RDOC OC@ =POOJIN <I <POCJMDN<ODJI DN PN@? OJ H<I<B@ RC@OC@M OC@ O<= DN ?DNKG<T@? JM IJO function autoriser_identifiant_onglet_dist($faire, $type, $id, $qui, $opt) { return true; // or false }

Example 2C@ "C<HKN $SOM<N $SOM< AD@G?N Q KGPBID <??N < O<= DIOJ OC@ >JIADBPM<ODJI K<B@ DIOJ OC@ OJJG=<M LPDO@ <KKMJKMD<O@GT I<H@? >JIADBPM<ODJI '@M@ <M@ OC@ ?@>G<M<ODJIN PN@? DI DON plugin.xml ADG@ <pipeline> <nom>autoriser</nom> <inclure>inc/iextras_autoriser.php</inclure> </pipeline> <onglet id='iextras' parent='configuration'> <icone>images/iextras-24.png</icone> <titre>iextras:champs_extras</titre> </onglet>

POCJMDN<ODJIN <M@ ?@ADI@? DI OC@ inc/iextras_autoriser.php ADG@ 2C@ O<= JIGT ?DNKG<TN DA OC@ <POCJM DN ?@><GM@? <N < R@=H<NO@M <?php if (!defined("_ECRIRE_INC_VERSION")) return; // function for the pipeline, nothing to do function iextras_autoriser(){} // authorisation declarations function autoriser_iextras_onglet_dist($faire, $type, $id, $qui, $opt) { return autoriser('configurer', 'iextras', $id, $qui, $opt); }

311


function autoriser_iextras_configurer_dist($faire, $type, $id, $qui, $opt) { return autoriser('webmestre', $type, $id, $qui, $opt); } ?>

%DI<GGT DI OC@ exec/iextras.php ADG@ OC@ OJJG=<M DN ><GG@? <N NCJRI =@GJR 2C@ ADMNO DN OC@ D?@IODAD@M JA OC@ M@LP@NO@? OJJG=<M OC@ N@>JI? DN OC@ D?@IODAD@M JA OC@ >PMM@IO O<= echo barre_onglets("configuration", "iextras");

312


Examples >C<KO@M OJ KM@N@IO < A@R >JI>M@O@ @S<HKG@N JA NH<GG N>MDKON

313


Adding a type of glossary (O DN KJNND=G@ OJ <?? GDIFN OJ @SO@MI<G BGJNN<MD@N AMJH 1.(. PNDIB OC@ [?nom] NCJMO>PO !T ?@A<PGO OC@ GDIFN <M@ H<?@ OJ RDFDK@?D< 2J >M@<O@ < I@R BGJNN<MT GDIF OC@M@ DN OC@ [?nom#typeNN] NTIO<S <Q<DG<=G@ \ OTK@ DN < RJM? AJM OC@ BGJNN<MT \ ,, DN <I JKODJI<G IPH@MD> D?@IODAD@M NDHKG@ API>ODJI ><GG@? glossaire_type() DN PN@? OJ M@OPMI < K<MOD>PG<M 30* K<M<H@O@MN <M@ K<NN@? OC@ O@SO <I? OC@ D?@IODAD@M Example: GDIF OJ OC@ OM<> NJPM>@ ADG@N AJM 1.(. <?php @define('_URL_BROWSER_TRAC', 'http://trac.rezo.net/trac/spip/ browser/branches/spip-2.0/'); /* * A link pointing to trac files * [?ecrire/inc_version.php#trac] * [?ecrire/inc_version.php#tracNNN] // NNN = line number */ function glossaire_trac($texte, $id=0) { return _URL_BROWSER_TRAC . $texte . ($id ? '#L'.$id : ''); } ?>

Applying a default sort sequence to the loops (O DN KJNND=G@ OJ NJMO OC@ JPOKPO JA GJJKN PNDIB OC@ {par} >MDO@MD< 2C@ O@HKG<O@ AJM OC@ ?J>PH@IO<ODJI TJP <M@ >PMM@IOGT M@<?DIB C<N OC@ N<H@ NJMODIB >MDO@MD< JA {par num titre, titre} AJM <GG JA DON ARTICLES @O RUBRIQUES GJJKN

314


# Examples 0<OC@M OC<I M@K@<O OCDN DI OC@ >J?@ AJM <GG JA OC@ GJJKN R@ ><I <KKGT DO EPNO JI>@ AJM <GG OC@ GJJKN DA OC@M@ DN IJ JOC@M NJMODIB >MDO@MD< NK@>DAD@? AJM < BDQ@I GJJK 2J ?J OCDN R@ PN@ OC@ pre_boucle KDK@GDI@ <I? <I? DIN@MO <I ORDER BY AJM OC@ 1/* N@G@>O LP@MD@N Plugin.xml : <pipeline> <nom>pre_boucle</nom> <inclure>documentation_pipelines.php</inclure> </pipeline>

documentation_pipelines.php : function documentation_pre_boucle($boucle){ // ARTICLES, SECTIONS : {par num titre, titre} if (in_array($boucle->type_requete, array('rubriques','articles')) AND !$boucle->order) { $boucle->select[] = "0+" . $boucle->id_table . ".titre AS autonum"; $boucle->order[] = "'autonum'"; $boucle->order[] = "'" . $boucle->id_table . ".titre'"; } return $boucle; }

#JDIB OCDN H@<IN OC<O OC@ GJJKN <M@ NJMO@? =T ?@A<PGO // auto sort {par num titre, titre} : <BOUCLE_a1(ARTICLES){id_rubrique}>... // different sort : <BOUCLE_a2(ARTICLES){id_rubrique}{!par date}>...

A few details 2C@ KDK@GDI@ M@>@DQ@N < =JP>G@ GJJK OTK@ .'. J=E@>O OC<O H<T C<Q@ Q<MDJPN Q<GP@N 2C@ GJJK IJO<=GT C<N NJH@ select <I? order Q<MD<=G@N RCD>C C<I?G@ RC<O RDGG =@ @IO@M@? DIOJ OC@ SELECT <I? ORDER BY >G<PN@N JA OC@ B@I@M<O@? 1/* LP@MT 2C@ 1/* O<=G@ I<H@ spip_articles JM spip_rubriques DI OC@ >PMM@IO ><N@ DN NOJM@? DI $boucle->id_table

315


5C@I R@ <NNDBI < IPH=@M RDOCDI OC@ ODOG@N JA 1.(. <MOD>G@N RCD>C ?J IJO C<Q@ <IT ranking AD@G? DI OC@DM O<=G@N @Q@I OCJPBC OC@ >J?@ C<N <GM@<?T =@@I @IQDN<B@? OJ C<I?G@ DO R@ RMDO@ DO GDF@ OCDN 2DOG@ IPH=@M KJDIO NK<>@ 2DOG@ (I JM?@M AJM 1/* OJ =@ <=G@ OJ @<NDGT NJMO =T IPH=@M <GG OC<O DN I@@?@? DN OJ AJM>@ < IPH@MD><G @Q<GP<ODJI JA OC@ AD@G? RCD>C DN OC@I >JIQ@MO@? DIOJ < IPH=@M 2CDN DN RCT OC@ >J?@ ODOM@ 1 <POJIPH RCD>C >M@<O@N <I <GD<N >JGPHI ><GG@? autonum CJG?DIB OCDN IPH@MD> ><G>PG<ODJI Q<GP@ DI DO DN OC@I <=G@ OJ =@ PN@? <N < NJMO >JGPHI DI OC@ ORDER BY >G<PN@

Consideration of new fields in table searches (A TJP C<Q@ >M@<O@? < I@R AD@G? DI JI@ JA OC@ 1.(. O<=G@N DO RDGG IJO =@ >JIND?@M@? =T ?@A<PGO =T OC@ N@<M>C API>ODJIN (O HPNO <GNJ =@ ?@>G<M@? @SKGD>DOGT AJM OC<O OJ J>>PM 2C@ M@>C@M>C@M;GDNO@;?@N;>C<HKN K KDK@GDI@ C<N RC<O TJP I@@? ><GG@? AMJH OC@ @>MDM@ DI> M@>C@M>C@M KCK ADG@ (O <>>@KON < K<M<H@O@M O<=G@ GDNODIB table/champ = coefficient >JPKG@N

RC@M@ OC@ >J@AAD>D@IO DN < IPH=@M NK@>DATDIB OC@ IPH=@M JA KJDION OJ <NNDBI AJM < NP>>@NNAPG N@<M>C DI OC<O AD@G? JI OC<O O<=G@ 2C@ CDBC@M OC@ >J@AAD>D@IO OC@ HJM@ KJDION OC<O AD@G? RDGG >M@?DO OJ < OJO<G N>JM@ AJM <IT N@<M>C@N OC<O H<O>C OC<O AD@G?fN >JIO@ION

Example 7JP C<Q@ < AD@G? OJRI DI OC@ 1/* O<=G@ NKDK;<MOD>G@N OC<O TJP RJPG? GDF@ OJ DI>GP?@ DI N@<M>C@N DO HPNO =@ ?@>G<M@? <N <I <??DODJI<G AD@G? DI OC@ KDK@GDI@ function prefixPlugin_rechercher_liste_des_champs($tables){ $tables['article']['town'] = 3; return $tables; }

316


# Examples

Display an authoring form, if authorised 2C@M@ <M@ NK@>D<G #AUTORISER O<BN OC<O H<F@ DO KJNND=G@ OJ H<I<B@ <>>@NN OJ >@MO<DI >JIO@IO <I? JM >@MO<DI AJMHN JI < ADI@ BM<DI@? N><G@ N NCJRI =@GJR

DA OC@ QDNDOJM C<N OC@ MDBCON OJ HJ?DAT OC@ <MOD>G@ OC@I < AJMH ><I =@ ?DNKG<T@? OJ @?DO OC<O <MOD>G@ RCD>C JI>@ Q<GD?<O@? RDGG M@OPMI OJ OC@ <MOD>G@ K<B@ DI LP@NODJI [(#AUTORISER{modifier, article, #ID_ARTICLE}) #FORMULAIRE_EDITER_ARTICLE{#ID_ARTICLE, #ID_RUBRIQUE, #URL_ARTICLE} ]

Modifying all of your templates in one hit 2C<IFN OJ NJH@ NK@>D<G CJJFN DO DN KJNND=G@ OJ PN@ < NDIBG@ NDHKG@ JK@M<ODJI JI < >JHKG@O@ N@O JA O@HKG<O@N ADG@N OJ HJ?DAT OC@ =@C<QDJPM JA < K<MOD>PG<M GJJK JM OTK@ JA GJJK EPNO =T PNDIB OC@ KM@;=JP>G@ K KDK@GDI@ %JM @S<HKG@ @Q@MT RUBRIQUES GJJK M@B<M?G@NN JA RCD>C O@HKG<O@ ADG@ DO DN NOJM@? DI ><I C<Q@ N@>OJM JHDOO@? AMJH DON N@<M>C >MDO@MD< $GLOBALS['spip_pipeline']['pre_boucle'] .= '|hide_a_sector'; function hide_a_sector($boucle){ if ($boucle->type_requete == 'rubriques') { $secteur = $boucle->id_table . '.id_secteur'; $boucle->where[] = array("'!='", "'$secteur'", "8"); } return $boucle; }

,JO@ OC<O OC@ KGPBDI >>ZN 0@NOM@DIO <GNJ JAA@MN OCDN API>ODJI OJ M@NOMD>O <>>@NN OJ NK@>DAD> >JIO@IO

317



Glossary #@ADIDODJIN JA NJH@ JA OC@ F@T O@>CID><G O@MHN PN@? DI OC@ ?J>PH@IO<ODJI

319


AJAX 2C@ O@MH ) 6 <I <>MJITH AJM Asynchronous JavaScript and XML DN PN@? OJ ?@N>MD=@ < >JGG@>ODJI JA O@>CIJGJBD@N PN@? OJ >M@<O@ <NTI>CMJIJPN >GD@IO N@MQ@M DIO@M<>ODJIN 2C@N@ >JINOMP>ODJIN RCD>C H<F@ DO KJNND=G@ OJ JIGT M@LP@NO < K<MOD<G K<B@ PK?<O@ AMJH OC@ N@MQ@M JM K<MOD<G @G@H@IO PK?<O@ ><I NDBIDAD><IOGT M@?P>@ OC@ ?<O< QJGPH@N OC<O I@@? OJ =@ OM<INHDOO@? <I? JAO@I H<F@ <I <KKGD><ODJI <KK@<M HJM@ M@NKJINDQ@ OJ DON PN@MN

Argument (I KMJBM<HHDIB OC@ O@MH <MBPH@IO DN PN@? AJM OC@ >JIO@ION N@IO RC@I H<FDIB < API>ODJI ><GG %PI>ODJIN ><I PN@ N@Q@M<G <MBPH@ION MBPH@ION ><I =@ OC@ M@NPGON JA JOC@M ><G>PG<ODJIN 5@ ?DAA@M@IOD<O@ <MBPH@ION OC@ DIKPO ?<O< AMJH K<M<H@O@MN RC<O OC@ API>ODJI M@>@DQ@N (I .'. R@ C<Q@ function_name('argument', $argument, ...); function_name($x + 4, $y * 2); // 2 calculated arguments are sent.

I? DI 1.(. AJM O<BN <I? ADGO@MN #TAG{argument, argument, ...} [(#TAG|filter{argument, argument})]

Cache files ><>C@ DN < NOJM@ JA ADG@N OC<O DN PN@? OJ <>>@G@M<O@ ?<O< <>>@NN 2C@M@ <M@ ><>C@N PN@? DIO@MI<GGT DI <GHJNO @Q@MT K<MO JA < >JHKPO@M DI OC@ HD>MJKMJ>@NNJMN JI C<M? ?MDQ@N DI NJAOR<M@ DI .'. API>ODJIN @O> 2C@T H<F@ DO KJNND=G@ AJM < BDQ@I KD@>@ JA ?<O< OJ =@ M@OMD@Q@? JM ><G>PG<O@? A<NO@M DI OC@ @Q@IO OC<O DO DN M@LP@NO@? HJM@ OC<I EPNO < NDIBG@ ODH@ RC@OC@M DO =@ < CDBCGT QJG<ODG@ NOJM<B@ NTNO@H GDF@ 0 + H@HJMT JM < HJM@ K@MH<I@IO M@NJPM>@ GDF@ < C<M? ?MDQ@

320


# Glossary ><>C@ JAO@I C<N < GDHDO@? GDA@ NK<I <N AJM @S<HKG@ OC@ ODH@ OC<O DO O<F@N AJM < KMJBM<HH@ OJ MPI JM OC@ ODH@ M@LPDM@? OJ KMJ>@NN < .'. API>ODJI ><GG Q<GD?DOT K@MDJ? ><I <GNJ =@ <NNDBI@? RC@I OC@ NOJM<B@ ?@QD>@ ?@GDQ@MN ?<O< OC<O DN HJM@ K@MNDNO@IO < R@= K<B@ ><I OC@M@=T O@GG < =MJRN@M KMJBM<HH@ AJM CJR H<IT CJPMN < K<B@ RDGG M@H<DI Q<GD? DA OC<O K<B@ DN =@DIB C@G? DI OC@ =MJRN@MfN GJ><G ><>C@

Parameter 2C@ K<M<H@O@MN JA < API>ODJI OC<O DN RC<O DN M@>@DQ@? RC@I OC@ API>ODJI DN ><GG@? <M@ ?@N>MD=@? DI OC@ ?@>G<M<ODJI JA OC<O API>ODJIN 2CDN ?@>G<M<ODJI H<T NK@>DAT OC@ OTK@ JA Q<GP@ @SK@>O@? DIO@B@M O<=G@ >C<M<>O@M NOMDIB` < ?@A<PGO Q<GP@ <I? HJNO DHKJMO<IOGT OC@ I<H@ JA OC@ Q<MD<=G@ RC@M@ OC@ PN<=G@ K<M<H@O@M DN NOJM@? RDOCDI OC@ API>ODJIfN >J?@ (I .'. R@ C<Q@ function name($param1, $param2=0){}

2CDN I<H@ API>ODJI RDGG M@>@DQ@ ORJ K<M<H@O@MN RC@I DO DN ><GG@? NOJM@? DI OC@ GJ><G Q<MD<=G@N $param1 <I? $param2 RCD>C RDGG C<Q@ < Q<GP@ JA 0 =T ?@A<PGO 5@ H<T OC@I ><GG OCDN K<MOD>PG<M API>ODJI RDOC @DOC@M JM <MBPH@ION name('Extra'); // param2 will equal 0 name('Extra', 19);

Pipeline 2C@ O@MH KDK@GDI@ DN PN@? RDOCDI 1.(. DI OC@ 3,(6 N@IN@ JA OC@ RJM? 2C@ KDK@GDI@ @S@>PO@N < N@MD@N JA API>ODJIN AJM RCD>C OC@ M@NPGO JA JI@ NP>C API>ODJI DN PN@? <N DIKPO AJM OC@ I@SO (I OCDN R<T @<>C API>ODJI DI < KDK@GDI@ ><I PN@ OC@ ?<O< OC<O <M@ K<NN@? OJ DO HJ?DAT OC@H PN@ OC@H <I? M@OPMI OC@H 2C@ M@NPGON OC@I <>O <N <MBPH@ION AJM OC@ I@SO API>ODJI <I? OC@ I@SO <I? NJ JI PIODG OC@ G<NO NP>C API>ODJI 5C@I ><GGDIB < KDK@GDI@ OC@ ADMNO API>ODJI DN Q@MT JAO@I K<NN@? ?<O< JM <O G@<NO < ?@A<PGO Q<GP@ 2C@ M@NPGON JA OC@ >C<DIDIB JA OC@ Q<MDJPN API>ODJIN DN OC@I PN@? JM ?DNKG<T@? ?@K@I?DIB JI OC@ NDOP<ODJI <O C<I?

321


"@MO<DI K<MOD>PG<M ><GGN JI KDK@GDI@N DI 1.(. <M@ OJ =@ >JIND?@M@? <N OMDBB@MN

DI OC@ N@IN@ OC<O OC@T NDHKGT ?@>G<M@ <I @Q@IO =PO ?J IJO @SK@>O <IT M@NPGO OJ =@ M@OPMI@? AMJH OC@ Q<MDJPN API>ODJIN OC<O OC@ KDK@GDI@ RDGG ><GG +JNO JA OC@N@ OMDBB@MN C<Q@ < I<H@ OC<O PN@N OC@ KM@ADS trig_

Recursion (I KMJBM<HHDIB R@ PN@ OC@ O@MH M@>PMNDJI AJM <I <GBJMDOCH NJH@ >JHKPO@M >J?@ OC<O DN <=G@ OJ ><GG DON@GA 5@ <GNJ NK@<F JA N@GA M@A@M@I>DIB .'. API>ODJIN ><I ><GG OC@HN@GQ@N M@>PMNDQ@GT GDF@ OC@ @S<HKG@ =@GJR RCD>C <??N PK OJ OC@ ADMNO 6 DIO@B@MN EPNO <N <I @S<HKG@ <N OCDN ><I =@ >JHKPO@? A<NO@M RDOC x*(x+1)/2 // calculation of : x + (x-1) + ... + 3 + 2 + 1 function sum($x) { if ($x <= 0) return 0; return $x + sum($x-1); } // call it $s = sum(8);

1.(. <GNJ <GGJRN TJP OJ RMDO@ M@>PMNDQ@ GJJKN K RDOCDI OC@ O@HKG<O@N

322


# Index

Index Symbols -K@M<OJMN -K@M<OJMN -K@M<OJMN (, -K@M<OJMN

O<BN 1.(. Q@MNDJI

-K@M<OJMN -K@M<OJMN -K@M<OJMN -K@M<OJMN -K@M<OJMN -K@M<OJMN %DGO@MN

<AAD>C@M;AD>C@;J=E@O .DK@GDI@N <AAD>C@;?MJDO@ .DK@GDI@N <AAD>C@;@IA<ION .DK@GDI@N <AAD>C@;B<P>C@ .DK@GDI@N <AAD>C@;CD@M<M>CD@ .DK@GDI@N <AAD>C@;HDGD@P .DK@GDI@N B@I?< .GPBDIN ) 6 <E<S (I>GP?@ K<M<H@O@MN <EJPO@M;=JPOJIN .DK@GDI@N <EJPO@M;JIBG@ON .DK@GDI@N <G@MO@N;<PO@PM .DK@GDI@N HDN .GPBDIN ,"0$;. &(, 2(-, 2<BN MBPH@ION 00 7 2<BN 02("*$1 *JJKN

A

NO@MDNF O<BN >>ZN M@NOM@DIO .GPBDIN

<>>P@DG;@I>JPMN .DK@GDI@N <>>P@DG;B<?B@O .DK@GDI@N <>>P@DG;DIAJMH<ODJIN .DK@GDI@N >ODJIN "2(-,;%-0+3* (0$ 2<BN <AA?<O@ %DGO@MN <AAD>C<B@;@IO@O@N;ADI<G .DK@GDI@N <AAD>C<B@;ADI<G .DK@GDI@N

<OOMD=PO;COHG %DGO@MN 32$301 *JJKN 32$301; 02("*$1 *JJKN 32$301;$* 0&(1 *JJKN POCJMDN<ODJIN

POJH<OD> KMJ>@NN@N <POJMDN@M .'. API>ODJIN

<POJMDN@M .DK@GDI@N 32-0(1$0 2<BN

<AAD>C@M;>JIADB;J=E@O .DK@GDI@N <AAD>C@M;>JIO@IP;J=E@O .DK@GDI@N

323


>JIADBPM@M;GDNO@;H@O<N .DK@GDI@N

B !<>FPKN

>JII@>O (I>GP?@ K<M<H@O@MN

=<MM@;JIBG@ON .'. API>ODJIN

"JII@>OJM ADG@ "JIO<>O <Q<I>Y .GPBDIN

!DNJPN .GPBDIN =J?T;KMDQ@ .DK@GDI@N

"JIO@SO

=JDO@;DIAJN .DK@GDI@N !JIPS .GPBDIN

>JMMDB@M;OTKJ .'. API>ODJIN

!POOJIN

>JPK@M %DGO@MN "M<TJIN .GPBDIN >M@@M;=<N@ .'. API>ODJIN

C

"MDO@MD< "<>C@

"MJI

" "'$ 2<BN

"42 227

"11

"<>C@ "JJG .GPBDIN

"42 AJMH GJ<?DIB 227

><G>PG@M;MP=MDLP@N;KP=GD@@N .'. API>ODJIN "%& .GPBDIN

"42 AJMH KMJ>@NNDIB 227

"C<HKN $SOM<N .GPBDIN

"42 AJMH Q@MDAD><ODJI 227

>C<MB@M;AJI>ODJI .'. API>ODJIN "C<MN@O "C<ON .GPBDIN "'$+(, 2<BN >JHH@I>@M;K<B@ .'. API>ODJIN "JHKJNDODJI .GPBDIN

#<O<=<N@N # 2$ 2<BN ?@>G<M@M;O<=G@N;<PSDGD<DM@N .DK@GDI@N

"JHKM@NN@PM .GPBDIN

?@>G<M@M;O<=G@N;DIO@MA<>@N .DK@GDI@N

>JHKO@M;>JIOMD=PODJIN;<PO@PM .DK@GDI@N

?@>G<M@M;O<=G@N;J=E@ON;NPMIJHN .DK@GDI@N

"-,#(2(-, *JJKN

?@>G<M@M;O<=G@N;KMDI>DK<G@N .DK@GDI@N

"-,%(& 2<BN >JIADB .'. API>ODJIN >JIADB >JII@>O KCK %DG@N "JIADBPM<ODJIN

324

D

?@>G<M@M;PMG;J=E@ON .DK@GDI@N #@>G<MDIB <I 1/* O<=G@ ?@ADIDM;N@NNDJI .DK@GDI@N


# Index ?@G@O@;NO<ODNODLP@N .DK@GDI@N

$4 * 2<BN

?@G@O@;O<=G@N .DK@GDI@N

@S>GPN "MDO@MD<

$4$,$+$,21 *JJKN

#$1"0(.2(%;1(2$;1.(. 2<BN

$6.-1$ 2<BN $SKM@NNJ .GPBDIN

?DM@>ODJI;>NN %DGO@MN

@SO@INDJI "MDO@MD<

#J>PH@IO<ODJI .GPBDIN

$SO@MI<G GD=M<MD@N

#-"3+$,21 *JJKN ?JNND@M;NLP@G@OO@N &GJ=<G Q<MD<=G@N #TI<HD> O<BN

F %<>@!JJF *JBDI .GPBDIN

%<NO><>C@ .GPBDIN

E

%("'($0 2<BN @>MDM@ DI>;Q@MNDJI KCK %DG@N

%DG@K<OCN

@>MDM@;H@O< .'. API>ODJIN $#(2 2<BN

%DGOM@N (H<B@N @O "JPG@PMN .GPBDIN

@?DO@M;>JIO@IP;AJMHPG<DM@;>AB .DK@GDI@N

ADI?;<GG;DI;K<OC .'. API>ODJIN

@?DO@M;>JIO@IP;J=E@O .DK@GDI@N

ADI?;DI;K<OC .'. API>ODJIN

@AA<>@M;H@O< .'. API>ODJIN

AJM>@M;G<IB &GJ=<G Q<MD<=G@N

$H<DG

%JMHD?<=G@ .GPBDIN

@H<DG;Q<GD?@ .'. API>ODJIN

%JMHN 227 228

$IGPHDIPM@N 2TKJBM<KCDLP@N .GPBDIN @IODO@N;COHG %DGO@MN $,4 2<BN

@IQ (I>GP?@ K<M<H@O@MN

$IQDMJIH@IO @IQJT@M;H<DG .'. API>ODJIN

%DGO@MN

%JMHN 2<=G@N .GPBDIN

AJMHPG<DM@N;SSS;>C<MB@M .'. API>ODJIN AJMHPG<DM@N;SSS;OM<DO@M .'. API>ODJIN %-0+3* (0$; 2<BN

$MMJM H@NN<B@

AJMHPG<DM@;>C<MB@M .DK@GDI@N

$MMJMN

AJMHPG<DM@;OM<DO@M .DK@GDI@N

@O %DGO@MN

325


AJMHPG<DM@;Q@MDAD@M .DK@GDI@N

(I>GP?@N DI>GP?@;NKDK .'. API>ODJIN

%JMPH .GPBDIN

(,"*30$ (,"*30$ 2<BN (IN>MDKODJI .GPBDIN

G

DIN@MO;<MOD>G@ .'. API>ODJIN

B@I@M@M;<>ODJI;<PO@PM .'. API>ODJIN

(,1$02;'$ # 2<BN

B@I@M@M;PMG;<>ODJI .'. API>ODJIN

DIN@MO;C@<? .DK@GDI@N

B@I@M@M;PMG;@>MDM@ .'. API>ODJIN

(,1$02;'$ #;"11 2<BN

B@I@M@M;PMG;@IODO@ .'. API>ODJIN &YJBM<KCD@ .GPBDIN

DIN@MO;C@<?;>NN .DK@GDI@N

&$2 2<BN

(INO<GG<ODJI

&M<KK@N .GPBDIN

(,20-#3"2(-, 2<BN

&0-3.$1;+-21 *JJKN

J )<Q<1>MDKO

H C@<?@M;KMDQ@ .DK@GDI@N

)@PS .GPBDIN

C@GGJ;RJMG? .'. API>ODJIN

)J= /P@P@ .GPBDIN )JDIN )/P@MT ELP@MT;KGPBDIN .DK@GDI@N

I D>JI@;CJMDUJIO<G@ .'. API>ODJIN (?DJHN "JHKDG@M D?S;G<IB &GJ=<G Q<MD<=G@N

G<IB (I>GP?@ K<M<H@O@MN

D?;MP=MDLP@ "MDO@MD<

* ,& 2<BN

D?;O<=G@;J=E@O .'. API>ODJIN

G<IB "MDO@MD<

(H<B@ KMJ>@NNDIB

*<IBP<B@

DH<B@;M@?PDM@ %DGO@MN

*<IBP<B@ >J?@N

(, -K@M<OJMN

326

L

D?;K<M@IO "MDO@MD<

G<IB IJH;SS KCK %DG@N


# Index * ,&;#(0 2<BN

+JON 2@>CIDLP@N .GPBDIN

*$1 32$301 2<BN

HPGOD

*D>@I>@ .GPBDIN

+PGODGDIBPDNH

GDM@;>JIADB .'. API>ODJIN GDM@;H@O<N .'. API>ODJIN GDNO@M;O<=G@N;IJ@M<N@ .DK@GDI@N GDNO@M;O<=G@N;IJ@SKJMO .DK@GDI@N

N ,J 1K<H .GPBDIN ,J"<>C@ .GPBDIN

GDNO@M;O<=G@N;IJDHKJMO .DK@GDI@N

IJH=M@;?@;GJBN &GJ=<G Q<MD<=G@N

*-&(,;.0(4$ 2<BN

,-+;1(2$;1.(. 2<BN

*-&(,;.3!*(" 2<BN

IJI %DGO@MN

*JBJ

,JO<ODJIN .GPBDIN

*-&-;1(2$;1.(. 2<BN

,-2$1 2<BN

*JJK

,JODAD><ODJIN

*JPK@ KCJOJ .GPBDIN

O J=E@O;OTK@ .'. API>ODJIN

M H<E;O<=G@N .'. API>ODJIN

-#2 Q@MN 1.(. .GPBDIN

H<O>C %DGO@MN

-K@I *<T@MN .GPBDIN

+YHJ[N<ODJI .GPBDIN

-K@I(# .GPBDIN

+@IPN .GPBDIN

-K@M<OJMN

+$,3;* ,& 2<BN

JKODHDN@M;=<N@;?DNK<MPN .DK@GDI@N

JI E<S*J<? )1 API>ODJIN

+@NN<B@MD@ .GPBDIN H@N;AJI>ODJIN KCK %DG@N

JMDBDI@;OM<?P>ODJI "MDO@MD<

H@N;JKODJIN KCK %DG@N

JPD %DGO@MN

JP %DGO@MN -Q@MGJ<?DIB

H@O< &GJ=<G Q<MD<=G@N HDIDKM@N .'. API>ODJIN +-#$*$ 2<BN +J?@GN HJ?DAD@M;>JIO@IP .'. API>ODJIN

P .<B@ C@<?@MN . &(, 2(-, 2<BN

327


K<BDI<ODJI "MDO@MD< .<BDI<ODJIN

R M<>DI@ "MDO@MD<

K<M "MDO@MD<

M@>C@M>C@M;GDNO@;?@N;>C<HKN .DK@GDI@N

.<M<H@O@MN

M@>C@M>C@M;GDNO@;?@N;EJDIOPM@N .DK@GDI@N

K<M<H@OM@;PMG %DGO@MN

M@>PK@M@M;AJI? .'. API>ODJIN

K<M<H@OM@;PMG .'. API>ODJIN .CJOJ H@O<?<O< .GPBDIN

M@>PK@M@M;AJI? .DK@GDI@N

.(.$*(,$ 2<BN

M@>PK@M@M;K<B@ .'. API>ODJIN

KDK@GDI@ .'. API>ODJIN

0@>PMNDJI

.DK@GDI@N

M@?DMDB@;<>ODJI;<PO@PM .'. API>ODJIN

.GPBDI ?@K@I?@I>D@N

M@?DMDB@;<>ODJI;KJNO .'. API>ODJIN

KGPBDI SHG %DG@N

M@APN@M;OM<DO@M;AJMHPG<DM@;<E<S .'. API>ODJIN

.GPBDIN

0@BPG<M @SKM@NNDJI

.JGTBGJO "JHKDG@M

0$+ 2<BN

.JGTCDYM<M>CD@ .GPBDIN

M@KG<>@ %DGO@MN

.JMO@ .GPH@ .GPBDIN

0@NOJM@N

KJNO;OTKJ .DK@GDI@N .MYQDNP<GDN<ODJI .GPBDIN

03!0(/3$1 *JJKN

KM@;=JP>G@ .DK@GDI@N

MP=MDLP@;@I>JPMN .DK@GDI@N

KM@;DIN@MODJI .DK@GDI@N

KM@;GD@IN .DK@GDI@N KM@;OTKJ .DK@GDI@N .MDQ<O@ UJI@ KMJKM@ %DGO@MN KMJKM@ .'. API>ODJIN KPMB@M;M@K@MOJDM@ .'. API>ODJIN

S 1<DND@N .GPBDIN 1@<M>CDIB N@>PMDN@M;<>ODJI .'. API>ODJIN 1@>PMDOT 1@G@>ODIB < O@HKG<O@ 1YG@>ODJI ?f<MOD>G@N .GPBDIN 1$*% 2<BN

Q LPJO<;><>C@ &GJ=<G Q<MD<=G@N

328

N@GA (I>GP?@ K<M<H@O@MN 1@I?DIB H<DG


# Index 1$11(-, 2<BN

NLG;?@G@O@ .'. API>ODJIN

1@NNDJIN

NLG;?MJK;O<=G@ .'. API>ODJIN

1$11(-,;1$2 2<BN 1$2 2<BN N@O;M@LP@NO .'. API>ODJIN

NDIJI %DGO@MN NJ>D<G;GJBDI;GDIFN .DK@GDI@N 1-312(20$ 2<BN 1.(. "G@<M .GPBDIN NKDK;>JII@>O;?= .'. API>ODJIN 1.(.;"0-, 2<BN NKDK;G<IB;MOG &GJ=<G Q<MD<=G@N NKDK;GJB .'. API>ODJIN 1.(.;. 2' "JINO<ION NKDK;KDK@GDI@ &GJ=<G Q<MD<=G@N NKDK;N@NNDJI .'. API>ODJIN NKDK;N@O>JJFD@ .'. API>ODJIN 1/* <=NOM<>ODJI 1/* LP@MT 1/* O<=G@ NLG;<GGA@ON@G .'. API>ODJIN

NLG;<GGO<=G@ .'. API>ODJIN NLG;<GO@M .'. API>ODJIN NLG;>JPIO .'. API>ODJIN NLG;>JPION@G .'. API>ODJIN NLG;>M@<O@ .'. API>ODJIN NLG;>M@<O@;=<N@ .'. API>ODJIN NLG;>M@<O@;QD@R .'. API>ODJIN NLG;?<O@;KMJ>C@ .'. API>ODJIN

NLG;?MJK;QD@R .'. API>ODJIN NLG;@MMIJ .'. API>ODJIN NLG;@MMJM .'. API>ODJIN NLG;@SKG<DI .'. API>ODJIN NLG;A@O>C .'. API>ODJIN

NLG;A@O>C;<GG .'. API>ODJIN NLG;A@ON@G .'. API>ODJIN NLG;AM@@ .'. API>ODJIN NLG;B@OA@ON@G .'. API>ODJIN NLG;B@O;N@G@>O .'. API>ODJIN NLG;C@S .'. API>ODJIN NLG;DI .'. API>ODJIN NLG;DIN@MO .'. API>ODJIN NLG;DIN@MOL .'. API>ODJIN

NLG;DIN@MOL;HPGOD .'. API>ODJIN NLG;DI;N@G@>O .'. API>ODJIN NLG;GDNO?=N .'. API>ODJIN NLG;HPGOD .'. API>ODJIN NLG;JKODHDU@ .'. API>ODJIN NLG;LP@MT .'. API>ODJIN NLG;LPJO@ .'. API>ODJIN NLG;M@K<DM .'. API>ODJIN NLG;M@KG<>@ .'. API>ODJIN NLG;M@KG<>@;HPGOD .'. API>ODJIN NLG;N@@F .'. API>ODJIN NLG;N@G@>O .'. API>ODJIN

NLG;N@G@>O?= .'. API>ODJIN

329


NLG;N@MQ@PM .'. API>ODJIN

2<MB@O .GPBDIN

NLG;NCJR=<N@ .'. API>ODJIN

2@HKG<O@ >JHH@ION

NLG;NCJRO<=G@ .'. API>ODJIN

O@NO;@NK<>@;KMDQ@ .'. API>ODJIN

2@HKG<O@N

NLG;PK?<O@ .'. API>ODJIN

O@SO@=MPO %DGO@MN

NLG;PK?<O@L .'. API>ODJIN

2C@ >JHKDG@M 2CYGD< .GPBDIN

NLG;Q@MNDJI .'. API>ODJIN

2D>F@ON .GPBDIN

1O<ODNOD>N

ODOM@;HJO "MDO@MD<

1O<ODNOD>N .GPBDIN

2M<?0P= .GPBDIN

1O<ODNODLP@N .GPBDIN

OM<?P>ODJI "MDO@MD<

NOTGDN@M .DK@GDI@N

OM<?PDM@;IJH;G<IBP@ %DGO@MN

NPDQM@;DIQ<GD?@PM .'. API>ODJIN

OM<DO@M;M<>>JPM>DN .'. API>ODJIN

1TIO<S

OMDB;NPKKMDH@M;J=E@ON;GD@N .DK@GDI@N OMJPQ@M;O<=G@ .'. API>ODJIN

T

OTKJ .'. API>ODJIN O<=G@N;<PSDGD<DM@N &GJ=<G Q<MD<=G@N

2TKJ &PDGG@H@ON .GPBDIN 2TKJBM<KCT

O<=G@N;EJDIOPM@N &GJ=<G Q<MD<=G@N O<=G@N;KMDI>DK<G@N &GJ=<G Q<MD<=G@N O<=G@;?@N;OM<DO@H@ION &GJ=<G Q<MD<=G@N

U 30* 30*; 2<BN

O<=G@;J=E@O .'. API>ODJIN

30*; "2(-,; 32$30 2<BN

O<=G@;J=E@O;NLG .'. API>ODJIN

30*; 02("*$ 2<BN

O<=G@;Q<G@PM %DGO@MN

30*;1(2$;1.(. 2<BN

2<=N

PODGDN@M;G<IBP@;QDNDO@PM .'. API>ODJIN

O<>C@N;B@I@M<G@N;>MJI .DK@GDI@N 2<B

O<DGG@;?@N;GJBN &GJ=<G Q<MD<=G@N

330

V 4 * 2<BN


# Index

W 5JM?KM@NN

;(,2$0#(0$;"-+. "2$;'$ #;$"0(0$ "JINO<ION ;* .'. API>ODJIN ;+ 6;*-& "JINO<ION ;+$2 ;" "'$;2(+$ "JINO<ION

X SJP %DGO@MN

;,-;" "'$ "JINO<ION

61.% .GPBDIN

;M@LP@NO .'. API>ODJIN

;2 .'. API>ODJIN

_ ;#(0;#! "JINO<ION ;?DNO API>ODJIN

;20 (2$+$,2;0 ""-30"(1 "JINO<ION ;20 (2$+$,2;27. "JINO<ION

;#30$$;" "'$;#$% 32 "JINO<ION

331


332


# Table of contents

Table of contents .M@A<>@ ,JO@N <=JPO OCDN ?J>PH@IO<ODJI (IOMJ?P>ODJI 5C<O DN 1.(. 5C<O ><I 1.(. =@ PN@? AJM 0@LPDM@H@ION <I? =<ND> ?@N>MDKODJI 2C@ O@HKG<O@N /PD>F JQ@MQD@R 2C@ O@HKG<O@N *JJKN 2C@ NTIO<S JA GJJKN 2C@ >JHKG@O@ NTIO<S JA GJJKN ,@NO@? GJJKN 0@>PMNDQ@ GJJKN *JJKN RDOC HDNNDIB O<=G@N 2<BN 2<B NTIO<S OC@ ?@ADIDODQ@ Q@MNDJI 2C@ $,4 @IQDMJIH@IO 2C@ >JIO@ION JA GJJKN =JP>G@N "JIO@ION JA K<M@IO GJJKN .M@?@ADI@? O<BN &@I@MD> O<BN POJH<OD> O<B KMJ>@NN@N (IO@MMPKODIB OC@ <POJH<OD> KMJ>@NN@N 3N@APG O<BN OJ FIJR 32-0(1$0 " "'$ "'$+(, #$1"0(.2(%;1(2$;1.(. $#(2 $,4 $4 * $6.-1$ &$2 (,"*30$ (,1$02;'$ # (,1$02;'$ #;"11 (,20-#3"2(-, * ,&

333


* ,&;#(0 *$1 32$301 +-#$*$ ,-2$1 0$+ 1$*% 1$11(-, 1$11(-,;1$2 1$2 4 * "MDO@MD< AJM GJJKN "MDO@MD< NTIO<S 1CJMO >PO >MDO@MD< 1DHKG@ JK@M<OJMN 2C@ (, JK@M<OJM 2C@ JK@M<OJM 2C@ JK@M<OJM -KODJI<G >MDO@MD< -KODJI<G >MDO@MD< RDOC JK@M<OJMN 2<B ADGO@MN %DGO@M NTIO<S %DGO@MN ?@MDQ@? AMJH .'. >G<NN@N "JHK<MDNJI ADGO@MN 1@<M>C <I? M@KG<>@ ADGO@MN %DGO@MN AJM O@NODIB (I>GP?@N (I>GP?@N RDOCDI OC@ O@HKG<O@N .<NNDIB K<M<H@O@MN OJ DI>GP?@N E<S ) 6 .<BDI<ODJIN ) 6 GDIFN *DIBPDNOD> @G@H@ION 2C@ NTIO<S JA G<IBP<B@ NOMDIBN *<IBP<B@ ADG@N 3NDIB OC@ G<IBP<B@ >J?@N 2C@ >JHKG@O@ NTIO<S JA G<IBP<B@ >J?@N 3NDIB G<IBP<B@ >J?@N DI .'. .JGTBGJON HPGOD O<BN +PGODGDIBP<GDNH +PGODGDIBP<G KJNND=DGDOD@N 2C@ G<IBP<B@ JA OC@ @IQDMJIH@IO

334


# Table of contents 2C@ G<IBP<B@ JA <I J=E@>O 1K@>D<G G<IBP<B@ >MDO@MD< %JM>DIB OC@ G<IBP<B@ JA OC@ QDNDOJMfN >CJD>@ "CJJNDIB OC@ I<QDB<ODJI G<IBP<B@ %JM>DIB < >C<IB@ DI OC@ DIO@MA<>@ G<IBP<B@ 1/* EJDIN =@OR@@I O<=G@N POJH<OD> EJDIN $SKGD>DO EJDI ?@>G<M<ODJIN POJH<ODIB EJDIN %JM>DIB EJDIN >>@NNDIB HPGODKG@ ?<O<=<N@N #@>G<MDIB <IJOC@M ?<O<=<N@ >>@NNDIB < ?@>G<M@? ?<O<=<N@ 2C@ >JII@>O 30* K<M<H@O@M (I>GPM@ RDOC < >JII@>OJM K<M<H@O@M (I?@S 2<=G@ JA >JIO@ION "JIO@ION JA OC@ ?DM@>OJMD@N 2C@ GDNO JA ?DM@>OJMD@N >JIADB @SO@INDJIN (+& GD= GJ><G KGPBDIN NLP@G@OO@N NLP@G@OO@N ?DNO OHK @>MDM@ @>MDM@ <>ODJI @>MDM@ <POC @>MDM@ =<GDN@ @>MDM@ =<N@ @>MDM@ >C<MN@ON @>MDM@ >JIADBPM<ODJI @>MDM@ @S@> @>MDM@ B@ID@ @>MDM@ DI> @>MDM@ DINO<GG @>MDM@ G<IB @>MDM@ H<E

335


@>MDM@ IJODAD><ODJIN @>MDM@ KGPBDIN @>MDM@ KP=GD> @>MDM@ M@L @>MDM@ OTKJBM<KCD@ @>MDM@ PMGN @>MDM@ SHG KMDQ@ KMDQ@ >JIO@IP KMDQ@ @?DO@M KMDQ@ @S@> KMDQ@ AJMHPG<DM@N KMDQ@ DH<B@N KMDQ@ DIAJN KMDQ@ E<Q<N>MDKO KMDQ@ HJ?@G@N KMDQ@ MNN KMDQ@ NO<ON KMDQ@ OM<INH@OOM@ KMDQ@ QDBI@OO@N (I?@S 2<=G@ JA >JIO@ION $SO@I?DIB 1.(. (IOMJ?P>ODJI 2@HKG<O@N JM KGPB DIN #@>G<MDIB JKODJIN #@>G<MDIB I@R API>ODJIN 2C@ >JI>@KO JA K<OC -Q@MMD?DIB < ADG@ -Q@MGJ<?DIB < ;?DNO API>ODJI 1JH@ API>ODJIN TJP NCJPG? FIJR >C<MB@M;AJI>ODJI ADI?;<GG;DI;K<OC M@>PK@M@M;AJI? NKDK;GJB OMJPQ@M;O<=G@ ;M@LP@NO DI>GP?@;NKDK ADI?;DI;K<OC .DK@GDI@N DIN@MO;C@<?;>NN

336


# Table of contents #@ADIDODJI *DNO JA >PMM@IO KDK@GDI@N #@>G<MDIB < I@R KDK@GDI@ "JIO@SOP<G KDK@GDI@N .DK@GDI@ ?@O<DGN M@>C@M>C@M;GDNO@;?@N;>C<HKN <>>P@DG;@I>JPMN <>>P@DG;B<?B@O <>>P@DG;DIAJMH<ODJIN <AAD>C<B@;@IO@O@N;ADI<G <AAD>C<B@;ADI<G <AAD>C@M;>JIADB;J=E@O <AAD>C@M;>JIO@IP;J=E@O <AAD>C@M;AD>C@;J=E@O <AAD>C@;?MJDO@ <AAD>C@;@IA<ION <AAD>C@;B<P>C@ <AAD>C@;CD@M<M>CD@ <AAD>C@;HDGD@P <EJPO@M;=JPOJIN <EJPO@M;JIBG@ON <G@MO@N;<PO@PM <POJMDN@M =<N@;<?HDI;M@K<DM =J?T;KMDQ@ =JDO@;DIAJN ><G>PG@M;MP=MDLP@N >JHKO@M;>JIOMD=PODJIN;<PO@PM >JIADBPM@M;GDNO@;H@O<N ?@>G<M@M;O<=G@N;<PSDGD<DM@N ?@>G<M@M;O<=G@N;DIO@MA<>@N ?@>G<M@M;O<=G@N;J=E@ON;NPMIJHN ?@>G<M@M;O<=G@N;KMDI>DK<G@N ?@>G<M@M;PMG;J=E@ON ?@ADIDM;N@NNDJI ?@G@O@;NO<ODNODLP@N ?@G@O@;O<=G@N @?DO@M;>JIO@IP;J=E@O AJMHPG<DM@;>C<MB@M AJMHPG<DM@;OM<DO@M AJMHPG<DM@;Q@MDAD@M

337


C@<?@M;KMDQ@ DIN@MO;C@<? ELP@MT;KGPBDIN GDNO@M;O<=G@N;IJ@M<N@ GDNO@M;O<=G@N;IJ@SKJMO GDNO@M;O<=G@N;IJDHKJMO JKODHDN@M;=<N@;?DNK<MPN KJNO;OTKJ KM@;=JP>G@ KM@;DIN@MODJI KM@;GD@IN KM@;OTKJ M@>C@M>C@M;GDNO@;?@N;EJDIOPM@N M@>PK@M@M;AJI? MP=MDLP@;@I>JPMN NOTGDN@M O<>C@N;B@I@M<G@N;>MJI OMDB;NPKKMDH@M;J=E@ON;GD@N <I? OC@ M@NO JA OC@H 2<BN #TI<HD> O<BN 2C@ =<GDN@;, +$;?DNO API>ODJI 2C@ =<GDN@;, +$;NO<O API>ODJI 2C@ =<GDN@;, +$;?TI API>ODJI &@I@MD> O<BN 0@OMD@QDIB OC@ J=E@>O <I? D?;J=E@>O "M@<ODIB K<B@N DI OC@ KMDQ<O@ UJI@ 2C@ >JIO@ION JA < O@HKG<O@ @S@> ADG@ 2C@ >JIO@ION JA < .'. @S@> ADG@ 2C@ DIAJMH<ODJI K<I@G (I?@S 2<=G@ JA >JIO@ION %PI>ODJI<GDOD@N POCJMDN<ODJIN 2C@ <POJMDN@M GD=M<MT 2C@ 32-0(1$0 O<B .MJ>@NN@N DI OC@ <POJMDN@M API>ODJI "M@<ODIB JM JQ@MGJ<?DIB OC@ <POCJMDN<ODJIN 1@>PM@? <>ODJIN 'JR N@>PM@? <>ODJIN RJMF 1@>PM@? <>ODJINf KM@?@ADI@? API>ODJIN

338


# Table of contents >ODJI 30*N DI < O@HKG<O@ >ODJIN <I? KMJ>@NN@N 2C@ >JIO@ION JA <I <>ODJI ADG@ 2C@ Q@MDAD><ODJIN 2C@ KMJ>@NN@N POJH<OD> M@?DM@>ODJIN @?DO@M;J=E@O <>ODJIN POC@IOD><ODJIN 2C@ >JIO@ION JA <I <POC ADG@ "JHKDG<ODJI JA OC@ O@HKG<O@N 2C@ NTIO<S JA OC@ O@HKG<O@N I<GTNDIB < O@HKG<O@ 2C@ <NN@H=GT KMJ>@NN@N #@O@MHDIDIB OC@ ><>C@ .<M<H@O@MN ?@O@MHDIDIB OC@ I<H@ JA OC@ O@HKG<O@ #@O@MHDIDIB OC@ O@HKG<O@ ADG@ >G@<I >JHKJNDODJI 2C@ >JHKDG<ODJI 2C@ ><>C@ 2C@ O@HKG<O@ ><>C@ 2C@ K<B@ ><>C@ 2C@ 1/* ><>C@ 2C@ KGPBDIN ><>C@ 2C@ K<OC ><>C@ 2C@ "11 <I? )<Q<1>MDKO ><>C@N 2C@ DH<B@ KMJ>@NNDIB ><>C@ 0@AM@NCDIB OC@ ><>C@ "JIADBPMDIB OC@ ><>C@ .@MDJ?D> O<NFN >MJI 'JR >MJI EJ=N <M@ MPI #@>G<MDIB < >MJI O<NF (I?@S 2<=G@ JA >JIO@ION %JMHN '2+* NOMP>OPM@ #DNKG<TDIB OC@ AJMH '<I?GDIB @MMJMN M@OPMI@? %D@G? N@K<M<ODJI PNDIB AD@G?N@O 0<?DJ <I? >C@>F=JS AD@G?N $SKG<DIDIB DIKPO AD@G?N

339


"JI?DODJI<G ?DNKG<TN .'. KMJ>@NNDIB .<NNDIB <MBPH@ION OJ OC@ "42 API>ODJIN *J<?DIB Q<GP@N DIOJ OC@ AJMHN POCJMDN@ OC@ ?DNKG<T JM CD?DIB JA < AJMH -OC@M KM@GJ<?DIB JKODJIN .DK@GDI@N PN@? AJM GJ<?DIB "C@>FDIB OC@ NP=HDOO@? Q<GP@N $S@>PODIB OC@ KMJ>@NN@N .MJ>@NNDIB RDOCJPO ) 6 $S<HKG@N 2M<ING<O@ <ITOCDIB "<G>PG<ODIB OC@ ?<T JA OC@ T@<M (I?@S 2<=G@ JA >JIO@ION 1/* <>>@NN +J?DAD><ODJI JA OC@ 1/* H<I<B@M #@>G<MDIB O<=G@ NOMP>OPM@N 2<=G@ PK?<O@N <I? DINO<GG<ODJI 2C@ 1/* .( "JHHJI @G@H@ION NLG;<GGA@ON@G NLG;<GGO<=G@ NLG;<GO@M NLG;>JPIO NLG;>JPION@G NLG;>M@<O@ NLG;>M@<O@;=<N@ NLG;>M@<O@;QD@R NLG;?<O@;KMJ>C@ NLG;?@G@O@ NLG;?MJK;O<=G@ NLG;?MJK;QD@R NLG;@MMIJ NLG;@MMJM NLG;@SKG<DI NLG;A@O>C NLG;A@O>C;<GG NLG;A@ON@G NLG;AM@@ NLG;B@OA@ON@G

340


# Table of contents NLG;B@O;>C<MN@O NLG;B@O;N@G@>O NLG;C@S NLG;DI NLG;DIN@MO NLG;DIN@MOL NLG;DIN@MOL;HPGOD NLG;DI;N@G@>O NLG;GDNO?=N NLG;HPGOD NLG;JKODHDU@ NLG;LP@MT NLG;LPJO@ NLG;M@K<DM NLG;M@KG<>@ NLG;M@KG<>@;HPGOD NLG;N@@F NLG;N@G@>O NLG;N@G@>O?= NLG;N@MQ@PM NLG;N@O;>C<MN@O NLG;NCJR=<N@ NLG;NCJRO<=G@ NLG;PK?<O@ NLG;PK?<O@L NLG;Q@MNDJI (I?@S 2<=G@ JA >JIO@ION "M@<ODIB TJPM JRI KGPBDIN 2C@ =<ND> KMDI>DKG@ JA KGPBDIN 2C@ HDIDH<G KGPBDI SHG KGPBDI SHG JOC@M >JHHJI <OOMD=PO@N '<I?GDIB ?@K@I?@I>D@N (INO<GGDIB @SO@MI<G GD=M<MD@N 3NDIB KDK@GDI@N #@ADIDIB =POOJIN #@ADIDIB K<B@ O<=N $S<HKG@N ??DIB < OTK@ JA BGJNN<MT KKGTDIB < ?@A<PGO NJMO N@LP@I>@ OJ OC@ GJJKN "JIND?@M<ODJI JA I@R AD@G?N DI O<=G@ N@<M>C@N

341


#DNKG<T <I <POCJMDIB AJMH DA <POCJMDN@? +J?DATDIB <GG JA TJPM O@HKG<O@N DI JI@ CDO &GJNN<MT ) 6 MBPH@IO "<>C@ ADG@N .<M<H@O@M .DK@GDI@ 0@>PMNDJI (I?@S 2<=G@ JA >JIO@ION

342


# Table of contents

343


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.