SuggestInput aneb našeptávač
#1 před 3 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
SuggestInput aneb našeptávač
Diskuse ke stránce SuggestInput
Ahoj, z dlouhé chvíle jsem si napsal našeptávač :)
Celý balík je ke stažení na http://github.com/…estInput.zip a k prohlédnutí jako live demo na http://mars.halousek.eu/suggester-test
A tady je malá ochutnávka, jak se používá:
SuggesterTestPresenter.php
<?php
protected function createComponentTestForm()
{
$form = new AppForm();
//see further functions' definitions for suggester factories and
//action definitions
//the simplest case - suggesting from an array
$form->addSuggestInput('suggest1', "Simple ArraySuggester")
//here is the link to the action that provides suggestions
->setSuggestLink($this->link('suggestAhoj'));
//you can also use this as a simple input with a non-changing tooltip
//which is displayed while the input is active
$form->addSuggestInput('suggest2', "Using ConstantSuggester as tooltip")
->setSuggestLink($this->link('suggestConstant'))
//and this way you set some JS options (defined in jquery.suggest.js)
->addJsOptions('itemsPerPage', 10)
->addJsOptions('noControl', true)
->addJsOptions('minchars', 0)
->addJsOptions('constant', true);
//checking if the submitted value is one of the suggested ones
$form->addSuggestInput('suggest3', "Suggested values check on form send")
->setSuggestLink($this->link('suggestAhoj'))
//here is the suggester that is used, only required if you want to use the following validator
->setSuggester($this['ahojSuggester'])
//this validation rule checks if the entered value is one of the suggested items
//the FALSE at the end means we do not allow empty value as a value
->addRule(SuggestInput::SUGGESTED_ONLY, 'Vybraná možnost musí být jedna z nabízených', FALSE);
//dibi suggester - suggest from a database table
$form->addSuggestInput('suggest4', "DibiSuggester")
->setSuggestLink($this->link('suggestDibi'));
$form->addSuggestInput('suggest5', 'Retrieving data through a signal')
->setSuggestLink($this->link('signalSuggest!'))
->addJsOptions('itemsPerPage', 10)
->addJsOptions('noControl', true)
->addJsOptions('minchars', 0)
->addJsOptions('constant', true)
->addJsOptions('componentName', $this->getName()); //important when using signals
$form->addSubmit('sub', 'Submit');
return $form;
}
public function actionSuggestAhoj($typedText = '')
{
$this->matches = $this['ahojSuggester']->getSuggestions($typedText);
}
public function renderSuggestAhoj()
{
$this->terminate(new JsonResponse($this->matches));
}
public function actionSuggestConstant($typedText = '')
{
$this->matches = $this['constantSuggester']->getSuggestions(NULL);
}
public function renderSuggestConstant()
{
$this->terminate(new JsonResponse($this->matches));
}
public function actionSuggestDibi($typedText = '')
{
$this->matches = $this['dibiSuggester']->getSuggestions($typedText);
}
public function renderSuggestDibi()
{
$this->terminate(new JsonResponse($this->matches));
}
public function handleSignalSuggest($typedText = '')
{
$this->matches = $this['constantSuggester']->getSuggestions(NULL);
$this->terminate(new JsonResponse($this->matches));
}
protected function createComponentAhojSuggester()
{
$suggester = new ArraySuggester();
$data = array(
'ahoj', 'ahojk', 'ahojky', 'bah', 'bahn', 'bahno',
'cíl', 'cíle', 'cílev', 'cílevě', 'cílevěd', 'cílevědo',
'cílevědom', 'cílevědomý', 'ěščřžýáíéúůďťň', 'ĚŠČŘŽÝÁÍÉÚŮĎŤŇ',
'ahoj ahoj', 'hola hou'
);
$suggester
->setItems($data)
//setting this will match only items beginning with query string
//->matchFromBeginning(TRUE)
;
return $suggester;
}
protected function createComponentConstantSuggester()
{
$suggester = new ConstantSuggester();
$data = array('A great tooltip', 'Is on more lines!', 'Type "Expedice Mars 2009" in the last input!');
return $suggester->setItems($data);
}
/* COOL!!! */
protected function createComponentDibiSuggester()
{
$suggester = new DibiSuggester();
return $suggester
->setTable(Environment::getConfig('tables')->suggestions)
->setColumn('text')
->setWhere('[text] LIKE %s');
}
?>
Víc dokumentace je v kódu a v balíku.
Tak si ho užijte!
Editoval peci1 (31. 10. 2010 23:44)
#2 před 2 lety
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
Prosím o radu. Zaujala mě komponenta našeptávače. Chtěl jsem si ji
vyzkoušet a narazil jsem na problém při registraci v konstruktu
BasePresenteru
Form::extensionMethod(‚Form::addSuggestInput‘,
‚SuggestInput::addSuggestInput‘);
Vyhodí mě to chybu Interface ‚IComponent‘ not found. Problém bude asi
v tom že používám PHP 5.3 se jmenými prostory, ale nevím jaký bych tam
ještě přidal. Samotný prostor Nette mě to nebere.
#3 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
mach2roman napsal(a):
Form::extensionMethod(‚Form::addSuggestInput‘, ‚SuggestInput::addSuggestInput‘);
V PHP 5.3 by melo stacit
Form::extensionMethod('addSuggestInput', 'SuggestInput::addSuggestInput');
ale to na veci asi prilis nezmeni.
Vyhodí mě to chybu Interface ‚IComponent‘ not found.
Nevim, ve zdrojacich interface IComponent je jasne napsano namespace Nette. Bez namespace to taky nefunguje? PHP5.3 nemam, takze to neotestuju. Mohlo by pomoct tu implements klauzuli odstranit, myslim, ze komponenta nic z toho rozhrani realne nevyuziva…
#4 před 2 lety
- _Martin_
- Nette guru

- Registrovaný: 26. 9. 2008
- Příspěvky: 722
Re: SuggestInput aneb našeptávač
peci1 napsal(a):
Nevim, ve zdrojacich interface IComponent je jasne napsano namespace Nette.
Tipuji na chybějící use Nette; ve tvých zdrojácích.
#5 před 2 lety
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
Jakým způsobem lze nastavit velikost vstupního inputu? U klasického textInput to nastavím 3.parametrem, ale tady mě to nejde.
Editoval mach2roman (10. 12. 2009 21:20)
#6 před 2 lety
- i.magine
- Člen

- Registrovaný: 13. 12. 2009
- Příspěvky: 82
Re: SuggestInput aneb našeptávač
Je to párádní věc, akorát (teda jestli jsem to dobře pochopil) se to dá použít jenom přímo v presenteru. Já to právě potřebuju v jedný komponenté v který mám formulář. Co jsem tak koukal tak problém bude asi v tom, že když předělám actionSuggestAhoj třeba na handleSuggestAhoj (jinak to hazí chyby) tak to zase nebere ten signál protože v Jquery je natvrdo –
$.get(options.source, {"typedText": typedText}
Takže se sice zavolá signál ale nepřijde mu žádnej parametr, protože
by musel posílat
nazevKomponenty-typedText a v tom bude asi jadro pudla.
Takže jsem dost neodborně hrábnul do kódu a pořádně ho zprasil… ale zase to funguje :-). Takže pokud by to někoho zajímalo. Tak v jquery.suggest.js to chce přidat do JsOptions novej option componentName:
(function($) {
$.suggest = function(input, options) {
...
var cacheSize = [];
//Tadyto pridat
var componentName = [];
var items = [];
...
A pak jeste zmenit GET pozadavek:
function suggest() {
....
if (options.componentName)
var typedTextCaption=options.componentName+"-typedText";
else
var typedTextCaption="typedText";
var getData = {}
getData[typedTextCaption]=typedText;
//AJAX(J) GET
$.get(options.source, getData, function(response) {
....
No a pak jeste v komponente pridat k inputu
->addJsOptions("componentName", $this->name);
a predelat actionSuggest… na handleSuggest… nejak takhle:
public function handleSuggest($typedText = '')
{
$this->matches = $this['suggester']->getSuggestions($typedText);
$this->renderSuggest();
}
Možná by nebylo od věci to tam dodat trochu líp, protože já se v tom fakt moc nevyznám.
Díky
#7 před 2 lety
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
Dneska jsem provedl zkušební update Nette z verze 0.9.2 na 0.9.3 a suggester který mě ve staré verzi šlape jak hodinky, tak v nové verzi nefunguje. Jak jsem zjistil ve FireBug konsoli, vrátí se místo dat pro našeptávač, html kod stránky. Neví někdo co je potřeba upravit?
#8 před 2 lety
- Honza Kuchař
- Moderator

- Registrovaný: 12. 8. 2007
- Příspěvky: 1588
Re: SuggestInput aneb našeptávač
Myslím, že to bude bug, jak se při nepřekreslení žádného snippetu a
AJAXovém požadavku pošle celá stránka. Narazil jsem na to už dříve.
Vyřešit se to dá asi pomocí $this->terminate(new
JsonResponse($this->payload)); nebo
$this->invalidateControl("nějakaBlbostKteraVubecNemusiExistovat");
(ale tohle mi dělalo na Nette 0.9.2 na 0.9.3 jsem to zatím netestoval)
Jestli to tam bude, tak to zkusím znova připomenout.
//EDIT: Oprava je použitá třeba tady:
https://svn.mujserver.net:8443/…bControl.php
ve fci handleSaveTabsOrder
// Workaround for: http://forum.nette.org/cs/2834-podivne-chovani-snippetu-tech-starych
$this->presenter->terminate(new JsonResponse($this->presenter->payload));
Editoval honzakuchar (29. 1. 2010 14:30)
#9 před 2 lety
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
Toto ošetření Bugu tam mám. Bez něj to ve 0.9.2 taky nefungovalo. Ale v 0.9.3 to ani s tímto ošetřením nejede.
#10 před 2 lety
- Honza Kuchař
- Moderator

- Registrovaný: 12. 8. 2007
- Příspěvky: 1588
Re: SuggestInput aneb našeptávač
Aha, tak to jdu otestovat TabControl.
#11 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
Omlouvam se, do konce unora mam zkouskovy, tak se k tomu asi nedostanu. Pokud se to nekomu povede opravit, budu jen rad =)
#12 před 2 lety
- Honza Kuchař
- Moderator

- Registrovaný: 12. 8. 2007
- Příspěvky: 1588
Re: SuggestInput aneb našeptávač
TabControl funguje bez problému. Takže bude chyba asi někde jinde.
#13 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
mach2roman napsal(a):
Jakým způsobem lze nastavit velikost vstupního inputu? U klasického textInput to nastavím 3.parametrem, ale tady mě to nejde.
Ahoj, muzes treba takhle:
$form['suggestInputName']->getControlPrototype()->setSize(5);
#14 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
mach2roman napsal(a):
Dneska jsem provedl zkušební update Nette z verze 0.9.2 na 0.9.3 a suggester který mě ve staré verzi šlape jak hodinky, tak v nové verzi nefunguje. Jak jsem zjistil ve FireBug konsoli, vrátí se místo dat pro našeptávač, html kod stránky. Neví někdo co je potřeba upravit?
Mohl bys to prosim vic popsat? Dela to ten upraveny suggester nebo puvodni? Ja jsem puvodni vyzkousel na 0.9.3 a funguje bez problemu.
#15 před 2 lety
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
peci1 napsal(a):
mach2roman napsal(a):
Dneska jsem provedl zkušební update Nette z verze 0.9.2 na 0.9.3 a suggester který mě ve staré verzi šlape jak hodinky, tak v nové verzi nefunguje. Jak jsem zjistil ve FireBug konsoli, vrátí se místo dat pro našeptávač, html kod stránky. Neví někdo co je potřeba upravit?
Mohl bys to prosim vic popsat? Dela to ten upraveny suggester nebo puvodni? Ja jsem puvodni vyzkousel na 0.9.3 a funguje bez problemu.
Už jsem to vyřešil. Problém byl v nastavení Apache (parametry rewrite mode). Zajímavé ale je, že na nette 0.9.2 do fungovalo nezávisle na tomto nastavení.
#16 před 2 lety
- Kenn
- Člen

- Registrovaný: 27. 1. 2009
- Příspěvky: 130
Re: SuggestInput aneb našeptávač
Právě zkouším našeptávač na dev 1.0 a háže mi chybu „Call to undefined method AppForm::addSuggestInput().“ Zkoušel jsem i ručně requirovat php soubor, ale nechce se mu. Běží někomu našeptávač na poslední verzi Nette?
http://OpiciNoviny.cz – čtení nejen pro opice :P
#17 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
Kenn napsal(a):
Právě zkouším našeptávač na dev 1.0 a háže mi chybu „Call to undefined method AppForm::addSuggestInput().“ Zkoušel jsem i ručně requirovat php soubor, ale nechce se mu. Běží někomu našeptávač na poslední verzi Nette?
Ahoj, volas v bootstrapu
Form::extensionMethod('Form::addSuggestInput', 'SuggestInput::addSuggestInput');
popr. v PHP 5.3
Form::extensionMethod('addSuggestInput', 'SuggestInput::addSuggestInput');
?
#18 před 2 lety
- Kenn
- Člen

- Registrovaný: 27. 1. 2009
- Příspěvky: 130
Re: SuggestInput aneb našeptávač
Už ano, díky :)
Bohužel mám stejný problém s vrácením HTML kódu stránky místo dat pro našeptávač. Podařilo se to někomu vyřešit?
Editoval Kenn (3. 3. 2010 9:42)
http://OpiciNoviny.cz – čtení nejen pro opice :P
#19 před 2 lety
- Kenn
- Člen

- Registrovaný: 27. 1. 2009
- Příspěvky: 130
Re: SuggestInput aneb našeptávač
Vyřešeno. SuggestInput vypisuje JavaScriptový kód volající funkci suggest, ale volá ji se špatným linkem, který potom vrací celý kód HTML stránky. Vyřešil jsem to tak, že používám klasický input, ne suggestInput a JS kód vkládám do šablony ručně.
Funkce řešící vrácení dat pro našeptávač vypadá nějak takto:
<?php
public function handleSuggestName($typedText = ''){
$this->matches = $this['nameSuggester']->getSuggestions($typedText);
$this->terminate(new JsonResponse($this->matches));
}
?>
a JS kód
<script>
$(function() {
jQuery("#frmfilterForm-name").suggest('?do=suggestName',[]);
});
</script>
http://OpiciNoviny.cz – čtení nejen pro opice :P
#20 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
Kenn napsal(a):
Vyřešeno. SuggestInput vypisuje JavaScriptový kód volající funkci suggest, ale volá ji se špatným linkem, který potom vrací celý kód HTML stránky. Vyřešil jsem to tak, že používám klasický input, ne suggestInput a JS kód vkládám do šablony ručně.
Ahoj, je nějaký rozdíl mezi tím, jestli se to zjišťuje jako action nebo jako signál? Mně přijde, že to vyjde nastejno – viz ukázkový presenter:
public function renderSuggestConstant()
{
$this->terminate(new JsonResponse($this->matches));
}
Jak vidíš, celé renderování končí posláním JsonResponse, takže se žádné HTML posílat nemá. Já v tom chybné volání nevidím. Nebo mi utekla nějaká nová „feature“, která tam nějaké HTML vpašuje?
Každopádně by asi nebyl problém předat suggesteru link na signál místo na action.
#21 před 2 lety
- Rampa
- Člen

- Registrovaný: 25. 3. 2009
- Příspěvky: 69
Re: SuggestInput aneb našeptávač
ahoj.
Zkouším tento suggest a je to super. Jen se mi nedaří zadat callback po selectu.
->addJSOptions('onSelect','GetUser')
po výběru by se měla zavolat funkce GetUser s focusem na inputu
zdroj: options.onSelect.apply($input[0])
ale vyhodí to chybu, že onSelect není funkce…
Když upravím zdroják a dám tam:
GetUser.apply($input[0]);
tak to šlape, ale potřebuju víc suggestů na stránce, takže toto není řešení.
Nevíte kde je zakopán hund?
Vždy jsem chtěl být v něčem největší…
Podařilo se mi to. Jsem největší LAMA.
#22 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
Rampa napsal(a):
ahoj.
Zkouším tento suggest a je to super. Jen se mi nedaří zadat callback po selectu.
->addJSOptions('onSelect','GetUser')
Tak ono to s predavanim function pointeru z PHP nebude tak jednoduchy… Koukni na http://stackoverflow.com/…-as-a-string , tam je napsany, jak to obejit (bud eval(options.onSelect)(args) nebo window[options.onSelect](args) ). Ted nemam cas to nejak opravovat a uploadovat a testovat, tak pokud se ti to povede, budu rad =)
#23 před 2 lety
- Rampa
- Člen

- Registrovaný: 25. 3. 2009
- Příspěvky: 69
Re: SuggestInput aneb našeptávač
tak jsem to rozjel. Na tom stacku se tím zabývají.
Je třeba upravit kód v jquery.suggest.js řádka
454 na:
window[options.onSelect].apply($input[0]);
díkes :)
Editoval Rampa (23. 3. 2010 10:24)
Vždy jsem chtěl být v něčem největší…
Podařilo se mi to. Jsem největší LAMA.
#24 před 2 lety
- cuga
- Nette guru

- Registrovaný: 22. 10. 2008
- Příspěvky: 229
Re: SuggestInput aneb našeptávač
hoj, mozna by bylo dobre upravit constructor Suggesteru, tak at odpovida Controlu
public function __construct(IComponentContainer $parent = NULL, $name = NULL, $table = NULL, $column = NULL, $where = NULL)
{
$this->setTable($table);
$this->setColumn($column);
$this->setWhere($where);
parent::__construct($parent, $name);
}
ja totiz mam metodu
protected function createComponent() {}
kde rozhoduju, jaka instance se pouzije… akorat to ma nemily dusledek, ze ve vsech dalsich tovarnickach, napr. createComponentDibiSuggester($name) musim dat new DibiSuggeste($this, $name), jinak mi haze error, ze komponenta neexistuje… a prave tady v tom kontruktoru tohle chybelo
#25 před 2 lety
- i.magine
- Člen

- Registrovaný: 13. 12. 2009
- Příspěvky: 82
Re: SuggestInput aneb našeptávač
Ahoj,
tak jsem zkoušel zase tuhle komponentu a narazil jsem problém se špatným
linkem.
V zadaném odkaze se zaměnilo & za
&
a pak odkaz nefungoval.
Tak jsem hrábnul do kódu a původní vypisování přes třidu Html jsem zaměnil na řádku 110 za:
$js = "<SCRIPT>".$script."</script>";
Trošku prasárna ale kdyby měl někdo lepší nápad… sem s ním.
Editoval i.magine (4. 8. 2010 16:19)
#26 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
cuga napsal(a):
hoj, mozna by bylo dobre upravit constructor Suggesteru, tak at odpovida Controlu
(asi jsi mel na mysli Component, ne?)
Ahoj, nemyslim si, ze by to byl dobry napad. SuggestInput je potomkem TextInputu, a ani TextInput nema pozadovany konstruktor. Coz mi tedy napovida, ze musi existovat nejake systemovejsi reseni.
#27 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
peci1 napsal(a):
mach2roman napsal(a):
Jakým způsobem lze nastavit velikost vstupního inputu? U klasického textInput to nastavím 3.parametrem, ale tady mě to nejde.
Ahoj, muzes treba takhle:
$form['suggestInputName']->getControlPrototype()->setSize(5);
V nove verzi ma SuggestInput velikost a maxLength v konstruktoru.
#28 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
peci1 napsal(a):
cuga napsal(a):
hoj, mozna by bylo dobre upravit constructor Suggesteru, tak at odpovida Controlu
(asi jsi mel na mysli Component, ne?)
Ahoj, nemyslim si, ze by to byl dobry napad. SuggestInput je potomkem TextInputu, a ani TextInput nema pozadovany konstruktor. Coz mi tedy napovida, ze musi existovat nejake systemovejsi reseni.
Zatracene, spatne jsem te pochopil :( Chtel jsi upravit konstruktor
Suggesteru, ne SuggestInputu. Stejne si ale myslim, ze by to bylo zbytecne –
pokud potrebujes nastavit rodice, tak mas
prece $parent->addComponent(...)
Editoval peci1 (21. 9. 2010 23:18)
#29 před 2 lety
- pospi
- Člen

- Registrovaný: 17. 10. 2010
- Příspěvky: 11
Re: SuggestInput aneb našeptávač
Ahoj , nemuzu to z odkazu stahnout , muzete mi tady nechat odkaz odkud bych to mihl stahnout , diky
#30 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
pospi napsal(a):
Ahoj , nemuzu to z odkazu stahnout , muzete mi tady nechat odkaz odkud bych to mihl stahnout , diky
Omlouvam se, updatoval jsem link, mel jsem trochu problemy s repozitarem. Ted uz je vse ozkousene a funkcni.
#31 před 2 lety
- Padik
- Člen

- Registrovaný: 19. 5. 2010
- Příspěvky: 52
Re: SuggestInput aneb našeptávač
Zdravím,
nice tool,
chtěl jsem ji vyzkoušet, jak si se mi nedaří sprovoznit.
Nette 2.0 alpha pro 5.3, poupravoval jsem to trochu, ale nemůžu dostat do
suggestu výsledek, stále dostávám do firebugu toto:
<script>
uncaught exception: [Exception... "Component returned failure code: 0x805e000a [nsIXMLHttpRequest.open]" nsresult: "0x805e000a (<unknown>)" location: "JS frame :: http://localhost/public/js/jquery.js :: anonymous :: line 5642" data: no]
Line 0
</script>
JS knihovny mám všechny naincludované, php funguje bez problému, jen
s tímhle si nevím rady používám dibisuggester.
Presenter:
<?php
protected function createComponentSearchForm(){
$form->addSuggestInput('q', "")
->setSuggestLink($this->link('suggestDibi'))
->addJsOptions('itemsPerPage', 10);
}
protected function createComponentDibiSuggester()
{
$suggester = new DibiSuggester();
return $suggester
->setTable('finder-queries')
->setColumn('query')
->setWhere('[query] LIKE %s');
}
?>
Aha, tak už jsem na to přišel, ta aplikace využívala jednu routu, takže jsem musel přidat routu do boostrapu, čili řešení bylo přidáním:
<?php
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
?>
Editoval Padik (2. 11. 2010 21:11)
#32 před 2 lety
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
Padik napsal(a):
Nette 2.0 alpha pro 5.3, poupravoval jsem to trochu
Ahoj, jsem rad, ze se to podarilo zprovoznit. Mohl bys mi pls nejak napsat,
co bylo pro 2.0a potreba upravit? Ja jsem se k ni jeste nedostal…
PS: staci asi poslat pres emailovy formular fora, zkusil bych to hodit
na GIT…
#33 před rokem
- czmacek@centrum.cz
- Člen

- Registrovaný: 29. 12. 2010
- Příspěvky: 15
Re: SuggestInput aneb našeptávač
Ahoj, narazil jsem na takovy problem. Nevim si rady.
<?php
30: $form = new \Nette\Forms\Form();
31:
32: //see further functions' definitions for suggester factories and
33: //action definitions
34: var_dump(is_callable(array($form, 'addSuggestInput'))); //vrati true
35: //the simplest case - suggesting from an array
36:
37: $form->addSuggestInput('suggest1', "Simple ArraySuggester") //zde mne ladenka //hodi Callback 'SuggestInput::addSuggestInput' is not callable.
38: ->setSuggestLink($this->link('suggestAhoj'));
39: //here is the link to the action that provides suggestions
?>
nevite pls. nekdo co s tim? predem diky.)
PHP 5.3.5
Apache/2.2.17 (Win32) PHP/5.3.5
Nette Framework 2.0-dev (revision bb2b723 released on 2011–02–06)
#34 před rokem
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
czmacek@centrum.cz napsal(a):
Ahoj, narazil jsem na takovy problem. Nevim si rady.
<?php 30: $form = new \Nette\Forms\Form(); 31: 32: //see further functions' definitions for suggester factories and 33: //action definitions 34: var_dump(is_callable(array($form, 'addSuggestInput'))); //vrati true 35: //the simplest case - suggesting from an array 36: 37: $form->addSuggestInput('suggest1', "Simple ArraySuggester") //zde mne ladenka //hodi Callback 'SuggestInput::addSuggestInput' is not callable. 38: ->setSuggestLink($this->link('suggestAhoj')); 39: //here is the link to the action that provides suggestions ?>nevite pls. nekdo co s tim? predem diky.)
Tady to vypada na spatne zaregistrovany form extension. Jsou dve
varianty:
Form::extensionMethod('Form::addSuggestInput',
'SuggestInput::addSuggestInput');
nebo Form::extensionMethod('addSuggestInput',
'SuggestInput::addSuggestInput'); v PHP 5.3
Kterou verzi pouzivas? A mas spravne naincludovany soubor SuggestInput.php?
#35 před rokem
- czmacek@centrum.cz
- Člen

- Registrovaný: 29. 12. 2010
- Příspěvky: 15
Re: SuggestInput aneb našeptávač
pouzivam php 5.3.5 viz. vyse. Zaregistrovany form mam v BasePresenteru
<?php
namespace AdminModule;
abstract class BasePresenter extends \BasePresenter
{
public function __construct()
{
\Nette\Forms\Form::extensionMethod('addSuggestInput', 'SuggestInput::addSuggestInput');
}
....
}
?>
Pouzivam RobotLoader, takze bez include.
Ja myslel ze kdyz
<?php
var_dump(is_callable(array($form, 'addSuggestInput')));
?>
vrati true, tak je to zaregistrovane spravne, ale jsem zacatecnik, takze to muze byt zcela spatna uvaha.
Pokud zaregistrovani
<?php
\Nette\Forms\Form::extensionMethod('addSuggestInput', 'SuggestInput::addSuggestInput');
?>
smazu ladenka vyhodi „Call to undefined method Nette\Forms\Form::addSuggestInput().“
z toho bych taky usuzoval ze zaregistrovani je spravne. Hmm?
Editoval Jan Tvrdík (17. 3. 2011 13:38)
#36 před rokem
- Jan Tvrdík
- Nette guru

- Registrovaný: 13. 4. 2008
- Příspěvky: 1262
Re: SuggestInput aneb našeptávač
Může tě to překvapit, může tě to dokonce i šokovat, ale toto fórum umožňuje editaci příspěvků. Používej ji, nebo budeš vykázán.
czmacek@centrum.cz wrote:
jeste jedna vec. Ja myslel ze kdyz
var_dump(is_callable(array($form, 'addSuggestInput')));vrati true, tak je to zaregistrovane spravne, ale jsem zacatecnik, takze to muze byt zcela spatna uvaha.
Funkce is_callable vrací TRUE i v případě
is_callable(array($form, 'totalniBlbost')), protože je definována
metoda __call.
Problém je v tom, že buď není třída SuggestInput načtena
(špatně nastavený RobotLoader), nebo jsi odkomentoval ty jmenné prostory a
ve skutečnosti je to Nette\Forms\SuggestInput, nebo je načtena a
není k dispozici metoda addSuggestInput.
#37 před rokem
- peci1
- Člen

- Registrovaný: 28. 4. 2009
- Příspěvky: 55
Re: SuggestInput aneb našeptávač
czmacek@centrum.cz napsal(a):
Ja myslel ze kdyz
<?php var_dump(is_callable(array($form, 'addSuggestInput'))); ?>vrati true, tak je to zaregistrovane spravne, ale jsem zacatecnik, takze to muze byt zcela spatna uvaha.
Kdyz uz, tak ty potrebujes testovat
is_callable('SuggestInput::addSuggestInput'), ale jeste lepsi
otestovani by bylo zavolat tu metodu primo:
SuggestInput::addSuggestInput($form, 'suggest1', 'Simple ArraySuggester');
Pokud tohle zavolani selze, pak opravdu musi byt spatne naincludovana ta
knihovna. Muzes zkusit promazat docasne soubory (slozka app/temp). Pokud ani to
nepomuze, pak musis mit spatne nastaveny RobotLoader. Jeste me napada, ze kdyz
pred prvnim pouzitim komponenty zavolas
require_once('path/to/SuggestInput.php'), pak to „musi“
fungovat.
Popr. si poradne projdi, jestli nekde nejsou spatne pouzite namespaces, ja tuhle komponentu na PHP5.3 netestoval…
#38 před rokem
- czmacek@centrum.cz
- Člen

- Registrovaný: 29. 12. 2010
- Příspěvky: 15
Re: SuggestInput aneb našeptávač
Jan Tvrdík: Dekuji za edit. Priste uz budu prispevek vkladat vcelku. Diky za rady panove. Jdu to odzkouset, pak dam vedet, kde jsem delal chybu, nicmene predpokladam ze to bude jedna Vami popsana vyse. d.)
Tak jsem vse smazal a zacal znovu. Ani nedokazi presne rici kde jsem mel chybu, myslim ze to bylo ve jmennych prostorech. Jeste jednou diky za rady.)
Editoval czmacek@centrum.cz (17. 3. 2011 15:39)
#39 před rokem
- Ani
- Nette guru

- Registrovaný: 2. 2. 2009
- Příspěvky: 233
Re: SuggestInput aneb našeptávač
Ahoj, našeptávač funguje pěkně, jen se mi nelíbilo že jsem musel při každém použití vytvářet v presenteru extra metody pro zpracovaní signálu. Chtěl jsem to vyrešit tak aby se při přidání suggestInputu pouze nastavil model s daty a nic víc se v presenteru psát nemuselo.
Vzhledem k tomu že furmulář neumí přijímat signál, ale komponenta zavešená do formuláře ano, jsem si suggest trochu upravil, tak se to třeba někomu bude hodit.
Samotný suggest input jsem podědil doplnil o metodu setSuggestModel ($model):
<?php
class SuggestInput extends \SuggestInput {
public function setSuggestModel($model) {
$suggeter = new Suggester($model, $this->parent, $this->name . 'SuggesterInputResponer');
$this->setSuggestLink($suggeter->link('suggesterJsonRespone!'));
return $this;
}
}
?>
Zároven si vytvořil komponentu která zpracuje signál:
<?php
class Suggester extends \Nette\Application\Control {
public $model;
public function __construct($model, $parent = NULL, $name = NULL) {
$this->model = $model;
parent::__construct($parent, $name);
}
public function handleSuggesterJsonRespone($typedText)
{
$this->model->presenter->terminate(new \Nette\Application\JsonResponse(
$this->model->getMatches($this->model->presenter->getParam('typedText'))
));
}
}
?>
A ještě BaseModel, kde metoda getMatches vrací výsledky, podle zadaného textu:
<?php
class BaseModel extends \Nette\Object {
public $presenter;
public function __construct($presenter) {
$this->presenter = $presenter;
}
public function getMatches($typedText) {
return array();
}
?>
Cele to má za výsledek je, že při přidáváni suggest do formuláře stačí zapsat model:
<?php
$form->addSuggestInput('suggest', 'Suggest input:')
->setSuggestModel(new BaseModel($presenter));
?>
Editoval Ani (13. 5. 2011 15:29)
Tomáš Burda – to.burda at gmail.com
#40 před 10 měsíci
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
Narazil jsem na problém s našeptávačem pod IIS 7.5 . Byl jsem nucen
portovat aplikaci z Apache na IIS 7.5 . Vše funguje bez nejmenšího problému
až na suggester. Pod Apachem funguje jak má, ale pod IIS se místo hodnot
objeví ve firebugu chyba "Page not found. Missing template
‚…/templates/Fenix/naseptavacMS.phtml‘ " , což je samozřejmě
neexistující šablona, protože našeptávač žádnou nemá a výsledek je
v renderu ukončen `$this->terminate(new
\Nette\Application\JsonResponse($this->matches)); `
Nevíte někdo co s tím? Co je na IIS při zpracování jiného? Ostatní Ajax
věci fungují normálně.
Editoval mach2roman (13. 7. 2011 15:46)
#41 před 10 měsíci
- gmvasek
- Nette guru

- Registrovaný: 19. 3. 2009
- Příspěvky: 1015
Re: SuggestInput aneb našeptávač
Rozdíl velké/malé písmeno v názvu?
Online
#42 před 10 měsíci
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
gmvasek napsal(a):
Rozdíl velké/malé písmeno v názvu?
Velikosti písmen jsou podle mě v pořádku, to by nefungovalo ani pod Apachem a tam to chodí bez problémů. Script je naprosto totožný.
#43 před 10 měsíci
- mach2roman
- Člen

- Registrovaný: 7. 10. 2009
- Příspěvky: 19
Re: SuggestInput aneb našeptávač
Tak jsem zjistil jednu důležitou věc. Našeptávač funguje pouze pokud aplikace běží pod Apachem a PHP běží jako modul. Pokud pod IIS nebo i pod Apachem nastavím PHP jako fastCGI klienta, tak vzniká stejná chyba. Má někdo nápad proč na stejném serveru pouze po změně z modulu na fastCGI našeptávač nefunguje (jinak celá aplikace funguje bez nejmenšího problému). Budu vděčný za každou radu.
#44 před 7 měsíci
- kralik
- Člen

- Registrovaný: 19. 1. 2011
- Příspěvky: 65
Re: SuggestInput aneb našeptávač
Ahoj lidi,
pokouším se zprovoznit tento našeptávač.
Prosím poraďte mi.
Nette mi vyhodí hlášku: Interface ‚IComponent‘ not found
Soubor ISuggester.php
<?php
use Nette;
interface ISuggester extends IComponent
{ ...
?>
mooc díky
#45 před 7 měsíci
- Ot@s
- Nette guru

- Registrovaný: 3. 11. 2010
- Příspěvky: 253
Re: SuggestInput aneb našeptávač
- vysyp keš
- zkontroluj, zda-li je ISuggester.php v cestach, ktere skenuje robotloader
#46 před 7 měsíci
- kralik
- Člen

- Registrovaný: 19. 1. 2011
- Příspěvky: 65
Re: SuggestInput aneb našeptávač
Ot@s napsal(a):
- vysyp keš
- zkontroluj, zda-li je ISuggester.php v cestach, ktere skenuje robotloader
- ten samozřejmě vysypán, resp. vymazán
- RobotLoader – hledá v %appDir% a v %libsDir% a celý SuggesterImput je v adr libs
používám PHP 5.3.
#47 před 7 měsíci
- kralik
- Člen

- Registrovaný: 19. 1. 2011
- Příspěvky: 65
Re: SuggestInput aneb našeptávač
podařilo se mi to částečně zprovoznit.
bylo potřeba přidat do souboru ISuggester.php
<?php
use Nette\IComponent;
interface ISuggester extends IComponent
{ ...
?>
Nyní se to chová tak, že při zadání se zobrazí „Náčítání…“ ale
- tento text „Načítání…“ se neukáže u imputu ale dole, jakoby na pokračování stránky
- nenačte se žádná hodnota i přesto, že jsem použil vše jak je uvedeno v SuggesterTestPresenter př. suggest1
prosím nevíte co s tím