problem mit hook_form_alter()
am 24.06.2009 - 13:27 Uhr in
Hallo,
ich baue gerade eine mehrsprachige Webseite.
Wenn man Content einstellt kann dieser entweder auf "language neutral", "deutsch" oder auf "türkisch" sein.
Das macht das locale modul. Es stellt dann im node/add -formular eine selectbox dar, wo man die drei optionen
wählen kann.
Allerdings will der Kunde das man nur deutsch oder türkisch wählen kann, also habe ich versucht die "language neutral"
option mittels hook_form_alter() aus dem formular zu entfernen.
Das klappt aber nicht...
ich kann zwar:
a) das komplette eingabe feld löschen mit: unset($form['language']);
b) alle optionen löschen mit: unset($form['language']['#options']);
ich kann auch den inhalt des arrays '#options' ändern (wenn ich es mit dpm() anzeige ist alles so wie es sein soll),
aber dann anschliessend sind im dargestellten formular TROTZDEM alle optionen wieder vorhanden.
Warum wird meine Änderung wieder "überschrieben"? Was mache ich falsch?
Gruß,
Sebastian
- Anmelden oder Registrieren um Kommentare zu schreiben
Code
am 24.06.2009 - 13:48 Uhr
Zeig doch mal Deinen Code.
Stefan
--
sei nett zu Deinem Themer
da gibt es nicht viel zu
am 24.06.2009 - 14:39 Uhr
da gibt es nicht viel zu zeigen. ich entferne mit array_shift($form['language']['#options']); das erste element aus dem optionen-array. es ist dann auch weg (dpm($form) sagt das ;) aber im gerenderten formular ist die option dann wieder vorhanden.
habe auch versucht das #options array komplett zu ersetzen $form['language']['#options'] = array ("a"=>"aaa", "b"=>"bbbb");
aber dann sind im formular trotzdem die ursprünglichen optionen drin.
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
das gleiche problem (es tut
am 24.06.2009 - 14:49 Uhr
das gleiche problem (es tut sich nichts) tritt auch auf, wenn ich versuche mittels hook_form_alter() gewisse dinge in einer selectbox vorzuselektiern (also #default_value zu ändern).
gibt es noch andere möglichkeiten an einem formular herumzudoktorn?
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
hook_form_alter
am 24.06.2009 - 15:27 Uhr
hook_form_alter
ist der (einzig wahre) Weg, in dieser Art Änderungen an den Formularen vorzunehmen.Ohne jedoch Deinen Code zu sehen, kann ich eventuelle Kunstfehler Deinerseits nicht erkennen.
Stefan
--
sei nett zu Deinem Themer
der code ist eigtl. nicht
am 24.06.2009 - 15:59 Uhr
der code ist eigtl. nicht mehr als die eine zeile von oben ;)
aber extra für dich:
function meinmodul_form_alter(&$form, $form_state, $form_id)
{
if($form_id=='rezept_node_form') {
$bla = array_shift($form['language']['#options']);
dpm($form); //<- hier sieht man das das element wirklich RAUS ist.
}
}
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
hook_form_alter() vs. hook_translation_form_alter()
am 24.06.2009 - 16:40 Uhr
Mit form_alter zu arbeiten ist kein rumdoktern.
Zu Deinem Problem.
Hast Du statt dem "normalen" hook_form_alter() schon den hook_translation_form_alter() getestet?* Add translation option to content type form.
* Alters language fields on node forms when a translation is about to be created.
und eventuell
Modul "Preserve language"?
Moeglicherweise erspart Dir "Preserve language" ein form_alter.
------------------------
Quiptime Group
Snipped als Ideen-Anreger
am 24.06.2009 - 16:38 Uhr
form_alter im i18n Modul (i18n.module)
<?php
function i18n_form_alter(&$form, $form_state, $form_id) {
switch ($form_id){
...
default:
// Extended language for node edit form
if (isset($form['#id']) && $form['#id'] == 'node-form') {
if (isset($form['#node']->type) && variable_get('language_content_type_'. $form['#node']->type, 0)) {
$form['language']['#options'] = i18n_node_language_list($form['#node'], TRUE);
}
}
?>
Eventuell hilft Dir das Snipped als Ideen-Anreger.
Beachte die Problematik bei Nodetypes die keine Multilanguage-Nodetypes sind. Eventuell gibt es da ein Problem wenn generell language neutral fehlt. Must Du testen.
------------------------
Quiptime Group
mhh.. interessant. wie man
am 25.06.2009 - 09:26 Uhr
mhh.. interessant. wie man an letzterem codeschnipsel sieht macht i18n_form_alter genau das selbe und da funktioniert es...
jetzt hab ich auch keine idee mehr, aber danke für die vielen anregungen!
________________________________________________________________________
Drupal-Entwicklung und Web-Design in Darmstadt || www.brightsolutions.de
Sofern das Problem noch
am 25.09.2009 - 14:09 Uhr
Sofern das Problem noch existiert und vielleicht zur Doku für Interessierte
hier ein Link zur Lösung des Problems:
http://drupal.org/node/250891
http://drupal.org/node/250891#comment-2041110
Und hiermit kann die Option "Language neutral" aus der Language Selection Liste entfernt werden:
unset($form['language']['#options'][$translation->language]);
andere lösung
am 20.05.2010 - 13:09 Uhr
sofern das Problem immer noch besteht. Bei mir hat eine sehr simple Lösung funktioniert.
Ich musste meinem Modul das ich selbst angelegt hatte eine höhere "Weight" als das i18n Modul hat gegeben. Bei mir reichte 101. Ansonsten kann man in der Tabelle "system" nachschauen.
folgender aufruf einmal in Modul oder sonstwo sollte reichen:
db_query("UPDATE {system} SET weight = [yournumber] WHERE name = 'yourmodulename'");
mehr infos hier: http://drupal.org/node/110238
Mein form_alter sieht z.b. so aus. Um bei einer bestimmten node edit form nur die vom user voreingestellte Sprache in der Select Box anzuzeigen.
<?php
function meinmodul_form_alter(&$form, &$form_state, $form_id) {
// you need more weight than i18n module
//db_query("UPDATE {system} SET weight = 101 WHERE name = 'meinmodul'");
if($form_id == "news_node_form") {
global $user;
if(isset($user->language) && $user->language && in_array("importeure",$user->roles)) {
// do it only with importeure wich have a preferred language
if(array_key_exists($user->language,$form['language']['#options'])) {
// delete all other languages from options select
$form['language']['#options'] = array($user->language => $form['language']['#options'][$user->language]);
}
}
}
}
?>