Ergebnis-Daten benutzerbezogen eintragen
am 28.07.2008 - 14:06 Uhr in
Hallo erstmal...
ich habe für unseren Sportverein mit Drupal eine neue WebSeite aufgesetzt.
Soweit komme ich super damit klar.
Benutzer mit Profil-Feldern angelegt, importiert... alles ok
Inhaltstyp "Termin" angelegt, Termine importiert....alles ok
Nun mein "Problem":
Da wir ja nun an fast jedem "Termin" ein Turnier veranstalten, sollen die Ergebnisse natürlich eingegeben werden.
dh. Neuer Inhaltstyp "Ergebnisverwaltung" mit Auswahl(DropDown)-Feldern "User Reference" und "Termin", und Texteingebe-Feld "Ergebnis" angelegt.
Soweit so gut. Geht auch. Ich möchte aber:
- Den Benutzer "UserReference" nicht über den Benutzernamen sondern über das Profil-Feld "Mitgliedsnummer" auswählen können
- Das DropDown-Feld "Termin" filtern und sortieren (z.B. nur Termine in 2008)
- Keine Titel für diesen Node eingeben müssen.
Ich hoffe ich habe das gut erklärt und ihr könnt mir weiterhelfen.
Danke schon im voraus
Sepp
- Anmelden oder Registrieren um Kommentare zu schreiben
userreference etc.
am 28.07.2008 - 15:02 Uhr
Moin!
- Den Benutzer "UserReference" nicht über den Benutzernamen sondern über das Profil-Feld "Mitgliedsnummer" auswählen können
Hm, das wurde vor längerer Zeit schonmal beim Modul direkt gefragt, es gab jedoch keine Antwort.
Wahrscheinlich bleibt Dir nichts anderes übrig, als userreference.module zu ändern (ab Zeile 358):
<?php
$result = db_query('SELECT u.name, u.uid FROM {users} u '. implode(' ', $join) .' WHERE '. implode(' AND ', $where) .' ORDER BY u.name ASC', $args);
while ($user = db_fetch_object($result)) {
$users[$user->uid] = $user->name;
}
?>
Das musst Du dann halt entsprechend anpassen (SQL erweitern und
<?php
$users[$user->uid] = $user->Mitgliedsnummer
?>
- Das DropDown-Feld "Termin" filtern und sortieren (z.B. nur Termine in 2008)
Wie baust Du das dropdown?
- Keine Titel für diesen Node eingeben müssen.
http://drupal.org/project/auto_nodetitle
hth,
Stefan
DropDown Termin
am 28.07.2008 - 15:08 Uhr
Hallo Stefan,
danke für deine schnelle Antwort. Werde ich heute abend ausprobieren.
Da Dropdown "Termin" baue ich als Feld eines Inhaltstyps aus dem Inhaltstyp "Termin"
Danke
Sepp
Termin
am 28.07.2008 - 18:22 Uhr
Na wenn Du die Auswahlliste sowieso selbst erstellst, also auch die Daten zusammensammelst, kannst Du doch auch gleich nach dem Datum filtern, oder?
Stefan
stBorchert schrieb Na wenn
am 28.07.2008 - 20:07 Uhr
Na wenn Du die Auswahlliste sowieso selbst erstellst, also auch die Daten zusammensammelst, kannst Du doch auch gleich nach dem Datum filtern, oder?
Du hast natürlich völlig recht. Ich beschäftige mich jetzt seit 2 Wochen mit Drupal und so lansam begreifs ich.
Also:
Anleitung DropDown-Liste:
Unter Strukturierung -> Ansichten eine Ansicht erstellen (ohne Seitenausgabe) mit dem Feld, das man später braucht, gefiltert und sortiert.
Diese Ansicht dann unter im Inhaltstyp als Feld mit Auswahlliste aus diesem Inhaltstyp mit der Ansicht die man vorher erstellt hat, angeben.
Drupal-Original-Zitat
Fortgeschritten - Beiträge, auf die verwiesen werden kann (Ansicht)
Also was für Profis !! ;-)
Bezüglich der User-Auswahl: Die Stelle ist schon mal richtig ! Danke !
Ich tüftle noch an der SQL-Abfrage !!
Sepp
Userreference bauen; Fertig !
am 29.07.2008 - 19:38 Uhr
Hallo Stefan,
danke für den Tipp. Die Stelle in Modules\cck\userrefence.module war genau richtig.
Ich habe dort folgendes eingefügt:
<?php
$users = array();
$profile = array();
$result = db_query('SELECT u.name, u.uid FROM {users} u '. implode(' ', $join) .' WHERE '. implode(' AND ', $where) .' ORDER BY u.name ASC', $args);
while ($user = db_fetch_object($result)) {
// $users[$user->uid] = $user->name; // alter Code
//ab hier neuer Code
// Alle Profilfelder abfragen
$profil_result = db_query('SELECT f.fid, f.value FROM {profile_values} f WHERE uid ='. $user->uid.' ORDER by f.fid ASC');
while ($profile = db_fetch_object($profil_result)) {
switch ($profile->fid) {
case 1: // fid = 1 Mitgliedsnummer wenn nicht vorhanden dann "xxx"
if (!$profile->value) {
$mitgliedsnummer = 'xxx';
}
else {
$mitgliedsnummer = str_pad(strval($profile->value),3,'0',STR_PAD_LEFT);
}
break;
case 3: // fid = 3 Vorname
$vorname = $profile->value;
break;
case 4: // fid = 4 Nachname
$users[$user->uid] = $mitgliedsnummer .'| '.$vorname.' '.$profile->value;
break;
}
}
//bis hier neuer Code
}
array_multisort($users, SORT_ASC); // sortieren
return $users;
}
?>
Kann man sicher eleganter machen.
Danke nochmal
Sepp
sql join
am 29.07.2008 - 21:38 Uhr
Ich überlege gerade, ob man das nicht auch in einem SQL-Statement (und somit auch nur mit einer Schleife) hinbekommt.
<?php
$users = array();
$profile = array();
// JOIN für Mitgliedsnummer
$join[] = 'LEFT JOIN {profile_values} p1 ON p.uid = u.uid AND p.fid = 1';
// JOIN für Vorname
$join[] = 'LEFT JOIN {profile_values} p3 ON p.uid = u.uid AND p.fid = 3';
// JOIN für Nachname
$join[] = 'LEFT JOIN {profile_values} p4 ON p.uid = u.uid AND p.fid = 4';
$result = db_query('SELECT u.name, u.uid, p1.value AS mnummer, p3.value AS vorname, p4.value as nachname FROM {users} u '. implode(' ', $join) .' WHERE '. implode(' AND ', $where) .' ORDER BY u.name ASC', $args);
while ($user = db_fetch_object($result)) {
$mitgliedsnummer = 'xxx';
if ($user->mnummer) {
$mitgliedsnummer = str_pad(strval($user->mnummer),3,'0',STR_PAD_LEFT);
}
$users[$user->uid] = $mitgliedsnummer .'| '.$user->vorname.' '.$user->nachname;
}
array_multisort($users, SORT_ASC); // sortieren
return $users;
?>
Nur so eine Überlegung... :-)
Stefan
Subselect statt Join
am 30.07.2008 - 07:45 Uhr
Joins sind performance-Killer, vieleicht sollte man solche Abfragen eher mit Sub-Queries machen?
Viele Grüße,
www.maximago.de
Perfomancetest
am 30.07.2008 - 08:03 Uhr
@maximago:
Nur so eine Überlegung... :-)
^^^ Wie gesagt. ^^^
Joins sind performance-Killer, vieleicht sollte man solche Abfragen eher mit Sub-Queries machen?
Ha, das schreit nach Performancetest und Zeitvergleich :-)
Stefan
Join haut hin
am 30.07.2008 - 08:13 Uhr
Hallo Stefan,
ja es funktioniert mit dem Join, man muß nur die Tabellen noch richtig angeben
LEFT JOIN {profile_values} p1 ON p1.uid = u.uid AND p1.fid = 1
dann klappts.
Ausserdem kann man das $users-Array nicht sortieren, da sonst die uid nicht mehr stimmt. Schade :-(
<?php
$users = array();
$profile = array();
// JOIN für Mitgliedsnummer
$join[] = 'LEFT JOIN {profile_values} p1 ON p1.uid = u.uid AND p1.fid = 1';
// JOIN für Vorname
$join[] = 'LEFT JOIN {profile_values} p3 ON p3.uid = u.uid AND p3.fid = 3';
// JOIN für Nachname
$join[] = 'LEFT JOIN {profile_values} p4 ON p4.uid = u.uid AND p4.fid = 4';
$result = db_query('SELECT u.name, u.uid, p1.value AS mnummer, p3.value AS vorname, p4.value as nachname FROM {users} u '. implode(' ', $join) .' WHERE '. implode(' AND ', $where) .' ORDER BY u.name ASC', $args);
while (
$user = db_fetch_object($result)) {
$mitgliedsnummer = 'xxx';
if ($user->mnummer) {
$mitgliedsnummer = str_pad(strval($user->mnummer),3,'0',STR_PAD_LEFT);
}
$users[$user->uid] = $mitgliedsnummer .'| '.$user->vorname.' '.$user->nachname;
}
return $users;
?>
@maximago: Da ich ja nicht der SQL-Experte bin (habt iht ja sicher schon gemerkt ;-)) ) muß ich mich erstmal über subselect schlau machen. Da wir aber nur 40 Mitglieder haben (und in naher Zukunft auch nicht viel mehr haben werden) ist die Performance aber auch so ok.
Sepp
Sortierung
am 30.07.2008 - 08:23 Uhr
man muß nur die Tabellen noch richtig angeben
LEFT JOIN {profile_values} p1 ON p1.uid = u.uid AND p1.fid = 1
Ah, stimmt. Hatte ich nicht gesehen.
Ausserdem kann man das $users-Array nicht sortieren, da sonst die uid nicht mehr stimmt.
Das hätte vorher aber auch schon nicht funktionieren dürfen. array_multisort behält die Zuordnung
Schlüssel => Wert
nämlich grundsätzlich nicht bei. Was spricht gegen die Verwendung von asort?Stefan
asort ist ok
am 30.07.2008 - 08:28 Uhr
Hallo Stefan,
Was spricht gegen die Verwendung von asort?
php überrascht mich immer wieder. Es gibt wohl für alles einen Befehl !
Funktioniert 100prozentig !!
Danke
Sepp