[plugin] plxAdminBar - Barre d'admin coté public/admin responsive

SudwebdesignSudwebdesign Member
février 2019 modifié dans Plugins
Voici un plugin, a l'instar de son homologue à base de données dont il en est adapté, qui permet d'afficher une top-bar qui donne accès a une multitude de raccourcis si bien sur vous êtes connecté (cotés public & admin).
plxadminbar_profil_selector.png
Il permet à chaque utilisateur de régler lui même grâce a la [ins]gestion du profil natif de PluXml[/ins] pour choisir où il veut afficher la barre : public, admin, les deux, ou aucune part (non).

*Aux administrateurs de régler son affichage pour les utilisateurs d'un seul trait par a la page "paramètres > [ins]Comptes d'utilisateurs[/ins]".
Voir le sélecteur pour la sélection (en haut)

plxadminbar-2.0.1-480px.png
plxadminbar-1.0.0.tb.png
Zéro config* et simple a utiliser.
[h]Il est a télécharger dans cet article[/h]
*Note (v2) :: Si a la première activation, elle est absente pour tous les utilisateurs et de toutes parties du site, elle est donc a réglée, ou non ;).
Note (v2.2.0) :: la barre doit être visible dès que l'on active le plugin (la première fois). [del]Cette modif est non vérifié PLM[/del] :)
Note (v2.2.1) :: la barre est visible par défaut dès que l'on active le plugin même si aucun paramètres de profils existe :)


## v2.2.1 : 06/02/2019 : idéFiX : SESSION & beforeunload alert plxMySearch field ##
Fix marge de droite trop large de la barre d'action du téléverseur de médias
::: DIV #files_uploader : classes inline-form action-bar : manque "fullwidth" si menu caché
Fix : adminbar-search #plxMySearch est confondu avec un champ d'édition : contexte : article, statique, profil, commentaire, etc...
::: dès qu'il y a un formulaire, et que l'on recherche === alerte d'un risque de perte de données non justifié ;)
Fix : Notice: Undefined index: ajaxplxAdminBar in class.plx.motor.php(546) : eval()'d code on line 11 ::: plxMotorGetUsers()
::: Contexte : pluxml.5.2 : a la première connexion (après MAJ 2.2.0) : $_SESSION est indéfinie : hook
Fix Changelog pour la v2.1.2 non publiée


## v2.2.0 : 05/02/2019 : Auto menu ou non ##
[+] Nouveaux paramètres a la page utilisateurs : Menu caché (Dynamique, Non ou Oui) #idée peaufiné de Jerry Wham
[+] Nouveau paramètre a la page de profil : Menu caché (Dynamique, Non ou Oui) #idée de Jerry Wham
[+] Constructeur de classe remanié
Fix admin-bar.php : js + plxAdminBar_fields_is_modified() : //Unknown identifier on old browserfor (var eli)
Fix admin content padding right pluxml < 5.3.1 when closed (document.body.style.padding)


## v2.1.1 : 05/01/2019 : pleins écrans & vanilla onbeforeunload ##
[+] Admin : vanilla js (remplace jQuery) : Si changement de(s) donnée(s) lors des modifs et qu'il y a risque de perte
::: article, page statique, profil, categorie, categories, statiques, comment, comment_new
Fix Admin : PluXml.5.2 : $plxAdmin->get => $_SERVER ::: plxUtils::getGets()
Fix Admin : media manager PluXml.5.6+ : image en plein écran difficile à fermer : overlay sous la barre
::: .modal__overlay{z-index:100000 !important;}
Fix Admin : Éditeurs wysiwy(g|m) : mode plein écran


## v2.1.0 : 29/11/2018 : Voir & Alerte si changé ##
[+] Admin : Lien "Voir" (article, catégorie, page statique)
[+] Compatible avec tinyEditor, tinyMce, CkEditor, WymEditor et kzAce (Plein écran)
[+] Nouvelles icônes : Fix Caractère invisible sur mobile/Tablette (☰) : (Merci Fontello)
[+] Admin : Si changement de(s) donnée(s) lors des modifs et qu'il y a risque de perte, on avertit avant le déchargement de la page d'édition : article, catégorie, page statique
::: Compatible plxToolbar, tinyEditor et si l'éditeur de texte (WYSIWYG) utilise window.onbeforeunload


## v2.0.1 : 14/11/2018 : Recherches & Profils(s) écrivain(s) ##
[+] Dans profil.php icône plugin + Retouche de l'icône + h4 remplacés : Fix : sur pluxml-5.6 (& plucss-1.2) les textes trops larges
[+] MySearch : admin-nocache.css : Le champ de recherche est toujours là
[+] Retouches du menu responsive : admin-nocache.css largeur d'écran<=767px : Pluxml-5.4 et supérieur
Fix Frontend : admin_bar.php : Mode _password : $plxAdmin_mode (lockArticles adhésion "_password")
Fix Lien Public des profils écrivains : Si l'article lui appartient affiche "Éditer cet article". Il est autorisé a le modifier (admin)
Fix Admin maxicontact : scr:767px search input ouvert a width:100% avec : search input maxicontact overide
Fix Page statique de gutuma inclue : admin-bar.php : mauvaise racine de pluxml (../../../) dans les hrefs des liens
::: Le lien est bon pour son édition (statique) ::: Fix ds edit art stat, cat début hardcode link vers $BASE_URL
Fix Erreur de $TITLE_ONE avec $adm_or_www = $this->show=='admin';


## v2.0.0 : 11/11/2018 : Espace Paramètres utilisateur(s) ##
[+] Toggle du Menu d'admin: ☰
[+] A propos de PluXml : déplacé a droite avant le profil
[+] Menus d'admin des plugins
::: Fichier de classe plxAdmin inclu ::: funtion checkProfil() absente de plxMotor
[+] Paramètres d'affichage de la barre a chaque utilisateur (profil, user & parametres_user)
[+] Admin : Parametres des utilisateurs (parametres_users.php) : Pour la séléction + plxAdminBar (Non, Admin, Public ou Tous)
[+] Admin : L’utilisateur & les administrateurs ont la possibilité de réglé où elle s'affiche (Non, admin, public ou Tous) (user.php & profil.php)
[+] plxMySearch dans la barre (si présent et activé)
[+] js qui déplace la barre (DOM) vers Body[0] (public)
[+] La barre s'affiche du coté admin + admin-nocache.css (NOSCRIPT)
Fix (localhost/mon_pluxml/) : perte du sousdossier dans les anciens PluXml
::: Si pluxml ds sous dossier, erreur de liens (tous) ::: soluce : urlRewrite ;)
::: $BASE_URL = $plxAdmin->urlRewrite(PLX_CORE.'admin/');
[+] Compatible avec le plugin gutuma
Fix *Affiche la barre même si déconnecté ::: soluce : session saveplxAdminBar : session racineplxAdminBar = plx->conf racine + $this->show ;)
[+] *Hook Index : Active l'affichage si l'utilisateur est connecté et est sur le bon site (même racine)
[+] *Hook AdminAuthPrepend : Nouvelle variable de session : Pour être sur qu'il s'agit du bon site grâce a sa "racine" (MULTIPLE PLUXML IN SAME HOST)
[+] *Fonctions de mise a jour et de (dés)activation : Paramétrages de la nouvelle variable de session
::: *Si Plusieurs PluXml dans le même serveur et sont dans des sous dossier(localhost/plux1, localhost/plux2) et que l'on est connecté a l'un d'eux, il est probable qu'elle s'affiche sur les autres, c'est dû a la variable de session. Par contre dès que l'on clique sur un lien admin, on est bien redirigé vers auth.php, Merci PluXml.


## v1.0.0 : 28/09/2018 ##
[+] Constantes de langue admin chargées et utilisées afin de rester au plus prêts des textes officiel de Pluxml ou de votre trad ;-)
[+] Impression géré (barre & menu du site cachés au Ctrl+p)
[+] Juste avec 2 fichiers de style et 2 hook
[+] Compatible plxMyMultilingue version 0.8.1 (10/04/2017)

Notre temps est la seule monnaie vraie ;)

Site, Dépôt, framagit, MyShop, Factux

#mozinor président

Réponses

  • Trop mignon ce plugin.

    Et il fonctionne parfaitement tout en étant fort pratique. :)
  • Slt @tou(te)s, le plugin est passé en 2.0.0 et s'affiche (au choix) aussi coté admin.

    Journal:
    ## v2.0.0 : 11/11/2018 : Espace Paramètres utilisateur(s) ##
    [+] Toggle du Menu d'admin: ☰
    [+] A propos de PluXml : déplacé a droite avant le profil
    [+] Menus d'admin des plugins
    ::: Fichier de classe plxAdmin inclu ::: funtion checkProfil() absente de plxMotor
    [+] Paramètres d'affichage de la barre a chaque utilisateur (profil, user & parametres_user)
    [+] Admin : Parametres des utilisateurs (parametres_users.php) : Pour la séléction + plxAdminBar (Non, Admin, Public ou Tous)
    [+] Admin : L’utilisateur & les administrateurs ont la possibilité de réglé où elle s'affiche (Non, admin, public ou Tous) (user.php & profil.php)
    [+] plxMySearch dans la barre (si présent et activé)
    [+] js qui déplace la barre (DOM) vers Body[0] (public)
    [+] La barre s'affiche du coté admin + admin-nocache.css (NOSCRIPT)
    Fix (localhost/mon_pluxml/) : perte du sousdossier dans les anciens PluXml
    ::: Si pluxml ds sous dossier, erreur de liens (tous) ::: soluce : urlRewrite ;)
    ::: $BASE_URL = $plxAdmin->urlRewrite(PLX_CORE.'admin/');
    [+] Compatible avec le plugin gutuma
    Fix *Affiche la barre même si déconnecté ::: soluce : session saveplxAdminBar : session racineplxAdminBar = plx->conf racine + $this->show ;)
    [+] *Hook Index : Active l'affichage si l'utilisateur est connecté et est sur le bon site (même racine)
    [+] *Hook AdminAuthPrepend : Nouvelle variable de session : Pour être sur qu'il s'agit du bon site grâce a sa "racine" (MULTIPLE PLUXML IN SAME HOST)
    [+] *Fonctions de mise a jour et de (dés)activation : Paramétrages de la nouvelle variable de session
    ::: *Si Plusieurs PluXml dans le même serveur et sont dans des sous dossier(localhost/plux1, localhost/plux2) et que l'on est connecté a l'un d'eux, il est probable qu'elle s'affiche sur les autres, c'est dû a la variable de session. Par contre dès que l'on clique sur un lien admin, on est bien redirigé vers auth.php, Merci PluXml.

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • Salut,

    Beau travail, bravo ! :)

    Petite(s) tracasserie(s) visuelle(s) :

    - l'icône pour la recherche est encadrée d'une bordure disgracieuse en mode frontend alors qu'elle apparaît sans bordure (plus esthétique) en mode admin ;
    - les icônes en mode petit écran sont très volumineuses (et la recherche n'est plus présente) ;
    - le titre et le select ont une police énorme (pour choisir l'emplacement de la barre en page admin : les h4 sont inutiles et non sémantiques, à remplacer par rien, le select se suffit à lui-même).


    à plus,

    Gzyg
  • Hello Sudwebdesign. Toujours mieux ? ;)

    Petite réflexion.

    Tu devrais afficher plus clairement que l'admin du plugin se passe dans le profil utilisateur car, si on ne regarde pas attentivement ton article sur ton site dans sa présentation, on passe une heure à comprendre comment ça marche.
  • SudwebdesignSudwebdesign Member
    novembre 2018 modifié
    Merci de vos retours :)
    Gzyg a écrit:
    Petite(s) tracasserie(s) visuelle(s) :

    - l'icône pour la recherche est encadrée d'une bordure disgracieuse en mode frontend alors qu'elle apparaît sans bordure (plus esthétique) en mode admin ;
    j'ai testé avec les thèmes par défaut (5.2 à 5.6) et n'est rien vu de tel, il doit y avoir une règle css du thème ou autre qui lui fait faire ça :/
    Gzyg a écrit:
    - les icônes en mode petit écran sont très volumineuses (et la recherche n'est plus présente) ;
    En mode en dessous 767px de large, oui les icônes sont plus grandes, c'est fait pour les gros doigts sur un tél ou tablettes ;) et l’icône de recherche est présente ds la v2.0.1 :)
    Gzyg a écrit:
    - le titre et le select ont une police énorme (pour choisir l'emplacement de la barre en page admin : les h4 sont inutiles et non sémantiques, à remplacer par rien, le select se suffit à lui-même).
    Je voulais que cela soit visible, apparemment c'était le cas mais trop grand, c'est réglé ;)
    jack31 a écrit:
    Tu devrais afficher plus clairement que l'admin du plugin se passe dans le profil utilisateur car, si on ne regarde pas attentivement ton article sur ton site dans sa présentation, on passe une heure à comprendre comment ça marche.
    C'est fait (#1) , enfin j'espère ;)

    D’ailleurs voici une MAJ v2.0.1 :

    ## v2.0.1 : 14/11/2018 : Recherches & Profils(s) écrivain(s) ##
    [+] Dans profil.php icône plugin + Retouche de l'icône + h4 remplacés : Fix : sur pluxml-5.6 (& plucss-1.2) les textes trops larges
    [+] MySearch : admin-nocache.css : Le champ de recherche est toujours là
    [+] Retouches du menu responsive : admin-nocache.css largeur d'écran<=767px : Pluxml-5.4 et supérieur
    Fix Frontend : admin_bar.php : Mode _password : $plxAdmin_mode (lockArticles adhésion "_password")
    Fix Lien Public des profils écrivains : Si l'article lui appartient affiche "Éditer cet article". Il est autorisé a le modifier (admin)
    Fix Admin maxicontact : scr:767px search input ouvert a width:100% avec : search input maxicontact overide
    Fix Page statique de gutuma inclue : admin-bar.php : mauvaise racine de pluxml (../../../) dans les hrefs des liens
    ::: Le lien est bon pour son édition (statique) ::: Fix ds edit art stat, cat début hardcode link vers $BASE_URL
    Fix Erreur de $TITLE_ONE avec $adm_or_www = $this->show=='admin';

    Belle MAJ & @ plus

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • Slt @tou(te)s, le plugin est passé en 2.1.0
    Affiche coté admin (article, catégorie ou statique) un nouveau lien (voir) et si édité une alerte.

    ## v2.1.0 : 29/11/2018 : Voir & Alerte si changé ##
    [+] Admin : Lien "Voir" (article, catégorie, page statique)
    [+] Compatible avec tinyEditor, tinyMce, CkEditor, WymEditor et kzAce (Plein écran)
    [+] Nouvelles icônes : Fix Caractère invisible sur mobile/Tablette (☰) : (Merci Fontello)
    [+] Admin : Si changement de(s) donnée(s) lors des modifs et qu'il y a risque de perte, on avertit avant le déchargement de la page d'édition : article, catégorie, page statique
    ::: Compatible plxToolbar, tinyEditor et si l'éditeur de texte (WYSIWYG) utilise window.onbeforeunload

    Belle MAJ & @ plus

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • Cela marche. Bravo ! :)
  • jack31 a écrit:
    Cela marche. Bravo ! :)
    Super merci :)

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • @ Sudwebdesign

    Holà amigo,

    Il se trouve que CKEditor 4 PHP #sudwebdesign - Version 4.11.1_PHP (30/11/2018) que j'ai téléchargé il y a quelques temps je ne sais plus où me cause des problèmes.

    Le principal est qu'il perturbe le gestionnaire de médias au point que ce dernier ne veut pas ajouter un fichier.

    Quoi tesse ou se pourrait-il qu'il veut pas ?


    PluXml version 5.7 (encodage UTF-8)
    Version de PHP : 5.6.39
  • jack31 a écrit:
    Il se trouve que CKEditor 4 PHP #sudwebdesign - Version 4.11.1_PHP (30/11/2018) que j'ai téléchargé il y a quelques temps je ne sais plus où me cause des problèmes.

    Heu... Résolu. Je n'a vais pas vu le post https://forum.pluxml.org/viewtopic.php?pid=58180#p58180

    Désolé. :8
  • Slt @tou(te)s, le plugin est passé en 2.1.1 ;)

    Journal:
    ## v2.1.1 : 05/01/2019 : pleins écrans & vanilla onbeforeunload ##
    [+] Admin : vanilla js (remplace jQuery) : Si changement de(s) donnée(s) lors des modifs et qu'il y a risque de perte
    ::: article, page statique, profil, categorie, categories, statiques, comment, comment_new
    Fix Admin : PluXml.5.2 : $plxAdmin->get => $_SERVER ::: plxUtils::getGets()
    Fix Admin : media manager PluXml.5.6+ : image en plein écran difficile à fermer : overlay sous la barre
    ::: .modal__overlay{z-index:100000 !important;}
    Fix Admin : Éditeurs wysiwy(g|m) : mode plein écran

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • Sudwebdesign a écrit:
    Slt @tou(te)s, le plugin est passé en 2.1.1

    On va tester. :)
  • 2.1.1 fonctionne parfaitement du moins jusqu'à maintenant.

    Suggestion :


    A l'affichage des plugins à télécharger sur ton site (ex: http://sudwebdesign.free.fr/index.php?article6/plxadminbar), ne pourrais-tu pas inverser l'ordre d'affichage pour avoir le plus récent en premier ?
  • jack31 a écrit:
    2.1.1 fonctionne parfaitement du moins jusqu'à maintenant.

    Suggestion :


    A l'affichage des plugins à télécharger sur ton site (ex: http://sudwebdesign.free.fr/index.php?article6/plxadminbar), ne pourrais-tu pas inverser l'ordre d'affichage pour avoir le plus récent en premier ?

    Merci du retour et de l'idée :)

    Inverser un tableau par JavaScript.
    [== JavaScript ==]
    var table = document.getElementById('plugin_table'),
     rows = table.rows;
    for (var i = 0; i < rows.length; i++) {
     rows[i].parentNode.insertBefore(rows[rows.length-1], rows[i]);
    }
    
    Source originelle

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • jack31jack31 Member
    janvier 2019 modifié
    Vėry quik and vėry good. :)
  • jack31 a écrit:
    Hello Sudwebdesign. Toujours mieux ? ;)

    Petite réflexion.

    Tu devrais afficher plus clairement que l'admin du plugin se passe dans le profil utilisateur car, si on ne regarde pas attentivement ton article sur ton site dans sa présentation, on passe une heure à comprendre comment ça marche.

    J'étais à deux doigts de dire que le plugin ne fonctionnait pas et puis, je suis allé dans mon profil sur PluXml et là, j'ai vu le menu déroulant d'affichage de la barre d'options.

    Je pense qu'il faut mettre cette subtilité plus en avant, voir même de créer un petit fichier d'aide pour l'expliquer. Ça ne mange pas de pain.

    Sinon, le plugin marche nickel !
  • L'option menu, qui permet de masquer le menu de l'administration est géniale car cela permet d'avoir la page complète d'affichée. Niveau confort, c'est top.
  • Et on ne parle pas de l'accés direct à l'édition des fichier du thème super pratique quand on veut bidouiller un peu.

    FTP devient un grand-père. Lol !
  • SudwebdesignSudwebdesign Member
    janvier 2019 modifié
    Jerry Wham a écrit:
    Je pense qu'il faut mettre cette subtilité plus en avant, voir même de créer un petit fichier d'aide pour l'expliquer.
    Premier post MAJ et article du site peaufinés, c'est bien mieux expliqué j’espère :)
    [édit] chouette qu'il vous soit utile :)

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • J'avoue que c'est THE plugin qu'il faut avoir ! Devrait être même intégré par défaut à Pluxml ;)
  • Je propose une mise à jour afin que chaque utilisateur puisse enregistrer dans ses préférences le choix de masquer l'affichage ou non du menu originel de PluXml. Pour cela, il faut remplacer le code du fichier plxAdminBar.php avec le code suivant :
    [== PHP ==]
    <?php if (!defined('PLX_ROOT')) exit;
    /**
     * Plugin plxAdminBar
     * @author Thomas Ingles
     * Thx FONTELLO
     **/
    class plxAdminBar extends plxPlugin{
     public function __construct($default_lang){
      $this->default_lang = ( isset($_SESSION['admin_lang'])?$_SESSION['admin_lang'] : (isset($_SESSION['lang'])?$_SESSION['lang']:$default_lang) );//$_SESSION['admin_lang']:plx>=5.6
      $this->BASE_URL = '';//Gutuma fix (see admin-bar.php)
      parent::__construct($this->default_lang);# appel du constructeur de la classe plxPlugin (obligatoire) [avec la langue utilisateur]
      $this->href_plugin = (defined('PLX_GROOT') ? str_replace(PLX_ROOT,PLX_GROOT,PLX_PLUGINS) : PLX_PLUGINS).__CLASS__;//PLX_GROOT est pour le plugin gutuma
      $this->show = FALSE;
      if(!defined('PLX_ADMIN')){//Déclaration des hooks pour la partie visiteur
       if(isset($_SESSION['profil'])){
        $this->show = 'public';
        $this->addHook('Index', 'Index');// 2.0.0 active si bon site et utilisateur parm + connecté
        $this->addHook('ThemeEndHead', 'ThemeEndHead');
        $this->addHook('ThemeEndBody', 'ThemeEndBody');
       }
      }else{//admin only
       $this->addHook('AdminAuthPrepend', 'AdminAuthPrepend');// 2.0.0 AdminAuthPrepend Only if logon attempt
    //show in admin
       if(isset($_SESSION['profil'])){
        $this->show = 'admin';
        $this->addHook('AdminTopEndHead', 'ThemeEndHead');// 2.0.0
        $this->addHook('AdminFootEndBody', 'ThemeEndBody');// 2.0.0
    //Profil params
        $this->addHook('AdminPrepend', 'AdminPrepend');// 2.0.0
        $this->addHook('plxAdminEditProfil', 'plxAdminEditProfil');// 2.0.0
        $this->addHook('plxAdminEditUsersXml', 'plxAdminEditUsersXml');// 2.0.0
        $this->addHook('plxAdminEditUsersUpdate', 'plxAdminEditUsersUpdate');// 2.0.0
        $this->addHook('plxAdminEditUser', 'plxAdminEditUser');// 2.0.0
        $this->addHook('plxMotorGetUsers', 'plxMotorGetUsers');// 2.0.0
        $this->addHook('AdminProfilPrepend', 'AdminProfilPrepend');// 2.0.0
        $this->addHook('AdminProfil', 'AdminProfil');// 2.0.0
        $this->addHook('AdminUser', 'AdminProfil');// 2.0.0
        $this->addHook('AdminUsersFoot', 'AdminUsersFoot');// 2.0.0 (compatible 5.2 & 5.3)
       }
      }
     }
     public function AdminPrepend(){#V 2.0.0 Méthode appelée quand on du coté admin (affichage (admin) + MAJ parametres_users.php
      echo '<?php ';?>
      # parametres_users.php, update in mass : plxAdminBar, AdminPrepend
    //fix changement de dossier media (plx 5.2) :: $_POST['selection'] is array
      if(isset($_POST['idUser']) AND isset($_POST['selection']) AND (strpos($_POST['selection'],'<?php echo __CLASS__ ?>') ==! FALSE)){
       $_POST['update'] = TRUE;
       $ab_mode = explode('_',$_POST['selection']);
       $ab_mode = $ab_mode[2];# adminBar mode selected : edit_users selector (parametres_users.php)
       foreach($_POST['idUser'] as $user_id){
        $plxAdmin->aUsers[$user_id]['<?php echo __CLASS__ ?>'] = $ab_mode;# For update user
        $plxAdmin->aUsers[$user_id]['ajax<?php echo __CLASS__ ?>'] = plxUtils::cdataCheck($_POST['ajax<?php echo __CLASS__ ?>']);
       }
       # Chargement des fichiers de langue en fonction du profil de l'utilisateur connecté : *sont chargées après le hook ;)
       loadLang(PLX_CORE.'lang/'.$lang.'/admin.php');
       loadLang(PLX_CORE.'lang/'.$lang.'/core.php');
    
       $plxAdmin->editUsers($_POST);# *NEED : L_SAVE_SUCCESSFUL
       header('Location: parametres_users.php');
       exit;
      }
      #verif et affichage de la barre
      if(isset($plxAdmin->aUsers[$_SESSION['user']]) AND isset($plxAdmin->aUsers[$_SESSION['user']]['<?php echo __CLASS__ ?>'])){
       $_SESSION['<?php echo __CLASS__ ?>'] = $plxAdmin->aUsers[$_SESSION['user']]['<?php echo __CLASS__ ?>'];//parm profil adminBar
       $_SESSION['ajax<?php echo __CLASS__ ?>'] = $plxAdmin->aUsers[$_SESSION['user']]['ajax<?php echo __CLASS__ ?>'];//parm profil adminBar
      }
    ?><?php
     }
     public function AdminUsersFoot(){#V 2.0.0 Méthode appelée quand on édite les utilisateurs du coté admin (parametres_users.php) : options au selecteur par js
      $arr = array('all'=>L_YES .' ('.L_ALL.')','admin'=>ltrim(L_ADMIN,'- '),'public'=>L_COMMENT_SITE_FIELD,'no'=>L_NO);
    ?>
    <script type="text/javascript">
    var arr = [];
    <?php foreach($arr as $val => $txt)://all,admin,public,no ?>
    arr.push(['<?php echo $val ?>','<?php echo $txt?>']);
    <?php endforeach; ?>
    var sel = document.getElementById('id_selection');//select
    for (var i = 0; i < arr.length; i++) {
    	var opt = document.createElement('option');
    	opt.value = '_<?php echo __CLASS__ ?>_' + arr[i][0];
    	opt.innerHTML = '<?php echo ucfirst(__CLASS__)?> &gt; ' + arr[i][1];
    	//sel.insertBefore(opt, sel.childNodes[0]);//reverse & In 1st pos
    	sel.appendChild(opt);
    }
    </script>
    <?php
     }
     public function plxAdminEditProfil(){#V 2.0.0 Méthode appelée quand on édite son profil du coté admin
      echo '<?php ';?>
      $this->aUsers[$_SESSION['user']]['<?php echo __CLASS__ ?>'] = $content['<?php echo __CLASS__ ?>'];
      $this->aUsers[$_SESSION['user']]['ajax<?php echo __CLASS__ ?>'] = $content['ajax<?php echo __CLASS__ ?>'];
    ?><?php
     }
     public function plxAdminEditUsersXml(){#V 2.0.0 Méthode appelée quand on du coté admin
      echo '<?php ';?>
      $xml .= "\t\t".'<<?php echo __CLASS__ ?>><![CDATA['.plxUtils::cdataCheck($user['<?php echo __CLASS__ ?>']).']]></<?php echo __CLASS__ ?>>'."\n";
      $xml .= "\t\t".'<ajax<?php echo __CLASS__ ?>><![CDATA['.plxUtils::cdataCheck($user['ajax<?php echo __CLASS__ ?>']).']]></ajax<?php echo __CLASS__ ?>>'."\n";
    ?><?php
     }
     public function plxAdminEditUsersUpdate(){#V 2.0.0 Méthode appelée quand on sauve les utilisateurs : coté admin
      echo '<?php ';?>
      # user(s) / profil basic
      $this->aUsers[$user_id]['<?php echo __CLASS__ ?>'] = (isset($this->aUsers[$user_id]['<?php echo __CLASS__ ?>']) ? $this->aUsers[$user_id]['<?php echo __CLASS__ ?>'] : 'all');
      $this->aUsers[$user_id]['ajax<?php echo __CLASS__ ?>'] = (isset($this->aUsers[$user_id]['ajax<?php echo __CLASS__ ?>']) ? $this->aUsers[$user_id]['ajax<?php echo __CLASS__ ?>'] : null);
    ?><?php
     }
     public function plxAdminEditUser(){#V 2.0.0 Méthode appelée quand on édite un utilisateur : coté admin
      echo '<?php ';?>
      $this->aUsers[$content['id']]['<?php echo __CLASS__ ?>'] = 'no';
      $this->aUsers[$content['id']]['ajax<?php echo __CLASS__ ?>'] = null;
      if($this->aUsers[$content['id']]['active']){
       $this->aUsers[$content['id']]['<?php echo __CLASS__ ?>'] = isset($content['<?php echo __CLASS__ ?>'])?$content['<?php echo __CLASS__ ?>']:'all';
       $this->aUsers[$content['id']]['ajax<?php echo __CLASS__ ?>'] = isset($content['ajax<?php echo __CLASS__ ?>'])?$content['ajax<?php echo __CLASS__ ?>'] : null;
       if($content['id'] == $_SESSION['user'])
        $_SESSION['<?php echo __CLASS__ ?>'] = $this->aUsers[$content['id']]['<?php echo __CLASS__ ?>'];
        $_SESSION['ajax<?php echo __CLASS__ ?>'] = $this->aUsers[$content['id']]['ajax<?php echo __CLASS__ ?>'];
      }
    ?><?php
     }
     public function plxMotorGetUsers(){#V 2.0.0 Méthode appelée quand on du coté admin
      echo '<?php ';?>
      $this->aUsers[$number]['<?php echo __CLASS__ ?>']='no';//all,public,admin
      $this->aUsers[$number]['ajax<?php echo __CLASS__ ?>']=null;//all,public,admin
      if($this->aUsers[$number]['active'] AND isset($iTags['<?php echo __CLASS__ ?>'][$i])){
       $this->aUsers[$number]['<?php echo __CLASS__ ?>'] = plxUtils::getValue($values[$iTags['<?php echo __CLASS__ ?>'][$i]]['value']);
       if($number == $_SESSION['user'])
        $_SESSION['<?php echo __CLASS__ ?>'] = $this->aUsers[$number]['<?php echo __CLASS__ ?>'];
      }
      if($this->aUsers[$number]['active'] AND isset($iTags['ajax<?php echo __CLASS__ ?>'][$i])){
       $this->aUsers[$number]['ajax<?php echo __CLASS__ ?>'] = plxUtils::getValue($values[$iTags['ajax<?php echo __CLASS__ ?>'][$i]]['value']);
       if($number == $_SESSION['user'])
        $_SESSION['ajax<?php echo __CLASS__ ?>'] = $this->aUsers[$number]['ajax<?php echo __CLASS__ ?>'];
      }
    ?><?php
     }
     public function AdminAuthPrepend(){#V 2.0.0 Pour être sur qu'il s'agit du bon site (MULTIPLE PLUXML IN SAME HOST) * @author Thomas Ingles
      echo '<?php '; ?>
      if(!empty($_POST)){//On login attempt only ::: $_POST['login'] $_POST['password']
       $_SESSION['racine<?php echo __CLASS__?>'] = $plxAdmin->aConf['racine'];//clef
      }
     ?><?php
     }
     public function AdminProfilPrepend(){#V 2.0.0 Méthode appelée quand on édite le profil coté admin et ajax (session menu toggler)
      echo '<?php ';?>
      if(isset($_GET['ajax<?php echo __CLASS__ ?>'])){//Ajax PHP, JS ou ...
       header('Pragma: no-cache');
       header('Content-Type: application/javascript');
       $_SESSION['ajax<?php echo __CLASS__ ?>'] = $_GET['ajax<?php echo __CLASS__ ?>'];//adapde le toggler (menu ouvert ou fermé)
       # echo 'console.log("Log AdminProfilPrepend : Session ajax<?php echo __CLASS__.time() ?> : '.$_SESSION['ajax<?php echo __CLASS__ ?>'].'");';
       exit();
      }
      if(isset($_POST['<?php echo __CLASS__ ?>']))
       $_profil['<?php echo __CLASS__ ?>'] = $_POST['<?php echo __CLASS__ ?>'];
      if(isset($_POST['ajax<?php echo __CLASS__ ?>']))
       $_profil['ajax<?php echo __CLASS__ ?>'] = $_POST['ajax<?php echo __CLASS__ ?>'];
    ?><?php
     }
     public function AdminProfil(){#V 2.0.0 Hook pour profil.php et user.php + AdminUser
    ?><img style="vertical-align:bottom" src="<?php echo $this->href_plugin ?>/icon.png">
    	<fieldset class="withlabel">
    		<div class="grid">
    			<div class="field col sml-12"><label for="id_<?php echo __CLASS__ ?>"><?php echo ucfirst(__CLASS__) ?>&nbsp;:</label>
    			
    <?php
      echo '<?php ';?>
      $plxabVal = (isset($id) ? $plxAdmin->aUsers[$id]['<?php echo __CLASS__ ?>'] : $_profil['<?php echo __CLASS__ ?>']);
      $plxajaxVal = (isset($id) ? $plxAdmin->aUsers[$id]['ajax<?php echo __CLASS__ ?>'] : $_profil['ajax<?php echo __CLASS__ ?>']);
      plxUtils::printSelect('<?php echo __CLASS__ ?>', array('all'=>L_YES.' ('.L_ALL.')','admin'=>ltrim(L_ADMIN,'- '),'public'=>L_COMMENT_SITE_FIELD,'no'=>L_NO),$plxabVal);
    ?>
            <br/>
            <label for="id_ajax<?php echo __CLASS__ ?>"><?php echo '<?php ';?>$plxAdmin->plxPlugins->aPlugins['<?php echo __CLASS__ ?>']->lang('L_HIDE_MENU')<?php echo '?>';?>&nbsp;:</label>
     <?php echo '<?php ';?>
            plxUtils::printSelect('ajax<?php echo __CLASS__ ?>', array('close'=> L_YES,null => L_NO),$plxajaxVal);
      ?>
    			</div>
    		</div>
    	</fieldset>
    <?php
     }
     public function adminCss(){#V 2.0.0 Méthode appelée du coté admin
    ?>
    	<link id="plxadminbar-nocache-css" defer rel="stylesheet" type="text/css" href="<?php echo $this->href_plugin ?>/css/admin-nocache.css?v=211" media="screen" />
    <?php
     }
     public function adminJs($plxAdmin){#V 2.0.0 Méthode qui affiche le javascript pour déplacer la bare en premiere pos <body[0]> coté admin
    ?>
    	<script type="text/javascript">
    	if(window.name == '<?php echo L_MEDIAS_TITLE ?>'){//if is media manager popup
    		document.getElementById('plxadminbar').style.display = 'none';//hide bar
    		new Array('-nocache','-icon','').forEach(function(e){//plxadminbar links
    			var ab_css = document.getElementById('plxadminbar'+e+'-css');//link id
    			ab_css.parentNode.removeChild(ab_css);//remove
    		});
    	}
    	function toggleMenu_ab(){//toggle admin pluxml main menu (aside)
    		var toog = document.getElementById('plx-admin-bar-toggle-menu');
    		var open = (toog.className.search("close") != -1);
    <?php if(isset($plxAdmin->version) && $plxAdmin->version != '5.4'){//plx5.3.1 et en dessous ?>
    		var menu = document.getElementById('sidebar');
    		menu.style.display = menu.style.display=="none"?"block":"none";
    		document.body.style = menu.style.display=="none"?"padding:0;":"";
    		document.getElementById('content').style.padding = menu.style.display=="none"?"0":"0";
    <?php }else{ ?>
    		var menu = document.getElementsByClassName('aside');
    		var plug = document.getElementsByTagName('section');
    		var abar = document.getElementsByClassName('action-bar');
    		var inav = document.getElementById('nav');//checkbox menu
    		inav.checked = !open?false:true;
    		abar[0].classList.toggle("fullwidth");
    		plug[0].className = open?"section col sml-12 med-9 med-offset-3 lrg-10 lrg-offset-2":"section col sml-12 offsetfix plx-<?php echo str_replace('.','',$plxAdmin->aConf['version']) ?>";
    		menu[0].style.display = open?"block":"none";
    <?php } ?>
    		toog.classList.toggle("close");
    		var ajax_ab = document.createElement('SCRIPT');
    		ajax_ab.id='plx-admin-bar-profil-ajax';
    		document.body.appendChild(ajax_ab);
    		ajax_ab.src='<?php echo $this->BASE_URL ?>profil.php?ajax<?php echo __CLASS__ ?>='+(open?'open':'close');//+'&d='+ new Date().getTime();//.getMilliseconds()
    		window.setTimeout(function(){ajax_ab.parentNode.removeChild(ajax_ab)},111);
    	}
    <?php echo (@$_SESSION['ajax'.__CLASS__ ] == 'close' ? 'toggleMenu_ab();' : '');//autoclose ?>
    	function <?php echo __CLASS__ ?>Init(){//init (new is's aside menu)
    		var unem = document.getElementById('plx-admin-bar-site-name');
    		var menu = unem.getElementsByTagName('LI');
    		for(var m=0;m < menu.length-1;m++){
    			var plg_mnu = (menu[m].id.search(/mnu_/)!==-1);
    			if(plg_mnu) menu[m].id = '<?php echo __CLASS__ ?>_'+menu[m].id;//new mnu_ plugins menu id's
    		}
    	}
    	<?php echo __CLASS__ ?>Init();
    	</script>
    <?php
      //$this->publicJs();
     }
     public function publicJs(){#V 2.0.0 Méthode qui affiche le javascript pour déplacer la bare en premiere pos <body[0]> coté public
    ?>
    	<script type="text/javascript">
    		var plxadminbar = document.getElementById('plxadminbar');
    		document.body.id = !document.body.id ? 'indexadminbar': document.body.id;
    		var b = document.getElementById(document.body.id);
    		b.insertBefore(plxadminbar, b.childNodes[0]);  // Insert <div#plxadminbar> before the first child of <body>
    	</script>
    <?php
     }
     public function searchForm($mode='public',$plxMotor){#V 2.0.0 + Moteur De Recherche plxMySearch
      $plxPluginName = 'plxMySearch';
      ${$plxPluginName} = @$plxMotor->plxPlugins->aPlugins[$plxPluginName];
      if(${$plxPluginName}){
       $var = array();
       $var['mnuName'] =  ${$plxPluginName}->getParam('mnuName_'.$this->default_lang);
       $var['placeholder'] = ${$plxPluginName}->getParam('placeholder_'.$this->default_lang);
       $var['frmLibButton'] =  ${$plxPluginName}->getParam('frmLibButton_'.$this->default_lang);
       $var['checkboxes'] = ${$plxPluginName}->getParam('checkboxes_'.$this->default_lang);
       # initialisation des variables communes à chaque langue
       $var['url'] = $plxMotor->urlRewrite('?'.${$plxPluginName}->lang.${$plxPluginName}->getParam('url'));
       $var['method'] =  ${$plxPluginName}->getParam('method');
    // <!-- MySearch Form -->
    ?>
            <form action="<?php echo $var['url']?>" id="adminbarsearch" method="<?php echo $var['method']?>" name="<?php echo $var['mnuName']?>">
              <input class="adminbar-input" id="adminbar-search" maxlength="150" name="searchfield" type="text" value="<?php echo @$_REQUEST['searchfield'] ?>" placeholder="<?php echo $var['placeholder']?>"/><label class="screen-reader-text" for="adminbar-search"><?php echo $var['frmLibButton']?></label>
              <input class="adminbar-button" type="submit" value="<?php echo $var['frmLibButton']?>" />&nbsp;
            </form>
    <?php
      }
     }
     public function OnActivate(){#V 2.0.0 Méthode appelée quand on active le plugin
      $plxMotor = plxMotor::getInstance();
      $_SESSION['racine'.__CLASS__] = $plxMotor->aConf['racine'];//clef
     }
     public function OnDeactivate(){#V 2.0.0 Méthode appelée quand on desactive le plugin
      unset($_SESSION['racine'.__CLASS__]);//clef supprimée
     }
     public function OnUpdate(){#V 2.0.0 Méthode appelée quand on update le plugin (si fichier update présent a la racine du plugin)
      $plxMotor = plxMotor::getInstance();
      $_SESSION['racine'.__CLASS__] = $plxMotor->aConf['racine'];//clef
     }
     public function Index(){//V 2.0.0 Pour être sur qu'il s'agit du bon site (MULTIPLE PLUXML IN SAME HOST) * @author Thomas Ingles
      if(!isset($_SESSION[__CLASS__]) OR ($_SESSION[__CLASS__] != 'admin' OR $_SESSION[__CLASS__] != 'no')){
       echo '<?php '; ?>
       if(isset($_SESSION['profil']) AND ($plxMotor->aConf['racine'] == $_SESSION['racine<?php echo __CLASS__ ?>'])){//clef
        if(isset($_SESSION['save<?php echo __CLASS__ ?>'])){
         $_SESSION['<?php echo __CLASS__ ?>'] = $_SESSION['save<?php echo __CLASS__ ?>'];//$plxMotor->aUsers[$_SESSION['user']]['<?php echo __CLASS__ ?>'];
        }
       }
       else{//autres pluxmls on same host
        $_SESSION['save<?php echo __CLASS__ ?>'] = $_SESSION['<?php echo __CLASS__ ?>'];
        $_SESSION['<?php echo __CLASS__ ?>'] = 'no';
       }
    ?><?php
      }
     }
     public function ThemeEndHead(){//var_dump(__CLASS__.'->'.__FUNCTION__,$this->show);
      if(!isset($_SESSION[__CLASS__]) OR $_SESSION[__CLASS__]=='no') return;// if(!$this->show) return;
      if($this->show=='public' AND $_SESSION[__CLASS__]=='admin') return;//V 2.0.0 admin-nocache.css (retouches les tops)
      if($this->show=='admin' AND $_SESSION[__CLASS__]=='public') return;//V 2.0.0 admin-nocache.css (retouches les tops)
    ?>
    <link id="plxadminbar-icon-css" defer rel="stylesheet" type="text/css" href="<?php echo $this->href_plugin ?>/css/dashicons.css?v=211" media="screen" />
    <link id="plxadminbar-css" defer rel="stylesheet" type="text/css" href="<?php echo $this->href_plugin ?>/css/admin-bar.css?v=211" media="screen,print" />
    <?php
      if($this->show=='admin') $this->adminCss();//V 2.0.0 admin-nocache.css (retouches les tops)
     }
     public function ThemeEndBody(){
      if(!isset($_SESSION[__CLASS__]) OR $_SESSION[__CLASS__]=='no') return;//if(!$this->show) return;
      if($this->show=='public' AND $_SESSION[__CLASS__]=='admin') return;//V 2.0.0 admin-nocache.css (retouches les tops)
      if($this->show=='admin' AND $_SESSION[__CLASS__]=='public') return;//V 2.0.0 admin-nocache.css (retouches les tops)
    ?>
    <script type="text/javascript" id="plxAdminBar" src="<?php echo $this->href_plugin ?>/js/plxAdminBar.js?v=210"></script>
    <?php
      $plxAdmin = plxMotor::getInstance();
      loadLang(PLX_CORE.'lang/'.$this->default_lang .'/admin.php');
      include_once('admin-bar.php');
      if($this->show=='admin')//defined('PLX_ADMIN'))
       $this->adminJs($plxAdmin);//V2.0.0 : [Admin] toggle menu (js)
      else
       $this->publicJs();//V2.0.0 : [Public] on la deplace au début de body (js)
     }
    }
    
    

    Cela affiche une liste déroulante supplémentaire dans la page de profil. Une fois le choix effectué, à chaque reconnexion, le menu est masqué (ou affiché) en fonction du choix précédemment enregistré.
  • Slt @tou(te)s, le plugin est passé en 2.2.0 ;)

    Belle idée et merci @ Jerry Wham ;)

    Journal:

    ## v2.2.0 : 05/02/2019 : Auto menu ou non ##
    [+] Nouveaux paramètres a la page utilisateurs : Menu caché (Dynamique, Non ou Oui) #idée peaufiné de Jerry Wham
    [+] Nouveau paramètre a la page de profil : Menu caché (Dynamique, Non ou Oui) #idée de Jerry Wham
    [+] Constructeur de classe remanié
    Fix admin-bar.php : js + plxAdminBar_fields_is_modified() : //Unknown identifier on old browserfor (var eli)
    Fix admin content padding right pluxml < 5.3.1 when closed (document.body.style.padding)


    Ps: un oubli dans le journal de l'archive.
    Lors de la première activation du plugin, la barre doit être visible pour tous les utilisateurs actifs du site, mais c'est non vérifié O:)

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • Slt @tou(te)s, le plugin est en 2.2.1
    Trois coquilles ont été relevés et corrigés

    Journal :
    ## v2.2.1 : 06/02/2019 : idéFiX : SESSION, upload medias action-bar fullwidth toggle & beforeunload alert plxMySearch field ##
    Fix marge de droite trop large de la barre d'action du téléverseur de médias
    ::: DIV #files_uploader : classes inline-form action-bar : manque "fullwidth" si menu caché
    Fix : adminbar-search #plxMySearch est confondu avec un champ d'édition : contexte : article, statique, profil, commentaire, etc...
    ::: dès qu'il y a un formulaire, et que l'on recherche === alerte d'un risque de perte de données non justifié ;)
    Fix : Notice: Undefined index: ajaxplxAdminBar in class.plx.motor.php(546) : eval()'d code on line 11 ::: plxMotorGetUsers()
    ::: Contexte : pluxml.5.2 : a la première connexion (après MAJ en 2.2.0) : $_SESSION est indéfinie : hook
    Fix Changelog pour la v2.1.2 non publiée

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • Slt @tou(te)s, plxAdminBar est en 2.2.2
    Deux coquilles ont été relevés et corrigés dont une qui bouffé de la mémoire coté admin pour rien

    ## v2.2.2 : 22/03/2019 : admin : Empreinte mémoire des plugins divisé par 2 ##
    Fix : Classe ThemeEndBody : scope pages admin : load 2 times all activatated plugs construct
    :i: Chaques contructeur de plugin est appelé 2 fois coté admin. Lorque l'on get l'instance de plxMotor coté back-end. Merci @Gari pour plnKikan qui averti s'il est chargé plusieurs fois
    ``` $plxAdmin = $this->show=='public'?plxMotor::getInstance():plxAdmin::getInstance();```
    #origin
    ``` $plxAdmin = plxMotor::getInstance();```
    Fix : Notice session : autres pluxmls on same host
    [+] info.xml : compat + MAJ desc

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • assodefisassodefis Member
    mai 2019 modifié

    Bonjour @Sudwebdesign, à tous,

    Nous avons testé cette barre et la trouvons vraiment bien. Notre seul bémol, pour ceux qui voudraient l'utiliser avec Visual Wizard, c'est qu'elle s'affiche au dessus de certaines options.

    Nous contournons en ne l'affichant que sur le site et pas sur le panel d'admin.

    Merci pour ce plugin ;)


  • @assodefis et aux utilisateurs Visual Wizard

    En collant ce code ci-dessous ds la partie admin "code css" de plxAdminBar (ou VW),

    /* CSS rules to fix fullscrenn mode of Visual Wizard with plxAdminBar */
    viw_sidebar-ui{
        z-index:100001 !important;
    }
    
    .viw_ui-fullscreen{
        z-index:100000 !important;
    }
    

    il est possible que cela suffise pour que le mode plein écran de VW passe au dessus de la barre, son index z est 99999 & ceux de la demo de Visual Wizard 55 et 100.

    Ravi qu'il vous plaise et soit utile 😊

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • SudwebdesignSudwebdesign Member
    septembre 2019 modifié

    Slt @tou(te)s, plxAdminBar est en 2.2.3

    Économie de mémoire coté public car la seule fonk utile de plxAdmin est rapatrié ds la classe principale et n'est plus utilisé. Il y a une petite coquille de corrigé avec le thème par défaut et pluCss

    ## v2.2.3 : 25/09/2019 : public : Besoin mémoriel minimisé ##
    [+] Classe : Ajout de la fonk checkProfil (seul plxMotor est nécessaire).
    ::: Scope : fichier admin-bar.php : affichage des liens "admin" des plugins.
    :i: L'inclusion du fichier lib/class.plx.admin.php ds admin-bar.php est supprimé.
    :i: Fonk inpiré de plxAdmin et minimisé car c'est la seule utilisé par plxAdminBar.
    [+] Classe : Double barres oblique (//) vers Dièse (#) (Commentaires PHP).
    Fix Public : Disparité de 32 pixels de hauteur entre la sidebar et le contenus.
    ::: Scope : theme defaut (v5.7) + PluCss 1.3.x
    ::: .content a aucun "top" si la barre est affiché.
    ::: La classe .content ést absente du ficher admin-bar.css
    ```.content, aside, .aside, .section .action-bar, #sidebar, #content{top: 32px !important}```
    #origin
    ```aside, .aside, .section .action-bar, #sidebar, #content{top: 32px !important}```
    


    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

Connectez-vous ou Inscrivez-vous pour répondre.