Передача значений в форму

Главные вкладки

Аватар пользователя _mixer _mixer 12 июня 2012 в 12:29

Подскажите новичку как можно передать в форму произвольную переменную? ($fid в примере)
На примере форма оценки произвольной фотографии

function mymodule_menu() {
    $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;
}

Комментарии

Аватар пользователя Orion76 Orion76 12 июня 2012 в 12:53
<?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); //<<<< ОБРАТИТЕ ВНИМАНИЕ НА АРГУМЕНТЫ.
}

?>
Аватар пользователя Shok211 Shok211 12 июня 2012 в 13:03

<?php drupal_get_form ?>
Quote:
.: Any additional arguments are passed on to the functions called by drupal_get_form(), including the unique form constructor function. For example, the node_edit form requires that a node object is passed in here when it is called. These are available to implementations of hook_form_alter() and hook_form_FORM_ID_alter() as the array $form_state['build_info']['args'].

Любые дополнительные аргументы переданные в функцию конструктора формы, будут включены в форму.
  1. Для Drupal 6, это дополнительные аргументы в функции формы <?php mymodule_evaluate_form($form$fid)?>
  2. Для Drupal 7 это элементы массива <?php $form_state['build_info']['args'?>
Аватар пользователя _mixer _mixer 12 июня 2012 в 13:13

Спасибо, попробую так сделать.
Еще как вариант я переделал форму

function mymodule_menu() {
    $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;
}

Мелочи. но все же Smile
Вдруг кому-то пригодится

Аватар пользователя Orion76 Orion76 12 июня 2012 в 13:50

Функции submit и validate по умолчанию имеют наименования соответственно ИД_ФОРМЫ_submit и ИД_ФОРМЫ_validate
где ИД_ФОРМЫ - наименование функции-конструктора формы(mymodule_evaluate_form)..
Поэтому нет смысла объявлять их в конструкторе формы..

Аватар пользователя _mixer _mixer 12 июня 2012 в 20:04

ерунда получается!

при создании формы мне в скрытое поле записывает одно ID, после сабмита формы я получаю совсем другое!

пропустил все через дебагер, получается так что форма после сабмита опять пересоздается, и естественно с базы выбирается новое случайное число и подставляется в скрытое поле. Или я что-то не так делаю или ничего не понял!

Аватар пользователя Orion76 Orion76 12 июня 2012 в 20:22

"_mixer" wrote:
получается так что форма после сабмита опять пересоздается,

Так и есть..
В функцию-конструктор формы передается по ссылке параметр $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'];
}
?>

как-то так..

Аватар пользователя Orion76 Orion76 12 июня 2012 в 20:36

А вообще, если непосредственно на странице формы hidden элемент fid не нужен.. значение fid в сабмит-функцию можно передать в той-же $form_state:
в функции-конструкторе:
$form_state['file_id']=$file_id;

в функции-сабмите:
$file_id=$form_state['file_id'];

Аватар пользователя _mixer _mixer 13 июня 2012 в 14:57

Спасибо за помощь!
Только у меня почему-то $form_state['post'] место $form_state['values'].
До сабмита $form_state['post'] пустой, после сабмита в нем значения полей формы. Суть одна. Проблема решена! Smile