Diskuze: Seznam s checkboxy, které si pamatují stav
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Budou to jen fragmenty kodu, snad to poskladas 
 Cela ma class ma asi 20k a resi to
strasne slozite, protoze mam nekolik takovych skupin checkboxu. Pozor! Neni to
wordpress. Vsechny me funkce nebudu rozepisovat. Dosad si tam ty spravne
wordpress nebo si je dopis.
https://projekty.slu.cz/evid3_app.php?…
Cast 1 - zobrazeni (ta lehci cast)
<tr>
        <td style="width:14rem;"><label>Participující součásti SU</label> </td>
        <td>Zaškrtnout
<label><input type="checkbox" value="1" onclick="chboxChangeSelected(this, 'filter[soucast]', 'all');"> vše</label>
<label><input type="checkbox" value="1" onclick="chboxChangeSelected(this, 'filter[soucast]', 'none');"> nic</label>
  <div class="form-check">
    <input type="checkbox" value="1" class="form-check-input" id="filter[soucast][1]" name="filter[soucast][1]" checked="checked">
    <label class="form-check-label" for="filter[soucast][1]">REK - Rektorát</label>
  </div>
  <div class="form-check">
    <input type="checkbox" value="2" class="form-check-input" id="filter[soucast][2]" name="filter[soucast][2]" checked="checked">
    <label class="form-check-label" for="filter[soucast][2]">FPF - Filozoficko-přírodovědecká fakulta v Opavě</label>
  </div>
//---
<?php
//Ty checkboxy generuji funkci
public function createCheckBoxList($name='', $cis=array(), $selected=array(), $js='')
        {
        if (is_array($name))
                {
                list($name, $cis, $selected) = $name;
                }
        if (!is_array($cis))
                {return;}
        $tpl = '
  <div class="form-check" '.$js.'>
    <input type="checkbox" value="{value}" class="form-check-input" id="{key}" name="{key}"{checked}>
    <label class="form-check-label" for="{key}">{text}</label>
  </div>';      // title="{title}"
        $out = '';
//      $out = '---'.$name.'---<br>';
        foreach ($cis as $key => $item)
                {
//              $title = $text = $item;
                $text = $item;
                $data = array(
                        'key'     => escapeHtml($name . '[' . $key . ']'),
                        'text'    => escapeHtml($text),
//                      'title'   => escapeHtml($title),
                        'value'   => escapeHtml($key),
                        'checked' => in_array($key, $selected) ? ' checked="checked"' : ''
                        );
                $out .= $this->APP->pageEngine->pageRender($tpl, $data);
                }
        return $out;
        }
//---
// ta funkce vyuziva generovani pres sablonu
// prepise data z array do sablony string {klic} = hodnota
public function pageRender($tpl='', $items = array(), $start='{', $end='}')
        {
        if (!(gettype($tpl)==="string" && gettype($items)==="array" && count($items)>0))
                {
                return $tpl;
                }
        $keys = array();
        foreach($items as $key=>$value)
                {
                $keys[] = $start.$key.$end;
                }
        return str_replace($keys, $items, $tpl);
        }
//---
// a $selected (u createCheckBoxList) vypada takto
$selected = array('1', '2'); // cili, seznam zaskrtnutych id
//---
// ciselnik (u createCheckBoxList), ktery ziskavam z db a ma podobu v php asi takovouto (coz je value=>text pro checkboxy)
$ciselnik = array(
'1' => 'REK - Rektorát'
'2' => 'FPF - Filozoficko-přírodovědecká fakulta v Opavě'
);
//kod, kterym to taham z sql (je to jen vycuc)
                $query = "SELECT DISTINCT `idsoucast`, `zkratka` ,`nazev`  FROM `s_soucast`
                             ORDER BY `idsoucast` ASC";//       -- poradi by melo byt asi stejne pro grupovane tabulky financi jako pro negrupovane v projektu!!!
//                      ";
//                        ORDER BY `logdate` DESC";
// ORDER BY `nazev` ASC";
                $data  = $this->SQL->selectAll($query);
                $cis   = array();
                if ($return_array==false && is_array($data))
                        {
                        foreach($data as $row)
                                {
                                $cis[$row['idsoucast']] = ($row['zkratka']!=='' ? $row['zkratka'].' - ': '') .  $row['nazev'];
                                }
                        return $cis;
                        }
                if (is_array($data))
                        {
                        foreach($data as $row)
                                {
                                $cis[$row['idsoucast']] = $row;
                                }
                        }
                return $cis;
?>
No, a ted prijde to tezsi. Musis to umet spravne ulozit a precist z db
// precteni z GET
$form = $_GET;
// bud
$name = 'filter[soucast]';
$value = isset($form[$name]) ? $form[$name] : -1;
// nebo - nechce se mi ted delat priklad a zkouse to
if ( isset($form['filter']) )
    {
    $name = 'soucast';
    $value = isset($form['filter'][$name]) ? $form['filter'][$name] : array();
     }
// no, mel bys z toho nakonec dostat pole zaskrtnutych, ktere jsem zminil v casti1
$selected = array('1', '2'); // cili, seznam zaskrtnutych id
---
// Do databaze si to uloz, jak potrebujes ty, treba jako json-string,
// ja tam mam fakt strasne slozity mechanizmus, pouzij neco jako
$query = "INSERT INTO tabulka zaskrtnute='".json_encode($selected)."'";
// ---zpetne--- prevod zase pres json_decode($string) php.net/json_decode
// nevyhoda je, ze to mas jako string. Ja to mam jako sql tabulku,
// protoze podle toho potrebuji tridit, kdo ma ktere zaskrtnute.
//Ale, klidne ti dam kod, co tam mam :)
// mam na to extra tabulku, kde ukladam
CREATE TABLE `s_formgroup` (
  `id1` int(10) unsigned NOT NULL, -- id-user (v mem pripade je to id-formulare, ktery ma ulozene zaskrtnute policka)
  `id2` int(10) unsigned NOT NULL, -- value
  `ap` int(10) unsigned NOT NULL, -- id-skupiny ('soucast')
  `logdate` date NOT NULL DEFAULT '0000-00-00',
  `loguser` int(10) unsigned NOT NULL DEFAULT '0',
  KEY `id1` (`id1`),
  KEY `id2` (`id2`),
  KEY `ap` (`ap`),
  KEY `logdate` (`logdate`),
  KEY `loguser` (`loguser`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
public function insert($name='', $idform='')
        {
        return $this->update($name, $idform);
        }
public function update($name='', $idform='')
        {
        $this->delete($name, $idform);
        $read  = $this->getReadByName($name, $idform);
        $items  = getRequest($read['name'], array());
        $items  = is_array($items) ? $items : array($items);
//      if ($result)// && $this->SQL->rowCount()>0)
//var_dump($name, $idform, $items);
        foreach ($items as $id2)
                {
                if (!($id2>0))
                        {continue;}
                $data   = array('id1'=>$idform, 'id2'=>$id2, 'ap'=>$read['where']['ap']);
//var_dump('data', $data);
                $query  = $this->SQL->createSimpleInsert('s_formgroup', $data);
                $result = $this->SQL->query($query);
                }
        }
public function select($name='', $idform='')
        {
        $sql = $this->SQL;
        // find checked
        $read  = $this->getReadByName($name, $idform);
        $where = array();
        if (is_array($read) && isset($read['where']) && is_array($read['where']))
                {
                foreach($read['where'] as $key=>$value)
                        {
                        $where[] = $sql->escapeKey($key).'='.$sql->escapeValue($value);
                        }
                }
if (count($where)==0) {echo '<hr>0 polozek checkboxu nebo neexistuje'; var_dump($name, $idform); echo '<hr>';}
        $where = count($where)>0 ? " WHERE ".implode(" AND ",$where) : "";
        $query    = "SELECT `id2` FROM `s_formgroup`".$where;
        $sql_data = $sql->selectAll($query, array());
        $selected = array();
        foreach ($sql_data as $row)
                {
                $id = $row['id2'];
                $selected[] = $id;
                }
        // render check-box list
        $name = $read['name'];
//var_dump($name, $selected);
//      return array($name, $this->getCisByName($name), $selected);
        return $selected;
        }
public function delete($name='', $idform='')
        {
        $read   = $this->getReadByName($name, $idform);
//var_dump('DELETE read', $read);
        $query  = "DELETE FROM `s_formgroup` WHERE `id1`=%s AND `ap`=%s";
        $query  = $this->SQL->prepare($query, array('id1'=>$read['where']['id1'], 'ap'=>$read['where']['ap'])); // id1=idform, ap=type_of_add_table
        $result = $this->SQL->query($query);
        }
					A, mimochodem, google se pouziva tak, ze mu tam polozis dotaz 
google = php sql save checked values for user
https://www.google.com/search?…
Zda se mi, ze tu maji o moc jednodussi kod.
https://stackoverflow.com/…nto-database
David Svatoš:3.3.2022 18:37
Super, díky moc!!
Jo Googlu jsem se samozřejmě zeptal 
 Ale pravděpodobně jsem se ptal blbě. Dík
Zobrazeno 4 zpráv z 4.
				
