I'm looking to add captcha support to the webform module, but it doesn't look like there's any easy way to append items to the list of captcha_points (other than editing the module source!).

Could a hook be added into captcha to append other module forms? Something like this in the captcha module:

<?php
    $newpoints
= module_invoke_all("captcha_add");
    foreach (
$newpoints as $key=>$value) {
     
$captcha_points[$key] = $value
   
}
?>

And then in the any other module (such as webform, for instance) put:
<?php
   
function webform_captcha_add () {
       return array (
        
'webform_client' => t('Webform Client Form'),
        
'webform_someotherform' => t('Some Other Webform Form'),
       );
    }
?>

I'm looking forward to adding this much requested feature to webform, thanks!

Comments

Version:4.6.x-1.x-dev» 6.x-2.x-dev

I'd also like something like this. I really need to use captcha with my guestbook module. It fille up with spam daily :/

Here's a bit of a work-around for this issue. I've found that more of a change would be necessary than I originally thought. What if a module wanted to customize the captcha, rather than having the captcha module simply stick the captcha at the bottom of the form? A seperate function would be needed that would return only the captcha and skips all the form-specific code currently in the captcha_form_alter() function.

In the exisiting system, we can still accomplish what we want by copying some of the captcha code into the custom module and passing in a fake form item to the captcha module, then merging the result with our custom module form. That sounds more complicated than it is. Here's the code:

<?php
if (module_exist("captcha")) {
   
// Create a dummy form to pass to the captcha function
   
$formItem = array();
   
// Pass the form to the captcha rendering function
   
$captcha_type = variable_get("captcha_type", NULL);
    if (
module_hook($captcha_type, 'captchachallenge')) {
       
call_user_func_array($captcha_type.'_captchachallenge', array(&$formItem, &$_SESSION['captcha']));
    }
       
// Add the captcha to the actual form
   
$form['captcha_response'] = $formItem['captcha_response'];
       
// Change any settings to the captcha
       
$form['captcha_response'] ['#weight'] = 2;
}
?>

The concept of a "captcha point" exists in the cvs version, which uses an array to define what forms you want to use captcha for. One option is to have a "captchapoint" hook, in which every module returns what all points you could have captchas. this is added to the list of captcha points, and this will show up in the captcha config.

ugh, i just noticed the original post says more or less the same thing i wrote. i should go sleep now.

Assigned:Unassigned» wundo

This is a Great feature, I will work in it today... Then I post my solutions here to see what you think ;)

I don't suppose there could be a patch for this that one could apply to a 4.6 install? I'm not quite able to upgrade to 4.7 yet, but I desperately need captcha on my feedback form (which I hear isn't a problem with 4.7).

Status:Active» Closed (fixed)

Status:Closed (fixed)» Active

This doesn't appear to be fixed .. or otherwise, it needs some documentation.

+1 for this feature request!
In particular, I would like to automatically integrate with webform.

Component:Code» Captcha API (captcha)
Assigned:wundo» Unassigned
Status:Active» Fixed

@donquixote

This is a bit of an old/outdated thread, so this might not be the best place to discuss this (e.g. strange thing in #1: the version was changed from 4.6.x-1.x-dev to 6.x-2.x-dev, but I doubt that even Drupal 6 existed in 2006)

Anyway, this might be the function you are looking for (first function in captcha.inc):

<?php
/**
* Helper function for adding/updating a CAPTCHA point.
*
* @param $form_id the form ID to configure.
* @param captcha_type the setting for the given form_id, can be:
*   - 'none' to disable CAPTCHA,
*   - 'default' to use the default challenge type
*   - NULL to remove the entry for the CAPTCHA type
*   - something of the form 'image_captcha/Image'
*   - an object with attributes $captcha_type->module and $captcha_type->type
* @return nothing
*/
function captcha_set_form_id_setting($form_id, $captcha_type) {
?>

Setting this thread back to fixed, unless someone disagrees :)

Status:Fixed» Active

The point is that I would like to be a bit more independent of the form id.
Webform form ids depend on the node id, and I really don't like code that depends on node ids.

I am looking for something that can be called in hook_form_alter, or in a form builder function. Or maybe even a #process handler that can be attached to the form.

I am sure one could come up with more ideas..
If you know a better place to discuss this, let me know!

ok, then you are probably interested in this part of #641122: Integrate with Spam module:

... But the CAPTCHA branch 6.x-2.x is the result of major refactoring to make it possible for other modules to inject CAPTCHAs in the way they want. CAPTCHA 6.x-2.x defines a CAPTCHA element that can be added to forms just like text fields an option lists.
The core CAPTCHA module just provides a basic admin interface that indeed stores its captcha points in its database table.

Adding a CAPTCHA to a form is just as easy as:

<?php
$form
['my_captcha'] = array(
 
'#type' => 'captcha',
);
?>

But true, this should be documented better

Status:Active» Closed (fixed)

But true, this should be documented better

Made a new issue about this: #743056: Document how to add a CAPTCHA programmatically
I think it's best to continue the discussion over there, and close this issue again because it's mainly from the Drupal 4.7 era.