[gelöst] dynamische formularfelder in db_query aufrufen
am 20.09.2010 - 17:28 Uhr in
Hallo zusammen,
ich möchte einen neuen Nodetyp [Spieltag] anlegen, der folgende Informationen aufnehmen kann:
- Titel, Body (also über Standardnode)
- zusätzlich zwei Felder: Saison & Spieltag.
- und dann mit einer Schleife über alle Nutzer der Site (oder einer Gruppe) einen entsprechenden Punktwert je Nutzer hinterlegen. Das heisst es gibt einen DB-Eintrag in der Nodes Tabelle und dann entsprechend der Anzahl von Nutzern DB-Einträge in einer Extra Tabelle [Spieltage] mit Punktwert je Nutzer und Spieltag und Saison.
Für die Anforderungen hinsichtlich des Punktwertes (je Nutzer) habe ich nichts passendes innerhalb CCK gefunden, so dass ich ich mich an die Entwichlung eines eigenen Node-Moduls gesetzt habe. Hier komme ich leider nur bis zum Formular, welches mir für die Nutzer auch dynamische Formularfelder (in der Form: $form['account'.$users_db_field->uid] also bspw. form name ="account1" für den Adminaccount) erzeugt. Die db_query innerhalb einer while Schleife über die user-tabelle mit insert into will einfach nicht funktionieren, in bezug auf die dynamischen Formelemente ("account.uid"). Ich denke es liegt an Syntax- Problemen innerhalb der db_query. Die uid's der Nutzer bekomme ich mittels db_query in die Tabelle "Spieltage" - d.h. es werden entsprechend Records pro Nutzer geschrieben. Es geht also "nur" um die Punktwerte, die nicht korrekt übergeben werden. Wie bekomme ich ein dynamisches Form Element innerhalb der db_query Funktion (in meinem Bsp.: account1, account2, ... accountn) aufgerufen?
Danke für Tipps und Hinweise,
Torsten
- Anmelden oder Registrieren um Kommentare zu schreiben
Es wäre viel einfacher, wenn
am 20.09.2010 - 20:54 Uhr
Es wäre viel einfacher, wenn du uns den entsprechenden Code posten würdest.
ok - sehr gern. Der
am 21.09.2010 - 12:35 Uhr
ok - sehr gern. Der Knackpunkt ist, der letzte Parameter der INSERT Abfrage (am Ende des Codeausschnitts) - der nicht tut.
/**
* Implementierung von hook_form().
*/
function spieltage_form($node) {
// Fragt Metadaten für diesen Node-Typ ab (für die Labels von Titel und Body).
// Wir haben sie in spieltage_node_info() definiert.
$type = node_get_types('type', $node);
$form['title'] = array(
'#type' => 'textfield',
'#title' => check_plain($type->title_label),
'#required' => TRUE,
'#default_value' => $node->title,
'#weight' => -5,
'#maxlength' => 255,
);
$form['body_filter']['body'] = array(
'#type' => 'textarea',
'#title' => check_plain($type->body_label),
'#default_value' => $node->body,
'#rows' => 7,
'#required' => TRUE
);
$form['body_filter']['filter'] = filter_form($node->format);
$form['saison'] = array(
'#type' => 'textfield',
'#title' => t('Saison'),
'#required' => TRUE,
'#default_value' => isset($node->saison) ? $node->saison : '',
'#weight' => 4
);
$form['body_filter']['filter'] = filter_form($node->format);
$form['spieltag'] = array(
'#type' => 'textfield',
'#title' => t('Spieltag'),
'#required' => TRUE,
'#maxlength' => 2,
'#size' => 2,
'#default_value' => isset($node->spieltag) ? $node->spieltag : '',
'#weight' => 5
);
/**
* Zugiff auf DB users, um die user im formular ausgeben zu lassen.
*/
$player_points = db_query('SELECT * FROM {users} u LEFT JOIN {spieltage} s ON u.uid = s.player_id');
while ( $users_db_field = db_fetch_object ($player_points) ) {
$form['account'.$users_db_field->uid] = array(
'#type' => 'textfield',
'#title' => t($users_db_field->name.' ['.$users_db_field->uid.']'),
'#required' => TRUE,
'#default_value'=> $node->st_points,
'#weight' => 7
);
}
/**
* Implementierung von hook_insert().
*/
function spieltage_insert($node) {
$player_points_initial = db_query('SELECT * FROM {users} order by name');
while ( $users_db_field_initial = db_fetch_object ($player_points_initial) ) {
db_query("INSERT INTO {spieltage} (nid, vid, saison, spieltag, player_id, st_points) VALUES (%d, %d, '%s', %d, %d, %d)", $node->nid, $node->vid, $node->saison, $node->spieltag, $users_db_field_initial->uid, $form->account[$users_db_field_initial->uid]);
}
}
Das kann auch gar nicht
am 21.09.2010 - 17:34 Uhr
Das kann auch gar nicht funktionieren, was du da machst und zwar in zweifacher Hinsicht:
1. im hook_insert gibt es die Variable $form nicht. Ergo kannst du von dort auch keine Werte abrufen.
2. selbst wenn du $form zur Verfügung hättest, dann wäre das immer noch ein Array. Du versuchst aber, die Variable als Object anzusprechen.
Du hast also alle Infos nur im Node-Object zur Verfügung. Das Problem ist, dass ich keine Ahnung habe, ob und wie man $node->account1, $node->account2, $node->account3 usw. dynamisch ansprechen kann.
Eine Möglichkeit gäbe es allerdings:
Du könntest erstmal '#tree' für dein Formular auf TRUE setzen, damit verschachtelte Form-Elemente auch in dieser Struktur in die Variable kommen.
Dann könntest du die Textfelder für die Spielerpunkte in eine solche verschachtelte Struktur bringen und die kannst du dann dynamisch im hook_insert abrufen.
Klingt sehr theoretisch, deswegen mal hier der entsprechende Code:
<?php
/**
* Implementierung von hook_form().
*/
function spieltage_form($node) {
// Fragt Metadaten für diesen Node-Typ ab (für die Labels von Titel und Body).
// Wir haben sie in spieltage_node_info() definiert.
$type = node_get_types('type', $node);
$form['#tree'] = TRUE; // --> wichtig für die Struktur, sonst bringen alle Änderungen nichts
/**
* Hier kommt der Code für das restliche Formular
*/
/**
* Zugiff auf DB users, um die user im formular ausgeben zu lassen.
*/
$player_points = db_query('SELECT * FROM {users} u LEFT JOIN {spieltage} s ON u.uid = s.player_id');
while ( $users_db_field = db_fetch_object ($player_points) )
{
$form['player_points'][$users_db_field->uid] = array(
'#type' => 'textfield',
'#title' => t($users_db_field->name.' ['.$users_db_field->uid.']'),
'#required' => TRUE,
'#default_value'=> $node->st_points,
'#weight' => 7
);
}
/**
* Implementierung von hook_insert().
*/
function spieltage_insert($node) {
$player_points_initial = db_query('SELECT * FROM {users} order by name');
while ( $users_db_field_initial = db_fetch_object ($player_points_initial) )
{
$sql = "INSERT INTO {spieltage} (nid, vid, saison, spieltag, player_id, st_points) VALUES (%d, %d, '%s', %d, %d, %d)";
//durch das strukturierte Anlegen der Felder werden alle Werte im Array "player_points" gespeichert und können über den Schlüssel (UID) angesprochen werden
$points = $node->player_points[$users_db_field_initial->uid];
db_query($sql, $node->nid, $node->vid, $node->saison, $node->spieltag, $users_db_field_initial->uid, $points);
}
}
?>
Damit dürfte es eigentlich klappen. Indem die Felder in
$form['player_points'][uid]
angelegt wurden, sind sie in dieser strukturierten Form auch im Node-Object zu finden. In $node->player_points[1] stehen dann also die Punkte des Admins usw.vielen dank. damit
am 22.09.2010 - 14:28 Uhr
vielen dank. damit funktioniert es. versuche jetzt mal zu verstehen, was du da entwickelt hast und dann die update abfrage zu implementieren. viele grüße, torsten