drupal-funktionen aus externer php-datei aufrufen
Eingetragen von headkit (514)
am 31.01.2008 - 15:31 Uhr in
am 31.01.2008 - 15:31 Uhr in
hi leute!
in meiner drupalseite habe ich einen flashbutton eingebaut, der ein php-skript triggert. ich möchte nun gerne aus dieser php-datei heraus drupalfunktionen benutzen. geht das?
danke!
- Anmelden oder Registrieren um Kommentare zu schreiben
Re: drupal-funktionen aus externer php-datei aufrufen
am 31.01.2008 - 15:46 Uhr
Wechsle in das Verzeichnis deiner Drupal-Installation und rufe drupal_bootstrap auf.
--
also mit include die
am 31.01.2008 - 16:00 Uhr
also mit include die bootstrap einbinden und dann kann ich nach dem aufruf "drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE)" die funktion "db_query()" benutzen?
Re: also mit include die
am 31.01.2008 - 16:10 Uhr
also mit include die bootstrap einbinden und dann kann ich nach dem aufruf "drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE)" die funktion "db_query()" benutzen?
Ja. Vorher aber noch mit chdir in das Verzeichnis der Drupal-Installation wechseln, sonst kann Drupal andere benötigte Dateien nicht finden.
--
die datei liegt eh im
am 31.01.2008 - 16:18 Uhr
die datei liegt eh im root.
aber ist es nicht einfacher bzw. schneller, die include-dateien einzeln einzubinden? ich kann doch z.b. auch direkt "database.inc" inkludieren.
oder?
funktioniert jedenfalls
am 31.01.2008 - 16:35 Uhr
funktioniert jedenfalls wunderbar - vielen dank!
kannst du mir zufällig auch
am 31.01.2008 - 16:36 Uhr
kannst du mir zufällig auch sagen, wie ich per PHP einen dateidownload anstoße?
danke!
Re: kannst du mir zufällig auch
am 31.01.2008 - 17:40 Uhr
... per PHP einen dateidownload anstoße[n]?
<?php
header("Location: $url");
?>
$url musst du durch die URL der Datei ersetzen. Du musst die absolute URL nehmen, also
<schema>:<schemaspezifischer_teil>
.--
ich hatte es so probiert,
am 31.01.2008 - 19:09 Uhr
ich hatte es so probiert, das klappt aber leider nicht.
<?php
// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
// addition by Jorg Weske
$file_extension = strtolower(substr(strrchr($filepath,"."),1));
echo "&bestaetigung=MIME:".$file_extension." \n&";
if( $filepath == "" )
{
echo "...";
exit;
} elseif ( ! file_exists( $filepath ) )
{
echo "...File not found";
exit;
};
switch( $file_extension )
{
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: ".$ctype);
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"".basename($filepath)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filepath));
readfile($filepath);
exit();
?>
warum weiß ich nicht.
also würde das dann auch so
am 31.01.2008 - 19:13 Uhr
also würde das dann auch so gehen:
<?php
header("Location: ".$url);
?>
oder?
und vor allem, wo ist da der unterschied?
headkit schrieb
am 31.01.2008 - 20:02 Uhr
<?php
// addition by Jorg Weske
$file_extension = strtolower(substr(strrchr($filepath,"."),1));
echo "&bestaetigung=MIME:".$file_extension." \n&";
?>
Es ist mir schleierhaft, was das soll. IMHO gehört es da nicht hin.
<?php
if( $filepath == "" )
{
echo "...";
exit;
} elseif ( ! file_exists( $filepath ) )
{
echo "...File not found";
exit;
};
?>
Dann solltest du aber auch so nett sein, das dem Browser mitzuteilen (nicht nur dem Benutzer):
<?php
header('HTTP/1.0 404 Not Found');
?>
<?php
switch( $file_extension )
{
// ... Lots of case-Statements ausgeschnitten ...
}
?>
Dafür gibt es bessere Methoden. Wenn die zu liefernde Datei mit Drupal hochgeladen wurde, dann steht der richtige Content-Type Header in der Datenbank.
<?php
header("Cache-Control: private",false); // required for certain browsers
?>
Insbesondere IE6
<?php
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"".basename($filepath)."\";" );
?>
Es genügt normalerweise nicht, einfach Anführungszeichen drumherumzupacken. Eigentlich muss der Dateiname laut RFC2183, RFC2045 und RFC822 aufgebaut sein. Diese RFCs sagen unter anderem, das Dateinamen mit Leerzeichen nicht in Anführungszeichen eingeschlossen werden müssen.
also würde das dann auch so gehen:
<?php
header("Location: ".$url);
?>
oder?
Nun ja, es kommt darauf an, was du mit "dateidownload anstoßen" meinst. Im Lichte deines letzten Beitrages meinst du wohl etwas anderes, als ich gedacht habe.
Für den Anfang schlage ich vor, sich solide PHP-Kenntnisste anzueignen. Insbesondere die Unterscheidung zwischen doppelten und einfachen Anführungszeichen bewegt micht zu glauben, daß es bei dir hauptsächlich dort mangelt.
warum weiß ich nicht.
Ja nee, is klar. Sonst hättest du nicht gefragt. Kannst du mir etwas genaueres über die Symptome sagen?
--
nuja, bin kein php-profi,
am 31.01.2008 - 20:39 Uhr
nuja, bin kein php-profi, sonst würd ich mich da nicht so durchhangeln.
das mit den anführungszeichen krieg ich aber schon hin, danke. ;-)
das obige skript hab ich mir aus verschiedenen foren zusammenkopiert. ich hab verschiedene versionen ausprobiert, die sich im prinzip aber alle nicht so sehr unterscheiden. das auseinanderpflücken macht hier jetzt nicht wirklich sinn.
die echos gehen an mein flashfile zurück.
das skript, das eigentlich funktionieren sollte ist folgendes:
<?php
include_once "includes/bootstrap.inc";
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
$rstrct_FID = $_POST[varFID];
$rstrct_UID = $_POST[varUID];
$query = db_query("SELECT filepath FROM {files} WHERE fid = %d",$rstrct_FID);
if($result = db_fetch_array($query)){
include_once "includes/file.inc";
include_once "includes/unicode.inc";
$download_filepath = $result[filepath];
$filepath = file_create_path($download_filepath);
$fileurl = file_create_url($download_filepath);
$filename = mime_header_encode(basename($filepath));
$size = filesize($filepath);
return array(
'Content-Type: application/octet-stream',
'Content-Length: ' . $size,
'Content-Disposition: attachment; filename=' . $filename,
'Content-Transfer-Encoding: binary'
);
}
*/
?>
wie es dann weitergehen soll - keine ahnung.
aber mach mich nicht gleich wieder fertig...
8-)
danach hab ich aus dem www.php.net folgendes skript probiert
<?php
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
$ext = strToLower(substr($filename,strlen($filename)-3, 3));
if ($ext == "mp3" ) { header("Content-Type: audio/x-mp3"); }
else if ($ext == "jpg") { header("Content-Type: image/jpeg"); }
else if ($ext == "gif") { header("Content-Type: image/gif"); }
else if ($ext == "zip") { header("Content-Type: application/zip"); }
else if ($ext == "png") { header("Content-Type: image/png"); }
else if ($ext == "swf") { header("Content-Type: application/x-shockwave-flash"); }
else if ($ext == "flv") { header("Content-Type: video/flv"); }
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$size);
header( "Content-Description: File Transfer");
readfile($filepath); */
?>
nix funzt.
kann doch nicht so schwer sein!
Re: nuja, bin kein php-profi,
am 01.02.2008 - 03:06 Uhr
kann doch nicht so schwer sein!
Doch, es ist so schwehr. Du spielst gerade mit 4 verschiedenen Spezifikationen herum (die 3 oben genannten RFCs plus RFC 2616), jede davon ca 100 Seiten dick. Es ist kein Wunder, wenn es nicht auf Anhieb funktioniert.
Was ich eigentlich vermisse, ist eine Fehlerbeschreibung. Du willst, das der Benutzer eine Datei herunteladen kann, soweit habe ich dich verstanden. Es funktioniert nicht, ok, das kann sich in vielen Varianten äußern:
Wo ist das Problem? Alle drei Symptome können auftreten und haben unterschiedliche Ursachen.
--
Es wird kein Dialog angezeigt, der zum Speichern der Datei auffo
am 01.02.2008 - 14:32 Uhr
Es wird kein Dialog angezeigt, der zum Speichern der Datei auffordert.
Der Fiddler schimpft aber auch nicht. er sagt nur "PK"
ich lade das jetzt mal hoch und teste, ob das online doch funktioniert.
...
RESPONSE HEADERS
HTTP/1.1 200 OK
Entity
Content-Length: 89683
Content-Type: octet/stream
Content-disposition: attachment; filename=files/path_to_file/filename.zip;
No Proxy-Authenticate Header is present.
No WWW-Authenticate Header is present.
Response headers do not contain caching-related directives.
No P3P Header is present.
-
funktioniert aber auch nicht...
nuja, schick ich den pfad
am 02.02.2008 - 17:05 Uhr
nuja, schick ich den pfad halt zu flash zurück und öffne von da den downloaddialog.
was solls...
hm, scheinbar verhindert
am 04.02.2008 - 15:50 Uhr
hm, scheinbar verhindert drupal auch hier das öffnen des download-dialoges.
warum verstehe ich nicht...
also weiter hier: http://www.drupalcenter.de/node/8074