CdCaptcha + BreezingForms

по адресу \plugins\system\cdcaptcha\extension\site\ создаем файл cdcaptcha_com_breezingforms.php с таким содержанием:

<?php

// no direct access
defined('_JEXEC') or die;

/**
 * WCMS! Contact Component
 */
class cdcaptcha_com_breezingforms
{
	public $name = 'CDCaptcha and BreezingForms';

	public $version = '2.5';

	public $enabled = 1;

	public $redirect = '';

	public $rememberFields = 1;

	public $isAjax = 0;

    /**
     * WCMS! Application Input
     * @var null
     */
    private $JInput = null;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->JInput = JFactory::getApplication()->input;
    }

	/**
	 * Get Instance
	 * @return instance
	 */
	public static function getInstance()
	{
		static $instance;
		if ($instance == null) $instance = new cdcaptcha_com_breezingforms();

		return $instance;
	}

	/**
	 * Form object
	 * @return object		Form element.
	 */
	public function formObject()
	{
		$formObject = new stdClass();

		$view = $this->JInput->get->get('view', '', 'cmd');
		//var_dump($view);
		//{WebXlooForms:ContactUs}
		switch($view) {
			case 'form':
				$formObject->formElement = 'form';
				$formObject->submitElement = 'input[name="ff_nm_Submit"]';
				$formObject->scriptDeclaration = "
container.before('<style>#cdcaptcha {margin: 10px 0 10px -35%; width: 300px;} #cdcaptcha .ui-widget .ui-widget {width: 90%;} #cdcaptcha .infotext {font-size: 1em; font-weight: bold; text-align: center; color: #183e65;} #cdcaptcha .status .status_locked {color: red;} #cdcaptcha .status .status_unlocked {color: green;} #cdcaptcha .infotext {font-style: normal;} #cdcaptcha .status {display:none;}</style><script>$(\".infotext\").html(\"NO ROBOTS ALLOWED\"); $(\".captcha_header\").html(\"\"); $(\".status\").before(\"<center><b>slide to submit</b></center><br>\"); </script>');
container.appendTo($('div', container.prev('div.Submit')));
";
				$formObject->rememberFields = array(
                    'jform'=> array(
                        'ff_nm_in_name',
                        'contact_email',
                        'contact_subject',
                        'contact_message',
                        'contact_email_copy'
                    )
                );
				break;

			default:
				$formObject->formElement = 'form';
				$formObject->submitElement = 'input[name="ff_nm_Submit"]';
				$formObject->scriptDeclaration = "
container.before('<style>#cdcaptcha {margin: 10px 0 10px -35%; width: 300px;} #cdcaptcha .ui-widget .ui-widget {width: 90%;} #cdcaptcha .infotext {font-size: 1em; font-weight: bold; text-align: center; color: #183e65;} #cdcaptcha .status .status_locked {color: red;} #cdcaptcha .status .status_unlocked {color: green;} #cdcaptcha .infotext {font-style: normal;} #cdcaptcha .status {display:none;}</style><script>$(\".infotext\").html(\"NO ROBOTS ALLOWED\"); $(\".captcha_header\").html(\"\"); $(\".status\").before(\"<center><b>Slide to submit</b></center><br>\"); </script>');
/*container.appendTo($('div', container.prev('div.Submit')));
console.log(container.parent().before('555'));*/
";
				break;
		}

		return $formObject;
	}

	/**
	 * Check captcha if required
	 * @return 	boolean			True if captcha is checked.
	 */
	public function checkCaptchaRules()
	{
		$post_task = $this->JInput->post->get('task', '', 'cmd');

		switch($post_task)
		{
			case 'form.submit':
				return true;
				break;

			default: break;
		}

		return false;
	}

}

?>

дальше стили и код правим под свои нужды.

ПОЛЕЗНО  Уязвимость редактора JCE

п.с. кнопка сабмита должа иметь имя "Submit" - это же правится в коде тут ff_nm_Submit

апдейт 28.02.2014

обнаружилась проблема, что если у кнопки сабмита в ХТМЛ убрать disabled, то форма отсылается без капчи. решилось так:

в /components/com_breezingforms/facileforms.process.php находим (примерно 2776 строка)

$params = ' action="' . $url . '"' .

и меняем на:

$params = ' action="about:blank' . $url . '"' .

далее в /plugins/system/cdcaptcha/extension/site/cdcaptcha_com_breezingforms.php добавляем проверку на драг слайдера и вставляем скрипт убирания about:blank

$formObject->sliderStop = "
console.log('Hello world');
$(function() {
  $('form').attr('action', function(jj,ww){
    return ww.replace('about:blank','');
  });
});
console.log('Hello world2');
		";