Drupal 7 - 尝试将表单添加到列表视图

时间:2015-11-09 23:38:38

标签: ajax drupal drupal-7 drupal-modules drupal-views

对不起,如果之前有人问过,我环顾四周,但在StackOverFlow.com上找不到这个具体问题。

我有一个名为'view-post-wall'的视图,我试图通过ajax提交添加提交给此视图的帖子,称为'post',但我还没有开始添加ajax。

我的模块名称是'friendicate'

我不明白我在这里缺少什么,我正在学习一个教程,现在已经无法解决这个问题2天了。

我也没有任何错误。

这是完整的模块代码


    function _form_post_ajax_add() {
      $form = array();
      $form['title'] = array(
        '#type' => 'textfield',
        '#title' => 'Title of post',
      );
      $form['body'] = array(
        '#type' => 'textarea',
        '#title' => 'description',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => 'Submit post',
      );
      return $form;
    }
    function post_ajax_preprocess_page(&$variables) {
      //krumo($variables);
      $arg = arg();
      if($arg[0] == 'view-post-wall') {
          $variables['page']['content']['system_main']['main']['#markup'] = drupal_render(drupal_get_form('_form_post_ajax_add'));
      }
    }

2 个答案:

答案 0 :(得分:1)

有多种方法可以实现这一点,我将在下面概述这些方法。此外,如果下面的建议没有任何效果,则可能是您的表单函数名称无效。我不确定是否会抛出Drupal。函数名的正确格式应以_form结尾,并包含参数$ form和$ form_state,如下所示:

_form_post_ajax_add_form($form, &$form_state) { ... }

另外,如果你想使用一个钩子,Steff在你的问题的评论中提到你需要在函数名中使用你的模块名。

friendicate_preprocess_page(&$variables) { ... }

好的,现在有一些想法如何在页面上获取表单。

您可以在模块中创建自定义块,然后将其分配到admin / structure / blocks中的区域

<?php


/**
 * Implements hook_block_info().
 */
function friendicate_block_info() {
  $blocks = array();

  $blocks['post_ajax'] = array(
    'info' => t('Translation Set Links'),
    'cache' => DRUPAL_NO_CACHE,
  );

  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function friendicate_block_view($delta = '') {
  $block = array();

  if ($delta == 'post_ajax') {
    $form = drupal_get_form('_form_post_ajax_add_form');
    $block['content'] = $form;
  }

  return $block;
}

清除缓存,您的块应显示在admin / structure / blocks

之前/之后查看附件

您可以使用Views hook hook_views_pre_render()

在视图之前和之后添加标记
<?php

/**
 * Implements hook_view_pre_render().
 */
function frendicate_views_pre_render(&$view) {
  if($view->name == 'view_post_wall') { // the machine name of your view
    $form = drupal_get_form('_form_post_ajax_add_form');
    $view->attachment_before = render($form);
  }
}

答案 1 :(得分:0)

或者可以使用view post render

[9, 8, 7] => {0: 9, 1: 8, 2: 7}