L'ouverture des statuts de billets de la version 2.33 de Dotclear oblige a modifier les requêtes liées aux billets, en effet il faut désormais tenir compte qu'il est possible d'avoir de nouveaux statuts encore inconnues jusqu'ici. Par exemple là ou il suffisait de tester si un billet avec un statut POST_PUBLISHED pour l'afficher, maintenant un nouveau statut POST_SUBSCRIBER amené par un plugin pourrait tout à fait avoir le droit d'être également affiché. Pour faciliter cette limite entre billet autorisé et billet restreint, les groupes de status ont une limite de niveau définie à partir de laquelle un billet est considéré comme restreint, c'est la propriété threshold. Elle peut être testé avec :
if (App::status()->post()->isRestricted($rs->post_status)) { }
Mais cela est loin d'être suffisant, la version 2.33 de Dotclear ouvre également les sessions coté publique. On peut alors imaginer qu'un billet sera restreint aux lecteurs lambda du blog mais autorisé aux lecteurs enregistrés coté publique. Le billet peut alors être restreint ou non suivant sont niveau mais également suivant le niveau de l'utilisateur.
Pour faciliter la gestion de ces requêtes complexes et pourvoir d'un coup accorder à nos besoins toutes les requêtes d'une page (il y en a pour les catégories de billets, les tags de billets, etc...) un nouveau behavior fait son apparition : coreBlogBeforeGetPostsAddingParameters
. Il va permettre aux plugins d'interagir avec les requêtes de billets de manière globale. A travers ce behavior un plugin peut modifier les paramètres de requête : post_type, post_status, et comment_status. Le plugin va pouvoir ainsi ajouter son post_status à la requête si l'utilisateur est enregistré.
Le plugin d'exemple concret et simple RestrictedReading permet de comprendre la mise en œuvre de ces changements.
Voici le contenu de son fichier Prepend.php :
class Prepend extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::PREPEND));
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
// Ajout d'une nouvelle permission pour les uilisateurs
App::auth()->setPermissionType(My::USER_PERMISSION, __('Restricted reading'));
// Ajout d'un nouveau status pour les billets
if (App::status()->post()->set(
(new Status(My::POST_STATUS , My::id(), 'Restricted reading', 'Restricted reading (>1)', My::fileURL('icon.svg'))),
)) {
// Ajout du behavior de modification des requêtes de billets
App::behavior()->addBehaviors([
'coreBlogBeforeGetPostsAddingParameters' => self::coreBlogBeforeGetPostsAddingParameters(...),
]);
return true;
}
return false;
}
/**
* Utilisation du behavior pour l'ajout de l'autorisation d'afficher le billet si :
* * Le billet a le status My::POST_STATUS
* * L'utilisateur est enregistré avec la permissions My::USER_PERMISSION
*/
public static function coreBlogBeforeGetPostsAddingParameters(ArrayObject $params, string|null $arg = null): void
{
if (App::task()->checkContext('FRONTEND') && App::auth()->check(My::USER_PERMISSION, App::blog()->id()) === true) {
if (!isset($params['post_status'])) {
$params['post_status'] = [];
}
if (!is_array($params['post_status'])) {
$params['post_status'] = [$params['post_status']];
}
$params['post_status'][] = My::POST_STATUS;
}
}
Grace à ce behavior tout le contenu de la page courante tiendra compte du statut du billet et des permissions de l'utilisateur.%%
La discussion continue ailleurs
URL de rétrolien : https://dotclear.watch/trackback/65