Problem mit Userrechten bei Drupal 4.7 beta2 und angepassten Modulen
am 20.12.2005 - 12:00 Uhr in
Hallo!
Habe Drupal 4.7 beta2 installiert. Da es nur wenige angepasste Module für 4.7 gibt habe ich es mal selbst probiert. Dabei habe ich verschiedene Module verwendet. Z. Bsp. img_assist als größeres Modul und filebrowser als kleines Modul.
Bei allen von mir anngepassten Modulen tritt das gleiche Problem auf.
Ich kann die Module als admin nicht konfigurieren.
Was funktionert?
- Modul ein oder ausschalten
- Berechtigungen für das Modul setzen
Was funktioniert nicht?
- die Konfiguration des Modules selbst in den Einstellungen
Dabei verweigert mir Dupal den Zugriff auf das Modul. Das Drupalinterne Logging meldet, daß Anonymous keinen Zugriff auf das Modul hat - obwohl ich ja als admin eingeloggt bin.
Was habe ich bei den angepassten Modulen verändert?
- Die Formularfelder (Formtags) an die neue Formapi. (Der formupdater nimmt da viel Arbeit ab.)
- Die Authentifizierung in der Funktion mein_modulname_perm() in Zusammenhang mit den Angaben in der Funktion mein_modulname_menu().
Offensichtlich übersehe ich da Etwas.
Hat Jemand mit 4.7 Erfahrungen oder kann mir einen Tip geben, wie ich das Problem mit der Authentifizierung lösen kann?
Gruss
quiptime
PS
Das Modul formupdater arbeitet nicht fehlerfrei!
- Bei Formtags mit Javascript werden die Javascript-Funktionsaufrufe nicht vollständig geparst. Kann man aber gut am geparsten Code erkennen - bei der Syntax eines Javascript-Funktionsaufrufes fehlen am Ende immer die drei Zeicehn )')
- Verschachtelte Formtags (Formtag im Formtag) werden nicht erkannt. Ausweg: Die Verschachtelungen im formupdater einzeln parsen.
- Anmelden oder Registrieren um Kommentare zu schreiben
Hat hier Niemand 4.7 am Laufen?
am 21.12.2005 - 17:52 Uhr
Gibt es hier Niemanden von den alten Hasen, der 4.7 installiert hat?
Da ich hier keine Datei anhängen kann poste ich den Code eines nicht 4.7 - tauglichen Modules. Das Modul filebrowser ist klein, hat nur 2 auf die neue Formapi umzustellende Forms.
Die beiden Forms sind mit dem formupdater bereits umgestellt - im Code entsprechend sichtbar.
Eventuell hat ja doch Jemand 4.7 am Laufen und probiert mal, dieses Modul zu verwenden und/oder kann den Fehler erkennen.
Hier der vollständige Modulcode filebrowser.module
<?php
// $Id: filebrowser.module,v 1.150 2005-12-14 20:08:30 dries Exp $
/**
* @file
* Enables users with appropriate permissions to browse a folder of files (FTP-like).
*/
/**
* Implementation of hook_help().
*/
function filebrowser_help($section = NULL, $sethelp = NULL) {
static $pagehelp = '';
if (!isset($section)) {
$pagehelp = $sethelp;
}
else {
switch ($section) {
case 'admin/modules#description':
return t('Provides FTP-like browsing capabilities.');
case $_GET['q']:
if ($pagehelp) {
return $pagehelp;
}
}
}
}
/**
* Implementation of hook_settings().
*/
function filebrowser_settings() {
//$output = form_textfield(t('Root directory'), 'filebrowser_root', variable_get('filebrowser_root', ''), 70, 100, t('Root directory used to present the filebrowser interface. Users will not be able to go up from this folder. Only a directory name under the Drupal root is accepted. Example: "public/files".'));
// my update 4.7
$form['filebrowser_root'] = array(
'#type' => 'textfield',
'#title' => t('Root directory'),
'#default_value' => variable_get('filebrowser_root', ''),
'#size' => 70,
'#maxlength' => 100,
'#description' => t('Root directory used to present the filebrowser interface. Users will not be able to go up from this folder. Only a directory name under the Drupal root is accepted. Example: "public/files".'),
);
$output = $form;
//$output .= form_textfield(t('Icon directory'), 'filebrowser_icons', variable_get('filebrowser_icons', ''), 70, 100, t('Name of directory, where file type icons are stored. Files should be named "file-txt.png", "file-gif.png", etc. The default icon is "file-default.png".'));
// my update 4.7
$form['filebrowser_icons'] = array(
'#type' => 'textfield',
'#title' => t('Icon directory'),
'#default_value' => variable_get('filebrowser_icons', ''),
'#size' => 70,
'#maxlength' => 100,
'#description' => t('Name of directory, where file type icons are stored. Files should be named "file-txt.png", "file-gif.png", etc. The default icon is "file-default.png".'),
);
$output .= $form;
return $output;
}
/**
* Implementation of hook_perm().
*/
function filebrowser_perm() {
return array('access filebrowser');
}
/**
* Implementation of hook_menu().
*/
function filebrowser_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array('path' => 'filebrowser', 'title' => t('filebrowser'),
'access' => user_access('access filebrowser'), 'callback' => 'filebrowser_page',
'type' => MENU_CALLBACK);
}
return $items;
}
/**
* Prints a folder layout
*/
function filebrowser_page() {
// Build breadcrumb list for uplevel folders
$subfolder = preg_replace("!^filebrowser/*!", "", $_GET['q']);
$parts = explode("/", $subfolder);
$breadcrumb = array();
$dirname = t('root');
if ($subfolder) {
$dirname = array_pop($parts);
while (count($parts)) {
$breadcrumb[] = l($parts[count($parts) -1], filebrowser_proper_path(join("/", $parts)));
array_pop($parts);
}
$breadcrumb[] = l(t('Filebrowser root'), 'filebrowser');
}
$breadcrumb[] = l(t('Home'), NULL);
// Get file list and generate output for this folder
$output = '';
if (!($files = filebrowser_get_list($subfolder))) {
drupal_set_message(t('Unable to get files for this directory'));
}
else {
$headers = array_merge(
array(
array('data' => t("Name"), 'field' => 1),
array('data' => t("Size"), 'field' => 2),
array('data' => t("Last modified"), 'field' => 3),
), filebrowser_get_fileinfo()
);
filebrowser_sort_table(array(tablesort_get_order($headers), tablesort_get_sort($headers)));
// Protect folders from being resorted
$folders = array();
foreach ($files as $rnum => $filei) {
if ($filei[1]['data'] == '') {
$folders[] = $filei;
unset($files[$rnum]);
}
}
usort($files, 'filebrowser_sort_table');
$files = array_merge($folders, $files);
// Drop attributes only used for sorting, so
// these will not end up in the HTML output
foreach($files as $rnum => $filei) {
foreach($filei as $cnum => $cell) {
if (is_array($cell)) {
unset($filei[$cnum]['sv']);
}
}
$files[$rnum] = $filei;
}
$output .= join('', module_invoke_all('filebrowser_pre', $subfolder));
$output .= theme("table", $headers, $files);
}
// Note: CSS can hook on this ID to style table elements differently
print theme("page", '<div id="filebrowser-page">' . $output . '</div>', t('%dirname directory', array("%dirname" => $dirname)), array_reverse($breadcrumb));
}
/**
* Returns a list of files in a subfolder under the admin
* specified filebrowser root. File system details (size, last
* modification) is added, plus a metafile is parsed to gather
* more information, if available.
*/
function filebrowser_get_list($subfolder = '') {
$folder = filebrowser_safe_folder($subfolder);
$inroot = ($folder == variable_get('filebrowser_root', ''));
// Signal error in case of bogus directory name
if (!(file_exists($folder) && is_dir($folder) && ($dir = opendir($folder)))) {
return FALSE;
}
// Collect folders and files separately and check for a metainfo file
$files = $folders = array();
$infofile = FALSE;
while (($entry = readdir($dir)) !== FALSE) {
if (is_dir("$folder/$entry")) {
// Skip version control system folders
if (!in_array($entry, array(".svn", "CVS"))) {
$folders[] = $entry;
}
}
else {
$files[] = $entry;
if (in_array(strtolower($entry), array("descript.ion", "files.bbs"))) {
$infofile = $entry;
}
}
}
closedir($dir);
// Order folders first, then files
sort($folders);
sort($files);
$files = array_merge($folders, $files);
// Get metainformation about files, and construct table spaceholder
// for files, which have no metainformation in that file
if ($infofile) {
$info = filebrowser_get_fileinfo("$folder/$infofile", $subfolder);
$emptyinfo = array_fill(0, count(filebrowser_get_fileinfo()), '');
}
// Build detailed list of files
$details = array();
foreach ($files as $file) {
$extrainfo = (isset($info[$file]) ? $info[$file] : $emptyinfo);
// Some real folder or file
if (!in_array($file, array(".", ".."))) {
$completepath = "$folder/$file";
if ($stat = stat($completepath)) {
$icon = filebrowser_get_icon($completepath);
if (is_dir($completepath)) {
$link = l("$icon $file", filebrowser_proper_path("$subfolder/$file"));
$size = '';
}
else {
$link = "<a href=\"$completepath\">$icon $file</a>";
$size = format_size($stat['size']);
}
$details[] = array_merge(
array(
array('data' => $link, 'class' => 'filename', 'sv' => $file),
array('data' => $size, 'sv' => ($size ? $stat['size']: 0)),
array('data' => format_interval(time() - $stat['mtime']), 'sv' => (time() - $stat['mtime']))
), $extrainfo);
}
}
// The special one-up folder
elseif ($file == ".." && !$inroot) {
$icon = filebrowser_get_icon(NULL, 'folder');
$link = "$icon $file";
$parts = explode("/", $subfolder);
array_pop($parts);
$up = t('up');
$link = l("$icon $file <$up>", filebrowser_proper_path(join("/", $parts)));
$details[] = array_merge(array(
array('data' => $link, 'class' => 'filename', 'sv' => $file),
array('data' => '', 'sv' => 0),
array('data' => '', 'sv' => 0)
), $extrainfo);
}
}
return $details;
}
/**
* Loads file metainformation from the specified file. Also
* allows the file to specify a *callback* with which the
* descriptions are parsed, so more metainformation can be
* presented on the output.
*/
function filebrowser_get_fileinfo($fullpath = NULL, $subfolder = '') {
static $metacols = array();
// Return (previously generated) meta column list
if (!isset($fullpath)) {
return $metacols;
}
// Build meta information list
$metainfo = array();
if (is_readable($fullpath) && ($file = file($fullpath))) {
foreach ($file as $line) {
// Skip empty and commented lines
if (trim($line) == '' || strpos(trim($line), '#') === 0) {
continue;
}
list($name, $description) = explode(" ", $line, 2);
if (isset($metainfo[$name])) {
$metainfo[$name] .= trim($description) . " ";
}
else {
$metainfo[$name] = trim($description) . " ";
}
}
$callback = FALSE;
if (isset($metainfo['*callback*']) && function_exists(trim($metainfo['*callback*']))) {
$callback = trim($metainfo['*callback*']);
unset($metainfo['*callback*']);
}
if (isset($metainfo['.'])) {
filebrowser_help(NULL, $metainfo['.']);
unset($metainfo['.']);
}
foreach ($metainfo as $name => $description) {
$metainfo[$name] = ($callback ? $callback(trim($description), $subfolder, $name) : array(trim($description)));
}
$metacols = ($callback ? $callback() : array(t('Description')));
}
return $metainfo;
}
/**
* Returns the appropriate HTML code for an icon representing
* a file, based on the extension of the file. A specific icon
* can also be requested with the second parameter.
*/
function filebrowser_get_icon($fullpath = NULL, $iconname = NULL) {
if (isset($fullpath)) {
$iconname = (is_dir($fullpath) ? 'folder' : preg_replace("!^.+\\.([^\\.]+)$!", "\\1", $fullpath));
}
elseif (!isset($iconname)) {
$iconname = 'default';
}
$iconfiles = array(
variable_get('filebrowser_icons', '') . "/file-$iconname.png",
variable_get('filebrowser_icons', '') . "/file-default.png"
);
foreach ($iconfiles as $icon) {
if (file_exists($icon)) {
return theme("image", $icon);
}
}
return '';
}
/**
* Convert windows path values to use slashes, prevent slashes used
* repeatedly, and try to catch and eliminate path walkback attemepts.
* Also prevent from accessing version control system folders.
*/
function filebrowser_safe_folder($subfolder) {
$folder = variable_get('filebrowser_root', '') . "/$subfolder";
while (TRUE) {
$safer = str_replace(array("\\", "../", "/.svn", "/CVS", ".."), array("/", "", "", "", ""), $folder);
if ($safer !== $folder) {
$folder = $safer;
}
else {
break;
}
}
$folder = preg_replace("!^/*([^/].+[^/])/*$!", "\\1", $folder);
return preg_replace("!/+!", "/", $folder);
}
/**
* Allows easy path generation even if $path has a leading slash.
*/
function filebrowser_proper_path($path) {
return str_replace("//", "/", "filebrowser/$path");
}
function filebrowser_sort_table($a, $b = NULL) {
static $orderby = 0;
static $sort = '';
if (!isset($b)) {
$orderby = (int) $a[0]['sql'];
$sort = $a[1];
}
elseif (is_array($a) && isset($a[$orderby-1]) && isset($a[$orderby-1]['sv'])) {
if ($a[$orderby-1]['sv'] == $b[$orderby-1]['sv']) {
return 0;
}
if ($sort == 'asc') {
return $a[$orderby-1]['sv'] > $b[$orderby-1]['sv'];
}
else {
return $a[$orderby-1]['sv'] < $b[$orderby-1]['sv'];
}
}
}
Zu diesem Modul gehören keine weiteren Dateien.
Ich bin immer noch in der Hoffnung, das Problem lösen zu können. Eventuell kann mir ja Jemand dabei helfen.
Da geht noch was.
Beta ist Beta
am 21.12.2005 - 19:43 Uhr
Da es eine Beta ist, habe ich sie nur eingeschränkt laufen, die Beta 2 noch gar nicht (wenig Zeit vor Weihnachten).
Generell hatte ich aber mit diversen CVS-Versionen die Erfahrung gemacht, dass es helfen kann (und nicht muss), die Tabelle
cache
vollständig zu leeren, und sich ab- und wieder anzumelden.sich ab- und wieder
am 21.12.2005 - 19:55 Uhr
@Hinrich,
sich ab- und wieder anmelden, table cache komplett leeren und Browsercookie löschen und danach neu einloggen - hatte ich alles schon probiert und hat aber nichts gebracht.
PS
Habe auf drupal.org mehrere 4.7 - taugliche module gefunden und sie installiert. Darunter print.module und emailpage.module - beide explizit als 4.7 - tauglich deklariert. Beide sind NICHT 4.7 - kompatibel.
Bei print.module habe ich die Forms auf die neue API umgestellt und die function print_perm() eingefügt (ohne print_perm() tauchte das Modul nicht in der Zugriffskontrolle auf). Mit dem Resultat: Es funktioniert nicht, gleiche Fehler wie oben beschrieben.
Da geht noch was.
4.7-Tauglichkeit
am 21.12.2005 - 20:08 Uhr
Habe auf drupal.org mehrere 4.7 - taugliche module gefunden und sie installiert. Darunter print.module und emailpage.module - beide explizit als 4.7 - tauglich deklariert. Beide sind NICHT 4.7 - kompatibel.
Das mit der Tauglichkeit ist trügerisch. Die Tatsache, dass ein Modul unter dem Reiter 4.7 auftaucht, besagt nicht, dass das Modul auch bereits 4.7-tauglich ist.
Hintergrund: Das Modul
project
auf drupal.org ist eng verzahnt mit dem Entwicklungssystem. Die gesamte Versionskontrolle des Kerns, der Module, der Themes und der Theme Engines erfolgt durch CVS. CVS erlaubt es, an jedem beliebigen Punkt der Entwicklung entweder Markierungen (sogenannte Tags) anzubringen oder Abzweigungen (sogenannte Branches) zu erstellen. Drupal verwendet diese Branches jeweils für freigegebene Versionen.Mit der ersten Beta von Drupal 4.7 wurde es untersagt, neue Funktionen zu implementieren (das sog. Feature Freeze). Um dennoch engagierten Entwicklern die Möglichkeit bieten zu können, neue Funktionen zu implementieren, wird in einem solchen Fall ein Branch erstellt. Entwickler von Modulen und Themes folgen in der Regel, mit der Konsequenz, dass der Branch zwar existiert, die Anpassung aber noch nicht vollständig erfolgt ist.
Das Modul
project
weiss aber nichts vom Entwicklungsstand der Module etc., sondern kann nur sehen, ob ein Branch esistiert. Ist das der Fall, erscheint der entsprechende Reiter.Um die tatsächliche Tauglichkeit herauszufinden, bietet es sich an, den Strauß an Mailing-Listen einschließlich der CVS-Meldungen zu bestellen.
4.7-Tauglichkeit
am 21.12.2005 - 20:56 Uhr
Die Details um die Zusammenhämge mit dem Modul project kannte icht so nicht.
Im Falle des Modules print.module klappt es aber trotzdem. Ich kann das Modul in den Settings auf Grund des beschriebenen Fehlers zwar nicht konfigurieren, aber es ist in den nodes verfügbar und der Link - printer friendly version - funktioniert.
Ich habe mir nochmal die INSTALL.txt, README.txt usw. des Modules durchgelesen: Der Maintainer selbst spricht in diesen Dateien an keiner Stelle über die 4.7 - Kompatibilität
Ich bin immer noch der Hoffnung, daß einer der alten Hasen hier eine 4.7 testet und eventuell einen Tipp zur Fehlerursache hat. Ich stecke nicht so tief in Drupal um die Fehlerursache erkennen.
Gruss
quiptime
PS
Ein wirklich 4.7 -kompatibles Modul habe ich installiert: front_page.module
Da geht noch was.
4.7-Tauglichkeit
am 21.12.2005 - 22:00 Uhr
Ich bin immer noch der Hoffnung, daß einer der alten Hasen hier eine 4.7 testet und eventuell einen Tipp zur Fehlerursache hat. Ich stecke nicht so tief in Drupal um die Fehlerursache erkennen.
Die Fehlerursachen können vielfältig sein. Das Tutorial listet fast 20 Einzelpunkte auf, die geändert werden müssen. Zusätzlich noch einige Punkte, die auf absehbare Zeit geändert werden müssen.
4.6-Module nach 4.7 upgraden
am 21.12.2005 - 23:17 Uhr
Vielleicht kann dir dies helfen: Converting 4.6 modules to 4.7
Ralf
Habe es inzwischen
am 16.01.2006 - 18:25 Uhr
Habe es inzwischen aufgegeben, selbst Module nach 4.7 zu konvertieren. Erfordert einen zu tiefen Einstieg in Drupal und so tief will ich eigentlich nicht in Drupal einsteigen - spaeter eventuell ergibt sich das von selbest. Ausserdem ist die allgemeine Entwicklung hin zu 4.7 an einigen Stellen doch recht zuegig - wenn auch etwas konfus.
Gruss quiptime
Da geht noch was.
Development
am 28.01.2006 - 21:14 Uhr
Du kannst jederzeit die Module-Entwickler über Drupal.org kontaktieren. Die entsprechenden Namen findest du auf den Seiten der jeweiligen Module. Das ist der unkomplizierteste und schnellste Weg ;-)
mfg holger
drupal experience http://cms.stnetwork.de
Projekte: www.ebec.net | www.stnetwork.de
Beste Grüße, Holger
---
IT-News und IT-Jobs auf w3Projekt.com