С помощью hook_form_alter назначьте свой обработчик формы, в нем будут доступны все значения полей формы после отправки. И что за форма, вы ее сами создаете?
С помощью 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('Поиск по имени'),
);
$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];
}
// Указываем, что форма должна быть построена заново.
$form_state['rebuild'] = TRUE;
}
function users_example_submit_view(){
$names =strval( $form_state['values']['name']);
$_SESSION['users_example_submit_view'] = 1;
<?php $names = $form_state['values']['name']; //Или что там у вас. $mail = db_query("SELECT mail FROM {users} WHERE name = :name", array(':name' => '$names'))->fetchField(); dpm($mail);?>
<?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?
Ничего не понял если честно. Вам что нужно получить 'uid','name','mail'? И записать это в массив? либо получить значение каждого поля? Либо вы еще не можете получить $names ?
Ничего не понял если честно. Вам что нужно получить 'uid','name','mail'? И записать это в массив? либо получить значение каждого поля? Либо вы еще не можете получить $names ?
Ну вот смотрите. Мне нужно получить значение 'uid','name','mail' определенного пользователя. Если убрать строку ->condition, то в форму выводится таблица с данными всех пользователей,поэтому я добавила условие, чтобы на выходе были данные определенного пользователя.
Если в строке будет вот так: ->condition('name','Фамилия Имя'), то на выходе получится таблица, где будут данные пользователя с фамилией, которая в кавычках. Но мне нужно фамилия и имя, которая вводится в поле textfield. Поэтому возник вопрос, как правильно получить и использовать значение этого поля.
Так я вам про это и писал. У вас модуль devel стоит? если вы введете в аякс колбэке print_r($form_state['values']); то должен выводится массив значений. где бы вы и должны были увидеть ваш $form_state['values']['names']; Если это дело не выводится значит что то не так с формой.
Так я вам про это и писал. У вас модуль devel стоит? если вы введете в аякс колбэке print_r($form_state['values']); то должен выводится массив значений. где бы вы и должны были увидеть ваш $form_state['values']['names']; Если это дело не выводится значит что то не так с формой.
Можно я пришлю вам весь модуль? Может у вас получится найти ошибку. Я что-то не очень понимаю, где я должна увидеть $form_state['values']['names']
Вот ввожу print_r($form_state['values'])
И получаю. Например qty это инпут куда я ввел цифру 5.
вот полный код моего ajax callback print_r работает без devel.
Короче у вас трабла именно с получением значения инпута. Ковыряйте форму.
Вот например, если будет такая строка:
->condition('name','Лысенко Виктория'), то выводится то, что на картинке. А если я напишу
->condition('name',$names), то выводится пустая таблица
Зачем '#default_value' => 'Иван Иванович Иванов'? Ведь тогда поиск будет осуществляться только по этой фамилии. Нужно, чтобы фамилии вводилась на форме в текстовом поле.
Комментарии
Мне нужно ввести фамилию в текстовом поле формы и по ней обратиться к бд, чтобы вывести данные о пользователе
https://api.drupal.org/api/drupal/developer%21topics%21forms_api_referen...
С помощью 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));
}
Пока что у меня получалось выводить список всех пользователей, по нажатию на кнопку "ОК"
В функции users_example_form_submit в $form_state['values'] найдете значение поля, используйте его как угодно.
Значение поля, например, можно найти так?
$names = $form_state['values']['name'];
Совсем запуталась. Помогите пожалуйста, я студентка, и многое в друпале пока непонятно. Вот, экспериментирую
поставьте devel. В коде напишите dpm($form); либо dpm($form_state); Либо без девела print_r. И там уже ищите то что вам нужно.
В users_example_ajax_callback напишите print_r($form_state['values'])
Напишите что получилось
Ничего не изменилось...
Мне просто нужно ввести фамилию пользователя, обратиться к бд и вывести данные о нем.
Как это правильно сделать?
Например хотите получить почту
<?php
$names = $form_state['values']['name']; //Или что там у вас.
$mail = db_query("SELECT mail FROM {users} WHERE name = :name", array(':name' => '$names'))->fetchField();
dpm($mail);?>
[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?
https://drupal.org/developing/api/database
Ничего не понял если честно. Вам что нужно получить 'uid','name','mail'? И записать это в массив? либо получить значение каждого поля? Либо вы еще не можете получить $names ?
Ну вот смотрите. Мне нужно получить значение 'uid','name','mail' определенного пользователя. Если убрать строку ->condition, то в форму выводится таблица с данными всех пользователей,поэтому я добавила условие, чтобы на выходе были данные определенного пользователя.
Если в строке будет вот так: ->condition('name','Фамилия Имя'), то на выходе получится таблица, где будут данные пользователя с фамилией, которая в кавычках. Но мне нужно фамилия и имя, которая вводится в поле textfield. Поэтому возник вопрос, как правильно получить и использовать значение этого поля.
Так я вам про это и писал. У вас модуль devel стоит? если вы введете в аякс колбэке print_r($form_state['values']); то должен выводится массив значений. где бы вы и должны были увидеть ваш $form_state['values']['names']; Если это дело не выводится значит что то не так с формой.
Можно я пришлю вам весь модуль? Может у вас получится найти ошибку. Я что-то не очень понимаю, где я должна увидеть $form_state['values']['names']
Модуля devel у меня нет.
Задача моя вот в чем: написать модуль с формой поиска данных о пользователях. Вот конкретного пользователя найти то и не получается
Вот ввожу 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'];
}
?>
Короче у вас трабла именно с получением значения инпута. Ковыряйте форму.
Вот например, если будет такая строка:
->condition('name','Лысенко Виктория'), то выводится то, что на картинке. А если я напишу
->condition('name',$names), то выводится пустая таблица
Подскажите пожалуйста, как при нажатии на кнопку вывести данные о пользователе, чья фамилия введена в текстовом поле. Я уже все переробывала...
Да я понял.
Вообще должно быть как то так по идее:
<?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'];
}?>
Не не то
Хотя у меня именно так и работает примерно.
if ($form_state['triggering_element']['#id'] == 'id_вашей кнопки'){
$form['step1']['names']['#default_value'] = $form_state['values']['names'];
}?>
Зачем '#default_value' => 'Иван Иванович Иванов'? Ведь тогда поиск будет осуществляться только по этой фамилии. Нужно, чтобы фамилии вводилась на форме в текстовом поле.
Попробуйте модуль. Может я что-то совсем не так делаю
Да не то написал. Смотрю просто по своей форме а у меня все по другому.
Не скачивается.
Сейчас попробую по-другому
..
http://yadi.sk/d/8zMV4p_INJNUe
http://yadi.sk/d/X-38myiMNJNTs
Так еще раз что у меня должно быть автокомплит у меня работает. То есть пользователя находит.
пришли пожалуйста скрин, что у тебя выходит и что ты вводишь в окне поиска пользователя
Нашел в чем ошибка подождите чутка
Что вы вводили в этом окне?
почту дайте
Сейчас сообщением пришлю
name
сейчас попробую
Не работает?
Ввела "Лысенко Виктория" это точно есть в базе, но вышло вот так:
<?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.')
);?>
У вас на локалке сайт?
Да
И кстати Это имя пользователя у вас такое Лысенко Виктория? потому что сейчас ищется по имени пользователя. т.е. логин
Да, так и есть