Imagecache via Form API
Eingetragen von drupalcentersven (44)
am 11.02.2011 - 19:47 Uhr in
am 11.02.2011 - 19:47 Uhr in
Es ist ja relativ einfach möglich, eine Datei hochzuladen über ein Formular, das mit der Form API erstellt worden ist.
Kann ich die Datei - in diesem Fall ein Bild - direkt mit Imagecache oder sonstwie auf eine gewünschte Größe bringen?
Danke
- Anmelden oder Registrieren um Kommentare zu schreiben
ImageCache bringt die Bilder
am 11.02.2011 - 21:19 Uhr
ImageCache bringt die Bilder auf die gewünschte Größe, wenn die Bilder erstmals mittels theme_imagecache() aufgerufen werden.
Wenn du die hochgeladenen Bilder also im Anschluss mit theme_imagecache() anzeigst, hast du die entsprechend veränderte Version des Bildes zur Verfügung. Beachte, dass das Original-Bild immer noch vorhanden ist und die ImageCache-Varianten zusätzlich gespeichert werden.
Wenn du das Bild nach dem Upload skaliert speichern willst (also nicht das Original behalten und zusätzlich eine skalierte Version speichern sondern direkt das Original entsprechend skaliert speichern), dann kannst du dir mal image_scale oder image_scale_and_crop anschauen. Damit kannst du direkt nach dem Upload entweder das Bild selbst skalieren oder eine skalierte Variante speichern und das alte löschen.
Hier gibt's noch ein paar Bild-Funktionen: http://api.drupal.org/api/drupal/includes--image.inc/group/image/6
Da habe ich wohl den Karren
am 14.02.2011 - 15:07 Uhr
Da habe ich wohl den Karren vor das Pferd gespannt.
Ich habe einen Content Type mit einem Custom Module erstellt. Da gibt es mehrere Felder, dynamische Select Lists, etc. Funkutioniert super.
Wie kann ich nun zu diesem Content Type ein Upload Field für ein Bild hinzufügen? Wo wird das Bild gespeichert? Muss ich im Schema für den Content Type ein extra Feld für das Bild definieren?
Danke.
Ein Upload-Feld kannst du
am 14.02.2011 - 19:06 Uhr
Ein Upload-Feld kannst du einbinden, indem du eben ein Feld für Datei-Upload mit in das Form-Array aufnimmst.
Gespeichert wird die Datei ohne dein zutun gar nicht, das musst du selbst beim Speichern des Nodes mittels file_save_upload regeln.
Muss ich im Schema für den Content Type ein extra Feld für das Bild definieren?
Kommt drauf an, was du mit dem Bild machen willst. Mit file_save_upload wird die Datei auf jeden Fall in der files-Tabelle eingetragen (beachte, dass die Datei mit file_save_upload nur temporär gespeichert wird, sie wird also irgendwann wieder gelöscht. Wenn du das verhindern willst, musst du nach dem speichern der Datei mittels file_set_status den Status ändern)
"Beim Speichern der Node"?
am 15.02.2011 - 14:53 Uhr
Wie greife ich den Moment ab, in dem die Node gespeichert wird? Ich habe in meinem Modul keine Submit-Funktion! Das heißt, die Buttons "save" und "preview" werden irgendwie automatisch erstellt. Ist das normal?
Hast du da ein Beispiel, wie mans macht?
Zitat: Das heißt, die Buttons
am 15.02.2011 - 15:45 Uhr
Das heißt, die Buttons "save" und "preview" werden irgendwie automatisch erstellt. Ist das normal?
Wenn man mal aufmerksam die API-Dokumentation zu hook_form liest, wird man feststellen, dass das normal ist.
Du musst dem Formular deine eigene Submit-Funktion zuweisen:
<?php
function mymodule_form(&$node, $form_state)
{
//Hier kommt der Quellcode für dein Formular
$form['title'] = array(
'#type' => 'textfield',
'#default_value' => $node->title,
'#size' => 60,
);
//.......
//usw.
//Hier kommt nun deine eigene submit-Funktion
$form['#submit'][] = 'mymodule_meine_submit_funktion';
}
//Und hier kommt der Code für deine eigene Submit-Funktion
function mymodule_meine_submit_funktion($form, &$form_state)
{
//Quellcode
}
?>
Das dürfte funktionieren, damit musst du mal ein wenig herumexperimentieren, weil ich nicht genau weiß, welche Variablen an die Funktion übergeben werden, ob z. B. $node mit übergeben wird usw.
Ok, das funktioniert schon
am 15.02.2011 - 16:55 Uhr
Ok, das funktioniert schon mal. Vielen Dank!
Das Bild wird im "files" Ordner gespeichert und in der Datenbank auch in der Tabelle "files" eingetragen, unter anderem mit einer "fid".
1. Wie weiß ich, welche "fid" zu welcher Node gehört?
2. Wie kann ich das Bild in der Node anzeigen? Wie muss ich den hook_view ändern?
Zitat: 1. Wie weiß ich,
am 15.02.2011 - 22:36 Uhr
1. Wie weiß ich, welche "fid" zu welcher Node gehört?
Das musst du dir selbst speichern. Du kannst z. B. mit deinem Modul eine eigene DB-Tabelle anlegen, in der die Node-ID mit allen dazu gehörenden File-IDs (fid) gespeichert wird.
2. Wie kann ich das Bild in der Node anzeigen? Wie muss ich den hook_view ändern?
Du müsstest im hook_view erstmal die zugehörige File-ID heraussuchen. Damit kannst du dir dann aus der files-Tabelle den Pfad der Datei holen und damit kannst dann über theme_imagecache ein Bild einfügen.
Bsp:
<?php
function mymodule_view($node, $teaser = FALSE, $page = FALSE)
{
node_prepare($node, $teaser);
//zum Node gehörende fid suchen
//geht davon aus, dass es eine Tabelle "mytable" gibt, in welcher es 2 Spalten gibt:
//nid und fid (also zu jedem Node gehört nur ein Bild)
$fid = db_result(db_query("SELECT fid FROM {mytable} mt WHERE nid = %d;", $node->nid));
$path = db_result(db_query("SELECT filepath FROM {files} f WHERE fid = %d;", $fid));
//attributes-Array erstellen
//übergibt Attribute, z. B. Klasse, ID usw.
$attributes = array('class' => 'meine-klasse', 'id' => 'meine-id');
//Bild-Tag mittels theme_image erstellen
$bild = theme_imagecache('preset_bezeichnung', $path, 'alt-text', 'title-text', $attributes);
//Wichtung des Body-Bereichs im Content speichern
$weight = $node->content['body']['#weight'];
//Bild in eigenem Bereich anzeigen
//durch $weight + 5 erscheint das Bild unter dem Body
$node->content['bild']['#value'] = "<div id='bild-container'>$bild</div>";
$node->content['bild']['#weight'] = $weight + 5;
return $node;
}
?>