web-dev-qa-db-ja.com

ノード追加フォームをビューにアタッチまたは埋め込む

ノードフォームをビューにアタッチまたは埋め込んで、ユーザーがフォームを送信すると、フォームの下のビューがajaxを介してリアルタイムで更新されるようにします。フォームはビューの上に表示されます。私のビューのブロック名はStatuses Streamです。

formblock module を試して、views uiを使用してフォームをビューのヘッダーセクションに配置しましたが、送信後、ノード作成ページにリダイレクトされていました。

次に、 Advanced Form Blockモジュール を試しました。 AFBモジュールを使用してフォームを作成しました。 ajaxでフォームを送信していますが、リアルタイムでビューを更新していません。

Ajax Form Entity モジュールを試したところです。 ajax経由で送信および更新していますが、それにビューをアタッチする方法が見つかりません。ただし、その設定では、表示モードを選択できます。もう少し柔軟性が必要です。

ノードフォームをビューにアタッチまたは埋め込んで、ajax経由で送信し、ビューをリアルタイムで更新する方法は?プログラムまたはモジュールを使用して、あらゆるソリューションを受け入れることができます。プログラムで実行すると、柔軟性が高まるため、より良い方法です。

3
Umair

反対側から見ます:ビューをノードフォームにアタッチします。

まず、組み込みのノードフォームで試してみました。しかし、これはかなり面倒なことがわかりました。代わりに、小さなカスタムフォームを作成し、プログラムで新しいノードを作成しました。 Ajax送信。更新されたビュー。幸せ。

これがカスタムモジュールのコードです。新しいD7標準インストールを想定しています。

情報ファイル

name = MYMODULE
description = Provides cool stuff.
core = 7.x
package = Custom
dependencies[] = views

モジュールファイル

まず、ビューを提供します。

/**
 * Implements hook_views_api().
 */
function MYMODULE_views_api() {

  return [
    'api' => 3,
  ];
}

/**
 * Implements hook_views_default_views().
 */
function MYMODULE_views_default_views() {

  $view = new view();
  $view->name = 'nodes';
  $view->description = '';
  $view->tag = 'default';
  $view->base_table = 'node';
  $view->human_name = 'Nodes';
  $view->core = 7;
  $view->api_version = '3.0';
  $view->disabled = FALSE;

  /* Display: Master */
  $handler = $view->new_display('default', 'Master', 'default');
  $handler->display->display_options['title'] = 'Nodes';
  $handler->display->display_options['use_more_always'] = FALSE;
  $handler->display->display_options['access']['type'] = 'none';
  $handler->display->display_options['cache']['type'] = 'none';
  $handler->display->display_options['query']['type'] = 'views_query';
  $handler->display->display_options['exposed_form']['type'] = 'basic';
  $handler->display->display_options['pager']['type'] = 'none';
  $handler->display->display_options['pager']['options']['offset'] = '0';
  $handler->display->display_options['style_plugin'] = 'default';
  $handler->display->display_options['row_plugin'] = 'fields';
  /* Field: Content: Title */
  $handler->display->display_options['fields']['title']['id'] = 'title';
  $handler->display->display_options['fields']['title']['table'] = 'node';
  $handler->display->display_options['fields']['title']['field'] = 'title';
  $handler->display->display_options['fields']['title']['label'] = '';
  $handler->display->display_options['fields']['title']['alter']['Word_boundary'] = FALSE;
  $handler->display->display_options['fields']['title']['alter']['Ellipsis'] = FALSE;
  /* Sort criterion: Content: Post date */
  $handler->display->display_options['sorts']['created']['id'] = 'created';
  $handler->display->display_options['sorts']['created']['table'] = 'node';
  $handler->display->display_options['sorts']['created']['field'] = 'created';
  $handler->display->display_options['sorts']['created']['order'] = 'DESC';

  /* Display: Block */
  $handler = $view->new_display('block', 'Block', 'block');

  $views[$view->name] = $view;
  return $views;
}

次にフォームを実行します。

/**
 * Provide a form.
 */
function MYMODULE_form($form, &$form_state) {

  $form['wrapper'] = [
    '#type'       => 'container',
    '#attributes' => [
      'id' => 'mywrapper',
    ],
  ];

  $form['wrapper']['node_form'] = [
    '#type'  => 'fieldset',
    '#title' => t('Add article'),
  ];

  $form['wrapper']['node_form']['node_title'] = [
    '#type'     => 'textfield',
    '#title'    => t('Article title'),
    '#required' => TRUE,
  ];

  $form['wrapper']['submit'] = [
    '#type'   => 'submit',
    '#value'  => t('Save'),
    '#submit' => ['MYMODULE_form_submit'],
    '#ajax'   => [
      'callback' => 'MYMODULE_MYCALLBACK',
      'wrapper'  => 'mywrapper',
    ],
  ];

  $form['wrapper']['view_display'] = [
    // view machine name && display/block name
    '#markup' => views_embed_view('nodes', 'block'),
  ];

  return $form;
}

/**
 * Do some validation.
 */
function MYMODULE_form_validate($form, &$form_state) {
  // Better do some validation.
  // Here or via #element_validate.
  // @see https://api.drupal.org/api/drupal/developer%21topics%21forms_api_reference.html/7.x#element_validate
}

/**
 * Form submit. Node creation.
 */
function MYMODULE_form_submit($form, &$form_state) {

  global $user;
  $node = new stdClass();

  $node->type     = 'article';
  $node->title    = $form_state['values']['node_title'];
  $node->language = LANGUAGE_NONE;
  $node->uid      = $user->uid;

  node_object_prepare($node);
  node_save($node);

  // Empty out title field on rebuild.
  $form_state['input']['node_title'] = '';

  // Rebuild form.
  $form_state['rebuild'] = TRUE;
}

/**
 * Ajax callback to return the whole wrapper.
 */
function MYMODULE_MYCALLBACK($form, &$form_state) {

  return $form['wrapper'];
}

実際の動作を確認するために、サンプルページに配置しました。

/**
 * Implements hook_menu().
 */
function MYMODULE_menu() {

  $items['example/form'] = [
    'title'            => 'Example Form',
    'description'      => 'A form to mess around with.',
    'page callback'    => 'drupal_get_form',
    'page arguments'   => ['MYMODULE_form'],
    'access arguments' => ['create article content'],
  ];

  return $items;
}
2
leymannx