Hook_form_alterを使用して、ワークフロー送信ボタンに検証の制限エラーを追加しようとしました。
フォームの変更では、2つのform_idを取得しています。1つは通常のノード追加form_idで、もう1つはワークフロー状態form_idです。
$form['actions']['workflow_course_status_save_as_draft']['#limit_validation_errors'] > = array(array('field_sample_course'));
私もまったく同じことをしましたが、#limit_validation_errorsの使い方が間違っていました。
これが失敗する理由は、#limit_validation_errorsを適切に使用していないためです。この問題はワークフローとは関係ありません。
フォームの検証中に、このプロパティが設定されている場合(検証エラーは制限されています)、Drupalコアはフォームの状態から検証されていないフォームの値を削除するため、検証に合格した値のみが残ります。コールバックを送信します。
Drupal 8: http://cgit.drupalcode.org/drupal/tree/core/lib/Drupal/Core/Form/FormValidator.php#n147 の場合
Drupal 7: http://cgit.drupalcode.org/drupal/tree/includes/form.inc?h=7.x#n119 の場合
私の解決策は、すべての検証の最後に実行されるカスタム検証を追加し、フォーム関連のすべてのエラーを削除することでした。
/**
* Removes all validation errors that could happen when saving a draft
*
* @param $form
* @param $form_state
*/
function my_custom_draft_validation($form, &$form_state) {
$errors = form_get_errors();
if (!empty($errors)) {
$messages = drupal_get_messages('error', TRUE);
// Remove error messages originated during the form validation
foreach ($messages['error'] as $error) {
if (!in_array($error, $errors)) {
drupal_set_message('error', $error);
}
}
// Remove all form errors
form_clear_error();
}
}
#limit_validation_errorsがクリックされたボタンに設定されている場合、ボタンは#submitプロパティも定義する必要があります(空の配列に設定される場合があります)。