ノードフォームをビューにアタッチまたは埋め込んで、ユーザーがフォームを送信すると、フォームの下のビューがajaxを介してリアルタイムで更新されるようにします。フォームはビューの上に表示されます。私のビューのブロック名はStatuses Streamです。
formblock module を試して、views uiを使用してフォームをビューのヘッダーセクションに配置しましたが、送信後、ノード作成ページにリダイレクトされていました。
次に、 Advanced Form Blockモジュール を試しました。 AFBモジュールを使用してフォームを作成しました。 ajaxでフォームを送信していますが、リアルタイムでビューを更新していません。
Ajax Form Entity モジュールを試したところです。 ajax経由で送信および更新していますが、それにビューをアタッチする方法が見つかりません。ただし、その設定では、表示モードを選択できます。もう少し柔軟性が必要です。
ノードフォームをビューにアタッチまたは埋め込んで、ajax経由で送信し、ビューをリアルタイムで更新する方法は?プログラムまたはモジュールを使用して、あらゆるソリューションを受け入れることができます。プログラムで実行すると、柔軟性が高まるため、より良い方法です。
反対側から見ます:ビューをノードフォームにアタッチします。
まず、組み込みのノードフォームで試してみました。しかし、これはかなり面倒なことがわかりました。代わりに、小さなカスタムフォームを作成し、プログラムで新しいノードを作成しました。 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;
}