render($element);
}
/**
* Render captcha form elements for the given element
*
* Creates and returns:
* - Hidden input with captcha identifier (name[id])
* - Text input for entering captcha value (name[input])
*
* More specific renderers will consume this and render it.
*
* @param ElementInterface $element
* @throws Exception\DomainException
* @return string
*/
protected function renderCaptchaInputs(ElementInterface $element)
{
$name = $element->getName();
if ($name === null || $name === '') {
throw new Exception\DomainException(sprintf(
'%s requires that the element has an assigned name; none discovered',
__METHOD__
));
}
$attributes = $element->getAttributes();
$captcha = $element->getCaptcha();
if ($captcha === null || !$captcha instanceof CaptchaAdapter) {
throw new Exception\DomainException(sprintf(
'%s requires that the element has a "captcha" attribute implementing Zend\Captcha\AdapterInterface; none found',
__METHOD__
));
}
$hidden = $this->renderCaptchaHidden($captcha, $attributes);
$input = $this->renderCaptchaInput($captcha, $attributes);
return $hidden . $input;
}
/**
* Render the hidden input with the captcha identifier
*
* @param CaptchaAdapter $captcha
* @param array $attributes
* @return string
*/
protected function renderCaptchaHidden(CaptchaAdapter $captcha, array $attributes)
{
$attributes['type'] = 'hidden';
$attributes['name'] .= '[id]';
if (isset($attributes['id'])) {
$attributes['id'] .= '-hidden';
}
if (method_exists($captcha, 'getId')) {
$attributes['value'] = $captcha->getId();
} elseif (array_key_exists('value', $attributes)) {
if (is_array($attributes['value']) && array_key_exists('id', $attributes['value'])) {
$attributes['value'] = $attributes['value']['id'];
}
}
$closingBracket = $this->getInlineClosingBracket();
$hidden = sprintf(
'createAttributesString($attributes),
$closingBracket
);
return $hidden;
}
/**
* Render the input for capturing the captcha value from the client
*
* @param CaptchaAdapter $captcha
* @param array $attributes
* @return string
*/
protected function renderCaptchaInput(CaptchaAdapter $captcha, array $attributes)
{
$attributes['type'] = 'text';
$attributes['name'] .= '[input]';
if (array_key_exists('value', $attributes)) {
unset($attributes['value']);
}
$closingBracket = $this->getInlineClosingBracket();
$input = sprintf(
'createAttributesString($attributes),
$closingBracket
);
return $input;
}
/**
* Set value for captchaPosition
*
* @param mixed $captchaPosition
* @throws Exception\InvalidArgumentException
* @return AbstractWord
*/
public function setCaptchaPosition($captchaPosition)
{
$captchaPosition = strtolower($captchaPosition);
if (!in_array($captchaPosition, array(self::CAPTCHA_APPEND, self::CAPTCHA_PREPEND))) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects either %s::CAPTCHA_APPEND or %s::CAPTCHA_PREPEND; received "%s"',
__METHOD__,
__CLASS__,
__CLASS__,
(string) $captchaPosition
));
}
$this->captchaPosition = $captchaPosition;
return $this;
}
/**
* Get position of captcha
*
* @return string
*/
public function getCaptchaPosition()
{
return $this->captchaPosition;
}
/**
* Set separator string for captcha and inputs
*
* @param string $separator
* @return AbstractWord
*/
public function setSeparator($separator)
{
$this->separator = (string) $separator;
return $this;
}
/**
* Get separator for captcha and inputs
*
* @return string
*/
public function getSeparator()
{
return $this->separator;
}
}