checkbox výber více ID, array

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

Zdravim,
snažím se vytvořit checkbox, který by sbíral do array idčka.

v latte vykresluji přes foreach:

<input type=checkbox name=sel[] value={$ukol->id_ukolu}>

V presenteru:

public function handleTest() {
    $values = $form->getHttpData($form::DATA_TEXT, 'sel[]');
    dump($values);
    exit;
 }

ale nemám vytvořený form a pro tento případ ani nechci, jak se dostanu k samotného checkboxu, zkoušel jsem proměnou, ale potom už mi nic nesbírá.

CZechBoY
Člen | 3608
+
0
-

No bez formulare se ti asi nic neposle…

Na co potrebujes formularovy policko bez formulare?

Tymikes
Člen | 63
+
0
-

Chtěl bych jen označit více řádků v seznamu pomocí checkboxu. Jsem myslel, že checkbox je na to vhodný.

CZechBoY
Člen | 3608
+
0
-

No a co budes delat po tom co se ty checkboxy odeslou? Prece zpracujes formular… Tak ho tam pridej ;-)
Pokud chces vic zaskrtnuti tak bys asi mohl pouzit ChechboxList

Tymikes
Člen | 63
+
0
-

Moc nevím, jak na to.
v latte mám

{form formular}
<input type=Checkbox name=sel[] value={$ukol->id_ukolu}>
{/form}

v presenteru mám

protected function createComponentFormular()
{
$form = new Form;
return $form;
}

public function handleTest($form) {
$values = $this->template->$form->getHttpData($form::DATA_TEXT, 'sel[]');
dump($values);
exit;
}

a je jedno co označím, chybu vyhazuje:

The variable ‚241‘ does not exist in template.

(241 je ID posledního přidaného řádku)

CZechBoY
Člen | 3608
+
0
-

Do toho formulare si nepridal checkboxy, z formulare vytahni data pomoci

$form['nazev checkboxu']->getValue();

Chechbox vykresli s atributem n:name misto name.

<input n:name="sel:$id">

Editoval CZechBoY (29. 2. 2016 20:23)

Tymikes
Člen | 63
+
0
-

Tak takto to vypadá po úpravě.

{form formular}
<input type=Checkbox n:name="sel:$ukol->id_ukolu" value={$ukol->id_ukolu}>
{/form}
protected function createComponentFormular()
{
$form = new Form;
$form->addCheckbox('sel', "");
return $form;
}

public function handleTest($form) {
$values = $form['sel']->getValue();
dump($values);
exit;
}

Takto po úprave a vyhazuje mi chybu:
Illegal string offset ‚sel‘

Editoval Tymikes (29. 2. 2016 20:32)

CZechBoY
Člen | 3608
+
0
-

Proc to vlastne davas do handleTest?

Normalne to navaz na uspesne odeslani formulare:

$form = new Form;
$form->addCheckboxList('sel');
$form->onSuccess[] = function (Form $form, array $values) {
    $ids = $values['sel'];
};
Tymikes
Člen | 63
+
0
-

Jsem to tam dával z důvodu, že potřebuju s nima potom pracovat (např. kliknout na odkaz a vybrané smazat, proto ten handle) a nevím, jak to teď udělat když už idčka nejspíš nasbíraná mám, ale mám je až po odeslaní formuláře (takže potřebuju ještě udělat odeslání formuláře/submit tlačítko – ale zase musí být mimo form)

//Tak nakonec mi to hází prázdný Array. Možná bude problém že ve funkci Form $form – není v té funkci definovaný nebo nevim.

protected function createComponentFormular()
{
$form = new Form;
$form->addCheckboxList('sel');
$form->addSubmit('odeslat');
$form->onSuccess[] = function (Form $form, array $values) {
$ids = $values['sel'];
dump($ids);
exit;
};
return $form;


}
{form formular}
      <input type=Checkbox n:name="sel:$ukol->id_ukolu" value={$ukol->id_ukolu}>
 {/form}

{form formular}
     <input type="submit" name="odeslat" value="Dump test"/>
{/form}

Editoval Tymikes (29. 2. 2016 22:05)

CZechBoY
Člen | 3608
+
0
-

Dej to do jednoho formu.
Odesilas formular odkazem nebo jak to myslis?

Tymikes
Člen | 63
+
0
-

Zkoušel jsem to dát do jednoho formu, to samé. Nene, dělám to způsobem, jak ukazuji nahoře, nic navíc.

CZechBoY
Člen | 3608
+
0
-

Muzes zkusit jeste setItems a dat tomu seznam idček, ktery vypisujes v ty tabulce.

Tymikes
Člen | 63
+
0
-

Já právě nebudu znát přesný počet těch IDček, ten bude pokaždý jiný.

Tymikes
Člen | 63
+
0
-

Když to zkusím např. takto

protected function createComponentFormular()
{
$form = new Form;
$form->addCheckboxList('sel');
$form->addSubmit('odeslat');
$form->onSuccess[] = array($this, 'registrationFormSucceeded');
return $form;
}


public function registrationFormSucceeded($form)
{
$values = $form->getHttpData($form::DATA_TEXT, 'sel');
dump($values);
exit;
}

Tak to vrací zase furt NULL

premek_k
Člen | 172
+
0
-

No a co takhle nepoužít form, ale v javascriptu si zjistit všechny zatržené checkboxy, následně je ajaxem poslat na server

//ajaxovy pozadavek
  var x = $.nette.ajax({
      url: ajaxLink,
      data: {
          boxes: checkedBoxes
      }
  });

a na serveru zpracovat v handle? @Tymikes, nebyl to i tvůj původní záměr?
Pokud ale děláš něco jako datagrid, raději použij některé hotové řešení, jinak se s tím udrbeš…

Editoval premek_k (1. 3. 2016 10:19)

Tymikes
Člen | 63
+
0
-

Toto záměrem je, jen jsem si myslel, že to půjde tímto způsobem. Jestli bych pak byl schopný s vybranými(zaškrtnutými) řádky pracovat bylo by to ok, ale ještě jsem s ajaxem nedělal.

Můžu se kouknout na ten datagrid, ale nevím kam soubory nakopírovat (composer nepoužívám). do \vendor ?

premek_k
Člen | 172
+
+4
-

Investuj čas a nastuduj composer. Je to nejlepší rozhodnutí.

Tymikes
Člen | 63
+
0
-

Tak jsem nainstaloval composer a pomocí něho Grido, chtěl bych to otestovat, ale nevím jak zobrazit ten grid v latte, mám tam tu základní továrničku

protected function createComponentGrid($name)
{
    $grid = new Grido\Grid($this, $name);
    $grid->setModel(array(
        array('name' => 'Lucie', 'gender' => 'female'),
        array('name' => 'Petra', 'gender' => 'female'),
        array('name' => 'Lenka', 'gender' => 'female'),
    ));
   return $grid;
}

a jak nyní v latte tento grid zobrazim? zkusil jsem

{control grid}

a mám chybu
Class ‚App\Presenters\Grido\Grid‘ not found
Pokud mám vytvořit ještě nějakou třídu, jak bude vypadat presenter a latte?

Mysteria
Člen | 797
+
+1
-

Jako obvykle problém se jmennými prostory.

$grid = new \Grido\Grid($this, $name);
Tymikes
Člen | 63
+
0
-

Mohl by jsi mi to trošku objasnit.
Momentálně mám chybu, která mi říká, že následující třída neexistuje. Ale mám jí vytvořit nebo už někde je? kde? Omlouvám se, že se tak ptám, rád bych to pochopil, dělám s nette chviličku.

chyba:
Class ‚Grido\Grid‘ not found

jiri.pudil
Nette Blogger | 1032
+
+1
-

Třída je v onom balíčku nainstalovaném pomocí Composeru. Jen se o ní ještě musí nějak dozvědět autoloader. Toho docílíš nejsnáz tak, že v bootstrapu načteš soubor vendor/autoload.php, který Composer generuje z metadat jednotlivých balíčků.

Tymikes
Člen | 63
+
0
-

Děkuji všem, grid už funguje :)