Получение токенов формы user/edit текущего пользователя

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

Аватар пользователя Sadchenko Sadchenko 27 декабря 2012 в 6:08

Всем привет!
Поставлена такая задача: Вывести в page.tpl.php заполняемое поле, которое расположено на странице редактирования профиля, чтоб при отправке данных происходило сохранение профиля с новым значением поля.

чтото типа такого:

<form enctype="multipart/form-data" action="/user/<?php echo $user->uid ?>/edit" method="post" id="user-profile-form" accept-charset="UTF-8">
  <label for="code_access">Код доступа</label>
  <input type="text" id="code_access" name="field_code_access[und][0][value]" value="">
  <input type="submit" id="edit-submit" name="op" value="Получить доступ">
</form>

Просто скопировать HTML формы и вставить в page.tpl.php смысла нет, так как в форме присутствуют переменные данные (токены):

<input type="hidden" name="form_build_id" value="form-Q7HnlpXCK5gmWsiGMxzFxGJNI-WlFM4boyId9i4yvSs">
<input type="hidden" name="form_token" value="na70h5O4r2P1WwtIiZGMZEFOmeTMFnBLSgyz_SCe0og">

Можно ли каким нибудь образом получить эти токены текущего пользователя, для вставки в page.tpl.php?

Комментарии

Аватар пользователя Sadchenko Sadchenko 27 декабря 2012 в 11:44

Спасибо, но к сожалению в хуках и функциях, пока что, я не особо. Могли бы Вы пожалуйста больше информации дать.
Я нашел по Вашей подсказке такой код:

<?php

function overlay_form_user_profile_form_alter(&$form, &$form_state) {
  if (
$form['#user_category'] == 'account') {
    
$account $form['#user'];
    if (
user_access('access overlay'$account)) {
      
$form['overlay_control'] = array(
        
'#type' => 'fieldset'
        
'#title' => t('Administrative overlay'), 
        
'#weight' => 4
        
'#collapsible' => TRUE,
      );

      

$form['overlay_control']['overlay'] = array(
        
'#type' => 'checkbox'
        
'#title' => t('Use the overlay for administrative pages.'), 
        
'#description' => t('Show administrative pages on top of the page you started from.'), 
        
'#default_value' => isset($account->data['overlay']) ? $account->data['overlay'] : 1,
      );
    }
  }
}
?>

Я так понял этот код идет в template.php
Как его видоизменить, чтоб потом вставить нужную переменную в нужное место формы в шаблоне page.tpl.php, чтоб выглядело примерно так

<input type="hidden" name="form_build_id" value="<?php echo $form_build_id ?>">
<input type="hidden" name="form_token" value="<?php echo $form_token ?>">
Аватар пользователя Niklan Niklan 27 декабря 2012 в 13:47

"Sadchenko" wrote:
">
">

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

"Sadchenko" wrote:
заполняемое поле, которое расположено на странице редактирования профиля, чтоб при отправке данных происходило сохранение профиля с новым значением поля.

Вот, сделал вам пример, изучайте

<?php
// Нам нужна только форма редактирования, а это user_profile_form
function hook_form_user_profile_form_alter(&$form, &$form_state$form_id) {
  
// Объявляем новое поле new_field
  
$form['new_field'] = array(
    
'#type' => 'textfield'// укзаываем что это текстовое поле
    
'#title' => 'Новое текстовое поле'// Название
    
'#description' => 'Описание нового поля.'// описание
  
);
  
  
// К субмиту формы подкрепляем еще нашу функцию, в которой будет происходить непосредственно сохранение чего и куда нужно.
  
$form['#submit'][] = 'hook_form_user_profile_form_alter_submit'
}
?>
Аватар пользователя Sadchenko Sadchenko 10 января 2013 в 14:50

Не получилось у меня до сих пор разобраться с этим. Могли бы мне пожалуйста подсказать, что я делаю не так?
Я вставил Ваш код, который Вы сделали в template.php, а в page.tpl.php поубирал ненужные строки из формы. Но форма все равно не работает.
При нажатии на кнопку "Сохранить" просто перебрасывает на страницу редактирования профиля.

Аватар пользователя Sadchenko Sadchenko 15 января 2013 в 15:37

Вот то, что вставляю в template.php

<?php
// Нам нужна только форма редактирования, а это user_profile_form
function hook_form_user_profile_form_alter(&$form, &$form_state$form_id) {
  
// Объявляем новое поле new_field
  
$form['field_code_access'] = array(
    
'#type' => 'textfield'// укзаываем что это текстовое поле
    
'#title' => 'Новое текстовое поле'// Название
    
'#description' => 'Описание нового поля.'// описание
  
);
  
  
// К субмиту формы подкрепляем еще нашу функцию, в которой будет происходить непосредственно сохранение чего и куда нужно.
  
$form['#submit'][] = 'hook_form_user_profile_form_alter_submit'
}
?>

А это то, что вставляю в page.tpl.php

<form enctype="multipart/form-data" action="/user/<?php echo $user->uid ?>/edit" method="post" id="user-profile-form" accept-charset="UTF-8">
<label for="edit-field-code-access-und-0-value">Код доступа</label>
<input type="text" id="edit-field-code-access-und-0-value" name="field_code_access[und][0][value]" value="">
<input type="hidden" name="form_id" value="user_profile_form">
<input type="submit" id="edit-submit" name="op" value="Сохранить">
</form>
Аватар пользователя Niklan Niklan 15 января 2013 в 16:42

Если хук такой как вы написали, он не правильный.
Раз не нашли как хуки делаются, дам намек

<?php
// Нам нужна только форма редактирования, а это user_profile_form
function THEMENAME_form_user_profile_form_alter(&$form, &$form_state$form_id) {
  
// Объявляем новое поле new_field
  
$form['field_code_access'] = array(
    
'#type' => 'textfield'// укзаываем что это текстовое поле
    
'#title' => 'Новое текстовое поле'// Название
    
'#description' => 'Описание нового поля.'// описание
  
);
  
  
// К субмиту формы подкрепляем еще нашу функцию, в которой будет происходить непосредственно сохранение чего и куда нужно.
  
$form['#submit'][] = 'THEMENAME_form_user_profile_form_alter_submit'
}
?>

Не надо никаких форм делать в page.tpl.php У каждой формы есть своя tpl.
Все делается в хуке - редактируется старое и добавляется новое. А Drupal за вас сгенерирует формочку.

Аватар пользователя Sadchenko Sadchenko 15 января 2013 в 16:47

Да, я искал как делают хуки, и понял теперь что не указал название темы.

"Niklan" wrote:
Не надо никаких форм делать в page.tpl.php

А как тогда вставить эту форму? я ведь не использую модуль webform, чтоб определить форму в блок.
Мне просто нужно, чтоб в определенном месте выводилось поле "код доступа" с конопкой "Сохранить" на всех страницах сайта.

Аватар пользователя Sadchenko Sadchenko 15 января 2013 в 21:59

А ну значит изначально я видимо неправильно объяснил свою задачу, извините меня пожалуйста, за это.
Мне нужно чтоб на всех страницах у меня была форма только с одним текстовым полем "Код доступа" (Это поле входит в список тех полей которые находятся на странице редактирования профиля)

Нужно чтоб при заполнении этого поля, и сохранении, информация отправлялась в профиль. То есть по другому говоря, происходило сохранение всей формы редактирования профиля с теперь уже заполненным полем "Код доступа".

Аватар пользователя Niklan Niklan 15 января 2013 в 22:36

Какой-то более наглядный пример можно? Я ничего не понял, кроме того что везде есть форма которая что-то где-то зачемто сохраняет и непонятно зачем она нужна и какие её функции.

Аватар пользователя Sadchenko Sadchenko 15 января 2013 в 22:49

Это поле служит для изменения Роли пользователя, посредством Rules!

Если пользователь на странице редактирования своего профиля заполняет это поле правильным значением (Кодом доступа полученным из подписки на рассылку), и происходит сохранение профиля, то у пользователя меняется "Роль" (типа повышается статус юзера).

Вот я и хочу это поле вывести на все страницы отдельно, чтоб не приходилось заходить на страницу редактирования.

Аватар пользователя Niklan Niklan 17 января 2013 в 16:41

Тут надо сидеть и делать.
Форму можно одну, а потом везде выводить её через drupal_get_form

Я бы сделал так:
1. создал страницу с формой для ввода кода.
2. Добавил бы ссылку на неё в качестве вкладки у пользователя на странице
3. Добавил блок с "рекламой" или drupal_get_form тянл бы саму формочку.

Тут мини-модуль все равно наваять придется.