УрокИсчезающий/появляющийся текст в форме поиска
Почти каждый сайт имеет поиск. И само собой, дизайн поиска бывает разный. Но довольно часто встречается такой вариант, когда в форме поиска стоит текст. Вот пример:
В друпале этот текст закидывается довольно просто с помощью след. функций в template.php:
function имятемы_theme(){ return array( 'search_theme_form' => array( 'arguments' => array('form' => NULL), ), ); } function имятемы_search_theme_form($form) { unset($form['search_theme_form']['#title']); $form['search_theme_form']['#value'] = 'Простой рецепт'; $form['submit']['#value'] = 'Найти'; return drupal_render($form); }
Важное замечание: если форма поиска выводится переменной $search_box, тогда можете смело копировать код и запихивать в template.php. Если же поиск выставлен блоком - тогда в названии функции theme надо будет заменить на block, т.е.
function имятемы_theme(){ return array( 'search_block_form' => array( 'arguments' => array('form' => NULL), ), ); } function имятемы_search_block_form($form) { unset($form['search_theme_form']['#title']); $form['search_theme_form']['#value'] = 'Простой рецепт'; $form['submit']['#value'] = 'Найти'; return drupal_render($form); }
Первая функция - это регистрация второй функции в друпале.
Но это ещё не всё. Нам ведь надо, чтобы при клике на текстовое поле поиска пропадал текст, а когда мы кликаем вне текстового поля - текст должен обратно появляться. Я видел реализацию этого функционала через накручивание левых скриптов, и килобайт 30 абсолютно ненужного кода. Особые хитрецы умудрялись ещё раз подключать библиотеку jquery. В итоге получалось около 100 килобайт скриптов только на исчезновение текста в поиске. В общем, херня полнейшая.
Вот как оно должно выглядеть в нормальной реализации:
function имятемы_search_theme_form($form) { unset($form['search_theme_form']['#title']); $form['search_theme_form']['#value'] = 'Простой рецепт'; $form['submit']['#value'] = 'Найти'; $form['search_theme_form']['#attributes'] = array( 'onBlur'=> "if (this.value.length == 0) {this.value='{$form['search_theme_form']['#value']}'}", 'onFocus'=> "if (this.value== '{$form['search_theme_form']['#value']}') {this.value=''}" ); return drupal_render($form); }
Вот и всё. Три дополнительных строки кода и все счастливы. Таким же образом можно делать и форму логина через функцию имятемы_user_login_block($form)
- SplasH
- 30.09.2010
- 4099
Комментарии
Спасибо, обязательно попробую!
Спасибо за Ваш сайт очень много полезных триксов.
У меня вопрос делаю исчезающий/появляющийся текст в форме обратной связи.
Сделал не как у Вас предложено через template.php, а создал свой модуль. Но когда указываю
$form['mail']['#value'] = 'E-mail';
при отправке друпал берет это значение и не учитывает то что ввел пользователь.(Эта ошибка не работает даже с отключенными $form['mail']['#attributes']) Помогает только отключение значения.
Попробуй $form['mail']['#default_value'] = t('E-mail');
Не фига не работает!
И вообще сайт как руководство для новичка - ...
Если позволите, вопрос от новичка :HAPPY:
Функцию надо выводить в шаблон?
Пробовал всякие варианты - без изменений. Очевидно, знаний не хватает.
Заранее благодарю.
Нет, эту функцию надо писать в template.php текущей темы.
Разобрался. На D7 работает! Это я блок входа переделывал. Пришлось почитать документацию на буржуйском, аж глаза режет :) А попутно вычитал еще много всего, что переваривать буду месяц, не меньше :)
АгрОмАднОЕ спасибо за урок!!!
Вот только радость моя не относится к полю типа 'password'... Это решаемо?
Решаемо. Для этого надо темизировать функцию
Спасибо за наводку! Подправил.
Но мне всё еще нужна помощь, плиз. Как вместо звездочек вывести "пароль"? Я так понимаю, нужно менять тип поля в зависимости от onFocus или onBlur.
Добавил переменную, которой будет присваиваться 'textfield' или 'password'. И два дня уже бьюсь, чтобы реализовать условие, но безуспешно...
SplasH, подскажи пожалуйста, в какую сторону копать.
Типы поля нельзя менять на js, у тебя будет выдавать просто ошибку. Единственный вариант, который более менее годен - это создать рядом с полем для пароля текстовое поле, и в зависимости от blur или focus прятать одно поле и показывать другое. А вообще по рукам надо бить таким дизайнерам, которые в поле с паролем вводят "Пароль". Пример реализации я нашёл на сайте http://www.mysamui.ru/ru
А если сайт создает не дизайнер, а музыкант? Тоже по рукам?!
:) :) :)
По сути, меня больше интересует не слово в форме Pasword, а разобраться с темизацией функций. Учитывая, что я только этим летом познакомился с PHP вообще. :)
Еще раз тебе СПАСИБО, Евгений, за то, что уделил мне время!!! Похоже, что вопрос мой исчерпан. С нетерпением жду новых статей по Drupal 7.
Да, музыканту тоже по рукам :) Для профилактики.
а не проще через языковой перевод сделать...?
А не подскажите как реализовать подобное (исчезающий текст) в exposed filter ? Т.е. есть раскрытый фильтр, который выводится в блок - в какую сторону копать в таком случае ? Drupal 6
Повесь кастомный js. Например так (для инпута с id edit-words):
У меня этот код выдает фатальную ошибку...
Не знаете что может быть не так у меня? У меня поиск как блок вставлен
Скорее всего, у вас седьмой Друпал, а статья писалась под шестой.
Комментировать