Jimbola Posted April 29, 2014 Share Posted April 29, 2014 Hello all, Is it possible to modify the standard contact form to include a simple anti-spam question like what is 1+1 and then if 2 isn't entered the form doesn't submit? Link to comment Share on other sites More sharing options...
vekia Posted April 29, 2014 Share Posted April 29, 2014 it's possible only with modification of: contact.tpl file contactController.php file what prestashop version you use? (exact number) Link to comment Share on other sites More sharing options...
Jimbola Posted April 29, 2014 Author Share Posted April 29, 2014 it's possible only with modification of: contact.tpl file contactController.php file what prestashop version you use? (exact number) It's 1.4.5.1 Link to comment Share on other sites More sharing options...
vekia Posted April 29, 2014 Share Posted April 29, 2014 in contact-form.tpl add this code: <p class="text"> <label for="antispam">{l s='2 + 8 ='}</label> <input type="text" name="antispam" id="antispam" value=""/> </p> before <p class="submit"> <input type="submit" name="submitMessage" id="submitMessage" value="{l s='Send'}" class="button_large" onclick="$(this).hide();" /> </p> then in Controllers/ContactController.php change this if condition: if (Tools::isSubmit('submitMessage')){ } to: if(Tools::getValue('antispam')==10){ $fileAttachment = NULL; if (isset($_FILES['fileUpload']['name']) AND !empty($_FILES['fileUpload']['name']) AND !empty($_FILES['fileUpload']['tmp_name'])) { $extension = array('.txt', '.rtf', '.doc', '.docx', '.pdf', '.zip', '.png', '.jpeg', '.gif', '.jpg'); $filename = uniqid().substr($_FILES['fileUpload']['name'], -5); $fileAttachment['content'] = file_get_contents($_FILES['fileUpload']['tmp_name']); $fileAttachment['name'] = $_FILES['fileUpload']['name']; $fileAttachment['mime'] = $_FILES['fileUpload']['type']; } $message = Tools::htmlentitiesUTF8(Tools::getValue('message')); if (!($from = trim(Tools::getValue('from'))) OR !Validate::isEmail($from)) $this->errors[] = Tools::displayError('Invalid e-mail address'); elseif (!($message = nl2br2($message))) $this->errors[] = Tools::displayError('Message cannot be blank'); elseif (!Validate::isCleanHtml($message)) $this->errors[] = Tools::displayError('Invalid message'); elseif (!($id_contact = (int)(Tools::getValue('id_contact'))) OR !(Validate::isLoadedObject($contact = new Contact((int)($id_contact), (int)(self::$cookie->id_lang))))) $this->errors[] = Tools::displayError('Please select a subject on the list.'); elseif (!empty($_FILES['fileUpload']['name']) AND $_FILES['fileUpload']['error'] != 0) $this->errors[] = Tools::displayError('An error occurred during the file upload'); elseif (!empty($_FILES['fileUpload']['name']) AND !in_array(substr($_FILES['fileUpload']['name'], -4), $extension) AND !in_array(substr($_FILES['fileUpload']['name'], -5), $extension)) $this->errors[] = Tools::displayError('Bad file extension'); else { if ((int)(self::$cookie->id_customer)) $customer = new Customer((int)(self::$cookie->id_customer)); else { $customer = new Customer(); $customer->getByEmail($from); } $contact = new Contact($id_contact, self::$cookie->id_lang); if (!(( $id_customer_thread = (int)Tools::getValue('id_customer_thread') AND (int)Db::getInstance()->getValue(' SELECT cm.id_customer_thread FROM '._DB_PREFIX_.'customer_thread cm WHERE cm.id_customer_thread = '.(int)$id_customer_thread.' AND token = \''.pSQL(Tools::getValue('token')).'\'') ) OR ( $id_customer_thread = (int)Db::getInstance()->getValue(' SELECT cm.id_customer_thread FROM '._DB_PREFIX_.'customer_thread cm WHERE cm.email = \''.pSQL($from).'\' AND cm.id_order = '.(int)(Tools::getValue('id_order')).'') ))) { $fields = Db::getInstance()->ExecuteS(' SELECT cm.id_customer_thread, cm.id_contact, cm.id_customer, cm.id_order, cm.id_product, cm.email FROM '._DB_PREFIX_.'customer_thread cm WHERE email = \''.pSQL($from).'\' AND ('. ($customer->id ? 'id_customer = '.(int)($customer->id).' OR ' : '').' id_order = '.(int)(Tools::getValue('id_order')).')'); $score = 0; foreach ($fields as $key => $row) { $tmp = 0; if ((int)$row['id_customer'] AND $row['id_customer'] != $customer->id AND $row['email'] != $from) continue; if ($row['id_order'] != 0 AND Tools::getValue('id_order') != $row['id_order']) continue; if ($row['email'] == $from) $tmp += 4; if ($row['id_contact'] == $id_contact) $tmp++; if (Tools::getValue('id_product') != 0 AND $row['id_product'] == Tools::getValue('id_product')) $tmp += 2; if ($tmp >= 5 AND $tmp >= $score) { $score = $tmp; $id_customer_thread = $row['id_customer_thread']; } } } $old_message = Db::getInstance()->getValue(' SELECT cm.message FROM '._DB_PREFIX_.'customer_message cm WHERE cm.id_customer_thread = '.(int)($id_customer_thread).' ORDER BY date_add DESC'); if ($old_message == htmlentities($message, ENT_COMPAT, 'UTF-8')) { self::$smarty->assign('alreadySent', 1); $contact->email = ''; $contact->customer_service = 0; } if (!empty($contact->email)) { if (Mail::Send((int)(self::$cookie->id_lang), 'contact', Mail::l('Message from contact form'), array('{email}' => $from, '{message}' => stripslashes($message)), $contact->email, $contact->name, $from, ((int)(self::$cookie->id_customer) ? $customer->firstname.' '.$customer->lastname : ''), $fileAttachment) AND Mail::Send((int)(self::$cookie->id_lang), 'contact_form', Mail::l('Your message has been correctly sent'), array('{message}' => stripslashes($message)), $from)) self::$smarty->assign('confirmation', 1); else $this->errors[] = Tools::displayError('An error occurred while sending message.'); } if ($contact->customer_service) { if ((int)$id_customer_thread) { $ct = new CustomerThread($id_customer_thread); $ct->status = 'open'; $ct->id_lang = (int)self::$cookie->id_lang; $ct->id_contact = (int)($id_contact); if ($id_order = (int)Tools::getValue('id_order')) $ct->id_order = $id_order; if ($id_product = (int)Tools::getValue('id_product')) $ct->id_product = $id_product; $ct->update(); } else { $ct = new CustomerThread(); if (isset($customer->id)) $ct->id_customer = (int)($customer->id); if ($id_order = (int)Tools::getValue('id_order')) $ct->id_order = $id_order; if ($id_product = (int)Tools::getValue('id_product')) $ct->id_product = $id_product; $ct->id_contact = (int)($id_contact); $ct->id_lang = (int)self::$cookie->id_lang; $ct->email = $from; $ct->status = 'open'; $ct->token = Tools::passwdGen(12); $ct->add(); } if ($ct->id) { $cm = new CustomerMessage(); $cm->id_customer_thread = $ct->id; $cm->message = htmlentities($message, ENT_COMPAT, 'UTF-8'); if (isset($filename) AND rename($_FILES['fileUpload']['tmp_name'], _PS_MODULE_DIR_.'../upload/'.$filename)) $cm->file_name = $filename; $cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']); $cm->user_agent = $_SERVER['HTTP_USER_AGENT']; if ($cm->add()) { if (empty($contact->email)) Mail::Send((int)(self::$cookie->id_lang), 'contact_form', Mail::l('Your message has been correctly sent'), array('{message}' => stripslashes($message)), $from); self::$smarty->assign('confirmation', 1); } else $this->errors[] = Tools::displayError('An error occurred while sending message.'); } else $this->errors[] = Tools::displayError('An error occurred while sending message.'); } if (count($this->errors) > 1) array_unique($this->errors); } } } i added there if condition to check antispam field value, if it is equal to 10 (2+8) then send messages. 1 Link to comment Share on other sites More sharing options...
Jimbola Posted April 29, 2014 Author Share Posted April 29, 2014 Thanks Do I need to replace all that big code block or just the first line? Link to comment Share on other sites More sharing options...
vekia Posted April 29, 2014 Share Posted April 29, 2014 you can add only if condition that i added there. remember about closing bracket. Link to comment Share on other sites More sharing options...
hatak Posted May 20, 2014 Share Posted May 20, 2014 (edited) nice and simple solution! (cheapest ) actually, we need to change if (Tools::isSubmit('submitMessage') to if(Tools::getValue('antispam')==X) works fine in ps1.6 Edited May 21, 2014 by hatak (see edit history) Link to comment Share on other sites More sharing options...
durangodave Posted October 25, 2014 Share Posted October 25, 2014 (edited) nice and simple solution! (cheapest ) actually, we need to change if (Tools::isSubmit('submitMessage') to if(Tools::getValue('antispam')==X) works fine in ps1.6 actually for 1.6, for security reasons you need to leave the test for submitMessage so rather than remove that just add a new if right under it so open up controllers/front/ContactController.php (of course i changed mine from a math to a visual page questions asking what color is the submit button) if (Tools::isSubmit('submitMessage')) { //anti spam mod just added new if statment is all if (Tools::getValue('antispam')=='green') { then be sure to close it out down below and also add some error control }else{ $this->errors[] = Tools::displayError('You did not answer the anti bot question correctly - must be lower case characters.'); }//close else getvalue antispam right above this } } public function setMedia() and then back i the tpl file to add the question to the form open up themes/your_theme_name/contact-form.tpl and add <!-- anti bot mod --> <p class="form-group"> <label for="antispam">{l s='What color is the send button below?'}</label> <input type="text" name="antispam" id="antispam" size="5" maxlength="6" value=""/> </p> <!-- mod end --> right above div class="submit" hope that helps.. Edited October 25, 2014 by durangodave (see edit history) 1 Link to comment Share on other sites More sharing options...
Frevab Posted September 30 Share Posted September 30 I prefer to to use captcha but will this simple anti-spam question work in PS 1.7.2.4 ? Or with modification ? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now