[gelöst] node validierung mit hook_nodeapi()
Eingetragen von netzkoop (1820)
am 26.11.2008 - 17:18 Uhr in
am 26.11.2008 - 17:18 Uhr in
Hallo zusammen,
ich habe einen CCK-Nodetyp erstellt: anruf
Diesen möchte ich nun validieren beim node/xy/add oder node/xy/edit und bekomme es nicht hin.
Mein Ansatz:
<?php
function anruf_nodeapi(&$node, $op, $a3 = 'anruf_node_form', $a4 = NULL) {
switch ($op) {
case 'validate':
if ($node->field_ort == 'falsch') {
form_set_error('field_ort', t('Diese Eingabe ist ungültig'));
}
break;
}
}
?>
Funktioniert so leider nicht...
Wo schreibe ich die function hin? In die template.php, in die node.tpl.php ?
Muss ich $node noch extra übergeben? Ich dachte, das wird für jeden Node vom Typ anruf ausgeführt.
Oder muss ich das validate anders ansprechen?
Fragen über Fragen...
Merci
- Anmelden oder Registrieren um Kommentare zu schreiben
Validation API
am 26.11.2008 - 17:37 Uhr
Eventuell bringt Dich das hier weiter: Validation API
Vor allem das hoert sich interessant an:
Included with this project is an AJAX Validation module that allows you to run a form validation in AJAX and returns errors without reloading the page.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Danke für den Tipp! Hab ich
am 26.11.2008 - 20:11 Uhr
Danke für den Tipp! Hab ich installiert und scheint vielversprechend.
Ich werde berichten, sobald ich es hinbekomme.
Für meinen Ehrgeiz doch tiefere Drupal-Einsicht zu gewinnen:
Kann vielleicht jemand was zu einer Lösung mittels hook_nodeapi()
sagen?
Das wäre wunderbar :-)
Merci
-----------
Luca Curella
Kooperative Netze - Berlin
hook_validate
am 27.11.2008 - 11:40 Uhr
Kann vielleicht jemand was zu einer Lösung mittels hook_nodeapi() sagen?
Was glaubst Du warum ich in meiner Antwort nicht auf hook_nodeapi eingegangen bin?
Guckst Du: hook_validate
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Tja, weiss nicht genau.
am 27.11.2008 - 13:17 Uhr
Tja, weiss nicht genau. Vielleicht deshalb?
Changes made to the $node object within a hook_validate() function will have no effect. The preferred method to change a node's content is to use or hook_nodeapi($op='submit') instead
Allerdings ist mir das Prinzip noch nicht klar.
Ich dachte mit hook_nodeapi($op='validate') habe ich Einfluss auf das Node-Object beim Anlegen oder Editieren.
Analog zu einer validate() Function direkt auf die Form.
Sehe ich mir das Formular unter node/add/anruf an findet sich dort
<input id="edit-anruf-node-form" type="hidden" value="anruf_node_form" name="form_id"/>
Zuerst hab ich folgendes versucht:
<?php
function anruf_node_form_validate($form, &$form_state) {
if ( $form_state['values']['field_ort'] == 'falsch') {
form_set_error('field_ort', t('Diese Eingabe ist ungültig'));
}
}
?>
was allerdings auch nicht funktioniert.
Warum eigentlich nicht?
So bin ich überhaupt nur auf hook_nodeapi gekommen,
weil ich dachte auf CCK-Forms habe ich vielleicht aus irgendwelchen Gründen keinen Einfluss.
-----------
Luca Curella
Kooperative Netze - Berlin
Drupal 6 Form API - FAPI
am 27.11.2008 - 13:59 Uhr
Irgendeine Form, allerdings D5:
<?php
/**
* Menu callback; handle the adding/editing of a new menu group.
*/
function menu_groups_edit_group_form($type, $gid = 0) {
$form['menu_groups']['group_add']['group_name'] = array(
'#type' => 'textfield',
'#title' => 'Name',
'#required' => TRUE,
'#default_value' => $item['name'],
'#description' => 'Enter a name for the menu group. The human-readable name of this menu group. It is recommended that this name begins with a capital letter and consists only of letters, numbers, and spaces. This name must be unique to this menu group.',
'#weight' => 0,
'#validate' => array('my_validate' => array())
);
return $form;
}
// Die Validierungsfunktion
function my_validate () {
// Validierungslogik
}
?>
Der gepostete Code ist Drupal 5 und dient nur der optischen Demonstration.
Drupal 6
Sehe Dir auf api.drupal.org die Validierungsmoeglichkeiten in der FAPI 6 fuer Drupal 6 an.
#element_validate
<?php
function myelement_validate($element, &$form_state) {
if (empty($element['#value']) {
form_error($element, t('This field is required.'));
}
}
?>
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Lösung
am 07.12.2008 - 18:53 Uhr
Hab es hinbekommen...
Funktioniert wunderbar mit nodeapi() - ich mach auch noch eine Handbuchseite draus.
Mir war nicht klar, dass CCK die Felder als array zurückgibt auch bei Einzelwerten.
<?php
function sitehelper_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
if($node->type == 'anruf') {
#print '<pre>';
#print_r($node);
#print '</pre>';
switch ($op) {
case 'view':
break;
case 'validate':
// FEHLER falls in Ort was eingetragen wird und Landkreis bleibt bei "keine Angabe"
$ort = $node->field_ort[0][value];
$landkreis = $node->field_landkreis[0][value];
if(($ort != '') && ($landkreis == 'keine Angabe')) {
form_set_error('field_landkreis', 'Landkreis: Unerlaubter Wert da Ort nicht leer');
}
break;
}
}
}
?>
-----------
Luca Curella
Kooperative Netze - Berlin