[gelöst]'#collapsible' auf FALSE im Formular von Imagefield per hook ändern
Eingetragen von messy (116)
am 19.04.2009 - 18:33 Uhr in
am 19.04.2009 - 18:33 Uhr in
Moin
Ich möchte beim Imagefieldmodul eine Funktion (http://rafb.net/p/4Rj0mM37.html) abändern. Zeile 16 '#collapsible' => true
soll auf false
gesetzt werden.
Wie bekomme ich das mit einem hook hin? Alles was ich versucht habe führte zu unschönen Fehlermeldungen.
- Anmelden oder Registrieren um Kommentare zu schreiben
Das sollte mit
am 20.04.2009 - 14:16 Uhr
Das sollte mit hook_form_alter klappen
function deinmodul_form_alter(&$form, $form_state, $form_id)
{
if($form_id=='imagefield_widget_form') {
//hier entsprechendes formularelement ändern
);
}
}
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
Moin Das ist der Ausschnitt
am 20.04.2009 - 20:02 Uhr
Moin
Das ist der Ausschnitt aus der Funktion
_imagefield_widget_form
<?php
$form[$fieldname] = array(
'#type' => 'fieldset',
'#title' => t($field['widget']['label']),
'#weight' => $field['widget']['weight'],
'#description' => t('Images are not saved until the form is submitted.'),
'#collapsible' => true,
'#collapsed' => false,
'#tree' => true,
'#prefix' => '<div id="'. form_clean_id($fieldname .'-attach-wrapper') .'">',
'#suffix' => '</div>',
);
?>
Das Modul hat bereits ein
imagefield_form_alter
. Dort habe ich eingefügt:<?php
if ($form_id == '_imagefield_widget_form') {
$form[$fieldname]['#collapsible'] = false;
}
?>
Leider klappt das nicht. Was habe ich falsch gemacht?
_____________________________________________________
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
also $fieldname ist eine
am 20.04.2009 - 20:50 Uhr
also $fieldname ist eine variable, die musst du dann mit dem namen DEINES feldes ersetzen (meinstens "field_irgendwas" benannt).
desweiteren solltest du auf keinen fall in der imagefield_form_alter etwas ändern, sondern eine eigene deinmodul_form_alter() implementieren.
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
Ich möchte ja, dass das
am 20.04.2009 - 21:06 Uhr
Ich möchte ja, dass das für alle
$fieldname
funktioniert. Habe jetzt:<?php
if ($form_id == '_imagefield_widget_form') {
$fieldname = $field['field_name'];
$form[$fieldname]['#collapsible'] = false;
}
?>
In dem imagefield.modul gab es bereits ein hook_alter. Deswegen habe ich das dort eingefügt.
_____________________________________________________
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
$form_id hat nur die IDs
am 22.04.2009 - 11:31 Uhr
$form_id hat nur die IDs für genau diesen node ausgegeben, aber der hook soll ja überall greifen, wo dieses Feld existiert, also habe ich es so gemacht:
<?php
if ($form['#id'] == 'node-form') {
$form[field_name]['#collapsible'] = FALSE;
}
?>
Leider muss ich jedes Feld direkt ansprechen, weil ich nicht weiß, wie ich alle imagefield-felder ansprechen soll. Hat da jemand ne Idee?
Dank an stBorchert für die Hilfe.
_____________________________________________________
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
Damit Dein Formalter nicht
am 22.04.2009 - 12:20 Uhr
Damit Dein Formalter nicht bei ALLEN Nodes bzw. ALLEN Nodetypes versucht sich auszufuehren wuerde ich noch den/die Nodetype/s gegenpruefen. Hat was mit Performance dieses hook_form_alter zu tun.
Im Form Array sollte der Nodetype zur Verfuegung stehen.
------------------------
Quiptime Group
Da geht noch was.
Re: '#collapsible' auf FALSE im Formular von Imagefield per ...
am 22.04.2009 - 13:42 Uhr
In dem imagefield.modul gab es bereits ein hook_alter. Deswegen habe ich das dort eingefügt.
In vier Wochen hast du das vergessen und beim nächsten Update des Imagefield-Moduls sind deine Änderungen Geschichte.
Leider muss ich jedes Feld direkt ansprechen, weil ich nicht weiß, wie ich alle imagefield-felder ansprechen soll.
Frag doch beim CCK nach, welche Image-Felder es gibt:
<?php
function example_form_alter(&$form, $form_state, $form_id)
{
// Handelt es sich um ein Node-Formular?
if ($form['#id'] == 'node-form') {
$node = $form['#node'];
// Ueber alle Formularfelder iterieren
foreach (element_children($form) as $child) {
// CCK-Feld laden
$field = content_fields($child, $node->type);
// Wurde ein CCK-Feld gefunden?
if ($field) {
// Ist es ein Image Field?
if ($field['type_name'] == 'image') {
// Hat das Feld den passenden Namen?
if ($field['field_name'] == $child) {
$form[$child]['#collapsible'] = false;
}
}
}
}
}
}
?>
--
quiptime schrieb Damit Dein
am 23.04.2009 - 14:54 Uhr
Damit Dein Formalter nicht bei ALLEN Nodes bzw. ALLEN Nodetypes versucht sich auszufuehren wuerde ich noch den/die Nodetype/s gegenpruefen. Hat was mit Performance dieses hook_form_alter zu tun.
Habe jetzt:
<?php
if ($form['type']['#value'] == 'typen_name') {
?>
Ist das so richtig oder muss ich die Abfrage noch weiter abwandeln, um die Performance beizuhalten?
In vier Wochen hast du das vergessen und beim nächsten Update des Imagefield-Moduls sind deine Änderungen Geschichte.
Mittlerweile habe ich ein eigenes Minimodul dafür.
Sehr schön ausformuliert deine Funktion. Danke!
Das es solche Funktionen wie
element_children
odercontent_fields
gibt wusste ich gar nicht. Fehlt mir einfach noch die Erfahrung. Sehr hilfreich. Jetzt versteh ich auch, warum manche keys mit '#' beginnen.Das nutze ich jetzt:
<?php
function mini_imagefield_collapsible_form_alter($form_id, &$form) {
if ($form['type']['#value'] == 'typen_name') {
$node = $form['#node'];
// Ueber alle Formularfelder iterieren
foreach (element_children($form) as $child) {
// CCK-Feld laden
$field = content_fields($child, $node->type);
// Wurde ein CCK-Feld gefunden?
if ($field) {
// Ist es ein Image Field?
if ($field['type'] == 'image') {
// Hat das Feld den passenden Namen?
$form[$child]['#collapsible'] = FALSE;
}
}
}
}
}
?>
_____________________________________________________
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
Ich hatte mich wohl etwas
am 23.04.2009 - 15:33 Uhr
Ich hatte mich wohl etwas missverstaendlich ausgedrueckt.
Ich meinte Du solltest im hook_form_alter auf die Form ID und den Nodetype pruefen
Etwa so:
function mini_imagefield_collapsible_form_alter($form_id, &$form) {
if ($form['#id'] == 'node-form' && $form['#node']['type'] == 'der_in_frage_kommende_nodetype') {
// TODO: Deine Formularaenderung
}
}
Um Form ID und Nodetype zu ermitteln kannst Du am Anfang des Minimodule diesen Code testhalber einfuegen:
print_r('Form ID: '. $form_id . '<br />');
print_r('Nodetype: '. $form['#node']['type']);
------------------------
Quiptime Group
Da geht noch was.
Moin, $form_id liefert
am 24.04.2009 - 08:28 Uhr
Moin,
$form_id
liefertnodetypname_node_form
undsearch_block_form
.Die Abfrage funktioniert nicht. Selbst
$form['#id'] == 'node-form'
wird nichttrue
, obwohl der key mitnode-form
gefüllt ist.$form['#node']['type'] == 'der_in_frage_kommende_nodetype'
klappt auch nicht, aber das liegt wohl daran, dass dies einstdClass Object
ist._____________________________________________________
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
Unter- und Bindestriche
am 24.04.2009 - 12:51 Uhr
Du kannst natuerlich auch
print_r($form);
ausfuehren.
Ohne das Devel Modul liefert dies aber unuebersichtliche Infos. Mit aktiviertem Devel Modul kann man statt print_r() ein dsm() verwenden. Also so
dsm($form);
Kann es sein das Dein Problem mit den Unter- und Bindestrichen zu tun hat? Beispiel mit der Form ID
gmap-node-form
gmap_node_form
Nur "gmap_node_form" wird im hook_form_alter funktionieren. Ebenso ist es beim Nodetype.
Ich poste Dir hier mal ein konkretes Beispiel von einem Modul an dem ich gerade arbeite. In dem Code kann man die Sache mit den Unterstrichen erkennen.
<?php
/**
* Implementation of hook_form_alter().
*/
function gmap_node_form_alter(&$form, $form_state, $form_id) {
//dsm('gmap_node_form_alter');
//dsm($form_id);
//dsm($form);
$types = gmap_node_check_set_nodetypes();
// Example form id: story_node_form
if ($types['type'][$form['type']['#value']] == 1) {
if ($form_id == $form['type']['#value'] .'_node_form') ;
if (gmap_node_exists_gmap($node) == TRUE) {
$form['gmap'] = array(
'#type' => 'value',
'#value' => $form['nid']['#value'],
);
$form['buttons']['delete']['#submit'] = array('alter_node_form_delete_submit');
}
}
}
}
?>
Mit diesem form_alter schaffe ich die Voraussetzung den normalen "Delete" Button der Nodeforms mit einer anderen Funktionalitaet zu versehen.
------------------------
Quiptime Group
Da geht noch was.
Moin Die Abfrage <?php
am 25.04.2009 - 11:52 Uhr
Moin
Die Abfrage
<?php
$form['#id'] == 'node-form'
?>
Der Wurm steckt in
<?php
$form['#node']['type'] == 'students_personality_inf'
?>
Wenn ich
<?php
$form['#id'] == 'node-form' && $form['#node']->type == 'mein-typenname'
?>
Danke für den Tipp mit
dsm($form);
. Diese Scrollbalken sind sehr nützlich.Bei mir sind das alles Bindestriche. Ist nicht bei D6 alles mit Unterstrichen?
_____________________________________________________
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
Hast Recht und es ist
am 25.04.2009 - 12:59 Uhr
Hast Recht und es ist logisch. $form['#node'] repraesentiert das Node Object und ist daher auch dementsprechend mit -> anzusprechen.
Um sich nicht selbst zu vewirren und der Ordnung halber kann man im form_alter die Zeile
$node = $form['#node']
einfuegen und danach mit der Node-Variablen-Syntax weiterarbeiten. nach dem Motto
<?php
$node = $form['#node'];
if ($form['#id'] == 'node-form' && $node->type == 'mein-typenname')
?>
Sorry fuer die kleine Freud'sche Fehlleistung beim schnellen posten weiter oben.
------------------------
Quiptime Group
Da geht noch was.
$node = $form['#node'] ist
am 25.04.2009 - 13:19 Uhr
$node = $form['#node']
ist natürlich sinnvoll, besonders weil ich damit danach noch weiter arbeite.Der Vollständigkeithalber hier nochmal die endgültige hook_form_alter:
<?php
function meinmodul_form_alter($form_id, &$form) {
$node = $form['#node'];
if ($form['#id'] == 'node-form' && $node->type == 'mein_nodetyp') {
foreach (element_children($form) as $child) {
$field = content_fields($child, $node->type);
if ($field) {
if ($field['type'] == 'image') {
$form[$child]['#collapsible'] = false;
}
}
}
}
}
?>
_____________________________________________________
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!
IRC Server: chat.freenode.net
Channel: #drupal.de
Für mehr User im Channel!