УрокИсчезающий/появляющийся текст в форме поиска

Почти каждый сайт имеет поиск. И само собой, дизайн поиска бывает разный. Но довольно часто встречается такой вариант, когда в форме поиска стоит текст. Вот пример:

search.JPG

В друпале этот текст закидывается довольно просто с помощью след. функций в 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)

Комментарии

Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Спасибо, обязательно попробую!

11.10.2010 01:26
Аватар пользователя Djet
Djet написал:

Спасибо за Ваш сайт очень много полезных триксов.
У меня вопрос делаю исчезающий/появляющийся текст в форме обратной связи.
Сделал не как у Вас предложено через template.php, а создал свой модуль. Но когда указываю

$form['mail']['#value'] = 'E-mail';

при отправке друпал берет это значение и не учитывает то что ввел пользователь.(Эта ошибка не работает даже с отключенными $form['mail']['#attributes']) Помогает только отключение значения.

28.10.2010 17:28
Аватар пользователя Spleshka
Spleshka написал:

Попробуй $form['mail']['#default_value'] = t('E-mail');

28.10.2010 19:19
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Не фига не работает!
И вообще сайт как руководство для новичка - ...

16.08.2011 13:10
Аватар пользователя vegas
vegas написал:

Если позволите, вопрос от новичка :HAPPY:
Функцию надо выводить в шаблон?
Пробовал всякие варианты - без изменений. Очевидно, знаний не хватает.

Заранее благодарю.

07.10.2011 17:32
Аватар пользователя Spleshka
Spleshka написал:

Нет, эту функцию надо писать в template.php текущей темы.

07.10.2011 19:35
Аватар пользователя vegas
vegas написал:

Разобрался. На D7 работает! Это я блок входа переделывал. Пришлось почитать документацию на буржуйском, аж глаза режет :) А попутно вычитал еще много всего, что переваривать буду месяц, не меньше :)
АгрОмАднОЕ спасибо за урок!!!

09.10.2011 06:21
Аватар пользователя vegas
vegas написал:

Вот только радость моя не относится к полю типа 'password'... Это решаемо?

09.10.2011 06:21
Аватар пользователя Spleshka
Spleshka написал:

Решаемо. Для этого надо темизировать функцию theme_password

09.10.2011 12:29
Аватар пользователя vegas
vegas написал:

Спасибо за наводку! Подправил.
Но мне всё еще нужна помощь, плиз. Как вместо звездочек вывести "пароль"? Я так понимаю, нужно менять тип поля в зависимости от onFocus или onBlur.
Добавил переменную, которой будет присваиваться 'textfield' или 'password'. И два дня уже бьюсь, чтобы реализовать условие, но безуспешно...
SplasH, подскажи пожалуйста, в какую сторону копать.

10.10.2011 22:38
Аватар пользователя Spleshka
Spleshka написал:

Типы поля нельзя менять на js, у тебя будет выдавать просто ошибку. Единственный вариант, который более менее годен - это создать рядом с полем для пароля текстовое поле, и в зависимости от blur или focus прятать одно поле и показывать другое. А вообще по рукам надо бить таким дизайнерам, которые в поле с паролем вводят "Пароль". Пример реализации я нашёл на сайте http://www.mysamui.ru/ru

13.10.2011 13:40
Аватар пользователя vegas
vegas написал:

А если сайт создает не дизайнер, а музыкант? Тоже по рукам?!
:) :) :)
По сути, меня больше интересует не слово в форме Pasword, а разобраться с темизацией функций. Учитывая, что я только этим летом познакомился с PHP вообще. :)

Еще раз тебе СПАСИБО, Евгений, за то, что уделил мне время!!! Похоже, что вопрос мой исчерпан. С нетерпением жду новых статей по Drupal 7.

14.10.2011 01:44
Аватар пользователя Spleshka
Spleshka написал:

Да, музыканту тоже по рукам :) Для профилактики.

15.10.2011 15:36
Аватар пользователя игорь
игорь написал:

а не проще через языковой перевод сделать...?

29.11.2011 23:34
Аватар пользователя pantey
pantey написал:

А не подскажите как реализовать подобное (исчезающий текст) в exposed filter ? Т.е. есть раскрытый фильтр, который выводится в блок - в какую сторону копать в таком случае ? Drupal 6

22.03.2012 14:17
Аватар пользователя Spleshka
Spleshka написал:

Повесь кастомный js. Например так (для инпута с id edit-words):

    var exposed_filter = $('#edit-words');
    exposed_filter.val(Drupal.t('Search'));
    exposed_filter.blur(function() {
      if ($(this).val() == '') {
        exposed_filter.val(Drupal.t('Search'));
      }
    });
    exposed_filter.focus(function() {
      if ($(this).val() == Drupal.t('Search')) {
        exposed_filter.val('');
      }
    });
12.04.2012 23:35
Аватар пользователя Val
Val написал:

У меня этот код выдает фатальную ошибку...

Fatal error: Cannot use object of type stdClass as array in Z:\home\Drupal7\www\includes\common.inc on line 5598

Не знаете что может быть не так у меня? У меня поиск как блок вставлен

07.05.2012 03:32
Аватар пользователя Spleshka
Spleshka написал:

Скорее всего, у вас седьмой Друпал, а статья писалась под шестой.

12.05.2012 16:48
Аватар пользователя Семен Семеныч Горбунков
Семен Семеныч Г... написал:

Заработало после перекодировки template.php в utf8(без bom)
Спасибо!

06.06.2012 12:58
Аватар пользователя Фадеев Алексей
Фадеев Алексей написал:

Обязательно попробую, давно бьюсь головой об стену с темизацией поиска на сайте. Попутный вопрос:

При выводе формы поиска поле ввода текта оказывается в отдельном Div (что следует из API ), а сама кнопка поиска ($form['submit'] ) оказывается "за бортом", не подскажите как этого избежать, т.к. необходимо что бы строка и кнопка были в одну строку. Заранее благодарен

04.12.2012 09:33
Аватар пользователя Spleshka
Spleshka написал:

@Фадеев Алексей, 2 варианта:

  • Просто добавить в css этим div'ам свойство inline
  • Перекрыть в теме вывод элементов формы через theme_form_element(), и снять там этот div.
05.12.2012 21:30

Комментировать