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.