Eigen errors Zend Captcha
Ik ben bezig met zend_captcha. Deze geeft echter als default error "Captcha value is wrong". Nu wil ik dit vervangen door mijn eigen error.
Ik heb hier 2 opties voor:
1. We openen Zend_Captcha_Word en veranderen daar de error melding
2. We voegen in Zend_Captcha_Word de volgende functie toe:
Code (php)
En dan kan ik gewoon de error meegeven bij het initialiseren.
Dit zijn beide geen ideale opties. Optie 1 niet omdat ik mijn error message flexibel wil houden en niet hard wil defineren. Optie 2 niet omdat ik daarmee een functie toevoeg aan het framework en ik de code daarmee niet meer kan kopieren naar een andere server met Zend zonder ook die aangepaste class mee te kopieren.
Wat blijft er dan nog over? Zend_Captcha_Word extenden, in die class de functie toevoegen uit optie 2 en vervolgens
$var = new deGeextendeClasse;
$var->SetErrorMessage('bla');
doen. Die optie valt echter ook af aangezien Zend_Captcha_Word een abstracte class is, dus de geextende class ook abstract moet zijn en die mag ik niet rechtstreeks benaderen.
En nu weet ik niet meer wat ik moet doen. Iemand die me hierbij kan helpen?
Groet
Newb
een abstracte klasse is er juist om ge-extend te worden! Hoezo mag dat volgens jou niet? Een abstracte klasse is als een Interface, echter mag je in een abstracte klasse al wel methodes uitschrijven.
GeextendeClass::functie() mag niet.
Quote:
Zend_Captcha_Word een abstracte class is, dus de geextende class ook abstract moet zijn en die mag ik niet rechtstreeks benaderen.
Dat zei je dus niet, je zei dat hij ook abstract moet zijn, maar dat is onzin.
Maar ik snap wel je probleem nu idd.
Dat is geen onzin. De geextende class van een abstracte class moet ook abstract zijn.
Voorbeeld:
Voertuig zou een abstracte class kunnen zijn.
Auto erft van voertuig, maar is geen abstracte class, maar een concrete.
Het zelfde geldt ook voor bijvoorbeeld fiets etc.
Op je vraag heb ik niet direct antwoord, maar ik denk eigenlijk dat er nog een betere manier moet zijn, er zal bij het ontwerp toch wel rekening mee gehouden zijn dat de error message ook aangepast moet kunnen worden?
Zelf heb ik nog nooit met Zend_Captcha gewerkt, maar is er niet een vergelijkbare manier om een error message in te stellen zoals die er ook voor zend form elementen is?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Zend_Captcha_Word_Error extends Zend_Captcha_Word
{
/**
* Set error message of bad captcha
*
* @param string $message
* @return Zend_Captcha_Word
*/
public function setErrorMessage($message)
{
$this->_messageTemplates[self::BAD_CAPTCHA] = $message;
return $this;
}
public function render(Zend_View_Interface $view, $element = null) { }
}
?>
class Zend_Captcha_Word_Error extends Zend_Captcha_Word
{
/**
* Set error message of bad captcha
*
* @param string $message
* @return Zend_Captcha_Word
*/
public function setErrorMessage($message)
{
$this->_messageTemplates[self::BAD_CAPTCHA] = $message;
return $this;
}
public function render(Zend_View_Interface $view, $element = null) { }
}
?>
Dat is een werkende functie, maar wanneer ik hem zo aanroep:
Dan gaat dat natuurlijk niet werken, ik initieer namelijk een nieuwe class dus de error melding wordt niet aangepast.
Iemand die me kan vertellen wat ik nu moet doen?
Fatal error: Class test contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Zend_Captcha_Adapter::render)
Gewijzigd op 01/01/1970 01:00:00 door PHP Newbie
I rest my case
Ik weet niet op welke manier je de captcha wil gebruiken, maar als dat Zend_Form_Element_Captcha is, dan heb ik het vermoeden dat je een melding via Zend_Form_Element_Captcha::setOptions zou moeten kunnen instellen. Helaas kan ik er verder heel weinig informatie over vinden.
Bij een standaard formulier element doe je het gewoon zo:
Code (php)
Zend_Captcha gebruikt echter zijn eigen validator:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
/**
* Validate the word
*
* @see Zend_Validate_Interface::isValid()
* @param mixed $value
* @return boolean
*/
public function isValid($value, $context = null)
{
if (!is_array($value) && !is_array($context)) {
$this->_error(self::MISSING_VALUE);
return false;
}
if (!is_array($value) && is_array($context)) {
$value = $context;
}
$name = $this->getName();
if (isset($value[$name])) {
$value = $value[$name];
}
if (!isset($value['input'])) {
$this->_error(self::MISSING_VALUE);
return false;
}
$input = strtolower($value['input']);
$this->_setValue($input);
if (!isset($value['id'])) {
$this->_error(self::MISSING_ID);
return false;
}
$this->_id = $value['id'];
if ($input !== $this->getWord()) {
$this->_error(self::BAD_CAPTCHA);
return false;
}
return true;
}
?>
/**
* Validate the word
*
* @see Zend_Validate_Interface::isValid()
* @param mixed $value
* @return boolean
*/
public function isValid($value, $context = null)
{
if (!is_array($value) && !is_array($context)) {
$this->_error(self::MISSING_VALUE);
return false;
}
if (!is_array($value) && is_array($context)) {
$value = $context;
}
$name = $this->getName();
if (isset($value[$name])) {
$value = $value[$name];
}
if (!isset($value['input'])) {
$this->_error(self::MISSING_VALUE);
return false;
}
$input = strtolower($value['input']);
$this->_setValue($input);
if (!isset($value['id'])) {
$this->_error(self::MISSING_ID);
return false;
}
$this->_id = $value['id'];
if ($input !== $this->getWord()) {
$this->_error(self::BAD_CAPTCHA);
return false;
}
return true;
}
?>
En ik heb dus geen idee hoe ik die error anders aan zou kunnen passen dan op bovenstaande manier.
:-)
(-:
:-(
)-:
edit: of zou het via Zend...Captach::setOption('_messageTemplates', array()) lukken?
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Ik krijg het daarmee niet voor elkaar... Toch vreemd dat hier op internet ook niks over te vinden is, ik zal toch niet de enige zijn met dit probleem?
(Ik heb ZF wel in m'n include_path staan, maar gebruik het zo goed als nooit. Wanneer je een opstapje geeft is het voor mij, en anderen de drempel wat lager om te proberen.)
Of kan je anders laten zien hoe je de instanties aanmaakt & raadpleegt?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$captcha = new Zend_Form_Element_Captcha('captcha', array('captcha' => array('captcha' => 'Image',
'fontSize' => 38,
'wordLen' => 5,
'timeout' => 300,
'LineNoiseLevel' => 4,
'DotNoiseLevel' => 30,
'ErrorMessage' => 'test',
'font' => $_SERVER['DOCUMENT_ROOT'] . '/KINGRICH.TTF',
'imgDir' => $_SERVER['DOCUMENT_ROOT'] . '/application/tmp/captcha/',
'imgUrl' => Zend_Controller_Front::getInstance()->getBaseUrl().'/application/tmp/captcha/'),
'imgAlt' => 'Captcha')
);
$captcha->setLabel('Voer code in');
?>
$captcha = new Zend_Form_Element_Captcha('captcha', array('captcha' => array('captcha' => 'Image',
'fontSize' => 38,
'wordLen' => 5,
'timeout' => 300,
'LineNoiseLevel' => 4,
'DotNoiseLevel' => 30,
'ErrorMessage' => 'test',
'font' => $_SERVER['DOCUMENT_ROOT'] . '/KINGRICH.TTF',
'imgDir' => $_SERVER['DOCUMENT_ROOT'] . '/application/tmp/captcha/',
'imgUrl' => Zend_Controller_Front::getInstance()->getBaseUrl().'/application/tmp/captcha/'),
'imgAlt' => 'Captcha')
);
$captcha->setLabel('Voer code in');
?>
Aanroepen doe ik zo:
Code (php)
Voorbeeld
Gewijzigd op 01/01/1970 01:00:00 door PHP Newbie
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$captcha = new Zend_Form_Element_Captcha('captcha', array('captcha' => array(
'_messageTemplates' => array(
Zend_Captcha_Word::MISSING_VALUE => 'Missende value',
Zend_Captcha_Word::MISSING_ID => 'Missende identiteit',
Zend_Captcha_Word::BAD_CAPTCHA => 'BEEEP Fout!'
),
'captcha' => 'Image',
'fontSize' => 38,
'wordLen' => 5,
'timeout' => 300,
'LineNoiseLevel' => 4,
'DotNoiseLevel' => 30,
'ErrorMessage' => 'test',
'font' => '/Library/Fonts/Microsoft/Gill Sans MT.ttf',
'imgDir' => '/tmp/'),
'imgAlt' => 'Captcha')
);
$captcha->isValid(array('captcha' => 'Pindakaas'));
var_dump($captcha);
?>
$captcha = new Zend_Form_Element_Captcha('captcha', array('captcha' => array(
'_messageTemplates' => array(
Zend_Captcha_Word::MISSING_VALUE => 'Missende value',
Zend_Captcha_Word::MISSING_ID => 'Missende identiteit',
Zend_Captcha_Word::BAD_CAPTCHA => 'BEEEP Fout!'
),
'captcha' => 'Image',
'fontSize' => 38,
'wordLen' => 5,
'timeout' => 300,
'LineNoiseLevel' => 4,
'DotNoiseLevel' => 30,
'ErrorMessage' => 'test',
'font' => '/Library/Fonts/Microsoft/Gill Sans MT.ttf',
'imgDir' => '/tmp/'),
'imgAlt' => 'Captcha')
);
$captcha->isValid(array('captcha' => 'Pindakaas'));
var_dump($captcha);
?>
Wanneer ik nu $captcha->isValid(array('captcha' => 'Pindakaas')) aanroep, en var_dump($captcha) eruit gooi, zie ik alleen maar Nederlandse foutmeldingen in de dump.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Heerlijk, dank u :-D
Ik zat zelf te kloten met het volgende:
maar dat werkte niet op de een of andere manier.. Nu deze maar eens proberen!