SuggestInput aneb našeptávač

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

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
+
0
-

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
+
0
-

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…

_Martin_
Generous Backer | 679
+
0
-

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.

mach2roman
Člen | 22
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

Honza Kuchař
Člen | 1662
+
0
-

Aha, tak to jdu otestovat TabControl.

peci1
Člen | 60
+
0
-

Omlouvam se, do konce unora mam zkouskovy, tak se k tomu asi nedostanu. Pokud se to nekomu povede opravit, budu jen rad =)

Honza Kuchař
Člen | 1662
+
0
-

TabControl funguje bez problému. Takže bude chyba asi někde jinde.

peci1
Člen | 60
+
0
-

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);
peci1
Člen | 60
+
0
-

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
+
0
-

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í.

Kenn
Člen | 110
+
0
-

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?

peci1
Člen | 60
+
0
-

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
+
0
-

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)

Kenn
Člen | 110
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 =)

Rampa
Člen | 65
+
0
-

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)

cuga
Člen | 210
+
0
-

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
+
0
-

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

&amp;

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
+
0
-

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
+
0
-

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
+
0
-

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)

pospi
Člen | 24
+
0
-

Ahoj , nemuzu to z odkazu stahnout , muzete mi tady nechat odkaz odkud bych to mihl stahnout , diky

peci1
Člen | 60
+
0
-

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.

Solution
Člen | 50
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

Aurielle
Člen | 1281
+
0
-

Rozdíl velké/malé písmeno v názvu?

mach2roman
Člen | 22
+
0
-

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
+
0
-

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
+
0
-

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

Ot@s
Backer | 476
+
0
-
  • vysyp keš
  • zkontroluj, zda-li je ISuggester.php v cestach, ktere skenuje robotloader
kralik
Člen | 230
+
0
-

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.

kralik
Člen | 230
+
0
-

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

Hubi
Člen | 9
+
0
-

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?

Tomáš Votruba
Moderator | 1114
+
0
-

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
+
0
-

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.