SPIP

[ar] [ast] [bg] [br] [ca] [co] [cpf] [cs] [da] [de] [en] [eo] [es] [eu] [fa] [fon] [fr] [gl] [id] [it] [ja] [lb] [nl] [oc] [pl] [pt] [ro] [ru] [sk] [sv] [tr] [uk] [vi] [zh] Espace de traduction

Download

SPIP 3.0

23 maart — aangepast op : 3 april

Alle versies van dit artikel:

SPIP 3 is een nieuwe versie die wordt gekenmerkt door een volledig herschreven privé gedeelte en herschreven skeletten, een sterke indeling in modules en een revolutionaire DATA-lus.


SPIP 2.0 bracht de functionaliteit die SPIP maakte tot een «framework» voor de ontwikkeling van webapplicaties in plaats van zijn initiële taak van publicatie-tool.

SPIP 3 voert die «framework» logica ook door op zichzelf: het gehele pivé gedeelte werd herschreven in skeletten op basis van de tools en functies die met de markuptaal van de skeletten van SPIP ter beschikking staan.

Deze volledige heropbouw van het privé gedeelte bood de gelegenheid het functioneren van de editoriale objecten te heroverwegen en hun gebruik te normaliseren en zo generiek mogelijk te maken: het merendeel van de historische eigenaardigheden van ieder object (en de daaraan gekoppelde uitzonderingen bij de verwerking binnen de code van SPIP) werden geschrapt en gestandaardiseerd.

Het aanmaken van nieuwe editoriale objecten en de aanpassing van bestaande wordt hierdoor een stuk eenvoudiger en gaat een stuk sneller.

SPIP 3 betekent ook de splitsing van de basissoftware en haar plugins: dat wat SPIP 2 te bieden had is in SPIP 3 terug te vinden als een core met 23 plugins.

Het "uitkleden" van de kern van SPIP wordt gecompenseerd met diverse API’s en toegangspunten voor de verdere ontwikkeling van plugins.

SPIP 3 rekent op de ontwikkelingen door de gemeenschap in SPIP-Zone en markeert daarmee een ommekeer: de groei van SPIP gebeurt niet langer vanuit de core, maar het is de ontwikkeling van plugins die de vooruitgang van SPIP gaan bepalen [1].

Onder de vele functionele noviteiten biedt SPIP 3 een nieuwe lus DATA waarmee nu op alle types gegevens kan worden gelust en niet meer uitsluitend op SQL-tabellen. Zo wordt het mogelijk een lus te maken op een opsomming, of op een CSV, XML ofYAML bestand... Maar nog krachtiger is dat met de lus DATA op een URL kan worden gelust, waardoor het mogelijk wordt direct een Google Spreadsheet, een online kalender, een lijst van video’s op Youtube, of foto’s op Flickr te benaderen... het internet wordt je database!

Vereisten : SPIP 3.0 vereist toch maar een minimale PHP versie 5.1.0 om correct te kunnen functioneren.

Een nieuw privé gedeelte [2]

Visueel werd het privé gedeelte voortgebouwd op de vorige versies, aangevuld met enkele nieuwe iconen:

  • de belangrijkste navigatie-iconen zijn speciaal voor SPIP ontworpen door Sébastien Desbenoît,
  • voor de rest gaat het om een set die is afgeleid van FatCow.

De herstructurering van de interface is vooral van technische aard, alhoewel sommige historische elementen ergonomisch zijn herzien.

De hoofdnavigatie is opnieuw gestructureerd. Het rolmenu dat ook met het toetsenbord is te bedienen, heeft een vertraging om met de muis snel een menu-item te kunnen selecteren.

Het gehele privé gedeelte werd dus herschreven in de vorm van skeletten die stan opgeslagen in de map prive/squelettes verdeeld in submappen die overeenkomen met de blokindeling van de pagina’s. Deze sub-indeling is gedaan om het gebruik van ajax mogelijk te maken en zo het volledig herladen van de pagina te beperken [3].

Ook in het privé gedeelte maakt een groot aantal toegangspunten (in eerste instantie geplaatst ten behoeve van de plugins van de core) het mogelijk dankzij pipelines om via plugins ook het privé gedeelte te kunnen aanpassen.

De pagina’s van het privé gedeelte zijn gereorganiseerd en hernoemd. Met name alle editoriale pagina’s hebben een coherente benaming, gebaseerd op de naam van het object dat ze bewerken.

Het herschrijven maakte ook een update van de volledige HTML mogelijk. Een referentiebron is aanwezig voor ontwikkelaars van plugins om hen diezelfde structuur te kunnen laten gebruiken en zo een homogeniteit met de core te bewerkstelligen.

Alle lijsten met objecten zijn skeletten die gemakkelijk kunnen worden aangepast. Ze maken allemaal gebruik van een sortering per kolom en van ajax functionaliteit.

Dankzij een steigervormig systeem kunnen automatisch minimale pagina’s worden geconstrueerd voor door plugins toegevoegde objecten. Elk element van deze standaard interface kan vervolgens worden aangepast in functie van de specifieke eigenschappen van dat object: [4].

Allen interactieve formulieren zijn geschreven als CVT formulier, waardoor ze profiteren van alle voordelen van deze functionaliteit en ze toch eenvoudig (door plugins) kunnen worden aangepast.

Een ander nieuwtje is dat SPIP 3 bij aanpassing van tekst met een simpele regelterugloop rekening houdt (je hoeft dus niet meer zelf de «_ » in te voegen).

Tenslotte kan het privé gedeelte thematisch worden aangepast door stylesheets of (een gedeeltelijke) aanpassing van de iconen. Ook hier zou een plugin je kunnen helpen, maar je kunt het ook zelf doen op basis van je eigen voorkeur.

Moduleren in plugins

SPIP 3 realiseert dus de splitsing van de software in plugins. De core blijft verantwoordelijk voor het beheer van objecten (als artikelen, rubrieken, auteurs, enz.), maar ook voor de markuptaal van de skeletten en de omkleding van het privé gedeelte. Alle overige functionaliteit wordt overgelaten aan plugins die automatisch worden geïnstalleerd tijdens de standaardinstallatie van SPIP 3. Deze standaard plugins bevinden zich in een map plugins-dist/ [5]

Deze uitsplitsing van de core heeft een aantal specifieke API’s mogelijk gemaakt die nu ter beschikking staan van de ontwikkelaars van plugins, die onbeperkt nieuwe functionaliteit kunnen toevoegen door de standaad plugins van SPIP als voorbeeld te nemen.

In het domein van de plugins doet SPIP 3 ook een belangrijke aanpassing in de XML declaratie. Naast een verbeterde leesbaarheid integreert het ook de kwestie van vertalingen van de plugin, evenals de tools voor een automatische opbouw van een verzamelboek van SPIP plugins en een tool voor het laden.

Verder kunnen ook de plugins gebruik maken van de mogelijkheden tot aanpassen van de core database door het eenvoudigweg declareren van de functie.

De standaard met SPIP meegeleverde plugins zijn:

  • Brèves voor nieuwsberichten.
  • Compagnon biedt de mogelijkheid tot de weergave van pedagogische informatie bij het eerste gebruik van het privé gedeelte.
  • Compresseur was al aanwezig in SPIP 2.1 en verbetert de responsetijden door stylesheets en JavaScript te comprimeren. Déze versie van de plugin verbetert ook de sheets per media-type. Het gebruik van @media om alle sheets tot één enkele sheet samen te voegen zonder de volgorde te beïnvloeden. Verder zorgt het voor absolute URL’s zonder protocol om op dei manier zowel van HTTP ans HTTPS gebruik te kunnen maken.
  • Dump verzorgt de backup en restore. De functionaliteit werd herschreven om een volledige, betrouwbare backup te garanderen. Het formaat is SQLite en alle tabellen worden systematisch bewaard. Je host moet dus wel over SQLite beschikken. Is dat niet het geval, dan zal je zelf via phpmyadmin of een andere interface voor een backup moeten zorgen.
  • Forum beheert alle forums, zowel op de publieke site als in het privé gedeelte. Forums zijn nu beschikbaar voor alle editoriale objecten (standaard en plugin).
  • Images was al beschikbaar in SPIP 2.1 en beheert alle afbeeldingsfilters en kleuren in de skelettten.
  • jQuery UI staat in een complementaire bibliotheek van SPIP. Het maakt dynamische grafische onderdelen mogelijk: tabs, drag & drop, voortgangsbalken, widgets, effecten… [6]
  • Mediabox integreert in SPIP een pop-in om media weer te geven of bepaalde interactie voor te stellen [7].
  • Medias [8] neemt het beheer van afbeeldingen en documenten voor zijn rekening. Het biedt een nieuwe interface en maakt documenten mogelijk in ieder editoriaal object.
  • Mots beheert trefwoorden en groepen van trefwoorden. Trefwoorden kunnen nu in elk editoriaal object worden toegepast.
  • Organiseur neemt het berichtensysteem en de kalender/agenda in het privé gedeelte voor zijn rekening. De interface werd volledig opnieuw opgebouwd. Het berichtensysteem biedt notificatie per email en de kalender is gebaseerd op de bibliotheek FullCalendar die een soepele navigatie mogelijk maakt.
  • Pétitions beheert petities in artikelen en heeft ook een herziene interface.
  • Porte plume ("penhouder") was al in SPIP 2.1 aanwezig en helpt bij de invoer van gegevens.
  • Révisions maakt het vergelijken van versies van ieder editoriaal object van SPIP mogelijk. Ook hier werd de interface gemoderniseerd.
  • SafeHTML was ook al onderdeel van SPIP 2.1 en zorgt voor de beveiliging van potentieel gevaarlijke inhoud van buitenaf.
  • Sites zorgt voor het functioneren van gerefereerde site en voor syndicatie (nieuwsovername). Een interface voor het beheer van gesyndiceerde artikelen staat ter beschikking.
  • Squelettes par rubriques zorgt voor de mogelijkheid om per rubriek andere skeletten toe te passen (zoals article-2.html voor artikelen in rubriek 2 en haar subrubrieken).
  • Statistiques neemt de site statistieken voor zijn rekening met een volledig herziene interface.
  • Support vieux navigateur was al in SPIP 2.1 aanwezig en biedt JavaScript functies voor het gebruik van oudere browsers.
  • Svp neemt het beheer van plugins voor zijn rekening: installatie, activeren, updaten, zoeken…
  • Textwheel is een typografische motor die de opmaakcodes van SPIP ondersteunt, maar is omschreven in bestanden volgens het YAML formaat. Hierdoor worden opmaakcodes versneld verwerkt (soms tot 2 keer zo snel) en kunnen opmaakcodes naar persoonlijke wensen worden aangepast.
  • Urls Étendues ("URL’s uitgebreid") ondersteunt de verschillende types URL’s en biedt een interface voor de configuratie en een fijninstelling van de URL’s per pagina.
  • Vertèbres ("wervels")was ook al in SPIP 2.1 aanwezig om webmasters de inhoud van een SQL-bale van SPIP te laten weergeven door middel van een automatisch gegenereerd skelet volgens de structuur van de tabel. Deze weergave gebeurt in het privé gedeelte.

Nieuwe standaardskeletten

De standaardskeletten werden herzien met een nieuwe grafische aankleding. Ze ondersteunen een nieuwe HTML basisstructuur die HTML5 ondersteunt, standaard «responsive» met conditionele selectors voor een meer soepele CSS.

Door het splitsen van de stylesheets in meerdere onafhankelijke sheets (volgens de methode Daisy, zie Un, deux, trois… feuilles CSS !). Je kunt er direct mee aan de slag. De historische spip_style.css verdwijnt ten gunste van spip.css, een onmisbaar bestand dat je samen met jouw stylesheets toepast.

Nieuwe functionaliteit

De ondersteuning van SQLite werd verbeterd en is nu de voorkeur bij een nieuwe installatie (als de server dit ondersteunt), vooral vanwege het eenvoudige gebruik [9].

Het beheer van de editoriale objecten werd veralgemeend. Hierdoor zijn auteurs, documenten, trefwoorden, forums, revisies en logo’s nu op elk object toepasbaar (die van SPIP maar ook via de nieuwe API toegewezen nieuwe objecten). Het beheer van de status, de publicatiedatum, de taal en de vertaling werden ook veralgemeend en zijn op alle objecten toepasbaar.

De identiteit van de site werd vervolledigd met een slogan tussen titel en lange omschrijving, toe te passen met het baken #SLOGAN_SITE_SPIP.

Het veiligheidsscherm is standaard opgenomen.

De logs kunnen worden beheerd op niveau van belangrijkheid. Standaard zijn ze minder verbaal en geven ze alleen meldingen weer van fouten of andere belangrijke informatie. Het niveau kan worden ingesteld voor het debuggen of tijdens ontwikkeling.

De periodieke cron in bestanden is verwijderd ten gunste van een wachtlijst van taken (die ook periodieke taken beheert). Hierdoor kunnen asynchrone acties worden geprogrammeerd [10] en kan via een API van de functionaliteit gebruik worden gemaakt in plugins.

De ajax functionaliteit in skeletten ({ajax} met een INCLURE) is beter toegankelijk dankzij de ARIA attributen. Daarbij wordt ook de browse-geschiedenis beheerd dankzij de API «History» van HTML5 [11]. De URL van de browser wordt dus automatisch aangepast bij de ajax links en maakt een stap terug probleemloos mogelijk.

De gebruikte modellen in een editoriale tekst ontvangen automatisch de context van het verzendende skelet [12].

Formulieren in het privé gedeelte gebruiken de mogelijkheden van HTML5, waaronder de attributen required of placeholder.

Een escape van de tekens # [ ] ( ) { } < > in skeletten is mogelijk door het gebruik van de backslash \. Het wordt mogelijk om bijvoorbeeld condities te schrijven op een aanklikbaar veld op een formulier, zonder dat de haakjes van het attribuut name de haakjes van het omhullende baken beïnvloeden:

  1. [(#ENV{param}|oui)
  2.    <label for='tendresse'>Met zorg?</label>
  3.    <input type='checkbox' name='met_wat\[\]' id='zorg' checked='checked' value='zorg' />
  4. ]

Opmaakcodes

Een nieuwe opmaakcode is toegevoegd voor afkortingen: [NS|Nederlandse Spoorwegen] (of [CMS|Content Management System{en}]) om aan te geven dat het om een andere taal gaat dan die van de tekst) maakt een tag abbr [13].

Documentmodellen accepteren nu een argument om de maximale hoogte of breedte aan te geven: <docxx|largeur=150> voor een breedte van maximaal 150px.

Je hoeft niet langer de opmaakcode «_ » in te voegen voor een eenvoudige regelterugloop. Om toch de oude werking te blijven gebruiken verwijzen we naar define('_AUTOBR', ''); in het bestand mes_options.php.

Lussen

Het systeem van lussen van SPIP werd veralgemeend op niet alleen op een SQL tabel te werken maar op een iterator. Een SQL iterator zorgt dat de traditionele lussen op de SQL tabel blijven functioneren, maar nu is een lus mogelijk op alle data waarop kan worden geïtereerd: De iterators van SPIP - de lus (DATA)

Een eerste nieuwe toepassing is de lus DATA die op alle data in tabelvorm kan worden losgelaten. Het kan een CSV bestand zijn, maar ook een URL die informatie in JSON verstuurt...:

Om de migratie van skeletten die gebruik maken van de lussen POUR en CONDITION, worden deze ook ondersteund als speciale toepassing van de lus DATA en in de bestaande syntax.

Voorwaardes

{si ...}: maakt een conditionele uitvoering van een lus mogelijk, waarbij de voorwaarde niet afhankelijk is van de data waarop wordt gelust, maar op de context van het skelet.

{tri ...}: werkt samen met het baken #TRI voor een gemakkelijke sortering.

{feuille}: selecteert een rubriek zonder subrubrieken (dus onderaan de hiërarchie).

{noeud}: selecteert een rubriek die wel subrubrieken heeft.

{!racine}: zondert de hoofdrubrieken (aan de root) uit.

{profondeur=3}: selecteert rubrieken van het derde niveau (hoofdrubrieken hebben niveau 0).

{id_parent} heeft een aangepast gedrag bij de afwezigheid van een omhullende lus RUBRIQUES: vroeger nam id_parent de id_rubrique van de context (#ENV{id_rubrique}), voortaan neemt {id_parent} de id_parent van de context (#ENV{id_parent}). Vanaf nu schrijf je dus {id_parent}.

Voor de migratie van een lus met {id_parent} kun je:
-  een context id_parent doorgeven;
-  {id_parent ?}{id_rubrique ?} gebruiken.

Bakens

Als een model het baken #CACHE bevat, kan het gecachet worden (maar het is niet verplicht).

In het privé gedeelte hebben de skeletten ook geen cache, tenzij een baken #CACHE aanwezig is.

#LOGO_DOCUMENT kent een nieuw argument voor de wijze van weergave van het logo:

  • auto (de traditionele standaardwaarde) geeft automatisch het vignet van het document weer als dat bestaat; anders het icoon dat tot het documenttype behoort;
  • icone geeft aan dat het icoon dat tot het documenttype behoort moet worden weergegeven;
  • apercu toont een verkleinde weergave van het document, zelfs als een vignet bestaat;
  • vignette toont het vignet als dat bestaat en anders niets.

Het baken #SPIP_CRON verdwijnt en heeft dus ook geen effect meer waar het nog zou staan.

#BOUTON_ACTION{label, url, class, confirm, titel, callback} genereert een mini HTML-formulier met een enkele knop die «label» weergeeft en bij een klik een POST doet naar «url». Dit baken moet bij voorkeur worden gebruikt wanneer de pagina «url» de database aanpast. Bevat «class» de waarde «ajax» dan wordt alleen het blok wat het bevat ververst. «confirm» biedt plaats aan een bevestigingsbericht aan de gebruiker, «titel» is de inhoud van het attribuut title op de knop en «callback» si een JavaScript functie doe moet worden aangeroepen bij het aanklikken van de knop.

#INFO_XXX{article, 13} vindt #XXX zonder een lus ARTICLES te hoeven maken op artikel 13 (kan worden toegepast op elke lus en elk veld van een lus: #INFO_TITRE{article,13}, #INFO_NOM{auteur,2}...)

#CONFIG{naam} toont de waarde van het item naam in de meta-data. Gaat het om een tabel, dan kan iedere waarde worden bereikt met de syntax #CONFIG{naam/subwaarde} wat de subwaarde van meta naam retourneert. Voor de meta-data van een bepaalde plugin, gebruik je de syntax #CONFIG{/metamijnplugin/naam}: door te beginnen met een / geef je aan dat je de meta naam van de tabel spip_metamijnplugin wilt weten in plaats van de tabel spip_meta van SPIP zelf. In alle gevallen kun je in een aanvullende parameter een standaardwaarde opgeven in het geval dat de meta nog niet bestaat: #CONFIG{naam,standaardwaarde} . Naar het voorbeeld van #CONFIG{naam/subwaarde} kan bij de bakens #ENV, #GET, #SESSION gebruik worden gemaakt van rechte haakjes om de subwaarde van een tabel te benaderen:#ENV{naam/subwaarde}, #GET{tabel/key/subkey}, #SESSION{prefs/couleur}.

#PUBLIE test de status gepubliceerd van een object. Het kan binnen een lus op het object zelf worden toegepast, maar ook met de expliciete argumenten: [(#PUBLIE{article, 3}|oui) ... ] (en op alle andere objecten).

#CLE en #VALEUR zijn twee bakens die de key en waarde van een lus DATA kunnen weergeven. #VALEUR{x} toont de subwaarde van x als #VALEUR een tabel is (gelijk aan [(#VALEUR|table_valeur{x})]). Je kunt meerdere subindexen aangeven #VALEUR{x/y/z} om een waarde in een subniveau van de tabel te tonen.

#PRODUIRE stuurt de naam van een statisch bestand dat vanuit een skelet werd gemaakt. Nuttig bij een berekende stylesheet of een berekende JavaScript. De syntax is gelijk aan die van het baken #INCLURE : #PRODUIRE{fond=mijnsheet.css,kleur=ffffff} om het skelet mijnsheet.css.html te gebruiken . #LISTE{a,b,c} stuurt een eenvoudige tabel met de waardes a,b en c. Het is een vereenvoudigde schrijfwijze voor #ARRAY{0,a,1,b,2,c}.

#TOTAL_UNIQUE stuurt het aantal weergegeven elementen ten gevolge van het filter |unique. Gebruik je |unique{naam}, dan doe je dat ook in het baken: #TOTAL_UNIQUE{naam}

In het privé gedeelte:

#AIDER{surtitre} geeft een link naar de sectie surtitre in de online hulp van SPIP.

#BOITE_OUVRIR, #BOITE_PIED en #BOITE_FERMER maakt het gebruik van de gestileerde boxen van het privé gedeelte mogelijk:

  • #BOITE_OUVRIR{titel,class} opent een box. De titel mag worden weggelaten. De classes van het privé gedeelte zijn: simple, info, note, raccourcis en important;
  • de erop volgende HTML wordt in de box opgenomen;
  • met #BOITE_PIED kan naar de voet van de box worden gegaan, als een voet noodzakelijk is.
  • #BOITE_FERMER sluit de box.

Kijk voor uitgebreide voorbeelden naar de pagina in het privé gedeelte ecrire/?exec=charte_boites voorgesteld door plugin http://plugins.spip.net/dev

#FORMULAIRE_RECHERCHE_ECRIRE toont het zoekformulier voor het privé gedeelte. Als eerste argument kun je de URL weergeven waarna hij moet wijzen en als tweede argument een class. Bij de aanwezigheid van JavaScript gedraagt het zich als een link naar een URL met de parameter recherche en de zoekopdracht. Geef je een class ajax aan als tweede argument dan zal deze functionaliteit worden uitgevoerd, bijvoorbeeld: #FORMULAIRE_RECHERCHE_ECRIRE{#SELF, ajax}

#CHEMIN_IMAGE{article-24.png} stuurt het pad naar het icoon article-24.png van het huidige thema van het privé gedeelte.

Filters

|lien_ou_expose biedt de mogelijkheid een eenvoudig menu van links te maken, waarbij de geselecteerde wordt weergegeven met een <strong>. Voorbeeld: [(#URL_PAGE{mijnpagina}|lien_ou_expose{label, #ENV{page}|=={mijnpage}, classe, titel, rel})]

|singulier_ou_pluriel geeft de ene of andere tekenreeks weer in functie van het getal waarop het wordt toegepast: [(#TOTAL_BOUCLE|singulier_ou_pluriel{1_artikel,nb_artikelen})]. 1_artikel en nb_artikelen zijn taalstrings die het aantal als argument @nb@ bevatten. Ie het aantal nul, dan wordt niets weergegeven.

|balise_img maakt snel een HTML-tag <img> vanuit de naam van een bestand waarbij ook e breedte en hoogte worden opgevraagd: [(#CHEMIN{mijnafb.png}|balise_img{alt,class})]

|affdate_debut_fin toont op eenvoudige wijze een tijdsinterval tussen een begin- en einddatum, waarbij ermee rekening wordt gehouden dat beide eventueel dezelfde dag, maand of jaar bevatten en eventueel het tijdstip wordt mee beschouwd (tweede argument, oui of non). Voorbeeld: [(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,horaire})]

|timestamp voegt aan de naam van een bestand een tijdstempel toe in de vorm ?1234567890 waarbij het getal de datum is geteld in secondes vanaf 1 janvier 1970. Dit filter is nuttig bij stylesheets om er zeker van te zijn dat ze opnieuw worden geladen bij een andere URL: [<link rel="stylesheet" href="(#CHEMIN{css/perso.css}|timestamp)" type="text/css" />]

|objet_icone verstuurt het standaard icoon van een SPIP object, waarbij standaard 24px als maat wordt gebruikt, tenzij 16 of 32 als argument wordt meegegeven: [(#OBJECT|objet_icone{16})]

|objet_info stuurt de eigenschap van een SPIP object zoals gedeclareerd (of automatisch werd toegewezen door SPIP) via de API declarer_tables_objets_sql

|objet_afficher_nb toont het aantal objecten rekening houdend met het aantal waarop het filter van toepassing is en de voor het object aangegeven taalstrings: [(#TOTAL_BOUCLE|objet_afficher_nb{auteur})] toont bijvoorbeeld 1 auteur of 23 auteurs.

|wrap omhult een tekst met een HTML-tag: [(#TITRE|wrap{<h3>})] geeft hetzelfde resultaat als [<h3>(#TITRE)</h3>]

|generer_info_entite toont het veld van een SPIP object: [(#ID_ARTICLE|generer_info_entite{article,titre})] stuurt de titel van het artikel #ID_ARTICLE. Het is gelijk aan [(#INFO_TITRE{article,#ID_ARTICLE})].

In het privé gedeelte:

|icone_horizontale toont een icoon van het privé gedeelte in horizontaal formaat. De syntax is: [(#URL|icone_horizontale{label,icoon,functie})]. icoon kan bijvoorbeeld zijn (article) in formaat 24px of expliciet (article-24.png). Het derde argument functie geeft een familie van acties aan dat is gekoppeld aan het icoon en kan zijn add, del, edit, new, of niets. Voorbeeld: [(#URL_ECRIRE{auteur_edit,new=oui}|icone_horizontale{<:icone_creer_nouvel_auteur:>,auteur,new})]

|icone_verticale toont een icoon in verticaal formaat en werkt zoals |icone_horizontale

|bouton_action_horizontal gebruikt dezelfde syntax als |icone_horizontale en geeft een overeenkomstig visueel effect. Maar de HTML markup is die van #BOUTON_ACTION om een POST naar een URL te doen en is dus nuttig bij aanpassing van de database.

|sinon_interdire_acces geplaatst op een willekeurige plaats op de pagina blokkeert de toegang wanneer de expressie niet waar is. In dat geval wordt een foutpagina weergegeven behalve als een URL voor een doorverwijzing als argument wordt meegegeven (je kunt ook een HTTP doorverwijsstatus als tweede argument aangeven). In het algemeen wordt het op een verificatie voor autorisatie gebruikt: [(#AUTORISER{modifier,article,#ID_ARTICLE}|sinon_interdire_acces)]

JavaScript

SPIP 3 gebruikt versie 1.7.2 van en integreert ook versie 1.8.20 van jQuery UI. Het is mogelijk een andere versie van jQuery in de publieke site te gebruiken door eenvoudig javascript/jquery.js in de map squelettes/ op te nemen zonder het privé gedeelte te beïnvloeden.

Links en ajax: Links .ajax verstoren niet langer de navigatie geschiedenis op browsers die de HTML5 History API ondersteunen (onder andere Firefox, Safari, Chrome). Bij het klikken op een ajax link van SPIP die een deel van de pagina herlaadt, wordt de URL aangepast in de browser en kan de bezoeker klikken op Vorige pagina om terug te gaan.

Speciale classes voor ajax links:

  • .nohistory geeft aan dat de browsergeschiedenis niet moet worden aangepast bij een klik op de link;
  • .preload geeft aan SPIP aan dat de inhoud van de link moet worden geladen wanneer de pagina zelf wordt geladen. Wordt op de link geklikt dan volgt een onmiddellijke aanpassing;
  • .nocache geeft aan SPIP aan dat de inhoud van de ajax link niet in de cache moet worden geplaatat. Meerdere klikken betekenen dus meerdere opvragingen vanaf de server (normaal wordt de inhoud van een URL na een eerste opvraging door de browser in een cache geplaatst en vandaar opnieuw uitgelezen).

Herladen van een ander blok met ajax: De .ajax link herlaadt normaal het blok waartoe de link behoort, maar soms moet ook een ander blok op de pagina worden herladen.

Daarvoor is het mogelijk om de ajax blokken te benoemen op het moment van de insluiting: <INCLURE{fond=...,ajax=naamvanhetblok} />. Het genoemde ajax blok kan worden herladen via het aanroepen van een ajaxReload('naamvanhetblok');. Als tweede argument kan een lijst van opties worden meegegeven met:

  • callback: de functie callback die kan worden opgeroepen na het laden van het ajax blok
  • args: een lijst van argumenten die worden doorgegeven aan de URL tijdens het laden van het blok (past de #ENV van het blok aan);
  • history: geeft aan of het herladen de geschiedenis van de browser moet worden aangepast (standaard niet waar). Voorbeeld:
    1. ajaxReload('naamblok', {
    2.    callback:function(){alert('fini');},
    3.    args:{id_article:3},
    4.    history:false
    5.    });

ajaxReload kan ook worden gebruikt op een jQuery selector waarbij hij het herladen van het kleinst mogelijke ajax blok dat het element bevat uitvoert. Het heeft slechts één mogelijk argument (de tabel van opties: $('#contenu').ajaxReload({args:{id_article:3}}).

JavaScript animaties: Wanneer een gebruiker een interactie start, kunnen meerdere types animaties worden gestart die van toepassing zijn op een jQuery selector:

  • jQuery('#mijnid').animateLoading() start de oplaad-animatie van #mijnid (automatisch gestart bij het herladen door ajax)
  • jQuery('#mijnid').endLoading() stopt de oplaad-animatie van #mijnid (automatisch gestart bij het herladen door ajax)
  • jQuery('#mijnid').animateAppend() start de animatie van het blok #mijnid om aan te geven dat deze door de interactie wordt toegevoegd
  • jQuery('#mijnid').animateRemove() start de animatie van het blok #mijnid om aan te geven dat ze door de interactie werd verwijderd

Nuttige functies: parametre_url() gedraagt zich als de PHP-versie van parametre_url om de argumenten van een URL te bewerken:

  • parametre_url(url,arg,value) voegt arg=value aan url toe en retourneert de aangepaste url;
  • parametre_url(url,arg,'') verwijdert de waarde van arg in url toe en retourneert de aangepaste url;
  • parametre_url(url,arg) retourneert de waarde van arg in url

$('a').followLink() volgt een link alsof er met de muis op werd geklikt (en houdt rekening met eventuele ajax functionaliteit).

Popin in het privé gedeelte: Een link naar een pagina van het privé gedeelte met een class .popin veroorzaakt de opening van een popin die de kern van de aangegeven bladzijde bevat (bloc contenu/). De link behoudt wel haar vermogen om een volledige bladzijde te openen in een nieuwe tab via een rechter muisklik.

API

SPIP 3 introduceert meerdere generieke API’s in het beheer van de editoriale objecten:

  • een generiek beheer van de tabellen met de links van een object naar elk ander object: de API editer_liens
  • het aanmaken van nieuwe editoriale objecten wordt vereenvoudigd met een declarerende API
  • een generiek beheer van functies voor het invoegen, aanpassen of publiceren van editoriale objecten: de API editer_objet
  • objet_test_si_publie($object, $id_object) maakt het gemakkelijk te controleren of een object gepubliceerd is in functie van zijn status (en niet in functie van een eventuele post-publicatie)
  • generer_url_ecrire_objet($object,$id_object,$args, $anker) stuurt de URL van de pagina van het object in het privé gedeelte. $args en $anker zijn optioneel.
  • le pipeline optimiser_base_disparus wordt opgeroepen bij het opruimen van objecten in de prullenbak en daaruit resulterende ongeldige links

SPIP 3 beschikt ook over een taaklijstbeheer waarmee de toekomstige of asynchrone uitvoering van taken kan worden geprogrammeerd.

De configuratie van plugins werd vereenvoudigd met de automatische aanmak van formulieren #FORMULAIRE_CONFIGURER_XXX en het gebruik van de functies lire_config, ecrire_config, effacer_config (zie Een functionaliteit of plugin configureren).

De CVT formulieren kunnen nu eenvoudig uit formulieren van meerdere pagina’s bestaan en ondersteunen een automatisch opslaan van de ingevoerde gegevens door middel van een eenvoudige declaratie. Een pipeline formulaire_fond maakt het mogelijk de achtergrond van een formulier aan te passen (om de HTML aan te passen) [14]

In de SQL API:

  • de functie sql_skip werd toegevoegd om een bepaald aantal resultaten over te slaan.
  • De waardes null in sql_updateq en sql_insertq zijn vertaald in NULL SQL en niet meer als een lege reeks.
  • de functies sql_demarrer_transaction en sql_terminer_transaction laten respectievelijk een SQL transactie starten of stoppen [15].

Een zandbak (public/sandbox.php) voor de compilatie van plugins maakt de compilatie van de skeletten van een plugin mogelijk binnen het geheel van filters en functies in een blacklist of whitelist mogelijk met de optie PHP in skeletten te verbieden.

Specialisatie van voorwaarden: De naam van een functie kan worden voorzien van een prefix met de naam van de server en/of de naam van de tabel. Het zoeken gebeurt in deze volgorde:

  1. voorwaarde_server_TABEL_mijnvoorwaarde_dist,
  2. voorwaarde_server_TABEL_mijnvoorwaarde,
  3. voorwaarde_server_mijnvoorwaarde_dist,
  4. voorwaarde_server_mijnvoorwaarde,
  5. voorwaarde_TABEL_mijnvoorwaarde_dist,
  6. voorwaarde_TABEL_mijnvoorwaarde,
  7. voorwaarde_mijnvoorwaarde_dist,
  8. voorwaarde_mijnvoorwaarde

In het bestand options.php van een plugin of in het bestand mes_options.php maakt $GLOBALS['marqueur_skel'] .= ":prefix" het mogelijk de cache van gecompileerde skeletten te onderscheiden zoals $GLOBALS['marqueur'] .= ":prefix" dat al deed voor de cache van de skeletten zelf.

Opmerkingen

[1Naast de plugin Porte-plume die al in SPIP 2 was opgenomen en de basis was van deze ontwikkeling, maken we je in het bijzonder attent op de plugins Afficher_objets, Base CSS, Navigation du privé, CVT multi-étapes, Forum, Job-queue, Mediabox, Médiathèque, TextWheel, URLs éditables, Comments, die de ontwikkeling van SPIP zelf sterk hebben beïnvloed; andere werden geïntegreerd met enkele aanpassingen.

[2Dit werk werd al enige tijd op de Zone voorbereid en de gebruikers van de plugins Navigation du privé of de Médiathèque zullen die ongetwijfeld herkennen.

[3zo gaat de overgang naar het aanpassen van een artikel dankzij ajax veel soepeler.

[5in SPIP 2.1 stonden ze in map extensions/ die nu is komen te vervallen.

[6Bekijk de pipeline op programmer.spip.org

[7Het is een alternatief voor plugins Thickbox, LightBox... die berusten op de bibliotheek Colorbox

[8In SPIP 2 bekend onder de naam "Médiathèque"

[9de ondersteuning van PostGreSQL moet als experimenteel worden beschouwd en wordt afgeraden in een productie-omgeving

[10Bijvoorbeeld het "zo snel mogelijk" verzenden van een email

[11in alle moderne browsers met uitzondering van Internet Explorer

[13De tag <acronym> wordt in HTML5 niet meer gebruikt.

[15Experimenteel werd ook een sql_preferer_transaction toegevoegd om een probleem van trage invoegingen met SQLite tegen te gaan, waar wij sneller worden ingevoegd in de transactionele modus. Deze functie verzendt uitsluitend true in SQLite


Het skelet van deze bladzijde zien Site gebouwd met SPIP | Vertaalruimte | Privé-site