[gelöst] Drupal Funktionen in eigener Custom-Funktion nutzen
am 23.09.2014 - 12:22 Uhr in
Hallo Leute,
ich habe mir in einer .module Datei eigene php-Funktionen geschrieben. Diese sollen unter anderem aber auch Drupal-Funktionen wie node_load oder invoke_rules_component etc. aufrufen. Leider bekomme ich immer
Fatal error: Call to undefined function node_load()
Wenn die drupal-Funktionen direkt aus einer module Datei aufgerufen werden funktionieren sie ja. Wenn diese aber durch Funktionen in einer module Datei aufgerufen werden, scheinen sie nicht sichtbar zu sein.
Wie erreiche ich denn die verfügbarkeit in den Funktionen?
Vielen Dank!
Max
- Anmelden oder Registrieren um Kommentare zu schreiben

Es reicht nicht, einfach nur
am 23.09.2014 - 13:23 Uhr
Es reicht nicht, einfach nur eine .module-Datei anzulegen, sondern Du mußt ein eigenes Modul erstellen, zu dem diese .module-Datei gehört. Dazu gibt es ausreichend Dokumentation. Nur mal googlen.
Diese Modul aktivierst Du genau wie andere Module auch auf der Modul-Seite. In Deinem Drupal-Modul stehen Dir dann alle Drupal-API Funktionen zur Verfügung.
Hallo wla, danke für deine
am 24.09.2014 - 10:40 Uhr
Hallo wla,
danke für deine Antwort. Wenn du das gesamte Modulumfeld (.info datei und ordner etc.) meinst, das liegt alles vor. Ich hab bereits dutzende Module entwickelt, aber eben noch keines, das als Library Funktionen für andere Module anbietet. In den anderen Modulen funktionieren diese Drupal-Funktionen, aber nicht innerhalb meiner Funktionen der .module Datei.
Wie erreiche ich die Sichtbarkeit dieser drupal_load funktion usw. in meinen Funktionen?
Viele Grüße,
Max
Ich bin leider immer noch auf
am 30.09.2014 - 12:56 Uhr
Ich bin leider immer noch auf keine Lösung gekommen. Um das Problem mal verständlicher zu machen, was ich bisher habe:
Ich habe in einer View ein php-Feld in jeder Zeile mit folgendem PSEUDO-Code (abgeändert, vereinfacht und natürlich sind es andere dateipfade etc.)
<?php
$nid = $row->nid;
$output = '<form action="meininterface.php" method="post">
<input type="text" name="kommentar" />
<input type="hidden" name="nid" value = "'.$nid.'" />
<input type="submit" value= "Absenden"/>
</form>';
return $output;
?>
meininterface.php liest die parameter aus und ruft dann eine funktion "aktualisieren" in meinefunctions.module auf. Beide Dateien sind in sites/all/modules/meinefunctions ordner und das modul ist aktiviert. Wieso mache ich das über eine php datei? Weil bei mir die .module datei in der form action="meinefunctions.module" mit der Begründung "Sie haben keinen Zugriff" nicht aufgerufen werden kann. (ich hab die dateiberechtigungen auf 755, kann trotzdem nicht aufgerufen werden)
Diese function "aktualisieren" soll nun ein field des nodes mit der entity_id "$nid" ändern und einen kommentar dazu in eine Tabelle schreiben.
In dieser "aktualisieren" function rufe ich deshalb node_load($nid) auf, bekomme jedoch die Fehlermeldung "Fatal error, call to undefined function"
Wie erreiche ich, dass ich in einem View-Feld mit einem Button sowohl das aktuelle $nid als auch einen optionalen Kommentar an eine Function übergebe, die dann node_load und node_save aufrufen kann?
Bin für jeden Tipp dankbar! Vielen Vielen Dank!!
Max
Der Fehler liegt in Deiner
am 30.09.2014 - 13:42 Uhr
Der Fehler liegt in Deiner Form-Definition
<form action="meininterface.php" method="post">. Ich vermute mal, daß Du meininterface.php nicht als URL in Drupal über einen hook_menu Aufruf definiert hast. Damit verläßt Du an der Stelle das Drupal-Umfeld. Du mußt mittels hook_menu einen URL registrieren, bei dessen Aufruf das Script ausgeführt wird (als Funktion in Drupal). Diese URL gibst Du dann bei action="interner Pfad" an. Dann sollte node_load auch vorhanden sein. Dazu hier das Zitat aus der Forms-API:#action
Used by: form
Description: The path to which the form will be submitted.
Values: An internal path
Hallo wla, vielen Dank für
am 30.09.2014 - 14:43 Uhr
Hallo wla,
vielen Dank für deine Antwort! Das klingt sehr interessant! Wenn ich das richtig verstanden habe, setze ich in meine "meinefunctions.module" also hook_menu ein?
<?php
function meinefunctions_menu{
$items['sites/all/modules/meinefunctions/meininterface.php'] = array(
'page callback' => 'aktualisieren',
'page arguments' => array($nid, $kommentar),
);
return $items;
}
?>
so ganz steig ich nicht dahinter... Brauch ich dann diese meininterface.php datei überhaupt oder könnte ich genauso in der form dann auch die .module datei aufrufen?
Von der architektur hab ich das schon richtig verstanden oder bin ich total auf dem holzweg?
1. Ich registriere die meininterface.php-URL in meiner .module datei und vergebe irgendwie eine interne URL (ist das ein attribut oder wie?)
2. Meine form im View-Field bleibt gleich mit ausnahme, dass ich die interne URL in action aufrufe.
Vielen vielen Dank!
Max
hook_menu oder include drupal bootstrap
am 01.10.2014 - 08:11 Uhr
Ein hook_menu-Pfad zeigt nicht auf die PHP-Datei! Der Pfad der per hook_menu erzeugt wird (aber in Wirklichkeit von der index.php verarbeitet wird) kann weitestgehend beliebig definiert werden. Zurück gegeben werden in der Regel Drupal-Seiten, die durch das Standard-Template gestaltet werden. Auch das ist mit hook_menu steuerbar. Siehe andere Module und die API-Beschreibung.
In den meisten Fällen ist dieser von wla vorgeschlagene Drupal-Weg die bessere Lösung. Wenn man aber tatsächlich mal eine eigenständige PHP-Datei benötigt bzw. Drupal auf direktem Weg mit anderen Anwendungen verknüpfen möchte, dann kann man per include-Befehl den Drupal-Bootstrap laden (siehe z.B. cron.php). Aber dann muss man sich um sehr viel andere Dinge kümmern insbesondere bezüglich Sicherheit. Vor allem für das Erzeugen und Verarbeiten von Formularen nimmt der Drupal-Core einem sehr viel Sicherheitsmanagement ab mit hook_form, das man dann aber auch benutzen sollte. Vor allem können andere Module an diese Formulare "andocken" z.B. mit einem Captcha-Schutz oder dem nützlichen Honeypot-Modul.
Hallo Carsten, auch dir
am 01.10.2014 - 08:45 Uhr
Hallo Carsten,
auch dir vielen Dank für deine Antwort!
Ich versuche gerade das umzusetzen, was wla empfohlen hat. Den internen Pfad habe ich nun denke ich korrekt (beliebig ^^) vergeben. Der Aufruf funktioniert auch prima. Da ich jedoch 4 Parameter (einer davon ist der Inhalt eines Textfeldes) an die php mitübergeben möchte, probiere ich gerade wildcards. Das funktioniert bei den 3 feststehenden Parametern, die zuvor per php bestimmt wurden bestens:
<form action="internerpfad/'.$function.'/'.$nid.'/'.$uid.'/" method="get" >in meiner hook_menu empfange ich diese parameter und kann sie auch an die funktion weitergeben.
<?php
function customfunctions_menu() {
$items['internerpfad/%/%/%/%'] = array(
'page callback' => 'test', //das ist meine Function im Drupal module
'access callback' => TRUE,
'type' => MENU_CALLBACK,
'page arguments' => array(1, 2, 3, 4),
);
return $items;
}
?>
Was nicht funktioniert: die Mitgabe des Inhalts des Textfeldes als 4. Parameter. Auch wenn ich im hook_menu den pfad auf
<?php
$items['internerpfad/%/%/%?textfeldname=%'] = array(
?>
ändere, scheint mein Programm nicht zu funzen.
Wla hat mir noch den Tipp mit submit-funktionen gegeben. Mit googles Hilfe stoße ich dann auf ein Javascript Event -> daraufhin clientseitige auslese der form-inhalte durch javascript. Dann könnte ich mittels javascript die URL generieren und aufrufen. Ist das so gedacht?
Vielen Vielen Dank!
Max
PHP $_GET nutzen
am 01.10.2014 - 09:07 Uhr
Das Attribut hinter dem Fragezeichen ("?textfeldname=%") nicht mit in den Drupal-Pfad angeben, sondern ganz einfach mit $_GET nutzen (in dem Fall "$_GET['textfeldname']". Auch dafür befindet sich ein Beispiel in der cron.php von Drupal 7, zur Entgegennahme des Passwort-Tokens.
Get-Paremeter auslesen auf
am 01.10.2014 - 14:29 Uhr
Get-Paremeter auslesen auf einer php Seite ist mir klar. In kombinierter Nutzung innerhalb des Hook_menu funktioniert das aber nicht.
<?php
function meinefunctions_menu() {
$textefeldinhalt = $_GET["textfeldname"];
$items['internerpfad/%/%/%'] = array(
'page callback' => 'test',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
'page arguments' => array(1, 2, 3, $textfeldinhalt),
);
return $items;
}
?>
oder meinst du das anders?
Innerhalb der Callback Funktion nutzen
am 01.10.2014 - 15:33 Uhr
In hook_menu definierst Du den Pfad, die Callback-Funktion und die Parameter die der Funktion übergeben werden. $_GET kannst Du dann in dieser Funktion nutzen.
D7 Module
am 01.10.2014 - 16:00 Uhr
Moin.
Sorry für die kurze Antwort und einfach nur den Link, aber bitte schau Dir mal das Tutorial zum Erstellen von Modulen für Drupal 7 an: Creating modules - a tutorial: Drupal 7.x.
Dort wird sehr (!) ausführlich erklärt, wie Du [api:hook_menu:7] und ähnliche Funktionen verwenden kannst, um das von Dir gewünschte Verhalten zu erreichen.
viel Spass beim Coden,
Stefan
Hallo Carsten und
am 01.10.2014 - 16:22 Uhr
Hallo Carsten und Stefan,
vielen Dank, dass ihr mir helfen wollt, jedoch denke ich, dass mein Fall etwas spezieller ist. Zumindest finde ich meinen Fall von einer kombinierten Parameterübergabe nicht in den Beispielen der allgemeinen hook_menu oder gar dem Drupal Tutorial zur Modulerstellung.
Wenn ich jetzt im hook menu drei Parameter empfange und mit 3 die Callback Funktion aufrufe, um dort dann per get parameter 4 aufzurufen, bekomme ich ebenfalls den "Seite nicht gefunden"- Fehler.
ich frage normalerweiße nie direkt nach Code weil ich es schlicht kapieren möchte was ich mache, aber ich glaube wir reden aneinander vorbei^^
besteht die Möglichkeit mir konkret hier an dem Code-Beispiel zu sagen, was hier falsch ist?
<?php
function meinefunctions_menu() {
$items['internerpfad/%/%/%'] = array(
'page callback' => 'test',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
'page arguments' => array(1, 2, 3),
);
return $items;
}
function test($param1, $param2, $param3){
$param4 = $_GET['kommentar'];
drupal_set_message(t('param1 '.$param1.' und param 2 '.$param2.' und param 3 '.$param3.' und param 4 '.$param4), 'status');
}
?>
die url sieht folgendermaßen aus:
/internerpfad/parameter1/parameter2/parameter3?kommentar=parameter4
vorab vielen Dank!
das Hauptgeheimnis ist vielleicht,
am 01.10.2014 - 19:56 Uhr
Dass die custom function in einem Modul liegen muss, oder dort includiert werden muss, um eine gemeinsame Basis zu haben.
Hallo Ronald, danke aber dass
am 02.10.2014 - 10:21 Uhr
Hallo Ronald,
danke aber dass ich es in ein Modul packen muss, ist mir bewusst.
Viele Grüße,
Max
Ich möchte mich bei allen,
am 06.10.2014 - 15:44 Uhr
Ich möchte mich bei allen, vor allem bei wla, für die Unterstützung bedanken!
es wird jetzt per javascript dynamisch eine url generiert und per button-klick aufgerufen. Im hook_menu empfange ich nach der url die parameter und rufe dann meine funktionen entsprechend auf.
Vielen Dank!
Max