Der beste Weg, um es zu implementieren, indem Sie hook_form_alter implementieren . Die Logik ist so, dass Sie die benutzerdefinierte Validierungsfunktion für alle Inhaltstypformulare hinzufügen müssen, die dasselbe Feld wie field_phone
(in Ihrem Fall) haben und dynamisch sein müssen. Einmal war ich auf eine solche Situation gestoßen, musste mich aber gegen das einzelne Formular validieren. Der folgende Code ist fast dieselbe Implementierung, aber ich habe ihn für Ihren Fall viel dynamischer gestaltet.
Erstellen Sie ein Modul und implementieren Sie hook_form_alter wie folgt :
/**
* Implementation of hook_form_alter
*/
function MODULE_NAME_form_alter(&$form, $form_state, $form_id) {
// $cck_type contains the array of all Drupal content type machine names
$cck_type = array_keys(node_type_get_types());
// Machine names of those content type whose instance you want to validate
// Add your machine name for whom you want to validate. You can get the
// machine names of content types from Admin > Structure > Content types. Fill
// as many required bu you.
$my_types = array('CCK_TYPE_1', 'CCK_TYPE_2', 'CCK_TYPE_3');
// Since, a user fill one form at particular time. The variable $current_type
// hold the Content Type machine name for current form.
if (arg(0) == 'node' && arg(1) == 'add') {
$current_type = arg(2);
} elseif ((arg(0) == 'node') && is_numeric(arg(1)) && (arg(2) == 'edit')) {
$node = node_load(arg(1));
$current_type = $node->type;
}
// gets current form's ID
$id_of_form = $form['form_id']['#value'];
// checks if the current form is part of Drupal Content Type
if (in_array($current_type, $my_types) && in_array($current_type, $cck_type)) {
$id_of_form = $form['form_id']['#value'];
if ($form_id == $id_of_form) {
// Adding custom validation function to the form so that we can validate
// the field of that form
$form['#validate'][] = 'custom_validates';
}
}
}
Implementieren Sie jetzt die benutzerdefinierte Validierungsfunktion zur Validierung.
/**
* Implementation of custom validation for validating 'field_phone' in your case.
* It can be any field, assuming that it is part of that form.
*/
function custom_validates(&$form, $form_state) {
$values = $form_state['values'];
// Language of the $form
$lang = $form['language']['#value'];
$field_phone = $values['field_phone'][$lang][0]['value'];
// In my case, for testing purpose, I had set the strings in Phone field
if (!is_integer($field_phone)) {
form_set_error('field_phone', 'Invalid phone number');
}
}
Bei dem einfachen Ansatz müssen Sie nur das $form_id
Formular Ihres Inhaltstyps überprüfen und die benutzerdefinierte Validierungsfunktion wie folgt hinzufügen:
/**
* Implementation of hook_form_alter
*/
function MODULE_NAME_form_alter(&$form, $form_state, $form_id) {
if (($form_id == 'content_type_form_id_1') ||
($form_id == 'content_type_form_id_2') ||
($form_id == 'content_type_form_id_3')) {
// Adding custom validation function to the form so that we can validate
// the field of that form
$form['#validate'][] = 'custom_validates';
}
}
Das Problem bei diesem einfachen Ansatz besteht jedoch darin, dass Sie die Formular-ID jedes einzelnen Formulars für den Inhaltstyp kennen und diese dann ||
wie zuvor gezeigt zur if-Anweisung mit dem Operator hinzufügen müssen. Dies wird viel Zeit in Anspruch nehmen.
Ich habe entsprechende Kommentare abgegeben, damit Sie die Logik und Implementierung verstehen.
Ich hoffe, dass meine Lösung Ihr Problem beantwortet.