Проблема с капчей. Undefined variable: site_key

Тема в разделе "OpenCart", создана пользователем antonbaton, 13 дек 2015.

  1. antonbaton

    antonbaton

    Регистрация:
    24 апр 2013
    Сообщения:
    8
    Симпатии:
    1
    Вместо каптчи вижу
    Код:
    Notice: Undefined variable: site_key in .../catalog/view/theme/mytheme/template/information/contact.tpl on line 133
    Иду смотреть код по указанному адресу, там вот:
    Код:
     <?php if($site_key){?>
      <divclass="form-group">
      <divclass="col-sm-offset-2 col-sm-10">
      <div class="g-recaptcha" data-sitekey="<?php echo $site_key;?>"></div>
      <?php if($error_captcha){?>
      <divclass="text-danger"><?php echo $error_captcha;?></div>
      <?php }?>
    Что не так?

    Капча гугла в настройках включена, все ключи введены. Стандартная капча отключена, но если включить, это не поможет.
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    Идите в контроллер страницы контактов и ищите там объявление site_key (правда. ошибка говорит о том, что его там нет).

    У вас это капча была с шаблоном или отдельным модулем устанавливалась? Если модулем, с ним должен был быть файл для vQmod, который это всё добавляет в нужные места.
     
  3. travlarnor

    travlarnor

    Регистрация:
    10 окт 2014
    Сообщения:
    46
    Симпатии:
    21
    Извиняюсь за костыль, но все-же:
    Если все работает так как надо, и просто мешает Notice, то можно немного поправить код,
    заменив
    <?php if($site_key){?>​
    на
    <?php if(isset($site_key) and $site_key){?>​

    Маловероятно, но возможно код писался для более ранних версий php, а у Вас на хостинге php повзрослел и стал более требовательным.
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    Включите мозги - как всё может работать, если что сейчас, что с вашей правкой не будет выводиться блок капчи?
    И если убрать обёртку с условием, всё равно работать не будет, потому что дальше есть вот эта строчка:
    PHP:
    <div class="g-recaptcha" data-sitekey="<?php echo $site_key;?>"></div>
    Из которой, конечно, можно убрать переменную, но если Гугл не прочитает отсюда правильный ключ, он не пришлёт капчу.


    А в насколько ранних версиях пыха, код умел работать без используемых в нём переменных?


    @antonbaton, самый простой вариант: убрать обёртку с условием (первая и последняя строка в вашем коде) и вписать ключ прямо тут вместо <?php echo $site_key;?>
     
  5. travlarnor

    travlarnor

    Регистрация:
    10 окт 2014
    Сообщения:
    46
    Симпатии:
    21
    Полегче, уважаемый! Некрасиво!
    Возможно Вы правы, но ни я, ни Вы не видели ничего, кроме приведенного куска кода, в котором используется некорректное (с относительно недавних пор) условие, которое я и поправил. Смею предположить, что далее может идти else.
    И не надо ёрничать. всегда умел.
    if($a){echo $a;}else{echo "переменная \$a не определена.";}​
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    Это не экзамен, где знаешь - не знаешь, а хоть что-то ответить надо. Так что, заведомо бессмысленные ответы считаю оскорблением (для меня так же очевидно, что без этой переменной капча не будет работать, как то, что 2+2 !=5, а потому любой совет о том, как избавится только от самой ошибки, но не подставить ключ в нужное место - бессмысленный).

    Мне и его достаточно.
    По вашей логике, терапевт должен был бы делать каждому пациенту вскрытие, чтоб установить диагноз.

    Если откинуть очевидную вещь, что оно там не нужно, достаточно и того, что последняя строка выглядит вот так
    PHP:
    <?php }?>
    Откуда, опять же, очевидно, что дальше нет никакого else, ибо тогда было бы вот так:
    PHP:
    <?php } else { ?>
    1. Это и сейчас работает, но никогда не работало и не будет работать, если переменная $a необходима для выполнения задачи (и именно об этом я говорил).
    2. Это проверка не на объявленность переменной, а на её заполненность. Второй блок сработает если в переменной $a будет 0, пустая строка, false и т.д. Да, для не объявленной переменной второй блок тоже сработает (плюс выкинет нотайс), но сознательно писать такой код, зная, что переменная может быть не объявлена - это чистейшее говнокодерство.
    3. В принципе, сознательно писать код, который может выкидывать нотайсы - это говнокодерство.
     
  7. travlarnor

    travlarnor

    Регистрация:
    10 окт 2014
    Сообщения:
    46
    Симпатии:
    21
    Меня огорчает то, что своим постом я нанес Вам оскорбление, но я не считал и не считаю свой пост бессмысленным, тем более заведомо. Попытаюсь объяснить:
    1 Модуль, фрагмент которого был представлен ТС, был написан тогда, когда php замечания о необъявленной переменной не выдавал. Могу ошибаться, но, насколько помню это где-то до php 5.4.
    2 Моя правка как раз избавит код от notice, никоим образом не изменив ни структуры, ни смысла. Насколько я знаю подобные ошибки решаются именно так. Да, я прекрасно понимаю, что капча от этой правки скорее всего не появится, но привык писать так, чтобы код ошибок не выдавал (да Вы и сами говорите о низком качестве кода, приводящего к notice).
    3 Сознательно писать код, зная, что переменная, используемая в нем может быть не объявлена - это норма. Просто перед использованием этой переменной делается проверка. Уверен, что и Вы так делаете.
    4 Не будучи доктором Хаусом я сделал оговорку "Если все работает так как надо, и просто мешает Notice".​

    Так что не оскорбляйтесь, не стоит.
     
    Последнее редактирование: 13 дек 2015
    skiv14 нравится это.
  8. antonbaton

    antonbaton

    Регистрация:
    24 апр 2013
    Сообщения:
    8
    Симпатии:
    1
    Друзья, не стоит эта мелочь таких разбирательств, но все-равно спасибо за теорию.

    В контроллере действительно нет упоминания site_key. Капча была установлена с шаблоном и никаких модулей для этого я не ставил.
     
  9. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    Значит, с шаблоном должен был идти файл для vQmod, чтоб отредактировать контроллер. Или его не было, или вы vQmod не используете, либо изменения не внеслись из-за какого-то конфликта.

    Самый простой вариант - вписать ключ прямо тут. И чтоб ничего не сломать, лучше всего сделать это добавив перед кодом, который вы здесь выложили это:
    PHP:
    <?php if(!isset($site_key) || empty($site_key)){
        
    $site_key 'ВАШ_КЛЮЧ';
    ?>
    Если скрипт капчи подключается в самом шаблоне, а не через контроллер, этого должно хватить, чтоб капча заработала.

    Тогда версии ОпенКарта на php ещё не было. Нотайсы при не объявленных переменных есть во всей пятой ветки php (с более ранними я не работал, но, думаю, что и там тоже) и выдаются, если выставлена генерация соответствующего уровня ошибок.
    Единственное изменение в 5.4 - это то, что E_STRICT стал частью E_ALL, но E_STRICT не имеет отношения к нотайсам - это ошибки типа статического вызова нестатического метода или одинакового имени для свойства в трейте и в классе, который использует этот трейт и т.д. В седьмом пыхе этот уровень убрали и разделили его ошибки между E_DEPRECATED, E_NOTICE и E_WARNING.

    Я всегда ставлю error_reporting(-1); так что независимо от версии языка вижу ошибки всех типов.

    Так именно об этом я и говорю - эта правка просто уберёт нотайс, никоим образом не повлияв на саму проблему.
    С таким же успехом можно просто отключить вывод ошибок.

    Не перекручивайте мои слова, я говорил не об использовании переменных, которые могут быть не объявлены, а о коде, который выдаёт нотайсы (по любым причинам).
    Если делается проверка (и решение на её основе)- нотайсов не будет! И к такому коду у меня нет претензий.

    Не надо быть Хаусом, чтоб понять, что ничего вообще не работает, если весь код, который должен работать, заключён в условие с переменной, которой нет.
    Кроме того, в первом посте явно говорится о том, что вместо капчи ошибка. Тогда что, по вашему, работает как надо, если смысл темы именно в том, что капчи нет.
     
  10. antonbaton

    antonbaton

    Регистрация:
    24 апр 2013
    Сообщения:
    8
    Симпатии:
    1
    Спасибо.
    Извиняюсь, нашел код капчи в контроллере:
    144 строка
    Код:
    // Captcha
        // Captcha
         if ($this->config->get($this->config->get('config_captcha') . '_status') && in_array('contact', (array)$this->config->get('config_captcha_page'))) {
           $data['captcha'] = $this->load->controller('captcha/' . $this->config->get('config_captcha'), $this->error);
         } else {
           $data['captcha'] = '';
         }
    
    и еще раз ниже - 178 строка
    Код:
        // Captcha
            if ($this->config->get($this->config->get('config_captcha') . '_status') && in_array('contact', (array)$this->config->get('config_captcha_page'))) {
                $captcha = $this->load->controller('captcha/' . $this->config->get('config_captcha') . '/validate');
    
                if ($captcha) {
                    $this->error['captcha'] = $captcha;
                }
            }
     
  11. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    А что внутри директории /catalog/controller/captcha (если она есть)?
    Код указывает на то, что у вас в админке есть возможность выбрать капчу из нескольких вариантов, но код самой капчи в отдельных контроллерах.

    Так капчка заработала после добавления моей правки?
     
  12. antonbaton

    antonbaton

    Регистрация:
    24 апр 2013
    Сообщения:
    8
    Симпатии:
    1
    К сожалению, после правки не заработала.
    По указанному вами пути находятся 2 файла:
    basic_captch.php
    google_cpatcha.php

    В последнем файле вот такой код:
     
  13. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    А что пишет? Не заработать не могло только, если у вас ключ от апи неправильный

    Как следует из этой строки:
    PHP:
    $data['site_key'] = $this->config->get('google_captcha_key');
    переменная в контроллере всё же есть.

    Дайте ссылку на сайт.
     
  14. ivan201661

    ivan201661

    Регистрация:
    20 ноя 2016
    Сообщения:
    3
    Симпатии:
    0
    Dotrox,
    Здравствуйте! Помогите пожалуйста. Возникла такая же проблема. добавив <?php if(!isset($site_key) || empty($site_key)){
    $site_key = 'ВАШ_КЛЮЧ';
    } ?>
    капча появилась но не работает.
     
  15. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    А конкретнее? Она не отправляется или всегда неправильно определяется или какие-то ошибки?
     
  16. ivan201661

    ivan201661

    Регистрация:
    20 ноя 2016
    Сообщения:
    3
    Симпатии:
    0
    внес изненение
    на страницу с товаром в отзывы стоит капча все бы хорошо но при нажатии на нее ни чего непроисходит. Вот ссылка на сайт. Вот код
    Код:
    <?php if(!isset($site_key) || empty($site_key)){
        $site_key = '6Lc8lQoUAAAAAJsVURE3fwj1a3J_B2PyP24iwgj9';} ?>
        
    <?php if ($site_key) { ?>
                      <div class="form-group">
                        <div class="col-sm-12">
                          <div class="g-recaptcha" data-sitekey="<?php echo $site_key; ?>"></div>
                        </div>
                      </div>
                     <?php } ?>
     
  17. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    2.038
    Симпатии:
    774
    Ну почему же не происходит? При нажатии на саму капчу галочка проставляется, а при отправке формы в ответ приходит вот это:
    Код:
    <b>Notice</b>: Undefined index: g-recaptcha-response in <b>/home/l/labraparay/labrapara/public_html/catalog/controller/captcha/google_captcha.php</b> on line <b>32</b>{"error":"Verification code does not match the image!"}
    Ну, и со страницы при отправке формы никакие данные из капчи не отправляются. Это у вас уже проблема в обработчике клика на кнопку добавления отзыва:
    Код:
    $('#button-review').on('click', function() {
        $.ajax({
            url: 'index.php?route=product/product/write&product_id=49',
            type: 'post',
            dataType: 'json',
            data: 'name=' + encodeURIComponent($('input[name=\'name\']').val()) + '&text=' + encodeURIComponent($('textarea[name=\'text\']').val()) + '&rating=' + encodeURIComponent($('input[name=\'rating\']:checked').val() ? $('input[name=\'rating\']:checked').val() : ''),
            beforeSend: function() {
                $('#button-review').button('loading');
            },
            complete: function() {
                $('#button-review').button('reset');
            },
            success: function(json) {
                $('.alert-success, .alert-danger').remove();
    
                if (json['error']) {
                    $('#review').after('<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '</div>');
                }
    
                if (json['success']) {
                    $('#review').after('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + '</div>');
    
                    $('input[name=\'name\']').val('');
                    $('textarea[name=\'text\']').val('');
                    $('input[name=\'rating\']:checked').prop('checked', false);
                }
            }
        });
    });
    
    Строку с data приведите к такому виду:
    Код:
    data: 'name=' + encodeURIComponent($('input[name=\'name\']').val()) + '&text=' + encodeURIComponent($('textarea[name=\'text\']').val()) + '&rating=' + encodeURIComponent($('input[name=\'rating\']:checked').val() ? $('input[name=\'rating\']:checked').val() : '') + '&g-recaptcha-response=' + $('textarea[name=\'g-recaptcha-response\']').val(),
     
  18. ivan201661

    ivan201661

    Регистрация:
    20 ноя 2016
    Сообщения:
    3
    Симпатии:
    0
    ПОБЕДА!!! Спасибо огромное.