Создание формы и передача в неё значения для отображения.

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

Аватар пользователя UAS UAS 6 декабря 2009 в 17:45

Сижу, не могу никак понять, как сделать форму, потом задать значения её полям и вывести на экран.
Копал и render, и ещё всякое, но че-то нифига не понято в передаваемых параметрах. То ли снова описывать все поля и передавать, то ли ещё что-то. Примеров не нашел. Помогите примером.

Вот код.

<?php
function uedu_groups_form_group_edit($form_state) {
    
$form['title'] = array(
        
'#type' => 'textfield',
        
'#title' => 'Номер группы',
        
'#required' => TRUE,
        
'#size' => 20,
        
'#maxlength' => 10
    
);
    return 
$form;
}
?>

Хочу, чтобы в title было вставлено значение, уже любое.. Помогите, а то сижу уже долго.. Знаю, что все дело в рендер-функциях и подобном, но так и не додумываю что и как надо передать.

P.S.: #default_value не годится.

Комментарии

Аватар пользователя mimohodom mimohodom 24 декабря 2009 в 14:57

Приветствую,

вам удалось решить проблему?

У меня схожий(е) вопрос(ы). Я с Drupal знаком всего нечего. Сделал модуль под Drupal 6, который при попадании пользователя на страницу /mymodule выводит форму. Для простоты можно считать, что это fieldset всего лишь c двумя текстовыми полями и кнопкой Submit.

Пользователь вводит текст в первом поле, нажимает submit, после чего введенные данные обрабатываются и выводятся на той же странице в текстовом поле2 (с сохранением исходных данных в поле1).

function mymodule_menu() {
        $items = array();
        $items['mymodule'] = array(
                'title' => t('mymodule'),
                'page callback' => 'mymodule_page',
                'access arguments' => array('access content'),
                'type' =>  MENU_CALLBACK
        );
        return $items;
}

function mymodule_page() {
    $output = drupal_get_form('mymodule_input_form');
}

function mymodule_input_form(&$form_state) {
       
        $form = array();
        $form['mymodule'] = array(
                '#type' => 'fieldset',
                '#title' => t('Вот, собственно'),
        );     
        $form['mymodule']['text_entered'] = array(
                '#title' => t('Введите текст'),
                '#type' => 'textarea',
                '#name' => t('sourcetext'),
                '#cols' => 60, '#rows' => 8,
                '#weight' => 5,
        );             
        $form['mymodule']['text_processed'] = array(
                '#title' => t('Результат обработки'),
                '#type' => 'textarea',
                '#name' => t('desttext'),
                '#cols' => 60'#rows' => 8,
                '#disabled' => TRUE,
                '#weight' => 10,
        );
        $form['mymodule']['submit'] = array(
                '#type' => 'submit',
                '#value' => t('Перевести'),
                '#weight' => 15,
        );     
        return $form;
}

function mymodule_input_form_validate($form_id, &$form_state) {

        $texto = $_POST['sourcetext'];  
        if (empty ($texto)) {
            form_set_error ('mymodule',t('Следует ввести текст!'));
            unset ($form_state['submitted']);
        }

        if (isset($form_id['mymodule']) && $form_state['submitted']) {
            if (!empty ($texto)) {
                drupal_set_message("Текст может быть отправлен на обработку");
            }
        }

}

function mymodule_input_form_submit($form_id, &$form_state) {
    //обработка введенных данных:
    $processed = ProcessData($texto);
}

Теперь, собственно, вопрос(ы):

Каким образом вставить полученное значение $processed в поле 'text_processed' формы?

Ну и исходный текст, соответственно, сохранить в 'text_entered'?

'text_processed' при первой загрузке формы объявлен как #disabled. Где снимать это ограничение?
в mymodule_form_input_form_alter()? Если так, то как запретить снятие #disabled до того момента,
пока не произойдет нажатие на Submit.

Аватар пользователя MCNet MCNet 5 января 2010 в 2:51

Расскажем нашим читателям об этом и многом другом в нашем журнале "А хрен его знает":

Начнём с того, что $_POST и $_GET всегда рекомендуется использовать в лучших традициях быдлокода Smile (поясняю: эти переменные использовать не нужно).

А для запоминания параметров есть специальная API-функция

variable_set($name, $value);

Кроме этого есть еще variable_del() и variable_get().

Использовать как-то так:

function mymodule_test_form($form_state) {
    //...
    $form['form_test'] = array(
        '#type' => 'textfield',
        '#title' => 'T.E.S.T.',
        '#default_value' => variable_get('mymodule_form_test', 'Введите значение'),
    );
    //...
}
function mymodule_test_submit($form, $form_state) {
    variable_set('mymodule_form_test', $form_state['values']['form_test']);
}

/// Показываем форму //

function mymodule_menu() {
  $items = array();

  $items['my/test/form'] = array(
    'title' => 'TEST',
    'page callback' => 'mymodule_show_me_the_form', // <- Эта функция выведет форму
    'type' => MENU_CALLBACK,
  );
  return $items;
}
function mymodule_show_me_the_form() {
  return drupal_get_form('mymodule_test_form', $form_state);
}

Ссылки по теме:
http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6
http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....

Аватар пользователя ii ii 16 февраля 2012 в 11:35

MCNet,
variable_set() не подходит, так как устанавливает значение переменной глобально.
В то время, как форма может быть использована несколькими пользователями одновременно.