Valor default em select
Tenho um pequeno CRUD com PHP e MVC, MySQL e Bootstrap. Quero clicar no link edit do index e o form edit abrir com o select já com o valor default vindo do banco.
Tabela
Eu tenho uma tabela simples
create table articles(
id int primary key auto_increment,
title varchar(50) not null,
body text not null,
category enum('health', 'reflections','education') default 'reflections'
);
Edit do Controller
public function edit($field_id)
{
if (isset($field_id)) {
$Article = new Article('articles');
$fetch = $Article->fetch($field_id);
if ($fetch === false) {
$error = new \Core\ErrorController();
$error->index();
} else {
require_once APP . 'views/templates/header.php';
require_once APP . 'views/templates/menu.php';
require_once APP . 'views/articles/edit.php';
require_once APP . 'views/templates/footer.php';
}
} else {
header('location: ' . URL . 'article/index');
}
}
A view edit
No form edit eu preciso que, quando clicar num registro do index, ele já trazer o valor do campo property do select preenchido como default. Como o select é fixo e criado com o campo tipo enum do MySQL, eu apenas trago o valor no option selected, os demais options continuam fixos e disponíveis no select do form edit. Depois irei criar uma versão que tem um campo tipo varchar na tabela e usa um select dinâmico criado com o PHP e populando os options dinamicamente.
...
<form action="<?php echo URL; ?>article/update" method="POST">
<table class="table table-hover table-stripped">
<tr><td><label>Title</label></td></tr>
<tr><td><input class="form-control" type="text" name="title" value="<?php echo htmlspecialchars($fetch->title, ENT_QUOTES, 'UTF-8'); ?>" required autofocus/></td></tr>
<tr><td><label>Category</label>
<select class="form-select" name="category" aria-label="Default select category">
<option selected><?=htmlspecialchars($fetch->category, ENT_QUOTES, 'UTF-8')?></option>
<option value="health">Health</option>
<option value="reflections">Reflections</option>
<option value="education">Education</option>
</select></td></tr>
<tr><td><label>Body</label></td></tr>
<tr><td><textarea cols="10" rows="5" class="form-control" name="body" required /><?php echo htmlspecialchars($fetch->body, ENT_QUOTES, 'UTF-8'); ?></textarea></tr>
<input type="hidden" name="field_id" value="<?=htmlspecialchars($fetch->id, ENT_QUOTES, 'UTF-8')?>" />
<tr><td class="text-center"><input type="submit" name="submit_update_article" value="Update Article" class="btn btn-primary btn-sm"/></td></tr>
</table>
</form>
...
Veja como fica
Ao clicar no select Category, ele abre com os options health, refletions e education.
Nova versão
Depois de uma sugestão do colega Eduardo Romão no grupo PHP Brasil eu fui dar uma olhada no código e acabei criando um select cujos options vem de um array e não mais diretamente no HTML. Assim eu verifico cada option com um foreach e comparo com o valor que veio do banco. Casos ejam iguais eu removo o option do array e não mostro no select. Veja:
<tr><td><label>Category</label>
<?php
$options = ['health', 'reflections', 'education'];
?>
<select class="form-select" name="category" aria-label="Default select category">
<option selected><?=htmlspecialchars($fetch->category, ENT_QUOTES, 'UTF-8')?></option>
<?php
foreach($options as $key => $option){
if($option == $fetch->category){
// Remover o option do array, caso seja igual ao valor que vem do banco
unset($options[$key]);
}else{
print "<option value=\"$option\">$option</option>";
}
}
?>
</select></td></tr>
Micro Framework RibaFS
Este código é parte de um pequeno blog que estou criando com um pequeno framework PHP, MVC e Rotas que estou criando. Logo estarei divulgando e sua finalidade é criar aplicativos, blogs e sites usando uma estrutura MVC com rotas.
Até ...