Вместо каптчи вижу Код: 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 }?> Что не так? Капча гугла в настройках включена, все ключи введены. Стандартная капча отключена, но если включить, это не поможет.
Идите в контроллер страницы контактов и ищите там объявление site_key (правда. ошибка говорит о том, что его там нет). У вас это капча была с шаблоном или отдельным модулем устанавливалась? Если модулем, с ним должен был быть файл для vQmod, который это всё добавляет в нужные места.
Извиняюсь за костыль, но все-же: Если все работает так как надо, и просто мешает Notice, то можно немного поправить код, заменив <?php if($site_key){?>на <?php if(isset($site_key) and $site_key){?> Маловероятно, но возможно код писался для более ранних версий php, а у Вас на хостинге php повзрослел и стал более требовательным.
Включите мозги - как всё может работать, если что сейчас, что с вашей правкой не будет выводиться блок капчи? И если убрать обёртку с условием, всё равно работать не будет, потому что дальше есть вот эта строчка: PHP: <div class="g-recaptcha" data-sitekey="<?php echo $site_key;?>"></div> Из которой, конечно, можно убрать переменную, но если Гугл не прочитает отсюда правильный ключ, он не пришлёт капчу. А в насколько ранних версиях пыха, код умел работать без используемых в нём переменных? @antonbaton, самый простой вариант: убрать обёртку с условием (первая и последняя строка в вашем коде) и вписать ключ прямо тут вместо <?php echo $site_key;?>
Полегче, уважаемый! Некрасиво! Возможно Вы правы, но ни я, ни Вы не видели ничего, кроме приведенного куска кода, в котором используется некорректное (с относительно недавних пор) условие, которое я и поправил. Смею предположить, что далее может идти else. И не надо ёрничать. всегда умел. if($a){echo $a;}else{echo "переменная \$a не определена.";}
Это не экзамен, где знаешь - не знаешь, а хоть что-то ответить надо. Так что, заведомо бессмысленные ответы считаю оскорблением (для меня так же очевидно, что без этой переменной капча не будет работать, как то, что 2+2 !=5, а потому любой совет о том, как избавится только от самой ошибки, но не подставить ключ в нужное место - бессмысленный). Мне и его достаточно. По вашей логике, терапевт должен был бы делать каждому пациенту вскрытие, чтоб установить диагноз. Если откинуть очевидную вещь, что оно там не нужно, достаточно и того, что последняя строка выглядит вот так PHP: <?php }?> Откуда, опять же, очевидно, что дальше нет никакого else, ибо тогда было бы вот так: PHP: <?php } else { ?> 1. Это и сейчас работает, но никогда не работало и не будет работать, если переменная $a необходима для выполнения задачи (и именно об этом я говорил). 2. Это проверка не на объявленность переменной, а на её заполненность. Второй блок сработает если в переменной $a будет 0, пустая строка, false и т.д. Да, для не объявленной переменной второй блок тоже сработает (плюс выкинет нотайс), но сознательно писать такой код, зная, что переменная может быть не объявлена - это чистейшее говнокодерство. 3. В принципе, сознательно писать код, который может выкидывать нотайсы - это говнокодерство.
Меня огорчает то, что своим постом я нанес Вам оскорбление, но я не считал и не считаю свой пост бессмысленным, тем более заведомо. Попытаюсь объяснить: 1 Модуль, фрагмент которого был представлен ТС, был написан тогда, когда php замечания о необъявленной переменной не выдавал. Могу ошибаться, но, насколько помню это где-то до php 5.4. 2 Моя правка как раз избавит код от notice, никоим образом не изменив ни структуры, ни смысла. Насколько я знаю подобные ошибки решаются именно так. Да, я прекрасно понимаю, что капча от этой правки скорее всего не появится, но привык писать так, чтобы код ошибок не выдавал (да Вы и сами говорите о низком качестве кода, приводящего к notice). 3 Сознательно писать код, зная, что переменная, используемая в нем может быть не объявлена - это норма. Просто перед использованием этой переменной делается проверка. Уверен, что и Вы так делаете. 4 Не будучи доктором Хаусом я сделал оговорку "Если все работает так как надо, и просто мешает Notice". Так что не оскорбляйтесь, не стоит.
Друзья, не стоит эта мелочь таких разбирательств, но все-равно спасибо за теорию. В контроллере действительно нет упоминания site_key. Капча была установлена с шаблоном и никаких модулей для этого я не ставил.
Значит, с шаблоном должен был идти файл для 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); так что независимо от версии языка вижу ошибки всех типов. Так именно об этом я и говорю - эта правка просто уберёт нотайс, никоим образом не повлияв на саму проблему. С таким же успехом можно просто отключить вывод ошибок. Не перекручивайте мои слова, я говорил не об использовании переменных, которые могут быть не объявлены, а о коде, который выдаёт нотайсы (по любым причинам). Если делается проверка (и решение на её основе)- нотайсов не будет! И к такому коду у меня нет претензий. Не надо быть Хаусом, чтоб понять, что ничего вообще не работает, если весь код, который должен работать, заключён в условие с переменной, которой нет. Кроме того, в первом посте явно говорится о том, что вместо капчи ошибка. Тогда что, по вашему, работает как надо, если смысл темы именно в том, что капчи нет.
Спасибо. Извиняюсь, нашел код капчи в контроллере: 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; } }
А что внутри директории /catalog/controller/captcha (если она есть)? Код указывает на то, что у вас в админке есть возможность выбрать капчу из нескольких вариантов, но код самой капчи в отдельных контроллерах. Так капчка заработала после добавления моей правки?
К сожалению, после правки не заработала. По указанному вами пути находятся 2 файла: basic_captch.php google_cpatcha.php В последнем файле вот такой код:
А что пишет? Не заработать не могло только, если у вас ключ от апи неправильный Как следует из этой строки: PHP: $data['site_key'] = $this->config->get('google_captcha_key'); переменная в контроллере всё же есть. Дайте ссылку на сайт.
Dotrox, Здравствуйте! Помогите пожалуйста. Возникла такая же проблема. добавив <?php if(!isset($site_key) || empty($site_key)){ $site_key = 'ВАШ_КЛЮЧ'; } ?> капча появилась но не работает.
внес изненение на страницу с товаром в отзывы стоит капча все бы хорошо но при нажатии на нее ни чего непроисходит. Вот ссылка на сайт. Вот код Код: <?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 } ?>
Ну почему же не происходит? При нажатии на саму капчу галочка проставляется, а при отправке формы в ответ приходит вот это: Код: <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(),