UndefinedOffset / silverstripe-nocaptcha

A spam protector and form field using Google's reCAPTCHA v2 or optionally a foundation v3 implementation
BSD 3-Clause "New" or "Revised" License
31 stars 37 forks source link

gettemplatehelper method not found #42

Closed guyvanbael closed 6 years ago

guyvanbael commented 6 years ago

Getting this error when adding no-captcha to a SS3.1.3 site. [User Error] Uncaught Exception: Object->__call(): the method 'gettemplatehelper' does not exist on 'NocaptchaField' GET /carre2015/contact Line 763 in /Users/guy/Documents/webroot/carre2015/framework/core/Object.php

Source 754 default : 755 throw new Exception ( 756 "Object->call(): extra method $method is invalid on $this->class:" 757 . var_export($config, true) 758 ); 759 } 760 } else { 761 // Please do not change the exception code number below. 762 $class = get_class($this); 763 throw new Exception("Object->call(): the method '$method' does not exist on '$class'", 2175); 764 } 765 } 766
767 // -------------------------------------------------------------------------------------------------------------- 768
769 /** Trace Object->call(getTemplateHelper,Array) NocaptchaField.php:269 NocaptchaField->getTemplateHelper() NocaptchaField.php:269 NocaptchaField->getFormID() ViewableData.php:108 ViewableData->get(FormID) ViewableData.php:363 ViewableData->obj(FormID,,,1) ViewableData.php:436 ViewableData->XML_val(FormID,,1) call_user_func_array(Array,Array) SSViewer.php:179 SSViewer_Scope->call(XML_val,Array) SSViewer.php:535 SSViewer_DataPresenter->call(XML_val,Array) .cache.nocaptcha.templates.forms.NocaptchaField.ss:19 SSViewer_DataPresenter->XML_val(FormID,,1) .cache.nocaptcha.templates.forms.NocaptchaField.ss:19 include(/private/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.nocaptcha.templates.forms.NocaptchaField.ss) SSViewer.php:1031 SSViewer->includeGeneratedTemplate(/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.nocaptcha.templates.forms.NocaptchaField.ss,NocaptchaField,,Array,) SSViewer.php:1098 SSViewer->process(NocaptchaField,) ViewableData.php:334 ViewableData->renderWith(Array) FormField.php:589 FormField->Field(Array) NocaptchaField.php:126 NocaptchaField->Field() ViewableData.php:361 ViewableData->obj(Field,,,1) ViewableData.php:436 ViewableData->XML_val(Field,,1) call_user_func_array(Array,Array) SSViewer.php:179 SSViewer_Scope->call(XML_val,Array) SSViewer.php:535 SSViewer_DataPresenter->call(XML_val,Array) .cache.framework.templates.forms.FormField_holder.ss:31 SSViewer_DataPresenter->XML_val(Field,,1) .cache.framework.templates.forms.FormField_holder.ss:31 include(/private/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.framework.templates.forms.FormField_holder.ss) SSViewer.php:1031 SSViewer->includeGeneratedTemplate(/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.framework.templates.forms.FormField_holder.ss,NocaptchaField,,Array,) SSViewer.php:1098 SSViewer->process(NocaptchaField,) ViewableData.php:334 ViewableData->renderWith(Array) FormField.php:605 FormField->FieldHolder() ViewableData.php:361 ViewableData->obj(FieldHolder,,,1) ViewableData.php:436 ViewableData->XML_val(FieldHolder,,1) call_user_func_array(Array,Array) SSViewer.php:179 SSViewer_Scope->call(XML_val,Array) SSViewer.php:535 SSViewer_DataPresenter->call(XML_val,Array) .cache.userforms.templates.forms.UserFormsStepField.ss:34 SSViewer_DataPresenter->XML_val(FieldHolder,,1) .cache.userforms.templates.forms.UserFormsStepField.ss:34 include(/private/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.userforms.templates.forms.UserFormsStepField.ss) SSViewer.php:1031 SSViewer->includeGeneratedTemplate(/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.userforms.templates.forms.UserFormsStepField.ss,UserFormsStepField,,Array,) SSViewer.php:1098 SSViewer->process(UserFormsStepField,) ViewableData.php:334 ViewableData->renderWith(Array) FormField.php:589 FormField->Field(Array) UserFormsStepField.php:24 UserFormsStepField->FieldHolder() ViewableData.php:361 ViewableData->obj(FieldHolder,,,1) ViewableData.php:436 ViewableData->XML_val(FieldHolder,,1) call_user_func_array(Array,Array) SSViewer.php:179 SSViewer_Scope->call(XML_val,Array) SSViewer.php:535 SSViewer_DataPresenter->call(XML_val,Array) .cache.userforms.templates.Includes.UserForm.ss:68 SSViewer_DataPresenter->XML_val(FieldHolder,,1) .cache.userforms.templates.Includes.UserForm.ss:68 include(/private/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.userforms.templates.Includes.UserForm.ss) SSViewer.php:1031 SSViewer->includeGeneratedTemplate(/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.userforms.templates.Includes.UserForm.ss,UserForm,,Array,) SSViewer.php:1098 SSViewer->process(UserForm,) ViewableData.php:334 ViewableData->renderWith(Array) Form.php:1351 Form->forTemplate() ViewableData.php:437 ViewableData->XML_val(Form,,1) call_user_func_array(Array,Array) SSViewer.php:179 SSViewer_Scope->call(XML_val,Array) SSViewer.php:535 SSViewer_DataPresenter->call(XML_val,Array) .cache.themes.carre2015.templates.Layout.ContactPagina.ss:30 SSViewer_DataPresenter->XML_val(Form,,1) .cache.themes.carre2015.templates.Layout.ContactPagina.ss:30 include(/private/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.themes.carre2015.templates.Layout.ContactPagina.ss) SSViewer.php:1031 SSViewer->includeGeneratedTemplate(/var/folders/m7/fvm9vz117wg8_t75r1sq2v4w0000gp/T/silverstripe-cache-php5.6.32-Users-guy-Documents-webroot-carre2015/guy/.cache.themes.carre2015.templates.Layout.ContactPagina.ss,ViewableData_Customised,,Array,) SSViewer.php:1098 SSViewer->process(ViewableData_Customised,) SSViewer.php:1094 SSViewer->process(ViewableData_Customised) Controller.php:198 Controller->handleAction(SS_HTTPRequest,index) RequestHandler.php:200 RequestHandler->handleRequest(SS_HTTPRequest,DataModel) Controller.php:153 Controller->handleRequest(SS_HTTPRequest,DataModel) ContentController.php:198 ContentController->handleRequest(SS_HTTPRequest,DataModel) ModelAsController.php:78 ModelAsController->handleRequest(SS_HTTPRequest,DataModel) Director.php:370 Director::handleRequest(SS_HTTPRequest,Session,DataModel) Director.php:153 Director::direct(/contact,DataModel) main.php:177

UndefinedOffset commented 6 years ago

Sorry for the confusion, looks like the 1.0.x branch/releases have not been compatible with 3.1 since version 0.3.0, SilverStripe 3.2 defines the method causing you issues. That version should still work on 3.1 however you cannot use the invisible captcha based on my commit for 0.3.1 it looks like there was an issue with it.

I've updated the composer.json accordingly.

guyvanbael commented 6 years ago

so, i should use 0.3.0 release? using this version fixes this isue BUT form can be submitted without having to tick the captcha box

UndefinedOffset commented 6 years ago

That would be my recommendation to at least try assuming you cannot update the version of the CMS to > 3.2.

You may also be able to extend the NocaptchaField and override getFormID with something replicates the functionality. Perhaps something like (untested):

class CustomNocaptchaField extends NocaptchaField {
    /**
     * Gets the form's id
     * @return string
     */
    public function getFormID() {
        return ($this->form ? $this->form->FormName():null);
    }
}

class CustomNocaptchaProtector implements NocaptchaProtector {
    /**
     * Return the Field that we will use in this protector
     * @return string
     */
    public function getFormField($name="Recaptcha2Field", $title='Captcha', $value=null) {
        return new CustomNocaptchaField($name, $title);
    }
}

Then use CustomNocaptchaProtector as your spam protector instead of the NocaptchaProtector.

guyvanbael commented 6 years ago

the only thing that helped was updating the cms. @UndefinedOffset Thanx a lot for pointing me in the right direction! Realy appreciate it!

UndefinedOffset commented 6 years ago

no problem