web-dev-qa-db-ja.com

新しい本のページを作成するときに、本のアウトラインを必須フィールドにすることはできますか?

特定のコンテンツタイプalwaysに親の本/ページがあることを確認したいと思います。

JavaScriptで、bookモジュールなどを変更して、これを行う方法はありますか?

3
Perbert

はい、book.moduleを変更せずにそれを行うことができます。 (Drupalファイルの変更は決して良い考えではありません。)

次のようなコードを含むカスタムモジュールを作成できます。

/**
 * Implements hook_BASE_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state, $form_id) {
  if (!empty($form['book']['bid'])) {
    $form['book']['bid']['#element_validate'][] = 'mymodule_book_validate';
  }
}

/**
 * Form validation handler for book_form_node_form_alter().
 */
function mymodule_book_validate($element, $form_state) {
  // Check other conditions you need to check.
  if ($element['#value'] == 0) {
    form_error($element, t('You must select a book.'));
  }
}

私が書いたコードでは、エラーを報告する前に他の条件をチェックできます。たとえば、書籍を管理する権限を持つユーザーが、書籍を書籍ページに割り当てないようにすることができます。また、ノードのタイトル、ブックページを作成しているユーザーに割り当てられている権限、ノードの本文として使用されているテキスト内のキーワードの存在など、他の条件を確認することもできます。

2
kiamlaluno

編集:確認すると、この質問はD7固有のものであることがわかります。私のコードスニペットに微妙な問題がある可能性があります。基本的に同じである必要があります。

何かが起こってはならない場合、私はそれを絶対に選択しないことを好む。

すべての本のページをデフォルトで新しい本にする場合:

/**
 * Implementation of hook_form_FORM_ID_alter() for node_form.
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  if (book_type_is_allowed($form['#node']->type)) {
    // Remove the "none" option.
    unset($form['book']['bid']['#options'][0]);
  }
}

完了したら、そのままにするか、$form['book']['bid']['#default_value']明示的に新しい本、または指定した本の入札価格。 noneを削除した後のセレクターの最初のオプションであるため、それはおそらく自然に新しい本を作成することになります。

3
Grayside