Всем привет!
Поставлена такая задача: Вывести в page.tpl.php заполняемое поле, которое расположено на странице редактирования профиля, чтоб при отправке данных происходило сохранение профиля с новым значением поля.
чтото типа такого:
<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 смысла нет, так как в форме присутствуют переменные данные (токены):
Можно ли каким нибудь образом получить эти токены текущего пользователя, для вставки в page.tpl.php?
Комментарии
hook_form_alter(), лучше hook_form_FORM_ID_alter()
Спасибо, но к сожалению в хуках и функциях, пока что, я не особо. Могли бы Вы пожалуйста больше информации дать.
Я нашел по Вашей подсказке такой код:
<?php function overlay_form_user_profile_form_alter(&$form, &$form_state) {
$form['overlay_control']['overlay'] = array(
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,
);
'#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_token" value="<?php echo $form_token ?>">
Это делает сама форма. Если будите пользоваться альтером, то он сам добавит куда и что нужно.
Вот, сделал вам пример, изучайте
<?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';
}
?>
Премного благодарен! Без Вашей помощи неделю бы разбирался!
Не получилось у меня до сих пор разобраться с этим. Могли бы мне пожалуйста подсказать, что я делаю не так?
Я вставил Ваш код, который Вы сделали в template.php, а в page.tpl.php поубирал ненужные строки из формы. Но форма все равно не работает.
При нажатии на кнопку "Сохранить" просто перебрасывает на страницу редактирования профиля.
скиньте код что вставили, есть подозрения где ошиблись.
Вот то, что вставляю в 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
<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>
Если хук такой как вы написали, он не правильный.
Раз не нашли как хуки делаются, дам намек
<?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 за вас сгенерирует формочку.
Да, я искал как делают хуки, и понял теперь что не указал название темы.
А как тогда вставить эту форму? я ведь не использую модуль webform, чтоб определить форму в блок.
Мне просто нужно, чтоб в определенном месте выводилось поле "код доступа" с конопкой "Сохранить" на всех страницах сайта.
Этот хук только там выведет.
А ну значит изначально я видимо неправильно объяснил свою задачу, извините меня пожалуйста, за это.
Мне нужно чтоб на всех страницах у меня была форма только с одним текстовым полем "Код доступа" (Это поле входит в список тех полей которые находятся на странице редактирования профиля)
Нужно чтоб при заполнении этого поля, и сохранении, информация отправлялась в профиль. То есть по другому говоря, происходило сохранение всей формы редактирования профиля с теперь уже заполненным полем "Код доступа".
Какой-то более наглядный пример можно? Я ничего не понял, кроме того что везде есть форма которая что-то где-то зачемто сохраняет и непонятно зачем она нужна и какие её функции.
Это поле служит для изменения Роли пользователя, посредством Rules!
Если пользователь на странице редактирования своего профиля заполняет это поле правильным значением (Кодом доступа полученным из подписки на рассылку), и происходит сохранение профиля, то у пользователя меняется "Роль" (типа повышается статус юзера).
Вот я и хочу это поле вывести на все страницы отдельно, чтоб не приходилось заходить на страницу редактирования.
Тут надо сидеть и делать.
Форму можно одну, а потом везде выводить её через drupal_get_form
Я бы сделал так:
1. создал страницу с формой для ввода кода.
2. Добавил бы ссылку на неё в качестве вкладки у пользователя на странице
3. Добавил блок с "рекламой" или drupal_get_form тянл бы саму формочку.
Тут мини-модуль все равно наваять придется.