La declaration de taches periodiques reste identique a auparavant (pipeline taches_generales_cron)
La balise #SPIP_CRON disparait, remplacee par un declenchement en fin de hit uniquement quand une tache
est en attente. Pour le declenchement, on utilise preferentiellement un socket, et a defaut une image background comme avant.
Lors d'un appel, le sequenceur execute autant de taches en attente que possible, dans la limite d'un temps donné. Des appels concurents peuvent se jouer, mais chaque tache est executee une unique fois par une seule instance. L'unicité de l'execution est garantie par un sql_delete.
SI jamais le nombre de taches en attente depasse un seuil (10000 par defaut) la file est purgee par un appel en fin de hit, synchrone.
Une page d'aministration est accesible aux administrateurs depuis le menu maintenance.
L'API est
/**
* Ajout d'une tache dans la file d'attente
*
* @param $function
* The function name to call.
* @param $description
* A human-readable description of the queued job.
* @param $arguments
* Optional array of arguments to pass to the function.
* @param $file
* Optional file path which needs to be included for $fucntion.
* @param $no_duplicate
* If TRUE, do not add the job to the queue if one with the same function and
* arguments already exists.
* @param $time
* time for starting the job. If 0, job will start as soon as possible
* @param $priority
* -10 (low priority) to +10 (high priority), 0 is the default
* @return int
* id of job
*/
function job_queue_add($function, $description, $arguments = array(), $file = '', $no_duplicate = FALSE, $time=0, $priority=0)
/**
* Supprimer une tache de la file d'attente
* @param int $id_job
* id of jonb to delete
* @return bool
*/
function job_queue_remove($id_job)
/**
* Associer une tache a un/des objets de SPIP
* @param int $id_job
* id of job to link
* @param array $objets
* can be a simple array('objet'=>'article','id_objet'=>23)
* or an array of simple array to link multiples objet in one time
*/
function job_queue_link($id_job,$objets)
dans ce cas l'autorisation cherche dans la globale table_statut la definition des statuts autorises en previsu
et adapte l'autorisation au cas demande
=> permet d'ecrire un code generique sur l'affichage d'un lien de previsu, qui est synchro avec la definition des boucles
r17112 a introduit le filtre statuts_articles_visibles pour filtrer les listes d'article en fonction du statut auteur,
mais ça doublonne fonctionnellement avec autoriser('voir','article') qui doit etre la seule reference car personalisable.
On revise donc le filtre pour lui faire tester un a un les statuts d'article existant avec la fonction autoriser qui garantit
la coherence de comportement (guy cesaro)
Je profite de cette écriture massive pour normaliser quelque chose de trompeur lorsqu'on compare deux versions, savoir l'usage de " ou ' dans le premier argument de define et defined. Comme les chaînes entre apostrophes sont plus rapidement analysées que celles entre guillemets, je choisis l'apostrophe.
Dépot obtenu avec le script Shell:
{{{
a=$(find . -name "*.php" |grep -v extensions/ | grep -v /config/ | grep -v index.php | grep -v public.php | grep -v prive.php )
echo -n "Fichiers: "
echo $a|wc -w
for i in $a
do
sed -f ~/Sites/spip/spip.sed $i > /tmp/f.php
if diff -q $i /tmp/f.php
then
:
else
diff $i /tmp/f.php
# echo $i; php /tmp/f.php
# mv /tmp/f.php $i
fi
done
}}}
et le script Sed:
{{{
s/Copyright (c) 2001-20../Copyright (c) 2001-2011/
s,\(if [(]!*\)*\(defined* *[(]\)"\([^"]*\)"\(.*\);[[:space:]]*[#/]*.*$,\1\2'\3'\4;,
}}}
et permettra aussi de gerer les liens auteur sur n'importe quel objet. On a en plus un champ vu sur la table de liaison, qui est utilise dans la messagerie.
On pourra avoir plus tard un champ role permettant de distinguer les roles des auteurs.
Ce premier commit met a jour toutes les requetes SQL, et prend en charge l'upgrade de la base.
Mais il n'est pas encore totalement fonctionnel.
debug a suivre.
Il reste le cas du formulaire de declaration d'une autre base, issu de l'installation. Mais il faudra traiter son cas specifiquement, on le laisse donc comme ca pour le moment.
http://zone.spip.org/trac/spip-zone/browser/_core_/plugins/bandeau?rev=29095
dans le core pour permettre de fixer l'ossature de la navigation et que les plugins s'y raccrochent
Integration de la skins/spip.
Les skins passent dans prive/ pour l'occasion
La navigation est definie dans prive/navigation.xml
Un champ webmestre est ajoute a la table spip_auteurs, et vaut oui ou non. Les droits de webmestre necessitent d'avoir ce champ a oui ET le statut 0minirezo, et pas de etre un admin restreint.
A l'upgrade, si _ID_WEBMESTRES est defini, les auteurs concernes sont statues webmestres, sinon seul l'auteur qui fait l'upgrade est promu webmestre.
Il est possible de se promouvoir webmestre en refaisant l'installation (suppression du fichier connect.php).
Un webmestre peut ensuite promouvoir ou degrader un autre webmestre. Un admin normal ne peut pas changer le statut d'un webmestre.
Introduction de 2 pipelines pour cela :
-* affichage_entetes_final() reçevant le tableau php d'entêtes de la page et permettant d'agir dessus.
-* configurer_liste_metas() reçevant le tableau des valeurs par défaut des metas de SPIP et permettant d'agir dessus (et servant à la sauvegarde des fichiers de configurations actuels de SPIP)
Reste à corriger :
-* le formulaire d'administration,
-* les images,
-* les chaines de langues,
-* les bugs non vus...
ce qui la rend extensible et utilisable par les plugins pour tout type d'objet
l'upgrade devrait se faire a partir de la table spip_documents_liens precedente ou des anciennes tables spip_documents_xxx selon le point de depart
il est maintenant possible de personaliser le rendu des objets par rubrique,
le formulaire de saisie des objets par rubrique
et donc les groupes de mots cles utilises par rubrique,
a l'aide de la fonction
autoriser_xxx_editermots($faire,$quoi,$id,$qui,$opts)
$opts recoit l'id_groupe du groupe de mot concerne, et les champs connus de ce groupe au moment de l'appel
par defaut la fonction ne fait que verifier la coherence du statut de l'auteur avec les droits necessaire pour ce groupe
{{{
<?php error_reporting(E_ALL); $x = "2345"; echo $x'id_document'] ?>
}}}
ne déclenche aucun avertissement et affiche tranquilement "2".
Une bardée d'indéfinis en moins, qui étaient sans grandes conséquences.
permettre a un plugin qui veut realiser une action
normalement interdite a l'utilisateur connecte
d'accorder temporairement (sur le hit ou meme moins)
une exception sans pour autant surcharger la fonction.
Utile par exemple pour creer un article et le publier avec l'api articles_set
sans pour autant bypasser les autorisations dans l'espace prive
Une exception se delivre avec la syntaxe
autoriser_exception('publierdans','rubrique',3);
et peut s'annuler aussitot l'action faite avec
autoriser_exception('publierdans','rubrique',3,false);
"
Le changement de stratégie sur la protection des documents rebondit encore.
Si un modèle a besoin d'incruster un document dont il ne connait que l'URL, le site exécutant la fonction copie_locale va échouer sur son propre appel car un serveur n'est pas son propre client. On repère donc la situation suffisamment en amont pour pouvoir faire sauter la auto-protection.
Par ailleurs, le filtre d'incrustation d'un CSV admet aussi la tabulation comme séparateur de colonne, et le {{{^M}}} comme unique séparateur de ligne (j'espère que le nombre de tableurs qui réinventent le RFC de CSV est strictement inférieur à mon nombre de collègues, je commence à en douter).
Précision sur [11111]: le raccourci pour Caption est {{{||}}} qu'il faut écrire entre triple accolade sur le Wiki de Trac.
Mais [10998] pose un autre problème: le code compilé des balises #URL_* sur base externe ne permet plus d'accéder à un document du site distant puisque ce script refuse à présent toute demande non émise par son espace privé.
Du coup, on introduit _DIR_IMG comme nouvelle meta, permettant de demander à un site distant le répertoire de ses documents. Le code compilé des balises #URL_* l'utilise pour produire la bonne URL. Evidemment si un .htaccess est présent, cette URL conduira à un 403.
A moyen terme, cette meta devrait permettre de résoudre le problème de l'accès aux vignettes et logos du site distant.
En prévision des portages utilisant cette réprésentation, l'interface s'enrichit de la fonction {{{sql_quote}}}, qui s'ajoute à celles définies dans [10707] [10667], [10433], [10131], [10146], [10154] et [10113]
{{{
quote => fonction d'abstraction de la citation d'une constante SQL
}}}
Pour MySQL et PG, cette fonction est donc équivalente à {{{_q()}}} qui reste disponible, mais doit être considérée comme obsolète. Le présent dépôt a été obtenu par le script ci-dessous, dont on peut faire usage pour ses extensions personnelles:
{{{
for i in $(grep -l '_q(' [bigpeau]*/*p)
do
sed 's/_q(/sql_quote(/g' $i > x
mv x $i
done
}}}
Un ajustement manuel a été nécessaire pour le critère "=", le compilateur testant si le code qu'il a produit contient la fonction de citation.
La Regexp précédent était trop restrictive dans sa manière d'exclure les requêtes avec GROUP BY, ORDER BY et LIMIT.
Dépot obtenu par:
{{{
for i in $(grep -l 'spip_query..SELECT.*FROM.*WHERE[^YT]*;' [a-i]*/*php)
do
# Pour la clause DISTINCT, laisser intact pour le moment.
sed 's/spip_query..SELECT *\([^D]*[^ ]\) *FROM *\(.*[^ ]\) *WHERE *\([^YT]*;\)$/sql_select("\1", "\2", "\3/;s/ "" *\.//;s/ch(sql_select\(.*\));/sel\1;/' $i > x
echo $i
mv x $i
done
}}}
et une suppressions manuelle de lourdeurs syntaxiques résultantes, et ajout d'une Include.
Pas d'intervention sur le fichier inc/meta: au test, include manquant. À controler.
Dépot obtenu par:
{{{
for i in $(grep -l 'spip_query..SELECT.*FROM.*WHERE[^A-Z]*;$' [a-i]*/*php)
do
# Pour la clause DISTINCT, laisser intact pour le moment.
sed 's/spip_query..SELECT *\([^D]*[^ ]\) *FROM *\(.*[^ ]\) *WHERE *\([^A-Z]*;\)$/sql_select("\1", "\2", "\3/;s/ "" *\.//;s/ch(sql_select\(.*\));/sel\1;/' $i > x
echo $i
mv x $i
done
#}}}
et deux suppressions manuelles de lourdeurs syntaxiques résultantes.
Pas d'intervention sur le fichier inc/meta: au test, include manquant. À controler.
- factorisation de code
- introduction d'un pipeline pour le calcul du texte
- gestion des caracteres non latins (arabe etc)
- possibilite de chiper une vieille URL d'article pour l'affecter a un autre article (ou a une rubrique, pourquoi pas)
- fonction d'autorisation specifique
- retour aux urls sans ',id' quand c'est possible
- debugs divers et varies
En conséquence, l'annonce de [9852] est modifiée: '''spip_fetch_array''' est remplacée par '''sql_fetch'''. Rien de modifié en revanche en ce qui concerne le fait que spip_fetch_array avec un deuxième argument égal à SPIP_NUM n'a pas d'équivalent et doit être réécrit si on éviter le recours à vieilles_def.php.
Dépot obtenu par le script suivant:
{{{
grep -v '// http://doc.spip.org/@spip_abstract_' base/abstract_sql.php > b
mv b base/abstract_sql.php
for i in $(grep -l "spip_abstract_" */*p|grep -v vieilles_def)
do
sed "s/spip_abstract_/sql_/g" $i > x; mv x $i
done
}}}
et intervention manuelle sur vieilles_def.php.
Ce dépot résulte donc du retrait des deux définitions de '''spip_fetch_array''' présentes dans source:spip/ecrire/base/db_mysql.php et source:spip/ecrire/base/db_pg.php (qui peuvent donc être chargés simultanément à présent si nécessaire) et de l'application du script suivant dans le répertoire '''ecrire''':
{{{
for i in $(grep -l spip_fetch_array */*p|grep -v vieilles_def)
do
sed s/spip_fetch_array/spip_abstract_fetch/g $i > x
mv x $i
done
}}}