Drupal 2 блокирует одну и ту же функцию формы с другим выводом, не работает


Я динамически создал несколько блоков в зависимости от того, сколько записей у меня есть в базе данных:

    function my_module_block_info() {
        $result_set = db_select('my_products', 'products')
            ->fields('products', array('pid', 'name'))
            ->execute();

        $blocks = array();

        foreach($result_set as $product) {
            $blocks['my_product_' . $product->pid] = array(
              'info' => ('My Product ' . $product->name)
            );
        }

        return $blocks;
    }

    function my_module_block_view($delta = '') {
        $pieces = explode('_', $delta);
        $pid = $pieces[2];
        $product = db_select('my_products', 'products')
            ->fields('products')
            ->condition('products.pid', $pid, '=')
            ->execute()
            ->fetchObject();

        $block['subject'] = $product->name;
        $block['content'] = my_module_block_content($product);
        return $block;
    }

function my_module_block_content(&$product) {
    $form = drupal_get_form('my_module_block_form', $product);

    $output = '<p>' . $product->price . '</p>';

    $output .= drupal_render($form);

    return $output;
}

function my_module_block_form($form, &$formstate, $product) {
    $form['submit_product] = array(
      '#type' => 'image_button',
      '#button_type' => 'submit',
      '#src' => base_path() . path_to_theme() . '/images/buy.gif',
    );
    $form['product_name'] = array(
      '#type' => 'hidden',
      '#value' => $product->name,
);
    return $form;
}

Моя проблема в том, что когда у меня на одной странице 2 блока с разными продуктами, функция отправки для отображаемого второго блока имеет значение $form['имя_продукта']['#значение'], равное первому блоку, который является совершенно другим продуктом. Что я делаю не так?

Author: 4life, 2014-01-16

2 answers

Я бы предложил добавить в массив форм идентификатор вашего продукта (я думаю, $product->pid или что-то в этом роде):

function my_module_block_form($form, &$formstate, $product) {
    $form[$product->pid]['submit_product] = array(
      '#type' => 'image_button',
      '#button_type' => 'submit',
      '#src' => base_path() . path_to_theme() . '/images/buy.gif',
    );
    $form[$product->pid]['product_name'] = array(
      '#type' => 'hidden',
      '#value' => $product->name,
    );
    return $form;
}

Тогда поля не должны быть перезаписаны.

 0
Author: Matt, 2014-01-16 17:13:23

Я нашел решение здесь: Несколько форм на одной странице?. Проблема в том, что drupal присваивает формам один и тот же идентификатор, потому что они используют одну и ту же функцию. Чтобы переопределить идентификатор, просто вызовите функцию, которая не существует, и с помощью простой формы hook_form перенаправьте ее следующим образом:

function my_module_forms($form_id, $args) {
    $forms = array();

    if(substr($form_id, 0, 10) == 'my_module_') {
        $forms[$form_id] = array(
          'callback' => 'my_module_block_form',
        );
    }

    return $forms;
}
 0
Author: Revan Darth, 2017-04-13 12:47:04