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['имя_продукта']['#значение'], равное первому блоку, который является совершенно другим продуктом. Что я делаю не так?
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;
}
Тогда поля не должны быть перезаписаны.
Я нашел решение здесь: Несколько форм на одной странице?. Проблема в том, что 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;
}