WebsiteBaker Community Forum
WebsiteBaker Support (2.13.x) => General Help & Support => Topic started by: kuerbis42 on January 05, 2026, 06:31:37 PM
-
HeyHo, mann bin ich wieder aktiv... :-D
Unter: https://help.WebsiteBaker.org/en/developer-guide/variables-and-constants.php (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
-
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 Administratorengrup pe, 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 Administratorengrup pe 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
-
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)
-
und 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
-
das werde ich gerne beherzigen :-)
Muss mich erst wieder eingrooven. Hat sich viel getan in den letzten 5 Jahren :|
Besten Dank
-
so, nun groove ich mich ja wirklich mal ein...
Auf der Seite https://help.WebsiteBaker.org/en/developer-guide/classes-and-functions.php (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???
-
Kann es sein, das du WB_PATH nicht zur Verfügung hast?
<?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
-
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
-
Ich glaube die Funktion dir() ist fehlerhaft https://stackoverflow.com/questions/8081623/is-dir-returns-false-even-when-it-is-a-dir (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 (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;
}
?>
-
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
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".
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
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
" . 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)
Kann 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 :-(
-
Quote
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!!
-
ich 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
(https://i.gyazo.com/936ea5a21a83f689c3fb16d0facd8a0b.png)