IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Seznam s checkboxy, které si pamatují stav

Aktivity
Avatar
David Svatoš:3.3.2022 10:42

Ahoj,
potřebuji na webu s Wordpressem udělat seznam, který bude mít checkboxy a budou si pamatovat stav zaškrtnutí a to na základě přihlášeného uživatele. Ti co nebudou přihlášení, tak se ten stav třeba neuloží, to už je jedno.

Zkusil jsem: Nejdříve jsem zkoušel hledat již dostupná řešení, ale nic použitelného jsem nenašel. Napadlo mě i zkusit rozšíření pro ankety, ale žádná dále nezobrazují vlastní volbu zaškrtnutí.

Chci docílit: Nejsem tolik zkušený v PHP, ale kdyby někdo mě dokázal nakopnout, nebo dát nějakou ukázku řešení, nějak bych si s tím už poradil.
Díky moc!

 
Odpovědět
3.3.2022 10:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.3.2022 11:42

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);
        }
 
Nahoru Odpovědět
3.3.2022 11:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.3.2022 11:48

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

 
Nahoru Odpovědět
3.3.2022 11:48
Avatar
Odpovídá na Peter Mlich
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

 
Nahoru Odpovědět
3.3.2022 18:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.