Anfänger - eigenes Personenverwaltungsmodul
am 29.05.2014 - 15:22 Uhr in
Hallo an die Profis,
bin ganz unerfahren im Drupal-Gebiet und habe mich beim Vorhaben eigenes Personenverwaltungsmoduls umzusetzen irgendwie in die Sackgasse manövriert
Zuerst die Grundinformationen:
Drupal 6.x
MySQL 5.5
Mein Vorhaben:
Ein eigenes kleines Modul, wo ich Personen-Daten (z.B.: Name, Vorname und Geburtsdatum) erfassen und in die DB speichern möchte. Zusätzlich sollte es möglich sein das Modul mit Personen-Id aufzurufen um die bestehende Daten ändern zu können.
Mein Problem:
Das Modul an sich war ja einfach umzusetzen. Die neuen Daten kann ich erfassen und in die DB ablegen. Wo ich Schwierigkeiten bekommen habe, ist beim Aufruf bestehender Daten. Ich kann die aus der DB (anhand der übergebenen Personen ID) gelesene Daten in die entsprechenden Felder eintragen und sehe die auch, doch beim Speichern (submit-Button) sind meine Änderungen an diesen Daten nicht vorhanden. D.h. wenn ich also z.B.: http://localhost/my_modul/person_data_entry_form?person_id=10 aufrufe und den Hans Müller aus der DB dazu ermittle und die Daten anzeige, klappt es alles wunderbar. Wenn ich jetzt aber den Vornamen auf Günther ändere und auf speichern gehe, dann bekomme ich in dazugehörigen submit-Funktion beim Vornamen immer noch den Hans. Die Daten hole ich da mit $form_data['values']['surname']. Das Ganze verwirrt mich einwenig, denn beim Neuerfassen der Daten alle ja korrekt läuft. Hat da jemand eine Idee. Danke in voraus.
Hier mein Code dazu:
function my_modul_perm()
{
return array( 'access person_data_entry_form' );
}
function my_modul_menu()
{
// Neue Person / Ändern
$items['my_modul/person_data_entry_form'] = array(
'type' => MENU_CALLBACK,
'access arguments' => array('access content'),
'page callback' => 'drupal_get_form',
'page arguments'=>array('person_data_entry_form'));
return $items;
}
function person_data_entry_form()
{
$form = array();
$m_pos = 1;
$m_person_id = $_GET['person_id'];
if(!empty($m_person_id))
{
$form['persid']=array(
'#type'=>'textfield',
'#default_value'=>' ',
'#title'=>t('Person Id'),
'#size'=>20,
'#maxlength'=>20,
'#weight'=>$m_pos++,
'#disabled'=>true);
}
$form['surname']=array(
'#type'=>'textfield',
'#required'=>true,
'#default_value'=>' ',
'#title'=>t('Name'),
'#size'=>45,
'#maxlength'=>45,
'#weight'=>$m_pos++);
$form['firstname']=array(
'#type'=>'textfield',
'#required'=>true,
'#default_value'=>' ',
'#title'=>t('Vorname'),
'#size'=>45,
'#maxlength'=>45,
'#weight'=>$m_pos++);
$oToday = new DateTime();
$form['birthday']=array(
'#type'=>'date',
'#required'=>true,
'#title'=>t('Geburtsdatum'),
'#date_year_range' => '-100:+0',
'#default_value' => date('Y-m-d', $oToday),
'#weight'=>$m_pos++);
$form['submit']=array(
'#type'=>'submit',
'#value'=>'Speichern',
'#weight'=>$m_pos++);
if(!empty($m_person_id))
{
$query = "select person_id, surname, firstname, birthday from {personen} where person_id=".$m_person_id;
$rs = db_query($query);
if ($rs)
{
if ($data = db_fetch_object($rs))
{
$form['persid']['#value'] = $data->person_id;
$form['surname']['#value'] = $data->surname;
$form['firstname']['#value'] = $data->firstname;
$form['birthday']['#value'] = date_convert($data->birthday,DATE_UNIX, DATE_ARRAY);
}
}
}
return $form;
}
function theme_person_data_entry_form($form)
{
$output.='<h1>Meine Personen</h1>';
$output .= drupal_render($form);
return $output;
}
function person_data_entry_form_validate($form, &$form_state)
{
$user_entered_surname = $form_state['values']['surname'];
$user_entered_firstname = $form_state['values']['firstname'];
$user_entered_birthday = $form_state['values']['birthday'];
if (empty($user_entered_surname)
|| empty($user_entered_firstname)
|| empty($user_entered_birthday))
{
form_set_error('mandatory_fields', "Bitte füllen Sie alle Pflichtfelder aus.");
}
}
function person_data_entry_form_submit($form, &$form_data)
{
$m_surname = trim($form_data['values']['surname']);
$m_firstname = trim($form_data['values']['firstname']);
$person_id = $form_data['values']['persid'];
$birthday = date_convert($form_data['values']['birthday'], DATE_ARRAY, DATE_UNIX);
}
function my_modul_theme()
{
return array('person_data_entry_form' => array(‘arguments’ => array(’form’ => NULL),),);
}
- Anmelden oder Registrieren um Kommentare zu schreiben
Hallo und Willkommen bei
am 29.05.2014 - 16:25 Uhr
Hallo und Willkommen bei Drupal.
Darf ich mal mit der uncharmanten Frage anfangen, warum Du dazu ein eigenes Modul schreiben willst? Diese Aufgabenstellung ist doch schon mit Bordmitteln plus dem Modul Views (aber das brauch man ohnehin immer) lösbar.
Dann schreibst Du, daß Du mit Drupal 6 arbeitest. Damit solltest Du nicht mehr anfangen. Die aktuelle Version ist Drupal 7 und die ist gut ausgereift. Wenn Drupal 8 erscheint fällt Drupal 6 aus der Wartung, da Drupal immer nur zwei Versionen unterstützt.
In Drupal 7 kannst Du dem User beliebige Felder hinzufügen. Das war bei Drupal 6 noch nicht so. Mittels Views kannst Du jetzt eine Übersicht über die aktuellen User anzeigen lassen. Mittels deine.domain.de/user/[ID] kommst Du auf die Profilseite dieses User.
Was willst Du sonst noch?
Hallo
am 29.05.2014 - 19:20 Uhr
Hallo und Danke für die Hinweise,
Drupal 6 muss ich vorerst verwenden, da ich ein bestehendes System für meine Studienzwecke verwenden wollte und wollte schauen wie das Ganze umgesetzt werden kann. Das mit den Views und einigen vergleichbaren Moduls habe ich mir schon angeschaut, doch diese sind von Umfang her zu groß für so einen simplen Aufgabe, die ich mir gestellt habe, außerdem wollte ich ein wenig selber coden und meine eigene DB Tabelllen und SQL Statements verwenden.
Kannst du mir den Grund meines Scheiterns nennen? Warum sind die Änderungen beim Submit nicht mehr vorhanden?
Den Grund kann ich eigentlich
am 29.05.2014 - 23:19 Uhr
Den Grund kann ich eigentlich nicht akzeptieren, was Du bei Drupal 6 brauchst ist nur noch bedingt in Drupal 7 für ein Node-Modul verwendbar. da hat sich unter der Haube eine Menge getan.
Es ist schon ewige Zeiten her, daß ich selbst ein Node-Modul in Drupal 6 geschrieben habe.
Du brauchst eine .install Datei, in der Du Dein Tabellenschema definierst mit install und uninstall Hook.
Im Modul brauchst Du folgende hooks:
Du kannst Dich ja am Node-Modul von Drupal 6 entlang hangeln. Mir fehlt in Deinem Code die Update Routine. Wenn Du also unbedingt in Drupal 6 ein eigenes Node-Modul codieren willst, solltest Du Dir das Buch "Pro Drupal Development" zulegen. Dort ist der Aufbau detailliert erklärt.
Aber nochmal: Es ist unsinnig!
Ich codiere heute nur noch, wenn ich unbedingt muß. Für fast alles gibt es bereits fertige Lösungen.
Außerdem ist gerade Views ein Alleinstellungsmerkmal von Drupal. Dieses Modul wandert bei Version 8 sogar in den Core. Darauf zu verzichten würde mir nie einfallen.
ebenso: KEIN drupal6
am 30.05.2014 - 05:23 Uhr
ebenso: KEIN drupal6 mehr!
alles umsetzen geht einfach mit feldern und inhaltstyp. dafür brauchst du kein modul
nun ja
am 30.05.2014 - 07:22 Uhr
wenn du unbedingt programmieren willst, obwohl es hier nicht nötig wäre, bitteschön.
Aufgrund der Meldung, die du bekommst, komme ich zu dem Ergebnis, dass du nicht unterscheidest zwischen INSERT und UPDATE.
Wenn ein Dokument gespeichert ist, muss ein INSERT schief gehen. Nach einer Veränderung der Daten kommt nur ein UPDATE in Frage.
Vielleicht hat das gereicht, dich in die richtige Richtung zu bringen.
Ansonsten kann ich mich nur den Kollegen anschließen: mache heute NICHTS mehr mit der 6er, es ist verlorene Liebesmüh'.
Ein Ersatzrad reicht mir völlig.
am 30.05.2014 - 08:42 Uhr
Hallo an alle, die geantwortet haben,
mir geht es ja nur um Verstehen, warum dies nicht funktioniert. Man kann doch nicht einem, der mit einem Platten liegen geblieben ist, sagen, dass er sich lieber ein neues Auto zulegen muss, denn mit dem neuen Auto passiert dass auf jeden Fall nicht. Ein Ersatzrad reicht mir also vorerst völlig.
Was ist mit Update Routine gemeint? Sind dabei die SQL Statements für Insert und UPDATE in die DB gemeint? Wenn ja, dann es geht nicht darum den Code für INSERT/UPDATE habe ich aus der Beschreibung raus genommen, denn diese funktionieren. Wie gesagt die Umgebung als solche mit Tabellen und richtigen INSRETS und UPDATES steht und funktioniert. Das Anlegen von neuen DATEN in die DB geht auch.
Wenn ich mit SUBMIT beim Ändern der Daten in diese Funktion hier rein springe:
function person_data_entry_form_submit($form, &$form_data)
{
$m_surname = trim($form_data['values']['surname']); // Bei neuen Einträgen ist der Wert richtig. Bei geänderten ist der Wert falsch, es wird nur ursprünglich eingelesener Wert zurückgegeben
$m_firstname = trim($form_data['values']['firstname']); // Bei neuen Einträgen ist der Wert richtig. Bei geänderten ist der Wert falsch, es wird nur ursprünglich eingelesener Wert zurückgegeben
$person_id = $form_data['values']['persid'];
$birthday = date_convert($form_data['values']['birthday'], DATE_ARRAY, DATE_UNIX); // Bei neuen Einträgen ist der Wert richtig. Bei geänderten ist der Wert falsch, es wird nur ursprünglich eingelesener Wert zurückgegeben
// HIER PASSIEREN DANN DIE INSERTS UND UPDATES etc......
}
sind die Werte in z.B.: $form_data['values']['surname'] vom ursprünglichen Datensatz und nicht die geänderten. D.h. wenn ich in der Maske den Vornamen ändere und möchte es speichern, habe ich in dem SUBMIT den alten Vornamen und nicht den geänderten.
Nochmals zu euer Vorschlag die Views etc, dafür zu verwenden, das werde ich auf jeden Fall tun und jede menge andere Module ausprobieren. Auch Drupal 7 und 8 ist auf meinem Plan. Doch fürs erste will ich ja nur wissen, was ich in diesem kleinen selbstgeschriebenen Modul für Drupal 6 falsch mache. Zu den Hooks. Ich habe mir einige hooks schon angeschaut:
hook_form
hook_validate
hook_perm
habe ich ja in meinem Code drin. Die
hook_node_info
hook_load
hook_insert
hook_update
hook_delete
sind soweit ich verstehe für die Schaffung der richtigen Bedingungen für das Modul da und sind meiner Meinung nach für mein Problem nicht relevant (bitte um Korrektur, wenn ich mich irre)
hook_view
scheint interessant zu sein, werde ich mir anschauen.
Danke in voraus
Das ist hier ein spezieller
am 30.05.2014 - 10:05 Uhr
Das ist hier ein spezieller Thread nur für Dich. Sorry, aber Du mußt Dich schon selber durch die alte Dokumentation wühlen. Ich habe ein Node-Modul zu Drupal 6 im September 2008 geschrieben. Ich bin in der Drupal 6 Materie nicht mehr drin. Für mich bringt es auch nichts, da noch mal einzusteigen und den anderen hier im Forum auch nicht.