Подскажите новичку как можно передать в форму произвольную переменную? ($fid в примере)
На примере форма оценки произвольной фотографии
$item = array();
$item['evaluate'] = array(
'title' => 'Оценивание фотографии',
'page callback'=>'mymodule_evaluation_page',
'access arguments' => array('access mymodule'),
'type' => MENU_NORMAL_ITEM,
);
return $item;
}
function mymodule_evaluate_form() {
$form = array();
$form['vote'] = array(
'#title' => 'Оцените фотографию',
'#type' => 'select',
'#options' => array(
1 => '1-балл',
2 => '2-балла',
3 => '3-балла',
4 => '4-балла',
5 => '5-баллов',
6 => '6-баллов',
7 => '7-баллов',
8 => '8-баллов',
9 => '9-баллов',
10 => '10-баллов',
),
'#default_value' => 5,
'#required' => TRUE,
);
$form['fid'] = array(
'#type' => 'hidden',
'#value' => $fid,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => "Оценить",
);
$form['#validate'][] = 'mymodule_evaluate_validate';
$form['#submit'][] = 'mymodule_evaluate_submit';
return $form;
}
function mymodule_evaluation_page() {
$mymodule_photo = db_fetch_array(db_query("SELECT `fid`, `task` FROM `mymodule_fotos` ORDER BY RAND() LIMIT 1"));
$photo = db_fetch_array(db_query("SELECT `filename`, `filepath` FROM `files` WHERE `fid` = '%d' LIMIT 1", $mymodule_photo['fid']));
$fid = $mymodule_photo['fid'];
$content = theme("imagecache", "640x480", $photo['filepath']).drupal_get_form('mymodule_evaluate_form');
return $content;
}
Комментарии
<?php function mymodule_evaluate_form(&$form_state,$arg1,$arg2....$argN) {
}
function
mymodule_evaluation_page() {......
$content = theme("imagecache", "640x480",$photo['filepath']).
drupal_get_form('mymodule_evaluate_form',$arg1,$arg2....$argN); //<<<< ОБРАТИТЕ ВНИМАНИЕ НА АРГУМЕНТЫ.
} ?>
<?php drupal_get_form ?>
Любые дополнительные аргументы переданные в функцию конструктора формы, будут включены в форму.
<?php mymodule_evaluate_form($form, $fid)?>
<?php $form_state['build_info']['args'] ?>
Спасибо, попробую так сделать.
Еще как вариант я переделал форму
$item = array();
$item['evaluate'] = array(
'title' => 'Оценивание фотографии',
'page callback' => 'drupal_get_form',
'page arguments' => array('mymodule_evaluate_form'),
'access arguments' => array('access mymodule'),
'type' => MENU_NORMAL_ITEM,
);
return $item;
}
function mymodule_evaluate_form() {
$mymodule_photo = db_fetch_array(db_query("SELECT `fid`, `task` FROM `mymodule_fotos` ORDER BY RAND() LIMIT 1"));
$photo = db_fetch_array(db_query("SELECT `filename`, `filepath` FROM `files` WHERE `fid` = '%d' LIMIT 1", $mymodule_photo['fid']));
$form = array();
$form['photo'] = array(
'#type' => 'item',
'#title' => '',
'#value' => theme("imagecache", "640x480", $photo['filepath']),
);
$form['vote'] = array(
'#title' => 'Оцените фотографию',
'#type' => 'select',
'#options' => array(
1 => '1-балл',
2 => '2-балла',
3 => '3-балла',
4 => '4-балла',
5 => '5-баллов',
6 => '6-баллов',
7 => '7-баллов',
8 => '8-баллов',
9 => '9-баллов',
10 => '10-баллов',
),
'#default_value' => 5,
'#required' => TRUE,
);
$form['fid'] = array(
'#type' => 'hidden',
'#value' => $mymodule_photo['fid'],
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => "Оценить",
);
$form['#validate'][] = 'mymodule_evaluate_validate';
$form['#submit'][] = 'mymodule_evaluate_submit';
return $form;
}
Мелочи. но все же
Вдруг кому-то пригодится
Функции submit и validate по умолчанию имеют наименования соответственно ИД_ФОРМЫ_submit и ИД_ФОРМЫ_validate
где ИД_ФОРМЫ - наименование функции-конструктора формы(mymodule_evaluate_form)..
Поэтому нет смысла объявлять их в конструкторе формы..
ерунда получается!
при создании формы мне в скрытое поле записывает одно ID, после сабмита формы я получаю совсем другое!
пропустил все через дебагер, получается так что форма после сабмита опять пересоздается, и естественно с базы выбирается новое случайное число и подставляется в скрытое поле. Или я что-то не так делаю или ничего не понял!
Так и есть..
В функцию-конструктор формы передается по ссылке параметр $form_state:
mymodule_evaluate_form(&$form_state)
При первом вызове функции элемент $form_state['values'] отсутствует..
При вызове после сабмита в нем содержатся значения полей формы.
Поэтому проверяйте его наличие, если нет - значения получаем из базы, если есть подставляем значения из него:
<?php
if(!isset($form_state['values']))
$mymodule_photo = db_fetch_array(db_query("SELECT `fid`, `task` FROM `mymodule_fotos` ORDER BY RAND() LIMIT 1"));
$photo = db_fetch_array(db_query("SELECT `filename`, `filepath` FROM `files` WHERE `fid` = '%d' LIMIT 1", $mymodule_photo['fid']));
$fid=$mymodule_photo['fid'];
}else{
$fid=$form_state['values']['fid'];
}
?>
как-то так..
А вообще, если непосредственно на странице формы hidden элемент fid не нужен.. значение fid в сабмит-функцию можно передать в той-же $form_state:
в функции-конструкторе:
$form_state['file_id']=$file_id;
в функции-сабмите:
$file_id=$form_state['file_id'];
Спасибо за помощь!
Только у меня почему-то $form_state['post'] место $form_state['values'].
До сабмита $form_state['post'] пустой, после сабмита в нем значения полей формы. Суть одна. Проблема решена!