Formular themen bzw erweitern auf Seite user/xxx/edit/category name
am 03.04.2012 - 16:28 Uhr in
Hallo,
da ich mir einen Wolf suche, dies und das probiert habe und bisher wie verloren in der Wüste stehe, muss ich echt mal euch Experten um Hilfestellung bitten.
Also es geht darum, daß ich für exakt eine Kategorie im Profile, welche ich mittels variable_get() [darin befindet sich der Name der Kategorie, welche ich vorab ausgewählt habe] vorgebe, das Formular so umarbeiten muss, daß a) für jedes Element ein eigener Slider zur Anwendung kommt und b) idealerweise ein 2. Slider pro Begriff in der gewählten Kategorie zur Verfügung steht und beide Werte dann gespeichert werden.
Diese Sache hatte ich schon einmal mit e107 und einer prototype slider.js gelöst, wo es aber pur php und html war. Das passt so aber nicht bei drupal.
Über HOOK_form_alter komme ich zwar genau an die entsprechenden Fehler heran, doch hab ich bisher noch nicht durchschaut, wie ich dort dann die Ausgabe der html Elemente beeinflussen kann. Versuche ich (stümperhaft, da in dem Bereich bisher noch unbescholten) dagegen über die template Funktion zu gehen, habe ich bisher noch keine Selektion auf genau diese eine Kategorie erreicht. Dann werden alle Felder unter user/*/edit geändert. Das ist aber gar nicht nötig.
Ich blicke es einfach nicht, was ich da wie anstellen muss. Ein Schubser in die richtige Richtung, daß ich (wirklich nur ) das Formular frei gestalten und mit weiteren html Elemten ausgeben kann, wäre phantastisch.
Oder muss ich sogar eine komplett eigene Funktion schreiben, die gar nicht auf form_alter bzw das template zugreift? Bin völlig ratlos im Moment, wo ich ansetzen muss.
Mit besten Grüßen
Rainer
- Anmelden oder Registrieren um Kommentare zu schreiben

So jetzt habe ich doch einen
am 04.04.2012 - 00:23 Uhr
So jetzt habe ich doch einen Teilerfolg verbuchen können.
in der template.php hab ich folgendes drin:
<?php
if (variable_get('profile_graph_enabled', NULL)){
function MEINTHEME_theme($existing, $type, $theme, $path){
return array(
'user_profile_form' => array(
'arguments' => array('form' => NULL),
'render element' => 'form',
'template' => 'user-profile-form',
),
);
}
}
?>
Und in der user-profile-form.tpl.php habe ich nun eine Weiche eingebaut.
<?php
$category = $form['_category']['#value'];
#print $category;
switch($category) {
case 'Neigungen':
$output='hier steht mein html code drin'
print $output;
break;
}
print drupal_render($form);
?>
Dadurch habe ich wenigstens schonmal erreicht, daß meine eigene Ausgabe generiert wird. Blöderweise fehlt mir jetzt das komplette Fieldset und die Formularangabe nebst Speichern und Löschen Button. Aber ich komme Step by Step weiter.
Im html Code konnte ich mehrere Slider aktivieren, die auch unabhängig voneinander werkeln und ihre Daten ins entsprechende Input Feld übergeben. Jetzt muss ich noch die Daten filtern und den entsprechenden Input Feldern zuordnen. Es sieht auf den ersten Blick schon recht brauchbar aus.
Wenn mir jemand verrät, ob das nun der "sichere Weg" ist, über eine tpl Datei zu gehen, wäre ich mit dieser "Lösung" fast schon zufrieden. Allerdings hatte ich eigentlich vorgehabt, das in mein Modul mit zu integrieren. Solange ich nicht kapiere, wie man komplexe html Elemente dort unterbringt, wird das aber nichts.
Gibt es eigentlich eine elegante Lösung dafür, wie man die Daten aus dem Formular abfragen und neu aufbereiten kann? Ich habe jetzt einen recht umständlichen Weg über dprint_r ($form) genutzt und mir damit alle erforderlichen Daten Stückweise rausgefiltert und neu als Values eingetragen. Ich denke, da gibts sicher eine perfekte Möglichkeit seitens Drupal. Nur habe ich sie noch nicht entdeckt oder verstanden (wohl eher beides).
Hätte nicht gedacht, daß es so ausartet wegen der mehrfachen Slider :-(
Es scheint ein größeres
am 05.04.2012 - 20:36 Uhr
Es scheint ein größeres Problem zu sein, da bis jetzt niemand eine Antwort gab (das ist keine Kritik!).
Ich hab jetzt nochmal alles überdacht und die tpl Datei und Funktion in der template.php verworfen, da ich die gewünschte Funktion in meinem Modul soweit passend hinbekommen habe. Es arbeitet alles wunderbar soweit.
Allerdings wäre es wünschenswert, zu jedem Textfeld im Formular ein 2. Textfeld gleichen Typs zu bekommen. Die Daten aus beiden Textfeldern müssten dann entweder Komma separiert oder gleich als serialized Data in der Tabelle profile_values gespeichert werden.
Gibt es da eine Möglichkeit über hook_form_alter das soweit zu erweitern? Zu diesem Fall habe ich bisher noch gar keine Lösung oder einen Hinweis gefunden.
Also es sieht jetzt so aus, daß ich mittels hook_form_alter das normale Textfeld als Slider Textfeld ausgeben kann.
<?php
function mymodule_form_alter(&$form, &$form_state, $form_id) {
$path = drupal_get_path('module', 'mymodule');
drupal_add_js("$path/js/slider.js");
drupal_add_js("$path/js/range.js");
drupal_add_js("$path/js/timer.js");
$count =0;
$div_height = variable_get('mymodule_input_height', NULL);
$div_width = variable_get('mymodule_graph_input_width', NULL);
$category_field = variable_get('mymodule_category', NULL);
$pfields = _mymodule_get_field($category_field);
if (variable_get('mymodule_enabled', NULL) && variable_get('mymodule_category', NULL)){
$category = $form['_category']['#value'];
switch ($category) {
case $category_field:
drupal_add_css(drupal_get_path('module', 'mymodule') .'/mymodule.css');
$output ='';
$index =0;
foreach ($pfields as $pfield) {
$def_val = $form[$category_field][$pfield]['#default_value'];
$def_id = str_replace(array('][', '_', ' '), '-', $pfield);
$form[$category_field][$pfield]['#type'] = 'slider_textfield';
$form[$category_field][$pfield]['#attributes'] = 'onchange="s'.$index.'.setValue(parseInt(this.value))"';
$form[$category_field][$pfield]['#field_prefix'] = '<table><tr><td><div class="slider" id="slider-'.$index.'" style="background-color: transparent; background-repeat: repeat-y; background-attachment: scroll; background-position: 0% 0%; background-clip: border-box; background-origin: padding-box; width: '.$div_width.'px; height: '.$div_height.'px; background-image: url("http://localhost/backup2/sites/all/modules/mymodule/images/bg4.h.gif"); background-size: '.$div_width.'px '.$div_height.'px;" tabindex="0">';
$form[$category_field][$pfield]['#field_suffix'] = '</div>
<script type="text/javascript">
var s'.$index.' = new Slider(document.getElementById(\'slider-'.$index.'\'), document.getElementById(\'edit-'.$def_id.'\'));
s'.$index.'.onchange = function () {
document.getElementById(\'edit-'.$def_id.'\').value = s'.$index.'.getValue();
};
s'.$index.'.onchange = function () {
document.getElementById(\'label-'.$def_id.'\').innerHTML = s'.$index.'.getValue();
};
s'.$index.'.setValue('.$def_val.');
window.onresize = function () {
s'.$index.'.recalculate();
};
</script>
</td>
<td>
<span id="label-'.$def_id.'" >'.$def_val.'</span></td>
</tr>
</table>';
$index++;
}
break;
}
return $form;
}
}
?>
Wenn das nicht realisierbar ist, ein weiteres Textfeld einzubinden, muss ich mich nach einer anderen Lösung umsehen. *seufz*
Ich hoffe mal, es stellt eine Herausforderung dar, diesen Fall mal zu durchleuchten, ob es machbar ist. Wenn ja, bitte nicht nur mit "ja das geht....()" antworten ;-)
Schönen Gruß
Rainer