Para comenzar fuerte el año os contamos cómo modificar JComments para utilizar el sistema reCaptcha que viene en el nucleo de Joomla! 2.5 con JComments.
Hace unos días finalmente migramos el blog a la última versión estable de Joomla! y nos dimos cuenta de que el sistema de CAPTCHA que viene de serie con JComments (KCAPTCHA) no funcionaba correctamente. Tras algunas búsquedas infructuosas sobre la solución del problema, pensamos que sería una buena cosa si pudiéramos usar el sistema reCaptcha que viene de serie en el núcleo de Joomla! 2.5. Las ventajas eran:
- Unificar la imagen del sitio de cara a los usuarios usando siempre el mismo sistema de CAPTCHA.
- No duplicar la configuración (ni el código) con nuevos sistemas CAPTCHA o teniendo que buscar nuevas llaves de API.
- Es mucho más divertido implementar esta solución ;o)
La desventaja principal de esto es que de momento es preciso modificar el componente tras cada actualización, pero tras revisar el código, podemos adelantar que parece que el equipo de JComments está trabajando en un sistema de plugins de CAPTCHA para que podáis elegir el sistema que más os guste.
Requisitos del sistema
Esta modificación la hemos probado únicamente con el siguiente software:
- Joomla! 2.5.8
- JComments 2.3.0 (salido el pasado 20 de diciembre)
Posiblemente funcione con versiones anteriores de Joomla! y de JComments y seguramente con versiones futuras, pero en ningún caso esto funcionará para Joomla! 1.5.
Incluir la opción dentro de la configuración de JComments
Primero tenemos que para poder elegir usar nuestro sistema reCaptcha dentro de JComments. Para ello editamos el fichero [JOOMLA]/administrator/components/com_jcomments/admin.jcomments.php y buscamos la línea de código (sobre la posición de línea 1066 en el fichero) que dice:
$captcha[] = JCommentsHTML::makeOption('kcaptcha', 'KCAPTCHA');
y justo debajo añadimos el siguiente código:
$captcha[] = JCommentsHTML::makeOption('recaptcha', 'recaptcha by Gnumla.com');
Incluir el cuadro de reCaptcha en el formulario de los comentarios
En este caso tendremos que editar el fichero [JOOMLA]/components/com_jcomments/tpl/default/tpl_form.php y buscamos sobre la línea 114, la parte de código que dice:
if ($this->getVar('comments-form-captcha', 0) == 1) {
$html = $this->getVar('comments-form-captcha-html');
if ($html != '') {
echo $html;
} else {
$link = JCommentsFactory::getLink('captcha');
?>
<p>
<span>
<img class="captcha" onclick="jcomments.clear('captcha');" id="comments-form-captcha-image" src="/<?php echo $link; ?>" width="121" height="60" alt="<?php echo JText::_('FORM_CAPTCHA'); ?>" /><br />
<span class="captcha" onclick="jcomments.clear('captcha');"><?php echo JText::_('FORM_CAPTCHA_REFRESH'); ?></span><br />
<input class="captcha" id="comments-form-captcha" type="text" name="captcha_refid" value="" size="5" tabindex="6" /><br />
</span>
</p>
<?php
}
}
?>
y la sustituimos por:
if ($this->getVar('comments-form-captcha', 0) == 1) {
$html = $this->getVar('comments-form-captcha-html','kcaptcha');
if ($html == 'kcaptcha') {
$link = JCommentsFactory::getLink('captcha');
?>
<p>
<span>
<img class="captcha" onclick="jcomments.clear('captcha');" id="comments-form-captcha-image" src="/<?php echo $link; ?>" width="121" height="60" alt="<?php echo JText::_('FORM_CAPTCHA'); ?>" /><br />
<span class="captcha" onclick="jcomments.clear('captcha');"><?php echo JText::_('FORM_CAPTCHA_REFRESH'); ?></span><br />
<input class="captcha" id="comments-form-captcha" type="text" name="captcha_refid" value="" size="5" tabindex="6" /><br />
</span>
</p>
<?php
} else {
$link = JCommentsFactory::getLink('captcha');
JPluginHelper::importPlugin('captcha');
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onInit','dynamic_recaptcha_1');
?>
<p>
<span>
<div id="dynamic_recaptcha_1"></div>
</span>
</p>
<?php
}
}
?>
Añadiendo la validación al formulario
Finalmente nos queda añadir la capacidad al formulario para validar el reCaptcha. Para ello tenemos que editar el fichero [JOOMLA]/components/com_jcomments/jcomments.ajax.php y modificar el código que aparece cerca de la línea 275:
if ($acl->check('enable_captcha') == 1)
{
$captchaEngine = $config->get('captcha_engine', 'kcaptcha');
if ($captchaEngine == 'kcaptcha')
{
require_once( JCOMMENTS_BASE.DS.'jcomments.captcha.php' );
if (!JCommentsCaptcha::check($values['captcha_refid']))
{
self::showErrorMessage(JText::_('ERROR_CAPTCHA'), 'captcha');
JCommentsCaptcha::destroy();
$response->addScript("jcomments.clear('captcha');");
return $response;
}
}
else
{
$result = JCommentsEvent::trigger('onJCommentsCaptchaVerify', array($values['captcha_refid'], &$response));
// if all plugins returns false
if (!in_array(true, $result, true))
{
self::showErrorMessage(JText::_('ERROR_CAPTCHA'));
return $response;
}
}
}
y sustituirlo por:
if ($acl->check('enable_captcha') == 1)
{
$captchaEngine = $config->get('captcha_engine', 'kcaptcha');
if ($captchaEngine == "recaptcha")
{
$post = JRequest::get('post');
JPluginHelper::importPlugin('captcha');
$dispatcher = JDispatcher::getInstance();
$resp = $dispatcher->trigger('onCheckAnswer',$post['recaptcha_response_field']);
if(!$resp[0]){
self::showErrorMessage(JText::_('ERROR_CAPTCHA'), 'captcha');
$response->addScript("Recaptcha.reload()");
return $response;
}
else
{
$response->addScript("Recaptcha.reload()");
}
}elseif ($captchaEngine == 'kcaptcha')
{
require_once( JCOMMENTS_BASE.DS.'jcomments.captcha.php' );
if (!JCommentsCaptcha::check($values['captcha_refid']))
{
self::showErrorMessage(JText::_('ERROR_CAPTCHA'), 'captcha');
JCommentsCaptcha::destroy();
$response->addScript("jcomments.clear('captcha');");
return $response;
}
} else
{
$result = JCommentsEvent::trigger('onJCommentsCaptchaVerify', array($values['captcha_refid'], &$response));
// if all plugins returns false
if (!in_array(true, $result, true))
{
self::showErrorMessage(JText::_('ERROR_CAPTCHA'));
return $response;
}
}
}
Una vez realizados estos cambios, podréis elegir indistintamente entre KCAPTCHA y reCaptcha nativo de Joomla! en vuestros sitios. Eso sí, no olvidéis configurar y activar el plugin de reCaptcha de Joomla! 2.5 si es que no lo habéis hecho ya ;o)
Cabe destacar que es posible incorporar estos cambios como un plugin de jcomments, por lo que si alguien se anima esperamos vuestros comentarios y vuestros aportes a este tema ;).
Referencias
Guía para añadir reCaptcha a un módulo (inglés)
Guía para integrar las librerías reCaptcha sin usar el plugin de Joomla! 2.5 (inglés) - [Enlace roto: http://askjoomla.com/3917/integrate-recaptcha-into-jcomments-instead-build-kcaptcha]