SuggestInput aneb našeptávač
- peci1
- Člen | 60
Diskuse ke stránce SuggestInput
Ahoj, z dlouhé chvíle jsem si napsal našeptávač :)
Celý balík je ke stažení na https://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)
- mach2roman
- Člen | 22
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.
- peci1
- Člen | 60
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…
- mach2roman
- Člen | 22
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)
- i.magine
- Člen | 81
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
- mach2roman
- Člen | 22
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?
- Honza Kuchař
- Člen | 1662
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: https://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)
- mach2roman
- Člen | 22
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.
- peci1
- Člen | 60
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.
- mach2roman
- Člen | 22
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í.
- peci1
- Člen | 60
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');
?
- Kenn
- Člen | 110
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>
- peci1
- Člen | 60
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.
- Rampa
- Člen | 65
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?
- peci1
- Člen | 60
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 windowoptions.onSelect ). Ted nemam cas to nejak opravovat a uploadovat a testovat, tak pokud se ti to povede, budu rad =)
- cuga
- Člen | 210
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
- i.magine
- Člen | 81
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)
- peci1
- Člen | 60
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.
- peci1
- Člen | 60
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.
- peci1
- Člen | 60
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)
- Solution
- Člen | 50
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)
- peci1
- Člen | 60
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…
- czmacek@centrum.cz
- Člen | 14
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)
- peci1
- Člen | 60
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?
- czmacek@centrum.cz
- Člen | 14
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)
- Jan Tvrdík
- Nette guru | 2595
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
.
- peci1
- Člen | 60
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…
- czmacek@centrum.cz
- Člen | 14
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)
- Ani
- Člen | 226
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)
- mach2roman
- Člen | 22
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)
- mach2roman
- Člen | 22
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ý.
- mach2roman
- Člen | 22
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.
- kralik
- Člen | 230
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
- Tomáš Votruba
- Moderator | 1114
Ahoj hoši, pokud by vám to nešlo zprovoznit, doporučuji využít Typeahead od Bootsrapu.
Implementace může vypadat nějak takto (+ přidání do Form). Použití pak takto:
$suggestList = array('pes', 'kočička', 'babátko');
$form->addSuggest('item', 'Věc:', $suggestList);
- Nesvadba
- Člen | 3
Hubi napsal(a):
Ahoj,
mám stejnej problém jako kralik. Také se mi zobrazí pouze „Načítání…“ a dál to nenačte hodnoty z pole. Neřešil jste už někdo podobný problém?
Protože jsem čerstvý začátečník a strávil nad tím hodiny a možná
jsem něco špatně nastavil, ale fungoval mi příklad až jsem nastavil
toto:
SuggestInput.php přidat use Nette\Application\UI\Form, Nette\Utils\Html,
Nette\Forms\Controls\TextInput;
ArraySuggester.php přidat use Nette\Utils\Strings,
Nette\ComponentModel\Component;
a je potřeba přepsat třídu String na třidu Strings:
ISuggester.php přidat use Nette\ComponentModel\IComponent;
ConstantSuggester.php přidat use Nette\ComponentModel\Component;
DibiSuggester.php přidat use Nette\ComponentModel\Component; využíva
třídy bidi jež není součásti Nette a je potřeba ji asi stáhnou a
přidat.
@layout.latte jsem musel ještě přidat <script
src=„http://code.jquery.com/jquery-1.4.2.min.js“
type=„text/javascript“></script> a pak vše chodilo.