Прошу помощи в работе с текстовым полем textfield

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

Комментарии

Аватар пользователя sergeybelya sergeybelya 26 апреля 2014 в 12:00

С помощью hook_form_alter назначьте свой обработчик формы, в нем будут доступны все значения полей формы после отправки. И что за форма, вы ее сами создаете?

Аватар пользователя Виктория Виктория 26 апреля 2014 в 12:08

sergeybelya wrote:
С помощью hook_form_alter назначьте свой обработчик формы, в нем будут доступны все значения полей формы после отправки. И что за форма, вы ее сами создаете?

Да, сама.
Вот код:
<?php

/**
* Implements hook_menu().
*/
function users_example_menu() {// эта функция делает возможным указание на страницы
$items = array();
$items['users_example'] = array(//содержится указание та то, что адрес нашей страницы будет читаться так: “/users-example”
'title' => 'Поиск данных о пользователях',// заголовок нашей страницы
'page callback' => 'drupal_get_form',// задает функцию, которая будет отвечать за вывод страницы
'page arguments' => array('users_example_form'),//задает аргумент функции, которая указана в параметре “page callback”
'access callback' => TRUE,//доступ к странице
);
return $items;//возвращаются все параметры, которые мы задали
}

function users_example_form($form, &$form_state) {// создание формы

// Обёртка для формы. Каждый раз в неё будет передаваться новая форма через ajax.
$form['#prefix'] = '

';// Строка, добавляется к выходным данным, перед элементом
$form['#suffix'] = '

';// Строка, добавляется к выходным данным, после элемента

// Данные в форме будут представлены в виде дерева, т.е.
// сохранять ключи родительских элементов.
$form['#tree'] = TRUE;//позволяет каскадировать элементы

// Если форма только что была создана, то мы окажемся на первом шаге.
// Если же пользователь уже переходил по форме, то получаем текущий шаг формы.
$step = empty($form_state['storage']['step']) ? 1 : $form_state['storage']['step'];
$form_state['storage']['step'] = $step;// В массиве $form_state сохраняются данные из предыдущих шагов

// Смотрим, на каком шаге мы сейчас находимся, и в зависимости
// от этого показываем нужную часть формы.
switch ($step) {
case 1:

// Если на первом шаге - показываем форму для первого шага.
// Задаём форму для первого шага.
$form['step1'] = array(
'#type' => 'fieldset',
'#title' => t('Поиск по имени'),
);

// $default_value = empty($form_state['values']['step1']['names']) ? '' : $form_state['values']['step1']['names'];
//$form['data'] = array('#markup' => isset($form_state['values']['names']) ? $form_state['values']['names'] : '');
$form['step1']['names'] = array(
'#type' => 'textfield',
'#title' => 'Введите имя',
'#autocomplete_path' => 'user/autocomplete',//поле с автодополнением имени пользователя
'#default_value' => $form_state['values']['names']
);
break;
$form['data'] = array('#markup' => isset($form_state['values']['names']) ? $form_state['values']['names'] : '');

case 2:

// Задаём форму для второга шага.
$form['step2'] = array(
'#type' => 'fieldset',
'#title' => 'Поиск по группе',
);

$form['step2']['grup'] = array(
'#type' => 'checkboxes',
'#title' => 'Выберите группу',
'#options' => drupal_map_assoc(array('1ПМ', '2ПМ', '3ПМ', '4ПМ', '5ПМ', '1ИС', '2ИС', '3ИС', '4ИС', '5ИС', '1ИБ', '2ИБ', '3ИБ', '4ИБ', '5ИБ')),//возвращает массив, где каждому значению массива, соответствует ключ того-же значения
);
// if (isset($form_state['values']['step2']['grup'])) {
// $form['step2']['grup']['#default_value'] = $form_state['values']['step2']['grup'];
//}

break;
}

//После создания формы пользователь должен видеть нужные кнопки
$form['actions'] = array('#type' => 'actions');// Обертка для кнопок

if ($step == 1) {
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => 'OK',
'#submit'=>array('users_example_submit_view')
);

$form['actions']['next'] = array(
'#type' => 'submit',
'#value' => 'Перейти к поиску по группе',
// На кнопку вешаем ajax-обработчик, который будет возвращать форму
// в ранее созданный

'#ajax' => array(
'wrapper' => 'users-example-form-wrapper',// селектор, куда будет помещены данные, полученные в результате выполнения users_example_ajax_callback из #ajax[‘callback’]
'callback' => 'users_example_ajax_callback',//фунцкия, которой передаётся форма и её состояние
),
);
}

// Если мы перешли на вторую форму, то покажем кнопку "Предыдущий шаг".
if ($step ==2 ) {
$form['actions']['prev'] = array(
'#type' => 'submit',
'#value' => 'Предыдущий шаг',
// Это хороший трюк - не валидируем форму, если нажимаем кнопку "Предыдущий шаг".
//'#limit_validation_errors' => array(),
//'#submit' => array('users_example_form_submit'),
'#ajax' => array(
'wrapper' => 'users-example-form-wrapper',
'callback' => 'users_example_ajax_callback',
),
);
$form['actions']['submitt'] = array(
'#type' => 'submit',
'#value' => 'OK',
//'#submit'=>array('users_example_submit_viewer')
);
}
if ($_SESSION['users_example_submit_view'] == 1) {
$header = array('ID', 'Name','E-mail');
$rows = array();
$names = strval($form_state['values']['names']);
//check_plain($_POST['names']);//strval($form_state['values']['names']);
$query = db_select('users','t')
->condition('name',$names)
->fields('t', array('uid','name','mail'))
->execute();
foreach ($query as $users) {
$rows[] = array($users->uid, $users->name, $users->mail);
}
// сначала формируем $header и $rows, потом:
$form['mytable'] = array(
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
'#empty' => t('No results.')
);
unset($_SESSION['users_example_submit_view']);
}
return $form;
}

function users_example_ajax_callback($form, $form_state) {
// Указываем, что хотим перезагрузить всю форму, вернув её целиком.
return $form;
}

function users_example_form_submit($form, &$form_state) {// обработчик состояний формы

// Сохраняем состояние формы, полученное при переходе на новый шаг.
$current_step = 'step' . $form_state['storage']['step'];// Узнаем текущий шаг
if (!empty($form_state['values'][$current_step])) {
$form_state['storage']['values'][$current_step] = $form_state['values'][$current_step];
}

// Если перешли на следующий шаг - то увеличиваем счётчик шагов.
if (isset($form['actions']['next']['#value']) && $form_state['triggering_element']['#value'] == $form['actions']['next']['#value']) {
$form_state['storage']['step']++;

// Если данные для следующего шага были уже введены пользователем,
// то восстанавливаем их и передаём в форму.
$step_name = 'step' . $form_state['storage']['step'];
if (!empty($form_state['storage']['values'][$step_name])) {
$form_state['values'][$step_name] = $form_state['storage']['values'][$step_name];
}
}

// Если вернулись на шаг назад - уменьшаем счётчик шагов.
if (isset($form['actions']['prev']['#value']) && $form_state['triggering_element']['#value'] == $form['actions']['prev']['#value']) {
$form_state['storage']['step']--;

// Забираем из хранилища данные по предыдущему шагу и возвращаем их в форму.
$step_name = 'step' . $form_state['storage']['step'];
$form_state['values'][$step_name] = $form_state['storage']['values'][$step_name];
}

//if (isset($form['actions']['submitt']['#value']) && $form_state['triggering_element']['#value'] == $form['actions']['submitt']['#value']) {
//print $node->fnamess['ru'][0]['value'];
//$nodes = db_select('node', 'n')->fields('n', array('nid', 'title'))->orderBy('n.nid')->execute();
//$header = array('Nid', 'Title');
//$rows = array();

//foreach ($nodes as $node) {
//$rows[] = array($node->nid, $node->title);
//}

//$output = theme('table', array('header' => $header, 'rows' => $rows));

// Показываем сообщение с введёнными данными.
//$message = 'Введённые данные:
';
//foreach ($form_state['storage']['values'] as $step => $values) {
// $message .= "
$step:
";
//foreach ($values as $key => $value) {
//$output = '';
// if (is_array($value)) {
//foreach ($value as $val) {
//$output .= $val ? $val . '; ' : '';
//}
//$value = implode(', ', $value);
//}
//else {
//$output = $value;
//}
//$message .= "$key = $output
";
//}

//}
//drupal_set_message($message);
//$form_state['rebuild'] = FALSE;
//return;
//}

// Указываем, что форма должна быть построена заново.
$form_state['rebuild'] = TRUE;
}
function users_example_submit_view(){
$names =strval( $form_state['values']['name']);
$_SESSION['users_example_submit_view'] = 1;

//return theme('table', array('header' => $header, 'rows' => $rows));
}

Аватар пользователя sergeybelya sergeybelya 26 апреля 2014 в 12:13

Виктория wrote:
Пока что у меня получалось выводить список всех пользователей, по нажатию на кнопку "ОК"

В функции users_example_form_submit в $form_state['values'] найдете значение поля, используйте его как угодно.

Аватар пользователя Виктория Виктория 26 апреля 2014 в 12:20

sergeybelya wrote:
Виктория wrote:
Пока что у меня получалось выводить список всех пользователей, по нажатию на кнопку "ОК"

В функции users_example_form_submit в $form_state['values'] найдете значение поля, используйте его как угодно.


Значение поля, например, можно найти так?
$names = $form_state['values']['name'];

Аватар пользователя Виктория Виктория 26 апреля 2014 в 12:22

sergeybelya wrote:
Виктория wrote:
Пока что у меня получалось выводить список всех пользователей, по нажатию на кнопку "ОК"

В функции users_example_form_submit в $form_state['values'] найдете значение поля, используйте его как угодно.


Совсем запуталась. Помогите пожалуйста, я студентка, и многое в друпале пока непонятно. Вот, экспериментирую

Аватар пользователя Moel Moel 26 апреля 2014 в 12:17

поставьте devel. В коде напишите dpm($form); либо dpm($form_state); Либо без девела print_r. И там уже ищите то что вам нужно.

Аватар пользователя Moel Moel 26 апреля 2014 в 13:06

Например хотите получить почту


<?php
$names 
$form_state['values']['name']; //Или что там у вас. 
$mail db_query("SELECT mail FROM {users} WHERE name = :name", array(':name' => '$names'))->fetchField();
dpm($mail);?>
Аватар пользователя Виктория Виктория 26 апреля 2014 в 13:13

[quote=Moel]Например хотите получить почту


<?php
$names 
$form_state['values']['name']; //Или что там у вас. 
$mail db_query("SELECT mail FROM {users} WHERE name = :name", array(':name' => '$names'))->fetchField();
dpm($mail);[/quote]?>

Хорошо. А если вот такая конструкция:
$names = $form_state['values']['names';
$query = db_select('users','t')
->condition('name',$names)
->fields('t', array('uid','name','mail'))
->execute();

Как здесь в переменную $names записать значение, которое вводиться в текстовое поле на форме, чтобы потом по этому значению осуществлялся поиск при условии condition?

Аватар пользователя Moel Moel 26 апреля 2014 в 13:29

Ничего не понял если честно. Вам что нужно получить 'uid','name','mail'? И записать это в массив? либо получить значение каждого поля? Либо вы еще не можете получить $names ?

Аватар пользователя Виктория Виктория 26 апреля 2014 в 13:39

Moel wrote:
Ничего не понял если честно. Вам что нужно получить 'uid','name','mail'? И записать это в массив? либо получить значение каждого поля? Либо вы еще не можете получить $names ?

Ну вот смотрите. Мне нужно получить значение 'uid','name','mail' определенного пользователя. Если убрать строку ->condition, то в форму выводится таблица с данными всех пользователей,поэтому я добавила условие, чтобы на выходе были данные определенного пользователя.

Если в строке будет вот так: ->condition('name','Фамилия Имя'), то на выходе получится таблица, где будут данные пользователя с фамилией, которая в кавычках. Но мне нужно фамилия и имя, которая вводится в поле textfield. Поэтому возник вопрос, как правильно получить и использовать значение этого поля.

Аватар пользователя Moel Moel 26 апреля 2014 в 13:50

Так я вам про это и писал. У вас модуль devel стоит? если вы введете в аякс колбэке print_r($form_state['values']); то должен выводится массив значений. где бы вы и должны были увидеть ваш $form_state['values']['names']; Если это дело не выводится значит что то не так с формой.

Аватар пользователя Виктория Виктория 26 апреля 2014 в 13:55

Moel wrote:
Так я вам про это и писал. У вас модуль devel стоит? если вы введете в аякс колбэке print_r($form_state['values']); то должен выводится массив значений. где бы вы и должны были увидеть ваш $form_state['values']['names']; Если это дело не выводится значит что то не так с формой.

Можно я пришлю вам весь модуль? Может у вас получится найти ошибку. Я что-то не очень понимаю, где я должна увидеть $form_state['values']['names']

Аватар пользователя Виктория Виктория 26 апреля 2014 в 14:01

Задача моя вот в чем: написать модуль с формой поиска данных о пользователях. Вот конкретного пользователя найти то и не получается

Аватар пользователя Moel Moel 26 апреля 2014 в 14:04

Вот ввожу print_r($form_state['values'])
И получаю. Например qty это инпут куда я ввел цифру 5.
вот полный код моего ajax callback print_r работает без devel.

<?php
function sub_btn_ajax($form$form_state) {
    
    
print_r($form_state['values']);  
    return 
$form['in_cart']['#markup'];
}
?>

Аватар пользователя Виктория Виктория 10 ноября 2015 в 11:49

Moel wrote:
Короче у вас трабла именно с получением значения инпута. Ковыряйте форму.

Вот например, если будет такая строка:
->condition('name','Лысенко Виктория'), то выводится то, что на картинке. А если я напишу
->condition('name',$names), то выводится пустая таблица

Аватар пользователя Виктория Виктория 26 апреля 2014 в 14:31

Подскажите пожалуйста, как при нажатии на кнопку вывести данные о пользователе, чья фамилия введена в текстовом поле. Я уже все переробывала...

Аватар пользователя Moel Moel 26 апреля 2014 в 14:37

Да я понял.
Вообще должно быть как то так по идее:

<?php
$form
['step1']['names'] = array(
        
'#type' => 'textfield'
        
'#title' => 'Введите имя',
        
'#autocomplete_path' => 'user/autocomplete',//поле с автодополнением имени пользователя 
        
'#default_value' => 'Иван Иванович Иванов'

................

if (

$form_state['triggering_element']['#id'] == 'id_вашей кнопки'){
 
$form['step1']['names']['#value'] = $form_state['values']['names'];
}
?>
Аватар пользователя Виктория Виктория 26 апреля 2014 в 14:54

Зачем '#default_value' => 'Иван Иванович Иванов'? Ведь тогда поиск будет осуществляться только по этой фамилии. Нужно, чтобы фамилии вводилась на форме в текстовом поле.

Аватар пользователя Виктория Виктория 10 ноября 2015 в 11:49

Moel wrote:
if ($form_state['triggering_element']['#id'] == 'id_вашей кнопки'){
$form['step1']['names']['#default_value'] = $form_state['values']['names'];
}?>

Попробуйте модуль. Может я что-то совсем не так делаю

Аватар пользователя Moel Moel 26 апреля 2014 в 16:59

<?php
// if ($_SESSION['users_example_submit_view'] == 1) {                                                           // вот поэтому не работало
  
if (isset($form_state['triggering_element']) && $form_state['triggering_element']['#id'] == 'find_user') {
    
$header = array('ID''Name''E-mail');
    
$rows = array();
    
//$names = strval($form_state['values']['names']);                                                          // и поэтому
    
$names $form_state['values']['step1']['names'];
    
//check_plain($_POST['names']);//strval($form_state['values']['names']);
    
$query db_select('users''u')
            ->
condition('u.name'$names)
            ->
fields('u', array('uid''name''mail'))
            ->
execute();
    
//->fetchObject();
    
foreach ($query as $users) {
      
$rows[] = array($users->uid$users->name$users->mail);
    }
    
// сначала формируем $header и $rows, потом:
    
$form['mytable'] = array(
        
'#theme' => 'table',
        
'#header' => $header,
        
'#rows' => $rows,
        
'#empty' => t('No results.')
    );
?>
Аватар пользователя Moel Moel 26 апреля 2014 в 17:03

И кстати Это имя пользователя у вас такое Лысенко Виктория? потому что сейчас ищется по имени пользователя. т.е. логин