Textinput – naplnění hodnoty přez Ajax
- tatyalien
- Člen | 239
Dobrý den,
předem upozorním že s ajaxem mám zatím jen zkušenost z představení viz
https://doc.nette.org/…ication/ajax .
Chci se zeptat, jak se dá řešit toto: mám formulář kde mám text input kde zadává uživatel datum, vedle něj mám tlačítko, na které mám navěšenou funkci, která pouze doplní aktuální den do text inputu. (uloží data do sessionu, redirectne zpět). Chtěl bych toto zajaxovat, aby se nemusela načítat celá stránka, ale jen tato jedna hodnota (jen doplnění dnešního data do textového pole). Jak se toto dá rešit?
Kód:
<?php
class DatumPresenter extends BasePresenter
{
public function renderDefault()
{
}
protected function createComponentDatumForm($name)
{
$form = new AppForm($this, $name);
$form->addText('datum_start', 'Datum startu')->addRule($form::FILLED, 'Zadejte datum.');
// Samozřejmně ve formuláři není pouze jeden textinput, jen jsem to osekal...
$form->addSubmit('btn_datum_start', 'Datum startu')->setValidationScope(false);
$form->addSubmit('btn_vymazat', 'Vymazat session')->setValidationScope(false);
$form->addSubmit('btn_odeslat', 'Odeslat');
//..
$form['btn_datum_start']->onClick[] = callback($this, 'datumyClicked');
$form['btn_vymazat']->onClick[] = callback($this, 'vymazatClicked');
// nastavení vyýchozích hodnot
$namespace = Environment::getSession('datumy');
$form->setDefaults((array) $namespace->datum);
}
public function datumyClicked(\Nette\Forms\SubmitButton $button) {
$values = $button->getForm()->getValues();
// zjistím si, pro jaký formulář chci doplňit datum
// protože názvy tlačítek jsou stejné jako formuláře jen mají navíc btn_
$formular = substr($button->getName(), 4);
$values[$formular] = Date("d.m.Y", Time());
$namespace = Environment::getSession('datumy');
$namespace->datum = $values;
$this->flashMessage("Vložen datum do hodnoty: '{$button->caption}'.");
$this->redirect('this');
}
public function vymazatClicked(\Nette\Forms\SubmitButton $button) {
$namespace = Environment::getSession('datumy');
unset($namespace->datum);
$this->flashMessage("Session vymazána.");
$this->redirect('this');
}
}
?>
- bojovyletoun
- Člen | 667
Tak jsem se na to podíval. Stačilo obalit control do snippetu, přidat
formu třídu ajax a poupravit funkce a přidat obslužný js . Prozatím takto
$button->form['datum_start']->value= $values = Date("d.m.Y - G:i:s", Time());
Moc se mi tam nelíbí ty hříčky s ukládáním a s session, řešil bych
to jinak, teď nevím jak ještě.
Momentálně jsem se zasekl u jedné věci – odesílám ajaxově, ale ať klikám na jakékoli tlačítko, vždy se odešle prvním tlačítkem. (viz ) . Zkoušel jsem to se svým skriptem obsluhujícím ajax a formy.
PS: radši to upřesním (platí to pro ajaxové odeslání), chyba je ve všech prohlížečích a nevím, jak tedy rozpoznat, kterým tlačítkem byl formulář odeslán. V požadavku není vůbec název buttonu. V případě, že neodesílám přes ajax, tak se odešle název submit buttonu.
Vyřešeno:
var send=$(this).serializeArray();
send.push({'name':this['nette-submittedBy'],'value':1}); //přidá k odeslaným datům název submitbuttonu
Editoval bojovyletoun (13. 5. 2011 14:23)
- tatyalien
- Člen | 239
Asi v tom plavu více než jsem si myslel, ale z toho co píšeš nedokážu stvořit funkční ozkoušení…
obalení snipetu bych ještě zvládl ;), ale zbytek už je pro mě
Španělsko…
Ukládání do sessionu tam mám pak pro odeslání formuláře, dávám
uživateli později možnost si zkontrolovat zadané údaje a až po
zkontrolování se ukládají data do db, pokud dá ne, vrátí se zpět do
editace formuláře (s přednastavenými hodnotami právě ze sessionu).
Editoval tatyalien (15. 5. 2011 21:39)
- tatyalien
- Člen | 239
bojovyletoun napsal(a):
Vyřešeno:
var send=$(this).serializeArray(); send.push({'name':this['nette-submittedBy'],'value':1}); //přidá k odeslaným datům název submitbuttonu
Prosímtě, kam to mám přesně napojit? Odesílám teď jeden formulář, který má 2 tlačítka a nedokážu dostat ajaxově, kterým tlačítkem to bylo odesláno. Ajax mám z doplňků jquery.ajaxform.js a jquery.nette.js, na formuláři třídu ajax… ajaxově se to odešle, ale nemůžu pak používat
if($form['tlacitko_a']->submittedBy) {
...
} else {
...
}
<script>
jQuery.ajaxSetup({
cache: false,
dataType: 'json',
success: function (payload) {
if (payload.snippets) {
for (var i in payload.snippets) {
$('#' + i).html(payload.snippets[i]);
}
}
}
});
// odesílání odkazů
$('a.ajax').live('click', function (event) {
event.preventDefault();
$.get(this.href);
});
// odesílání formulářů
$('form.ajax').live('submit', function (event) {
event.preventDefault();
$.post(this.action, $(this).serialize());
});
</script>
Vzykoušel jsem i toto
// submit button
if (this.is(":submit")) {
form = this.parents("form");
sendValues[this.attr("name")] = this.val() || "";
// toto
this.get(0).form["nette-submittedBy"] = this.get(0); //tohle přidat
...
Editoval tatyalien (1. 6. 2012 9:37)