За последние 24 часа нас посетили 18732 программиста и 1603 робота. Сейчас ищут 869 программистов ...

Поисковик

Тема в разделе "Прочие вопросы по PHP", создана пользователем devid134, 27 июл 2013.

  1. devid134

    devid134 Новичок

    С нами с:
    19 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    как сделать так чтобы кнопка не нажималась если в поле ничего не ввели?

    model.php

    Код (Text):
    1.  
    2. /*  === Поиск ===  */
    3. function search(){
    4.     $search = clear($_GET['search']);
    5.     $result_search = array(); // результат поиска
    6.    
    7.     if(mb_strlen($search, 'UTF-8') < 3){
    8.         $result_search['notfound'] = "<div class='error_search'>Поисковый запрос должен содержать<br /> не менее 3-х символов!</div>";
    9.     }else{
    10.         $query = "SELECT goods_id, name, img, anons_list, anons, price, hits, new, sale, articul
    11.                    FROM goods
    12.                        WHERE MATCH(name, keywords, articul, anons_list, anons, content)
    13.                            AGAINST('$search*' IN BOOLEAN MODE) AND visible='1'";
    14.         $res = mysql_query($query) or die(mysql_error());
    15.        
    16.         if(mysql_num_rows($res) > 0){
    17.             while($row_search = mysql_fetch_assoc($res)){
    18.                 $result_search[] = $row_search;
    19.             }
    20.         }else{
    21.             $result_search['notfound'] = "<div class='error_search'>По Вашему запросу ничего не найдено!</div>";
    22.         }
    23.     }
    24.     return $result_search;
    25. }
    26. /*  === Поиск ===  */
    controller.php

    Код (Text):
    1.  
    2. case('search'):
    3.         // Поиск
    4.         $result_search = search();
    5.        
    6.         // параметры для навигации
    7.          $perpage = PERPAGE; // кол-во товаров на страницу
    8.          if(isset($_GET['page'])){
    9.             $page = (int)$_GET['page'];
    10.             if($page < 1) $page = 1;
    11.          }else{
    12.             $page = 1;
    13.          }
    14.          $count_rows = count($result_search);  //  общее кол-во товаров
    15.          $pages_count = ceil($count_rows / $perpage);  // кол-во страниц
    16.          if(!$pages_count) $pages_count = 1; // минимум 1 страница
    17.          if($page > $pages_count) $page = $pages_count; // если запрошенная страница больше максимума
    18.          $start_pos = ($page - 1) * $perpage; // начальная позиция для запроса
    19.          $endpos = $start_pos + $perpage; // до какого товара будет вывод на странице
    20.          if($endpos > $count_rows) $endpos = $count_rows;
    21.          
    22.     break;
    сама форма

    Код (Text):
    1.  
    2. <form method="get">
    3.         <ul class="search-head">
    4.             <input type="hidden" name="view" value="search"/>
    5.             <li><input type="text" name="search" id="quickquery" placeholder="Что вы хотите купить?" />
    6.                 <script type="text/javascript">
    7.                     //<![CDATA[
    8.                     placeholderSetup('quickquery');
    9.                     //]]>
    10.                 </script>  
    11.             </li>
    12.             <li><input type="image" class="search-btn" src="<?=TEMPLATE?>images/search-btn.jpg" /></li>
    13.         </ul>
    14. </form>
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Попробуйте в инпут, который окошко для ввода, добавить атрибут required="true".

    Браузер просто не даст отослать форму на сервер, пока в инпуте не будет хоть что-нибудь введено. То есть кнопочка-то будет нажматься, но это будет приводить лишь к сообщению "заполните это поле!". А сервак будет тихо мирно себе ждать нормальный запрос.
     
  3. devid134

    devid134 Новичок

    С нами с:
    19 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    Все равно ищет все товары которые совпадают с
    placeholder="Что вы хотите купить?"
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Попробуй js проверять, чем не вариант?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    а ну правильно, там же не сабмит, а какая-то, пардон *опа. С плейсхолдером какие-то мутки до кучи.
     
  6. devid134

    devid134 Новичок

    С нами с:
    19 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    а можно другим способом выводить сообщение, вместо placeholder="Что вы хотите купить?", чтобы не была такая жопа и как мне проверить js если поиск построин не по js?
     
  7. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Старый добрый javascript... Пишем там все необходимое, а при событии onClick делаем свое дело, чистим поле если не равно Что вы хотите купить?, или еще как то, твое дело.Думаю разберешься как правильно сделать.

    Смотрим твой код, немного начинаем думать... Если у тебя простая кнопка да еще с типом image то значить сабмит формы происходит через js и еще как кажется там ajax.Перед сабмитом проверяем что пользователь что то ввел.
     
  8. devid134

    devid134 Новичок

    С нами с:
    19 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    спасибо щас все попробую)

    Добавлено спустя 4 минуты 54 секунды:
    Вот скрипт но если честно я в скриптах не очень)) Поможете? Где вписать onClick?
    Код (Text):
    1.  
    2. function placeholderSetup(id) {
    3.     var el = ge(id);
    4.     if(!el) return;
    5.     if(el.type != 'text') return;
    6.     if(el.type != 'text') return;
    7.    
    8.     var ph = el.getAttribute("placeholder");
    9.     if( ph && ph != "" ) {
    10.         el.value = ph;
    11.         el.style.color = '#37424b';
    12.         el.is_focused = 0;
    13.         el.onfocus = placeholderFocus;
    14.         el.onblur = placeholderBlur;
    15.     }
    16. }
    Добавлено спустя 46 секунд:
    Также и...

    Код (Text):
    1.  
    2. function placeholderFocus() {
    3.   if(!this.is_focused) {
    4.     this.is_focused = 1;
    5.     this.value = '';
    6.     this.style.color = '#37424b';
    7.  
    8.     var rs = this.getAttribute("radioselect");
    9.     if( rs && rs != "" ) {
    10.       var re = document.getElementById(rs);
    11.       if(!re) { return; }
    12.       if(re.type != 'radio') return;
    13.  
    14.       re.checked=true;
    15.     }
    16.   }
    17. }
    18.  
    19. function placeholderBlur() {
    20.   var ph = this.getAttribute("placeholder")
    21.   if( this.is_focused && ph && this.value == "" ) {
    22.         this.is_focused = 0;
    23.     this.value = ph;
    24.     this.style.color = '#37424b';
    25.   }
    26. }
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А че это за куски джава кода? Я хз что это ты мне показываешь:)
    Создай отдельную функцию, напиши как тебе надобно и вызывай.

    Сори мне сейчас не до этого, мож кто то и напишет за тебя подожди немного...
    Я дал тебе направление, попробуй.
     
  10. devid134

    devid134 Новичок

    С нами с:
    19 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    Ок спасибо) попробую методом тыка))
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Java!=JavaScript;
    Плейсхолдер как раз и задуман, чтобы в пустом поле ввода показывалась подсказка, что туда воодить, но само поле чтобы при этом было пустое. По умолчанию плейсхолдер не может быть отправлен на сервер. Это у вас там какая-то JS-хрень, которая впихивает плейсхолдер в запрос. Предположительно:
    Добавлено спустя 10 минут 32 секунды:
    Эти вот пляски с бубном - просто невероятные костыли. У меня, к примеру, в проекте текущем куча форм обычных, пробрасывающих данные через AJAX, при этом нигде не используется такая экзотика, чтобы запрос собирался через JS, минуя сабмит-событие, и сам отправлялся на сервер по клику. Есть же стандартные механизмы для этого.
    1) Создал форму.
    2) На сабмит формы вешаешь листенер AJAX-овый. Ту же JQuery берешь, делаешь в ней обработку сабмита формы по id.
    Код (Text):
    1. $("#ID_формы").submit
    3) Перед запросом сериализуем данные с формы:
    Код (Text):
    1. var data = $("#ID_формы").serialize();
    4) В запрос к передаваемым данным дописываешь data.
    5) ...
    6) PROFIT!

    При этом нет никаких костылей, используются только стандартные механизмы, которые ни за что не сунут плейсхолдер в запрос, и тем более не позволят отправить формы с пустыми required-инпутами. Зачем было пытаться решить проблемы, которые уже давным-давно решены? Более того, можно вынести проверку на длину введенного текста на сторону клиента, используя атрибут pattern. Конечно, это не сверхнадежный фильтр, ибо клиент, при желании его обойдет, так что на сервере фильтрация тоже должна стоять. Но количество холостых запросов к серверу он заметно снизит.

    Щас глянул ваш код, так и есть:
    1)var el = ge(id);
    2) var ph = el.getAttribute("placeholder");
    3) el.value = ph;
    [​IMG]
    И вот накойчерт тогда нужен плейсхолдер, скажите? Не проще ли просто при создании формы, сразу ей Value вбивать?
     
  12. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Спасибо за просветление, а то не знал :) (сарказм)

    По моему ты его вообще грузанул.
    Как мне кажется код там готовый ему надо просто проверить что поле заполнено, а он сейчас полезет куда не надо(((
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну дык, жизнь-боль.
    Пусть переадресует весь этот груз тому, кто ему этот код "сготовил".

    Там в инпуте берется плейсхолдер, превращается в велью, потом берется велью и стилизуется под плейсхолдер. В итоге плейсхолдер не плейсхолдер, реквайред не актуален, pattern не применим, зато есть search_btn, которая инициирует отправку запроса, минуя submit-событие. Это вот апофеоз того, что я называю анальной стоматологией.
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    "placeholder" не работает в некоторых браузерах, по этому я всегда делаю свой для кроссбраузерности.
    А проверить ввели в поле или нет, помогут события клавиатуры.
    http://learn.javascript.ru/keyboard-events
    Сделать кнопку не активной поможет атрибут "disabled".
    При вводе проверить ввели или нет и если ввели, сделать кнопку активной и убрать "disabled".
    Яваскрипт поможет вам-это сделать без перезагрузки.
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Все правильно. В некоторых. В IE6, например. Который сдох. В то время как 95% пользователей сидят на браузерах, поддерживающих HTML5. Тут же это делается без проверки на браузер в принципе. Я понимаю, что если плейсхолдер не поддерживается, можно сконвертить его в велью. А если поддерживается, можно оставить как плейсхолдер, чтобы браузер сам все правильно сделал. Но тут, согласитесь, немного по-другому происходит.

    Эти вот костыли, по большому счету, как раз и оставляют на плаву браузеры, не поддерживающие в 2013 году то, что было введено 6(!!!) лет назад. Интернет - это конкуренция. Естественный отбор. Не тянешь? Вон с рынка. Не хочешь "вон с рынка?" сделай в своем браузере функцию обновления и соответствуй современным требованиям. Если бы такой подход практиковался во всем интернете, проблема отпала бы сама собой. Но нет, нам жалко потерять 5% пользователей говнобраузеров, по этому мы, в угоду им, уродуем свои проекты.

    Вон, вышел IE10, поддерживающий все фичи, которые были в хроме 3 года назад. Ура. Но, он "суперсовременен", как говорят маркетологи, был только на момент выхода. Следующее обновление случится только года через 3. IE - открой интернет заново и закрой обратно.
     
  16. devid134

    devid134 Новичок

    С нами с:
    19 июл 2013
    Сообщения:
    14
    Симпатии:
    0
    вот 1 хороший человек из 1 форума написал скрипт и он помог мне
    Код (Text):
    1.  
    2. function check(text) {
    3.     var button = document.getElementById("bt");
    4.     return text !== "" ? button.disabled = false : button.disabled = true;
    5. }
     
  17. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ну что я говорил ему просто проверить надо было пусто не пусто...
    Можешь доработать что бы поле при клике очищалось и т.д. и да событие onBlur.
    Можешь поэксперементировать
    http://design.originweb.info/dhtml/onblur.html

    А если 2 пробела? :)
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    не удивляйтесь, увидев пользователя с именем "введите ваше имя" )))
     
  19. devid134

    devid134 Новичок

    С нами с:
    19 июл 2013
    Сообщения:
    14
    Симпатии:
    0
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да! Йуху! MOAR JS! Чтобы исправить косяки одного скрипта, давайте добавим еще один скрипт!

    Решение-то было нужно в 2 действия:
    1) Выпиливаем строчку placeholderSetup('quickquery');
    2) Добавляем инпуту атрибут required="true"

    Все. Плейсхолдер будет вести себя как плейсхолдер и браузер сам не позволит отослать пустой запрос. И работать это будет даже при отключенном JS у клиента.

    Хотя...может браузер и пропустил бы пустое значение, учитывая что у вас там отправка формы магическая, а не сабмитовая(кстати, а нахрена?). Но, конечно, проще чтобы проект обрастал костылями. Костылями для костылей. Заплатками для косяков, порождаемых костылями и тд. Это самый настоящий рак кода.
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чувак, заглядывай в доки чаще.