Bonjour,
J'ai pour projet d'améliorer un système de liste de course.
Actuellement, il me suffit de cocher un ou plusieurs checkbox, pour ensuite valider traditionnellement un bouton pour enregistrer tout cela en BDD.
J'aimerais, que lorsque l'on coche un checkbox, on rajoute deux champs, dont un de type "number" et l'autre de type "select" afin de définir la quantité et le type qui sera inséré sur la même ligne en BDD.
La partie JS permettant d'intégré ses champs sont déjà existant, et me permet aussi, en cas d'affichage, de les maintenir visibles.
Mon soucis, est que je n'arrives pas à récupérer les valeurs des champs "number" et "select" et les traiter, car, vu comment j'ai fais, si je vais un var_dump($_POST) ça m'affiche tous les champs rajoutés, même les vides (car je joue en JS sur le display:none ou inline).
Comment, puis-je procéder pour récupérer uniquement les valeurs sélectionnées pour les insérées en BDD (donc, Article (checkbox. Ceci est déjà réalisé) , la quantité (fournie par le champ de type "number" et le type (fourni par le champ "select") ?
Voici le code que j'ai actuellement. Je précise que ce n'est que le code usuel en question, et pas toutes mes pages.
Page qui liste les articles, avec les checkbox (qui eux sont opérationnels depuis longtemps) et les deux champs rajoutés via JS (possiblement améliorable si besoin, n'hésitez pas svp )
Page de traitement des données, avec mon var_dump, et le traitement des checkbox (uniquement eux, car tant que je n'arrives pas dans le var_dump à récupérer toutes les valeurs souhaitées, je ne modifierais pas l’insertion en BDD.)
Code SQL pour la table
Je vous remercie d'avance, en espérant que tout est claire de ma part, et n'hésitez pas à me dire, si ce n'est pas le cas.
Bien cordialement.
EDIT: Voici une image du visuel que ça donne, pour peut être, mieux aider à comprendre le contexte et mon souhait.
Modifié par Fre3z69 (30 Aug 2020 - 17:00)
J'ai pour projet d'améliorer un système de liste de course.
Actuellement, il me suffit de cocher un ou plusieurs checkbox, pour ensuite valider traditionnellement un bouton pour enregistrer tout cela en BDD.
J'aimerais, que lorsque l'on coche un checkbox, on rajoute deux champs, dont un de type "number" et l'autre de type "select" afin de définir la quantité et le type qui sera inséré sur la même ligne en BDD.
La partie JS permettant d'intégré ses champs sont déjà existant, et me permet aussi, en cas d'affichage, de les maintenir visibles.
Mon soucis, est que je n'arrives pas à récupérer les valeurs des champs "number" et "select" et les traiter, car, vu comment j'ai fais, si je vais un var_dump($_POST) ça m'affiche tous les champs rajoutés, même les vides (car je joue en JS sur le display:none ou inline).
Comment, puis-je procéder pour récupérer uniquement les valeurs sélectionnées pour les insérées en BDD (donc, Article (checkbox. Ceci est déjà réalisé) , la quantité (fournie par le champ de type "number" et le type (fourni par le champ "select") ?
Voici le code que j'ai actuellement. Je précise que ce n'est que le code usuel en question, et pas toutes mes pages.
Page qui liste les articles, avec les checkbox (qui eux sont opérationnels depuis longtemps) et les deux champs rajoutés via JS (possiblement améliorable si besoin, n'hésitez pas svp )
<form action="" method="post">
<?php
$articles = recuperer_articles();
$shelf_id = null;
$article_id = null;
$listeOuverte = false;
$sousListeOuverte = false;
$nbl = count($articles);
if($nbl == 0)
{
$listeHtml = <<<HTML
<div class="alert border-bottom-danger text-center" role="alert">
<span class="font-weight-bold font-weight-light">Il y'a aucun article enregistré.</span>
</div>
HTML;
}
else
{
$listeHtml = <<<HTML
<div class="card-columns">
HTML;
foreach($articles as $v)
{
// $nbr = $i++;
// On vérifie que l'article est le premier de la liste, SACHANT qu'on sait qu'il y 'en a.
if ($shelf_id != $v['shelf_id'])
{
// Si la liste des menus est ouverte
if(true === $listeOuverte)
{
// Si la liste des sous-menus est ouverte
if (true === $sousListeOuverte)
{
// on la ferme la liste des sous-menus en définissant $sousListeOuverte sur FALSE
$sousListeOuverte = false;
// on ferme la balise </ul> de sousmenu
$listeHtml .= <<<HTML
</div>
</div>
</div>
</div>
HTML;
}
//on la ferme la liste des menus en définissant $listeouverte sur FALSE
$listeOuverte = false;
}
$listeHtml .=<<<HTML
<div class="border-success">
<div class="card card-widget mb-4 shadow-sm">
<div class="card-header bg-success text-white text-center">{$v['shelf_name']}</div>
<div class="card-body">
<div class="form-group">
HTML;
$shelf_id = $v['shelf_id'];
$listeOuverte = true;
//Si il y a des sousmenus
if (!is_null($v['shelf_id']))
{
//on définit $souslisteouverte sur TRUE
$sousListeOuverte = true;
}
}
if (!is_null($v['shelf_id']))
{
$true = comparer_articles($v['article_id']);
// var_dump($true);exit;
$checked = ($true)?'checked="checked"':'';
$display = ($true)?'style="display:inline;"':'style="display:none;"';
$listeHtml .=<<<HTML
<div class="form-check mb-3">
<label class="form-check-label" >
<input type="checkbox" class="form-check-input" name="articles[]" id="Check{$v['article_id']}" value="{$v['article_id']}" {$checked} onclick="affNumberCache('Number{$v['article_id']}');affTypeCache('Type{$v['article_id']}');">{$v['article_name']}
</label>
<div style="display:block;">
<input type="number" name="count[{$v['article_id']}]" class="w-25 h-25 ml-1 form-control" id="Number{$v['article_id']}" {$display}>
<select name="type[{$v['article_id']}]" class="w-25 h-25 ml-1 form-control" id="Type{$v['article_id']}" {$display}>
<optgroup label="Type">
<option value="pcs">Pièce(s)</option>
<option value="grm">Gramme(s)</option>
<option value="ltr">Litre(s)</option>
</optgroup>
</select>
</div>
</div>
<script type="text/javascript">
function affNumberCache(Number{$v['article_id']}) {
var div = document.getElementById(Number{$v['article_id']});
if (div.style.display == "inline"){
div.style.display = "none";
}
else{
div.style.display = "inline";
}
}
function affTypeCache(Type{$v['article_id']}) {
var div = document.getElementById(Type{$v['article_id']});
if (div.style.display == "inline"){
div.style.display = "none";
}
else{
div.style.display = "inline";
}
}
</script>
HTML;
}
}
// si la liste de menu est ouverte
if (true === $listeOuverte)
{
$listeHtml .= <<<HTML
</div>
</div>
</div>
</div>
HTML;
}
$listeHtml .= <<<HTML
</div>
HTML;
}
echo $listeHtml;
?>
<button type="submit" name="insert_articles" class="btn btn-success btn-small offset-md-10 mb-4"><i class="<?= $valid_icon ?>"></i> Enregistrer la liste</button>
</form>
<?php
}
?>
Page de traitement des données, avec mon var_dump, et le traitement des checkbox (uniquement eux, car tant que je n'arrives pas dans le var_dump à récupérer toutes les valeurs souhaitées, je ne modifierais pas l’insertion en BDD.)
if (isset($_POST['insert_articles'])){
var_dump($_POST);exit();
$articles = isset($_POST['articles'])?$_POST['articles']:null;
if (!empty($articles)){
$deletid=$cnx->prepare('TRUNCATE TABLE t_courses');
try {
$deletid->execute();
}
catch(PDOException $e){
echo '<div id="alert" class="alert alert-error">
Erreur : La requête à un problème, merci de contacter un administrateur ou le webmaster!
</div>';
exit;
}
$deletid->CloseCursor();
$query = $cnx->prepare("INSERT INTO t_courses (article_id) VALUES (:article_id)");
foreach($articles as $article_id)
{
$query->bindValue(':article_id',$article_id,PDO::PARAM_INT);
$query->execute();
}
$query->CloseCursor();
list_export_html();
header('Location: ./index.php?p=courses');
}else{
$deletid=$cnx->prepare('TRUNCATE TABLE t_courses');
try {
$deletid->execute();
}
catch(PDOException $e){
echo '<div id="alert" class="alert alert-error">
Erreur : La requête à un problème, merci de contacter un administrateur ou le webmaster!
</div>';
exit;
}
$deletid->CloseCursor();
list_export_html();
header('Location: ./index.php?p=courses');
}
}
Code SQL pour la table
CREATE TABLE IF NOT EXISTS `t_courses` (
`courses_id` int(11) NOT NULL AUTO_INCREMENT,
`article_id` int(11) DEFAULT NULL,
`courses_number` int(11) NOT NULL DEFAULT '0',
`courses_type` enum('pcs','g','l') NOT NULL DEFAULT 'pcs',
`courses_statut` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`courses_id`),
KEY `article_id` (`article_id`),
KEY `article_id_2` (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Je vous remercie d'avance, en espérant que tout est claire de ma part, et n'hésitez pas à me dire, si ce n'est pas le cas.
Bien cordialement.
EDIT: Voici une image du visuel que ça donne, pour peut être, mieux aider à comprendre le contexte et mon souhait.
Modifié par Fre3z69 (30 Aug 2020 - 17:00)