[addon captcha] Captcha form control

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jirka
Člen | 1
+
0
-

Zdravím, jsem v Nette úplně nový a neznalý, ale hledal jsem a nenalezl.

Mám problém s captchou (zkouším verzi Panda v úpravě Ondřej Mirtes, PHP 5.2.6, Nette 0.9.4):

Captcha se mi zobrazí, ale po odeslání (ať už ji chci validovat nebo ne, resp. ať dám ->addRule(Captcha::validateValid) nebo nedám), mi vyskočí chyba Call to a member function invoke() on a non-objectTextBase.php, řádek 54 (fce getValue).
Je třeba někde (kde a jak?) přidat do TextBase nějaký (‚Captcha‘?) filter?
Nebo co jsem přehlédnul a co dělám špatně?

pjoter
Člen | 118
+
0
-

vyřešil jste někdo na té nejnovější verzi nette zobrazování té captchi pls?

regiss
Člen | 61
+
0
-

pjoter napsal(a):

vyřešil jste někdo na té nejnovější verzi nette zobrazování té captchi pls?

Nazdar,

zkus zakomentovat tyto dva radky v Captcha.php

//		$second->filter(IMG_FILTER_SMOOTH, 1);
//		$second->filter(IMG_FILTER_CONTRAST, -60);
pjoter
Člen | 118
+
0
-

Zkusil jsem to, ale stále:
Obrázek “view-source:http://.../captcha/show/?…” nelze zobrazit, protože obsahuje chyby.

Endrju
Člen | 147
+
0
-

jirka napsal(a):

Zdravím, jsem v Nette úplně nový a neznalý, ale hledal jsem a nenalezl.

Mám problém s captchou (zkouším verzi Panda v úpravě Ondřej Mirtes, PHP 5.2.6, Nette 0.9.4):

Captcha se mi zobrazí, ale po odeslání (ať už ji chci validovat nebo ne, resp. ať dám ->addRule(Captcha::validateValid) nebo nedám), mi vyskočí chyba Call to a member function invoke() on a non-objectTextBase.php, řádek 54 (fce getValue).
Je třeba někde (kde a jak?) přidat do TextBase nějaký (‚Captcha‘?) filter?
Nebo co jsem přehlédnul a co dělám špatně?

Stejný problém u mě. Běhám na NetteFramework-0.9.4-PHP5.2

Věděl by někdo co s tím prosím?

Chyba je na radku $value = (string) $filter->invoke($value);

	/**
	 * Returns control's value.
	 * @return string
	 */
	public function getValue()
	{
		$value = $this->value;
		foreach ($this->filters as $filter) {
			$value = (string) $filter->invoke($value);
		}
		return $value === $this->translate($this->emptyValue) ? '' : $value;
	}

Editoval Endrju (16. 6. 2010 23:55)

assassik
Člen | 43
+
0
-

Tady je upravená verze pro aktuální (25.6.2010) Nette 5.3

github.com/PavelMaca/CaptchaControl

Navíc jsem to upravil tak, že při špatném opsání se vygeneruje obrázek s novým textem.

Font included

Editoval assassik (27. 11. 2010 17:51)

Lawondyss
Člen | 106
+
0
-

Hlásí mi to chybu:

Fatal Error
Call to a member function invoke() on a non-object

ve funkci TextBase::getValue().
S tímhle si poradit neumím :-(

Lawondyss
Člen | 106
+
0
-

Po hodinách hloubání a dloubání jsem na to přišel!

V souboru Captcha.php v konstruktoru je nutné do filtrů zavolat funkci strtolower() callbackem.

$this->filters[] = ‚strtolower‘;
=>
$this->filters[] = callback(‚strtolower‘);

ViPEr*CZ*
Člen | 817
+
0
-

Už to někdo vyřešil… pokud ne tak navrhuji captcha stáhnout z doplňků… osobně jsem to zkoušel a bez úspěchu… chybu mi to vyhazuje v metodě getLink a konkrétně v lookup funkci, kde by mělo dojít ke vrácení nějaké url adresy… bohužel ještě jsem to úplně nepochopil a podle popisků to není jasné.

ViPEr*CZ*
Člen | 817
+
0
-

Tak už jsem kapku dál… konečně se mi podařilo vykreslit obrázek… no jo ale k čemu mi to je když se mi neporovná při odeslání… když si vypíšu getValue, tak mi to nic nevrací…

public static function validateValid(IFormControl $control)
{
  $values = $control->getValue();
  var_dump($values);
  return false;
}

A nevím jak přesně upravit loadHttpData… kde v originále co je ke stažení je parametr, ale s parametrem ta funkce v mém Nette již není.

Editoval ViPEr*CZ* (27. 11. 2010 0:27)

assassik
Člen | 43
+
0
-

ViPErCZ napsal(a):

A zkoušel jsi mojí verzi?
Dneska jsem jí updatnul a měla by bez problému jít na Nette 2.0.a2 i na 0.9.7

Odkaz je kousek výše.

Endrju
Člen | 147
+
0
-

@assassik, tak odkaz neni platny https://github.com/…ter/captcha/

assassik
Člen | 43
+
0
-

díky, nevšiml jsem si github.com/PavelMaca/CaptchaControl

Editoval assassik (27. 11. 2010 17:51)

ViPEr*CZ*
Člen | 817
+
0
-

Ee nezkoušel… bohužel jedu ještě pod 5.2 PHP… toto mi nepojede.
Stále mám jen obrázek… a po odeslání mi to nezvaliduje… prostě stále, že jsem neopsal správný obrázek. Už jsem si vše vypsal… vidím co je v sessions… a jak se to tam vše ukládá… ale stále se mi neodesílá formulář… použít POST pro zjištění z formuláře se mi nechce teda… ale nechápu některé metody nejspíš… z dokumentace toho moc nevyčtu .. např. loadHttpData nevím co ve skutečnosti má dělat.

ViPEr*CZ*
Člen | 817
+
0
-

Tak jsem se pohnul dále… ta metoda loadHttpData se vůbec nevolala… tak jsem ji zavolal z validateValid a hle… již se mi odesílá input. Další problém ovšem nastane v tom, že stará třída měla parametr v loadHttpData, který vracel zřejmě hodnotu z hidden fieldu… a jak se teď k té hodnotě vlastně dostanu, když teď je ta funkce bez parametru?

ViPEr*CZ*
Člen | 817
+
0
-

Tak možná to někomu pomůže… musel jsem rozšířit takto:

public static function validateValid(IFormControl $control)
{
  $control->loadHttpData(); //++
  return $control->getValue() === $control->getWord();
}

Dále pak přepsat loadHttpData takto:

public function loadHttpData()
{
    $path = strtr(str_replace(']', '', $this->getHtmlName()), '.', '_'); //++
    $token = ArrayTools::get($this->getForm()->getHttpData(), explode('[', $this->getKeyName())); //++
    if (isset($token)) {
	$key = $token;
	if ($this->loadState($key)) {
		$session = $this->getStateSession();
		unset($session->$key);
		parent::loadHttpData();
		if ($this->tmpValue !== $this->word) {
			$this->tmpValue = '';
		}
	}
    }
}

Zde zmizel parametr funkce public function loadHttpData() a ty dva řádky co přibyli zjistí hodnotu z HiddenFieldu… ten je potřeba, aby se našlo správné slovo v sessions. Ve funkci getImage jsem si navolil proměnnou $link na svůj link, kde se zobrazí captcha obrázek místo $this->getLink, které mi nenašlo přidaný presenter (možná kvůli mým rourám v bootstrapu – možná uvést do příkladu jak mají být nastaveny roury, aby to z toho návodu šlo hned). Pokud se Vám negenerují obrázky tak ještě by mohlo pomoci zakomentování těchto dvou řádků:

$second->filter(IMG_FILTER_SMOOTH, 1);
$second->filter(IMG_FILTER_CONTRAST, -60);

Editoval ViPEr*CZ* (27. 11. 2010 20:35)

assassik
Člen | 43
+
0
-

@ViPEr*CZ*, tak ono stačí odstranit namespace na začátku souboru a mělo by to fungovat (odzkoušeno na Nette 2.0.a2 nonprefix)

ViPEr*CZ*
Člen | 817
+
0
-

Děkuji. Používám starší verzi Nette 1.0 a k PHP 5.3 jsem ještě nemigroval… to přijde ještě někdy v budoucnu. Každopádně děkuji. Moje úpravy fungují 100%. Ještě jsem si generování obrázku přepsal do ImageMagick komponenty pro PHP. Takže pokud by někdo používal starší Nette a měl problémy s rozšířením Captcha co je ke stažení v rozšířeních, tak mu ten návod výše doufám pomůže.

@assassik: až přejdu k namespace a PHP 5.3 tak určitě využiji tvojí komponentu ;-)

japlavaren
Člen | 404
+
0
-

Dobry den,

nakopirval som si captchu do stranky a mam problem – hadze mi to Declaration of Captcha::loadHttpData() must be compatible with that of IFormControl::loadHttpData()
pouzivam nette prefixovanu v 2.0

viete mi niekto poradit, co sa mu nepaci?

dakujem

Panda
Člen | 569
+
0
-

Addon není kompatibilní s aktuálními verzemi Nette, zde v tématu bys měl najít upravené verze, stačí si projít diskuzi. Osobně jsem to ale netestoval, takže nevím, nakolik jsou navrhované úpravy funkční.

japlavaren
Člen | 404
+
0
-

stiahol som si najnovsiu verziu od assasika a je tam pravdepodobne bug.
vo funkcii addCaptcha na riadku 178 je zapis

<?php
return $form[$name] = new static;
?>

co je zapis co mne a php nic nehovori. dokazete mi niekto poradit, ako to upravit?

dakujem

Aurielle
Člen | 1281
+
0
-

Ten zápis je naprosto v pořádku, jen klíčové slovo static bylo zavedeno až v PHP 5.3 (late static bindings). Pokud není třída děděna, tak by se to mělo dát vyřešit nahrazením za self.

visitor
Člen | 22
+
0
-

Funkční verze pro NETTE 2.0 (PHP 5.2)
http://blog.jankocmanek.cz/…2-0-php-5-2/

ViPEr*CZ*
Člen | 817
+
0
-

No mě to moc nefunguje teda. Máte to bez prefixů. A i když si přípíšu tam co má být velké N, tak to nefunguje. Moje verze co jsem tu upravoval již taktéž nefunguje pod 2.0.
Bohužel nevím proč… proč naopak teď loadHttpData úplně aplikaci kousne a bílá obrazovka (log prázdný). To je nepochopitelné, zvlášť když ta metoda je stále v API dokumentaci, tak proč to teď vyhazuje chybu (respektive nedělá absolutně nic)?

// Tak mi chyběl v té metodě ještě prefix NArrayTools::get … zajmavý, že to nikde nic nevyhodilo… pak se to blbě hledá :-D

Editoval ViPEr*CZ* (2. 3. 2011 13:23)

live.to.ride
Člen | 1
+
0
-

Pro ty jemž se obrázek nezobrazuje
framework 1.0 alpha

Call to undefined function get_called_class()
Captcha – 743:

  • FormContainer::extensionMethod(‚addCaptcha‘, array(‚Captcha‘, ‚addCaptcha‘)); // stara hodnota
  • FormContainer::extensionMethod(‚FormContainer::addCaptcha‘, array(‚Captcha‘, ‚addCaptcha‘)); // funkcni

Obrázek se nezobrazuje – chyba v Captcha:show
Captcha – 550:

  • $this->getHttpResponse()->expire(0); // stara hodnota
  • $this->getHttpResponse()->setExpiration(0); // funkcni

Call to a member function invoke() on a non-object @ TextBase.php Line: 54
Captcha – 101:

  • $this->filters[] = ‚strtolower‘ // stara hodnota
  • $this->filters[] = callback(‚strtolower‘); // funkcni

Použil jsem tipy z dřívějších příspěvků, takže rekapitulace

Mě to jede, pokud nepomohlo good luck and read the fuckin` sources ;)

Editoval live.to.ride (30. 3. 2011 13:54)

Podbor
Člen | 19
+
0
-

Zdravím,
používám výbornou Captchu od Pavla Máci, ale narazil jsem na fakt, že načítání stránky, ve které je formulář s danou Captchou mi trvá snad 20 ms. Je to běžná „čekací“ doba ?
Stroj pravda není nejnovější, ale takovou čekací dobu jsem nikde nezaznamenal. Používám nejnovější Google Chrome.

Aurielle
Člen | 1281
+
0
-

20ms je nepostřehnutelných. Nemyslel jsi 20s?

Podbor
Člen | 19
+
0
-

gmvasek napsal(a):

20ms je nepostřehnutelných. Nemyslel jsi 20s?

Jo, pardon. Překlep.

assassik
Člen | 43
+
0
-

Běžný to určitě není, kdyžtak mi pošli konfiguraci Captchy a já se na to mrknu.

PS: repo updatnutý na nový namespace, github.com/PavelMaca/CaptchaControl

Editoval assassik (22. 4. 2011 22:14)

qacer
Člen | 8
+
0
-

Class 'Nette\Forms\Controls\TextBase' not found v libs/CaptchaControl.php, netusim, kde je chyba, vsetko som robil podla navodu/postupu

Aurielle
Člen | 1281
+
0
-

Nové namespaces, stáhni si novou verzi z GitHubu… https://github.com/…ptchaControl

qacer
Člen | 8
+
0
-

mam najnovsiu verziu captchy GitHubu, (nette NetteFramework-2.0alpha-PHP5.3)

assassik
Člen | 43
+
0
-

pro NetteFramework-2.0alpha-PHP5.3 potřebuješ verzi se starýma NS viz: https://github.com/…e-2.0-Alpha2

Editoval assassik (23. 4. 2011 19:23)

Felix
Nette Core | 1196
+
0
-

Pokud chcete pouzivat Seznam captchu nebo reCaptchu, zkuste CaptchaExtension treba vam to neco usetri =)

xDexter
Člen | 13
+
0
-

assassik napsal(a):

ViPErCZ napsal(a):

A zkoušel jsi mojí verzi?
Dneska jsem jí updatnul a měla by bez problému jít na Nette 2.0.a2 i na 0.9.7

Odkaz je kousek výše.

Zdravím,

dnes jsem vyzkoušel tuto verzi a funguje skvěle! Jen jsem objevil problém při zobrazení v IE 6 a 7, captcha se nezobrazí. Víte o tom nebo IE6 a 7 nejsou podporovány?

Problém jsem důkladněji nezkoumal, ale ještě upozorním v kompatibilním režimu IE 8 nebo 9 se captcha zobrazí, ale v samotném IE 7 či 6 ne!

viz. http://www.fckvasice.cz/diskuze/

pjoter
Člen | 118
+
0
-

ten kdo řeší stejný problém jako měl @ViPEr*CZ* je potreba jeste prejmenovat NHiddenField a NForm ve stejne metode jinak neni treba nic prepisovat a jede !

czhDavid
Člen | 14
+
0
-

Jenom bych zde chtěl sdělit svůj menší postřeh.
Pokud chcete vypsat formulář s captchou ručně nezapomeňte vypsat i její skryté pole obsahující _uid_captcha

pidiclovek
Člen | 91
+
0
-

czhDavid napsal(a):

Jenom bych zde chtěl sdělit svůj menší postřeh.
Pokud chcete vypsat formulář s captchou ručně nezapomeňte vypsat i její skryté pole obsahující _uid_captcha

Ahoj, přesně o toto se pokouším, _uid_captcha i samotný captcha input vypisuji, ale nedaří se mi nijak vypsat obrázek :( Poradíte prosím?

v šabloně:

{form newNewsletterContactForm}
    <ul class="errors" n:if="$form->hasErrors()">
        <li n:foreach="$form->errors as $error">{$error}</li>
    </ul>

    <div id="newsletterH">NEWSLETTER</div>
    <div id="newsletterFirstRow">
    {input name}
    {input email}
    </div>

    <div id="newsletterSecondRow">
    {input captcha}
    {}
    </div>
    <div>
    {input _uid_captcha}
    </div>
{/form newNewsletterContactForm}
tatyalien
Člen | 239
+
0
-

Použij

{label captcha/}