Zpracování akce po kliknutí na checkbox pomocí AJAXu
- maros
- Člen | 16
Zdravím,
můžete mi prosím poradit? Už jakou dobu řeším problém ohledně
checkboxů. Povedlo se mi zprovoznit, aby se po kliknutí na checkbox zavolala
handle metoda, ale zároveň se provede i redirect stránky. Potřeboval bych
to udělat ajaxově, aby se provedl handle bez přesměrování.
$fcont = $form->addContainer('watches');
foreach ($this->revision as $key => $value)
{
$fcont->addCheckbox($value->getId(), 'Hlídat')
->controlPrototype->onChange('window.open("'.$this->link("changeWatchStatus!", array("check" => $value->getId())).'","_self")');
if($value->isWatch())
{
$fcont->components[$value->getId()]->setValue(1);
}
}
Jedná se o checkboxy, který hlídají stav, tedy potřebuji po kliknutí provést změnu stavu. V šabloně to vykresluju takto:
<div n:foreach="$checkBoxForm['watches']->getComponents() as $checkbox">
<div class="col-md-1">{$checkbox->control}</div>
</div>
Nemáte někdo nápad, jak to udělat pomocí AJAXu?
Editoval maros (12. 3. 2016 21:31)
- Machy8
- Člen | 59
Nestačilo by akorát přidat return false po kliknutí? Je tomu tak třeba v tomto návodu. Ajax se dá provést například takhle (budeš si muset do hlavičky přidat tento soubor):
window.urlPrikazu = {link odesli!};
a pak jen
$("#checkbox").click(function(){
var mujCheckbox = $(this).val();
$.ajax({
url: urlPrikazu,
data: {hodnota: mujCheckbox}
});
return false;
})
Editoval Machy8 (12. 3. 2016 22:16)
- maros
- Člen | 16
Nene, jediné co mi to volá handle, tak je
$fcont->addCheckbox($value->getId(), 'Hlídat')
->controlPrototype->onChange('window.open("'.$this->link("changeWatchStatus!", array("check" => $value->getId())).'","_self")');
Nepoužívám doposud žádný javascript. Neloguje mi to žádnou chybu.
- maros
- Člen | 16
Vypnul jsem latte syntaxi ve scriptu.
Jen taková otázka pro jistotu, řádek, který mi určuje akci onChange při
tvorbě checkboxu, mám smazat nebo ne? Když ho smažu, neprovede se nic, když
ho tam nechám, změna se provede, ale přesměruje se stránka.
Nemůže být problém, že se mi generují dynamicky checkboxy, kde každý má
jiný ID a v JS ve funkci používám identifikátor #checkbox?
Signál, který se volá, vypadá následovně:
public function handlechangeWatchStatus($data)
{
$q_revision = $this->em->getRepository('Items');
$temp_revision = $q_revision->find($data);
$temp = ($temp_revision->isWatch() ? false : true);
$temp_revision->setWatch($temp);
$this->em->persist($temp_revision);
$this->em->flush();
}
Editoval maros (12. 3. 2016 23:17)
- premek_k
- Člen | 172
Takhle je funkční to, co bylo uvedeno výše – pro jeden checkbox:
V latte:
{* Nejake jQuery - jen pro uplnost preneseno sem z @layout.latte) *}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<input type="checkbox" id="myCheckbox">Test
<script type="text/javascript">
$("#myCheckbox").click(function(){
var isChecked = $(this).is(':checked');
var ajaxLink = {link odesliAjaxem!};
$.ajax({
url: ajaxLink,
data: { state: isChecked }
});
})
</script>
a v controleru
public function handleOdesliAjaxem($state)
{
var_dump($state);
}