Mam listę rozwijaną, która wyświetla różne pola w zależności od tego, co zostało wybrane, i wiem, że mogę przeszukiwać widoczność stanów, ale kiedy próbuję użyć wymaganego, wyświetlany jest * zakres, ale tak naprawdę nie jest wymagany. Chodzi mi o to, że nawet jeśli jest to „wymagane”, mogę nacisnąć Prześlij i nie otrzymać komunikatu o błędzie od Drupala. Czy robię coś źle, czy jest to obecnie zepsute w Drupal 7.8?
$form['host_info'] = array(
'#type' => 'select',
'#title' => t("Host Connection"),
'#options' => array(
'SSH2' => t('SSH2'),
'Web Service' => t('Web Service'),
),
'#default_value' => t(variable_get('host_info', 'SSH2')),
'#description' => t("Specify the connection information to the host"),
'#required' => TRUE,
);
$form['ssh_host'] = array(
'#type' => 'textfield',
'#title' => t("Host Address"),
'#description' => t("Host address of the SSH2 server"),
'#default_value' => t(variable_get('ssh_host')),
'#states' => array(
'visible' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
'required' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
),
);
$form['ssh_port'] = array(
'#type' => 'textfield',
'#title' => t("Port"),
'#description' => t("Port number of the SSH2 server"),
'#default_value' => t(variable_get('ssh_port')),
'#states' => array(
'visible' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
'required' => array(
':input[name=host_info]' => array('value' => t('Web Service')),
),
),
);
7
javascript
Sathariel
źródło
źródło
name
. To musi być:input[name="host_info"]
.Odpowiedzi:
Musisz to zweryfikować samodzielnie w niestandardowej funkcji sprawdzania poprawności.
Wszystko skonfigurowane przez #states dzieje się w 100% w przeglądarce, wszystko, czego nie robi, nie jest widoczne dla Drupala po przesłaniu formularza (na przykład wszystkie niewidoczne pola formularza są przesyłane i sprawdzane w ten sam sposób, jeśli nie ma #states).
źródło
Możesz użyć wymaganego w ten sposób:
źródło
Bardzo podobny do odpowiedzi Felixa Eve, tylko ten fragment kodu do sprawdzania poprawności elementu wbudowanego:
Wywołujesz funkcję sprawdzania poprawności elementu wymaganego elementu:
Następnie funkcja sprawdzania poprawności znajduje wymagane pole i sprawdza, czy ma poprawną wartość formularza, która ujawniłaby pole, które musi być wymagane.
źródło
Istnieje inny sposób użycia funkcji AFTER_BUILD dla formularza i uczynienia tego pola opcjonalnym. Oto link do drupala 6.
Dodaj to do kodu formularza
Zaimplementuj po kompilacji, przetestuj niestandardowe warunki w polu
W moim przypadku #states dodawał wiele *, więc muszę tego unikać i użyłem jquery do ukrycia i pokazania zakresu zawierającego *
I
Na podstawie mojej wartości custom_field.
źródło
Oto szczegółowy przewodnik po Drupal 7 z #states .
To jest ważny bit:
źródło
Właśnie spotkałem się z tym samym problemem, więc potrzebowałem zapewnić niestandardową weryfikację, ale chciałem, aby była ona kontrolowana za pomocą tablicy #states, więc nie musiałem podawać tych samych reguł dwa razy.
Działa poprzez wyodrębnienie nazwy pola z selektora jQuery (selektor musi mieć format
:input[name="field_name"]
, aby nie działał).Poniższy kod jest testowany tylko w konkretnym scenariuszu, w którym go używałem, jednak uważam, że może się przydać komuś innemu.
źródło
W Drupal 8 mogłem to zrobić w ten sposób:
Nie umieszczaj t („SSH2”). spowoduje to umieszczenie jego tłumaczenia zamiast wartości opcji, która jest nieprzetłumaczonym SSH2.
Podejrzewam, że działałoby to również w przypadku Drupala 7.
źródło
Zagnieżdżiłem pola formularza i pole wyboru, więc musiałem trochę popracować nad odpowiedzią Dominica Woodmana. W przypadku, gdy jakakolwiek inna osoba napotka ten sam problem:
źródło