Exposed Filters - Formular überschreiben klappt nicht
am 30.03.2010 - 10:55 Uhr in
Hallo,
ich komme hier gerade auf keinen grünen Zweig. Ich habe in einem View einige hervorgehobene Filter, darunter auch einen, der ein Von-Bis-Datum beinhaltet. Dieses möchte ich gern verändern, habe mich auch schon ein ganzes Stück weit mit dem Überschreiben von Formularen beschäftigt.
Hintergrund: Ich möchte die Zeit zwischen Geburtsjahren auswählen lassen, habe den Filter also auf das Jahr beschränkt. Man kann ja für die Werte einen Zeitraum entweder relativ zum aktuellen Zeitpunkt oder zwischen zwei Jahreszahlen angeben. Ich möchte die auswählbaren Jahre aber in Relation zum Geburtsjahr des Benutzers haben - was mit einem selsbt eingefügten Formular an gleicher Stelle schon fein geklappt hat.
Ich hab es schon mit hook_form_alter() versucht, auch mit meinmodul_preprocess_views_exposed_form analog zu dem Vorschlag hier: http://drupal.org/node/320992
Wenn ich letzteres mache, kann ich sogar den Text auf dem Submit-Button ändern, grundsätzlich scheint das ja zu funktionieren.
Der Filter selbst steckt in "date_filter_1", ich habe mir das Array per dsm() ausgeben lassen.
Relevante Punkte, wo ich denke, dass ich was überschreiben könnte, sind:
$vars['form']['date_filter_1']['min']['#date_year_range']
da steht das von mir in Views gesetzte 1900:2000 drin
$vars['form']['date_filter_1']['min']['#title']
„Von“-Datum -> da möchte ich auch gern was anderes stehen haben
$vars['form']['date_filter_1']['min']['year']['#options'] = $optionarray;
Das ist das Array, in dem ich für mein eigenes Formularfeld schon die korrekten Optionen erzeugt habe.
Dito für die 'max'-Werte.
default_date und default_to_date sind in diesem Zusammenhang wohl uninteressant, ist ja bloß die Voreinstellung.
Dann gäbe es noch $vars['form']['date_filter_1']['#children']
<div class="date-views-filter-wrapper">
<div class="container-inline-date date-clear"> </div>
<div class="date-clear form-item">
<div class="description">
<div class="container-inline-date date-clear-block">
<div class="form-item" id="edit-date-filter-1-min-wrapper">
<label for="edit-date-filter-1-min">„Von“-Datum: </label>
<div class="date-year">
<div class="form-item" id="edit-date-filter-1-min-year-wrapper">
<select name="date_filter_1[min][year]" class="form-select date-year" id="edit-date-filter-1-min-year" ><option value="" selected="selected">-Jahr</option><option value="1900">1900</option>...<option value="1999">1999</option><option value="2000">2000</option></select>
</div>
</div>
<input type="hidden" name="date_filter_1[min][month]" id="edit-date-filter-1-min-month" value="0" />
<input type="hidden" name="date_filter_1[min][day]" id="edit-date-filter-1-min-day" value="0" />
<input type="hidden" name="date_filter_1[min][hour]" id="edit-date-filter-1-min-hour" value="0" />
<input type="hidden" name="date_filter_1[min][minute]" id="edit-date-filter-1-min-minute" value="0" />
<input type="hidden" name="date_filter_1[min][second]" id="edit-date-filter-1-min-second" value="0" />
</div>
</div>
<div class="container-inline-date date-clear-block">
<div class="form-item" id="edit-date-filter-1-max-wrapper">
<label for="edit-date-filter-1-max">„Bis“-Datum: </label>
<div class="date-year">
<div class="form-item" id="edit-date-filter-1-max-year-wrapper">
<select name="date_filter_1[max][year]" class="form-select date-year" id="edit-date-filter-1-max-year" ><option value="" selected="selected">-Jahr</option><option value="1900">1900</option>...<option value="1999">1999</option><option value="2000">2000</option></select>
</div>
</div>
<input type="hidden" name="date_filter_1[max][month]" id="edit-date-filter-1-max-month" value="0" />
<input type="hidden" name="date_filter_1[max][day]" id="edit-date-filter-1-max-day" value="0" />
<input type="hidden" name="date_filter_1[max][hour]" id="edit-date-filter-1-max-hour" value="0" />
<input type="hidden" name="date_filter_1[max][minute]" id="edit-date-filter-1-max-minute" value="0" />
<input type="hidden" name="date_filter_1[max][second]" id="edit-date-filter-1-max-second" value="0" />
</div>
</div></div> </div> </div>
Ob es mir weiterhilft, wenn ich das jetzt zerschneide und mein Array da reinschreibe, sei mal dahin gestellt. Ich vermute, das mit dem Überschreiben würde ebenfalls nicht klappen. Egal, was ich zu ändern versuche, es klappt nichts davon ... also entweder habe ich da einen strukturellen Fehler drin oder die Sachen lassen sich nicht überschreiben.
Wobei, wenn ich dsm($vars['form']['date_filter_1']);
nach der Änderung noch mal ausgebe, kann ich sehen, dass $vars['form']['date_filter_1']['min']['year']['#options'] = $optionarray;
zum Beispiel korrekt angenommen wurde ... nur im Formular keine Änderung.
Erwähnen sollte ich vielleicht auch noch, dass ich bei einer ähnlichen Geschichte vor etwa einem Monat mit views_pre_execute ein ähnliches Problem hatte (dereine hat mir beim Drupalcamp freundlicherweise Starthilfe gegeben, bloß funktionierte seine Version ebenso wenig wie meine), der Wert wurde per dsm() richtig angezeigt, aber nicht übernommen, da hab ich es dann über einen "hartkodierten" Teil gelöst, den ich in die build-info als weitere AND-Bedingung eingefügt habe. Das geht hier aber natürlich nicht, ich will ja keine DB-Abfrage, sondern die Ausgabe modifizieren.
Wo liegt hier mein ganz grundlegender Denkfehler?
LG
Sonja
- Anmelden oder Registrieren um Kommentare zu schreiben
Man sollte mir ja nicht
am 30.03.2010 - 12:06 Uhr
Man sollte mir ja nicht nachsagen, dass ich schnell aufgebe ... leider sind manche Sachen einfach schwer rauszufinden, wenn man keine gute Lektüre dafür hat ... also der Knackpunkt war das "Widget".
Ich hatte mit die Geschichte mit dem Submit-Button noch mal angeschaut und festgestellt, dass der dem Formular gleichgeordnet ist, also bin ich eine Ebene höher gegangen und habe dsm($args) gemacht. Voilá, ich konnte sehen, was ich brauche, habe mich dann auch an der Syntax des Beispiels orientiert, und dieser code hier funktioniert jetzt:
$vars['widgets']['filter-date_filter_1']->widget = drupal_render($vars['form']['date_filter_1']['min']).drupal_render($vars['form']['date_filter_1']['max']);
Zumindest für die Ausgabe, die korrekte Weiterverarbeitung muss ich dann gleich mal testen!
LG
Sonja
Drupal Freelancer im Rheinland gesucht?