• Welcome to WebsiteBaker Community Forum. Please log in or sign up.
Welcome, Guest
News
Support WebsiteBaker
Your donations will help to:
PayPal
  • Pay for our dedicated server
  • Pay for domain registration
  • and much more!
You can donate by clicking on the button below.

Fehler in der Dokumentation

Started by kuerbis42, January 05, 2026, 06:31:37 PM  ( Read 4,951 times )

kuerbis42

HeyHo, mann bin ich wieder aktiv... :-D

Unter: https://help.WebsiteBaker.org/en/developer-guide/variables-and-constants.php
hat sich (mindestens hier):
Session variables (class.wb.php) Description:
$_SESSION['USER_ID'] ID of the user loged in
$_SESSION
['GROUP_ID'] group ID of the user loged in
$_SESSION
['GROUP_NAME'] group name of the user loged in
$_SESSION
['USERNAME'] user name of the user loged in
$_SESSION
['DISPLAY_NAME'] display name of the user loged in
$_SESSION
['EMAIL'] Email
$_SESSION
['HOME_FOLDER'] home folder in /media of user loged in
$_SESSION
['TIMEZONE'] timezone of user loged in

ein Fehler eingeschlichen.
Die $_SESSION-Variable heißt nicht GROUP_ID sond GROUPS_ID.
Also: $_SESSION['GROUPS_ID']    group ID of the user loged in


Greets

    Gast

    nicht unbedingt falsch  :wink:

    beide Session-Variablen existieren, aber ich schreib es dazu

    Ein kurzer Blick in die Geschichte von WB: group_id stammt aus früheren Zeiten von WB und erlaubte nur eine einzige ID. Wenn ich richtig "geforscht" habe, wurde es um WB 2.7.1 ergänzt mit der groups_id. Dieser Wert ist ein Array und ermöglicht es, User mehrere Gruppen zuzuweisen.

    Weil die Entwickler meinten, group_id wäre nun überflüssig, stand es viele Jahre auf deprecated. Hat aber nie jemand entfernt und irgendwann flog der Kommentar auch raus. Es hat heute nach wie vor seine Gültigkeit und kann auch verwendet werden. Allerdings muß man dann auch wissen, wie es funktioniert.

    Wir nehmen an, es existieren mindestens 3 Usergruppen. Es können auch nur 2 oder 30 sein, aber 3 erklärt sich leichter ;-)
    Usergruppe 1 ist immer die Administratorengruppe, Gruppe 2 nenn ich Fußball, hier arbeiten Redakteure im Fußballbereich, Usergruppe 3 das Gleiche für Handball

    Ich möchte einen neuen Fußball-Redakteur anlegen, wähle also Gruppe 2, group_id wäre dann die 2, groups_id ebenso
    Lege ich nun einen User an, der beide Bereiche abdecken soll, bekäme auch der die group_id == 2 und im Feld groups_id steht dann 2,3

    group_id ordnet zuerst die Gruppen, die in der Gruppenauswahl genannt wurden, der Reihe nach, beginnend mit der obersten Priorität Administratorengruppe 1, dann aufwärts, darum ist diese group_id also die 2, die SESSION['groups_id'] dann aber 2,3

    Das grundsätzlich nicht empfohlen wird, direkt mit Session-Variablen zu arbeiten, wirst du sicher wissen. Alles Weitere wäre dann abhängig von dem, was da erforderlich ist. Da diese Session-Variablen einen erfolgreichen Login erfordern, kannst du auch die wb-internen Funktionen nutzen, die z.b. in der class.wb.php vorliegen, einfach mal durchscrollen und im Zweifel einfach fragen







      kuerbis42

      #2
      danke für die ausführliche Antwort  und ich will auch gar nicht widersprechen :-o

      ....aber wenn ich ein print_r($_SESSION) mache, dann erhalte ich (gekürzt) folgendes:
      Array (
      [
      session_started] => 1767633378
      [TOKENS] => .....}
      [
      SYSTEM_PERMISSIONS] => Array ( [0] => access [1] => ....] => users_delete [52] => users_modify )
      [
      MODULE_PERMISSIONS] => Array ( [0] => )
      [
      TEMPLATE_PERMISSIONS] => Array ( [0] => )
      [
      USER_ID] => 1
      [GROUPS_ID] => 1
      [USERNAME] => Cheffe
      [DISPLAY_NAME] => Administrator
      [EMAIL] => someone@world.com
      [HOME_FOLDER] =>
      [
      LANGUAGE] => DE
      [TIMEZONE] => 0
      [DATE_FORMAT] => d-m-Y
      [TIME_FORMAT] => H:i
      [GROUP_NAME] => Array ( [1] => Administrators )
      [
      PAGE_ID] => 8
      [HTTP_REFERER] => https://..../pages/sessions.php )


      GROUP_ID ist nicht dabei.
      Sinn und Zweck für mich:
      je nach Gruppe sollen auf der Seite zusätzliche Felder angezeigt werden: Admins haben "immer alles" und "BackOffice" darf ein wenig mehr als "sterbliche Normalos" :-)

      Deswegen wollte ich mit $_SESSION['GROUP_NAME'][$_SESSION['GROUP_ID']] auf die Gruppe prüfen und bin dann über das "S" gestolpert, weil nichts zurück kam.
      (Dazu möchte ich dann noch ergänzen: lt. Dokumentation steht in $_SESSION['GROUP_NAME'] schon der Name der Gruppe drin, was aber ja so nicht stimmt, denn es ist ein Array, mein erster Ansatz:
      if($_SESSION['GROUP_NAME']==="DeineGruppe")
      schlug fehl, deshalb musste ich tiefer gehen)

        Gast

        Quoteund ich will auch gar nicht widersprechen
        nur keine Angst ;-)
        Wenn falsch, dann falsch und das darf man auch sagen

        zur GROUP_ID
        Ja, da muß ich mich wohl korrigieren, was die Session-Variablen betrifft

        GROUP_ID wurde gestrichen aus den Session-Variablen ab Version WB 2.13.4. Habe die Hilfe-Seite einen entsprechenden Hinweis verpasst. Analog dem Hinweis zur Variable GROUP_NAME, der, wie richtig bemerkt, einen Array enthält mit den Gruppennamen zu den in GROUPS_ID genannten Gruppen.

        zu deinem Vorhaben... Sieh es nicht als Vorgabe, sondern eher als Tip. Du wirst mit etwas Praxis schnell merken, das es so auch viel leichter ist, vorallem aber sicherer.  :wink:

        Bin ich, als Frontend-User, erstmal auf der Ebene, das ich Zugriff auf die Session-Variablen habe, was über Cross-Site-Scripting ja kein großes Problem wäre, dann kann ich diese Variablen nicht nur lesen und nutzen, sondern eben auch verändern. Und weil ich an dieser Stelle ja schon eingeloggt sein muß (sonst funktionieren die Session-Variablen ja nicht), kann ich mich dann auch leicht zum Admin machen

        mal ein grundsätzlicher Ablauf
        1. zuerst prüfen, ob der User auch tatsächlich angemeldet ist mit is_authenticated(), wenn nicht: exit()
        2. Wenn angemeldet, hätte er Zugriffsrechte mit get_permission(), wenn nicht: exit()
        3. ami_group_member() prüft, ob der User Mitglied der genannte(n) Gruppe(n) ist, damit lassen sich dann Inhalte schalten oder Menüpunkte

        andere interessante Funktionen wären z.b.
        get_page_permission() - hat der angemeldete User Rechte zum Besuch dieser Seite?
        getGroupId() - die aktuelle Gruppen-ID des Users

          kuerbis42

          das werde ich gerne beherzigen  :-)
          Muss mich erst wieder eingrooven. Hat sich viel getan in den letzten 5 Jahren  :|

          Besten Dank

            kuerbis42

            so, nun groove ich mich ja wirklich mal ein...

            Auf der Seite https://help.WebsiteBaker.org/en/developer-guide/classes-and-functions.php
            stehen ja einige Funktionen, die ich nutzen könnte...
            Interessant sind natürlich:
            directory_list(): returns a array with all subdirectories based on a starting directory
            file_list(): returns a array with all files and subdirectories based on a starting directory (possible to exclude files from beeing listed)
            get_home_folders(): returns array with all home folders below /media

            Leider bekomme ich aber immer nur "nichts" zurück.

            Test-Source:
            header('Content-Type: application/json'); /* damit es besser lesbar ist....*/
            require_once(WB_PATH."/framework/functions.php");

            $base = realpath(WB_PATH."/media");

            function
            read_all_files($root = '.'){ /* von https://www.php.net/manual/de/function.readdir.php */
             
            $files  = array('files'=>array(), 'dirs'=>array());
             
            $directories  = array();
             
            $last_letter  = $root[strlen($root)-1];
             
            $root  = ($last_letter == '\\' || $last_letter == '/') ? $root : $root.DIRECTORY_SEPARATOR;
             
             
            $directories[]  = $root;
             
             while (
            sizeof($directories)) {
               
            $dir  = array_pop($directories);
               if (
            $handle = opendir($dir)) {
                 while (
            false !== ($file = readdir($handle))) {
                   if (
            $file == '.' || $file == '..') {
                     continue;
                   }
                   
            $file  = $dir.$file;
                   if (
            is_dir($file)) {
                     
            $directory_path = $file.DIRECTORY_SEPARATOR;
                     
            array_push($directories, $directory_path);
                     
            $files['dirs'][]  = $directory_path;
                   } elseif (
            is_file($file)) {
                     
            $files['files'][]  = $file;
                   }
                 }
                 
            closedir($handle);
               }
             }  
             return
            $files;
            }
            echo
            $base." \n";

            // WB interne Funkltion:
            $all_files = file_list($base);
            print_r($all_files);

            echo
            "##########################################\n";
            echo
            "Ersatzfunktion:\n"
            $all_files = read_all_files($base); // liefert array aller Dateien & Unterordner
            print_r( $all_files);
            die();



            Und hier die Ausgabe (function list_files() gibt ein leeres Array zurück, read_all_files() enthält das, was ich brauche:
            /www/wwwroot/6.....de/media
            Array
            (
            )
            ##########################################
            Ersatzfunktion:
            Array
            (
               [
            files] => Array
                   (
                       [
            0] => /www/wwwroot/6.....de/media/acp_daten/location_images/Gebaude15.jpg
                       
            [1] => /www/wwwroot/6.....de/media/acp_daten/location_images/Gebaude2.jpg
                       
            [2] => /www/wwwroot/6.....de/media/acp_daten/location_images/Gebaude1.jpg
                       
            [3] => /www/wwwroot/6.....de/media/acp_daten/location_images/Gebaude14.jpg
                       
            [4] => /www/wwwroot/6.....de/media/acp_daten/location_images/Gebaude17.jpg
                       
            [5] => /www/wwwroot/6.....de/media/acp_daten/location_images/Gebaude1dsds.jpg
                       
            [6] => /www/wwwroot/6.....de/media/acp_daten/location_images/sueden/Gebaude17.jpg
                       
            [7] => /www/wwwroot/6.....de/media/acp_daten/location_images/sueden/Gebaude1dsds.jpg
                       
            [8] => /www/wwwroot/6.....de/media/acp_daten/dj_images/DJ_1-dj_695bbba3e56087.90944195.jpg
                       
            [9] => /www/wwwroot/6.....de/media/acp_daten/dj_images/DJ_3-dj_695d5a28b9ecd2.32009774.jpg
                   
            )

               [
            dirs] => Array
                   (
                       [
            0] => /www/wwwroot/6.....de/media/calendar/
                       [
            1] => /www/wwwroot/6.....de/media/acp_daten/
                       [
            2] => /www/wwwroot/6.....de/media/acp_daten/dj_images/
                       [
            3] => /www/wwwroot/6.....de/media/acp_daten/location_images/
                       [
            4] => /www/wwwroot/6.....de/media/acp_daten/location_images/sueden/
                   )

            )


            Was mache ich falsch???

              Gast

              Kann es sein, das du WB_PATH nicht zur Verfügung hast? 

              Quote<?php
              require('config.php');

              //header('Content-Type: application/json'); /* damit es besser lesbar ist....*/
              require_once(WB_PATH."/framework/functions.php");

              $base = realpath(WB_PATH."/media");

              $aFileList = file_list($base);
              echo "<pre class='debug-dump'>DEBUG in " . basename(__FILE__) . " on line " . __LINE__ . ":<br>";
              print_r($aFileList);
              echo "</pre>";

              $aDirList = directory_list($base);
              echo "<pre class='debug-dump'>DEBUG in " . basename(__FILE__) . " on line " . __LINE__ . ":<br>";
              print_r($aDirList);
              echo "</pre>";

              ergibt
              File-List
              DEBUG in newEmptyPHP.php on line 10:
              Array
              (
                 
              • => F:\cms1\wb_test_1622\media/1015-800x500-grayscale.jpg
                    [1] => F:\cms1\wb_test_1622\media/1015-800x500.jpg
                    [2] => F:\cms1\wb_test_1622\media/1765895479_image1a.jpg
                    [3] => F:\cms1\wb_test_1622\media/1765895479_image1b.jpg
                    [4] => F:\cms1\wb_test_1622\media/IMG_0196.jpg
                    [5] => F:\cms1\wb_test_1622\media/IMG_0196_800.jpg
                    [6] => F:\cms1\wb_test_1622\media/lens.html
                )


                Folderlist
                DEBUG in newEmptyPHP.php on line 15:
                Array
                (
                   
              • => F:\cms1\wb_test_1622\media/faqbaker
                    [1] => F:\cms1\wb_test_1622\media/kuerbistest
                    [2] => F:\cms1\wb_test_1622\media/mod_image_comparison
                )

                JSON hab ich mal deaktiviert zum Test, damit kommst du dann ja klar, wenn es erstmal läuft, oder?


                zur get_home_folders(): Ergebnis wäre der Ordner des angemeldeten Users, der in der Tabelle users im Feld home_folder steht

                es gab in WB mal eine Funktion, die jedem registrierten User ein eigenes Unterverzeichnis in /media zugewiesen hat mit dem Zweck, das jeder User nur aus diesem Bereich Material in den Sectionen verwenden darf. Hat sich aber in der Praxis nicht bewährt, weil es eben die Möglichkeit nahm, auch in anderen media-Ordner zu arbeiten. Hier bedarf es einfach besserer Settings, die einem Admin erlauben, einem User oder Usergruppe auch Zugriff auch andere Ordner zu gewähren.
                Diese ganze Schaltung zieht sich durch den kompletten Core und damit dies bei Rektivierung nicht wieder neu programmiert werden muß, blieb der Rest drin. Nur das Anlegen eines solchen Ordner mit entsprechendem Eintrag in der User-Tabelle wurde deaktiviert, weshalb du dort kein Ergebnis bekommst.

                Für die neue WB-Version hab ich das nun wieder aktiviert und regle die Zulassung über Gruppenrechte. Ist aber noch nicht spruchreif und eigentlich auch zu starr. Vielleicht fällt mir noch etwas anderes ein

                kuerbis42

                WB_PATH: doch, der ist gesetzt (ich muss dazu sagen, dass ich das in einer WB-"Seite" programmiere, Abschnitt Code v3.1.0, d.h. es sollte ja sowieso "alles da sein".
                Als Template benutze ich WB Default V1.2.3
                (achja, den echten Domainnamen habe ich gekürzt, er ist aber normal in der Anzeige)
                Wenn ich Dein require('config.php') setze, dann kommt im Debug-Log:
                Sun, 11 Jan 2026 15:50:28 +0000 [E_WARNING] /config.php:[8] from /config.php:[8] define "Constant DB_TYPE already defined"
                Sun, 11 Jan 2026 15:50:28 +0000 [E_WARNING] /config.php:[9] from /config.php:[9] define "Constant DB_HOST already defined"
                Sun, 11 Jan 2026 15:50:28 +0000 [E_WARNING] /config.php:[10] from /config.php:[10] define "Constant DB_PORT already defined"
                ....
                Sun, 11 Jan 2026 15:50:28 +0000 [E_WARNING] /config.php:[17] from /config.php:[17] define "Constant WB_URL already defined"
                PHP Fatal error: Cannot redeclare function SanitizeHttpReferer() (previously declared in /www/wwwroot/60......de/fram....


                Wenn ich  require('config.php') weg lasse, dann kommt:

                DEBUG in view.php(31) : eval()'d code on line 9:
                Array
                (
                )

                und
                DEBUG in view.php(31) : eval()'d code on line 14:
                Array
                (
                   [0] => /www/wwwroot/60....t.de/acp_daten
                   [1] => /www/wwwroot/60....t.de/acp_daten/dj_images
                   [2] => /www/wwwroot/60....t.de/acp_daten/location_images
                   [3] => /www/wwwroot/60....t.de/acp_daten/location_images/sueden
                   [4] => /www/wwwroot/60....t.de/calendar
                )


                nun habe ich eine dirctcode.php direkt im ./pages-Verzeichnis angelegt (require("../config.php"), also einen zurück):
                DEBUG in dirctcode.php on line 10:
                Array
                (
                )

                DEBUG in dirctcode.php on line 15:
                Array
                (
                   [
                0] => /www/wwwroot/60....t.de/acp_daten
                   
                [1] => /www/wwwroot/60....t.de/acp_daten/dj_images
                   
                [2] => /www/wwwroot/60....t.de/acp_daten/location_images
                   
                [3] => /www/wwwroot/60....t.de/acp_daten/location_images/sueden
                   
                [4] => /www/wwwroot/60....t.de/calendar
                )


                Außerdem fällt mir gerade auf:
                Es fehlt in der Ausgabe das Verzeichnis "media"
                /www/wwwroot/60....t.de/media/acp_daten

                Kann es sein, das die Funktion nur auf Windows richtig funktioniert? Du hast es ja lokal ausprobiert, ich  auf einem Debian mit ngx

                  kuerbis42




                  Ich glaube die Funktion dir() ist fehlerhaft https://stackoverflow.com/questions/8081623/is-dir-returns-false-even-when-it-is-a-dir.
                  Schau mal hier:
                  https://www.php.net/manual/en/function.scandir.php
                  Ich habe mir dann mal die folgende Funktion "geklaut", das funktioniert prima.
                  <?php
                  function find_all_files($dir)
                  {
                     
                  $root = scandir($dir);
                     foreach(
                  $root as $value)
                     {
                         if(
                  $value === "." || $value === "..") {continue;}
                         if(
                  is_file("$dir/$value")) {$result[]="$dir/$value";continue;}
                         foreach(
                  find_all_files("$dir/$value") as $value)
                         {
                             
                  $result[]=$value;
                         }
                     }
                     return
                  $result;
                  }
                  ?>

                    Gast

                    du mußt viel ruhiger werden...    :wink: :-D

                    also...

                    dir() ist nix von WB, das ist eine PHP-Funktion -> https://www.php.net/manual/de/function.dir.php

                    Quoteich muss dazu sagen, dass ich das in einer WB-"Seite" programmiere, Abschnitt Code v3.1.0, d.h. es sollte ja sowieso "alles da sein".

                    ja, ist es dort auch. Ich hab nicht im CMS getestet, mir nur das Datenbank-Zeugs von WB geklaut, darum dort die config mit eingebunden, um auf die WB-Funktionen zuzugreifen

                    Quoteeval()'d code on line 14:
                    stammt aus meinem Code und betrifft immer die Zeile im WB-Code-Editor, egal, ob für Droplets oder Module wie Code oder Code²
                    in diesem Fall gehts um das hier
                    " . basename(__FILE__) . " on line " . __LINE__ . "

                    schreib es so, ist der eval-Fehler auch weg

                    $aFileList = file_list($base);
                    echo
                    "<pre class='debug-dump'>DEBUG:<br>";
                    print_r($aFileList);
                    echo
                    "</pre>";


                    in deiner ersten Antwort verwendest du

                    $base = realpath(WB_PATH."/media");

                    lass dir das dort direkt ausgeben und kontrolliere es. Kann ich von hier aus nicht sehen, nur darauf vertrauen, das du das auch richtig angibst.
                    Noch als Hinweis: /media ist ein Verzeichnis, das nicht jeder benutzt. Was gültig ist, steht in den WB-Optionen unter Servereinstellungen -> Medienverzeichnis:
                    (nur änderbar bei einer Neuinstallation)


                    QuoteKann es sein, das die Funktion nur auf Windows richtig funktioniert? Du hast es ja lokal ausprobiert, ich  auf einem Debian mit ngx

                    Nein, sonst würde WB ja nicht funktionieren und online schaut das ja nicht anders aus, nur die Pfade ändern sich -> https://i.gyazo.com/92423774d0a8e4074fd251ed5ca3d5d8.png


                    noch als Tip: wenn du WB als Basis nutzt, würde ich auch dabei bleiben. WB ermittelt den Serverpfad  selbst und unabhängig von dem, was real auf dem Server passiert. Hab grad ne halbe Stunde gesucht, warum das Löschen beim Upgrade nicht geht - ja, da fehlte ein Slash am Ende  :-(





                      kuerbis42

                      QuoteQuote

                          eval()'d code on line 14:

                      stammt aus meinem Code und betrifft immer die Zeile im WB-Code-Editor, egal, ob für Droplets oder Module wie Code oder Code²
                      in diesem Fall gehts um das hier
                      Code: [Select]

                      " . basename(__FILE__) . " on line " . __LINE__ . "


                      schreib es so, ist der eval-Fehler auch weg

                      das weiß ich, dass es aus Deinem Code stammt - ich habe einfach nur die Ausgabe kopiert.

                      Ich habe eben ein komplett frisches WB 2.13.9 r25 aufgesetzt - alles neu**!
                      Dann Deinen Code kopiert und in die erste WB-Seite eingefügt (geändert habe ich nur require('config.php'); in require_once('config.php');

                      Nun bekomme ich auch eine Ausgabe und Dateien, bzw. Ordner im Array zurück geliefert  :roll:.
                      Vielleicht war ja irgendetwas in meiner ersten Installation kaputt.

                      Auch habe ich mir die Beschreibung von file_list() noch einmal "durchgelesen" (da steht ja nicht viel, aber wer lesen kann: liefert alle Dateien aus dem aktuellen Verzeichnis (ohne Rekursion)...)

                      Ergebnis:
                      1. die Funtkion funktioniert
                      2. sie reicht mir aber nicht  :| - ich benötige die Rekursion an der Stelle, aber das ist mein Problem (habe ich ja auch schon etwas für mich gefunden)


                      **Bei der Installation bin ich auf einen Fehler gestoßen: "config.php" konnte nicht geschrieben werden. Ich habe dann eine leere config.php angelegt, danach lief es durch.


                      Auf jeden Fall: vielen Dank für Deine Mühe und Geduld!!

                        Gast

                        Quoteich benötige die Rekursion an der Stelle, aber das ist mein Problem (habe ich ja auch schon etwas für mich gefunden)

                        na dann probier mal die Datei im Anhang. Vielleicht nicht das, was du korrekt brauchst, aber nimm dir raus, was dir gefällt oder erweitere wie gewünscht

                        Tipp: entpacke die Datei ins media-Verzeichnis oder irgendwo anders hin. Passe den Pfad zur config.php an und nutzt das Wrappermodul


                          \n\n