Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
ola galera estou na luta aqui, se eu estiver no lugar errado sorry...
seguinte estou num projeto de escola de cursos, e no curso terá tipo uns 3 valores de curso
os cursos aVista - curso Parcelado - e curso pago na promissoria
fiz esses radio para habilitar e desabilitar os valores conforme clicado
<input type="radio" name="comoPagar" id="Pgtovista" onclick="habilitar()" />
<label class="form-check-label" for="aVista">
à Vista
</label>
<input type="radio" name="comoPagar" id="Pgtoparcelado" onclick="habilitar()" />
<label class="form-check-label" for="parcelado">
Parcelado
</label>
<input type="radio" name="comoPagar" id="Pgtopromissoria" onclick="habilitar()" />
<label class="form-check-label" for="promissoria">
Promissoria
</label>
esse é meu java script para trabalhar
<script>
//Habilitar_Desabilitar_Inputs
function habilitar() {
//aVista
if ($("#Pgtovista").prop('checked') == true) {
$("#Avista").prop("disabled", false);
}
else {
$("#Avista").prop("disabled", true);
}
//Parcelado
if ($("#Pgtoparcelado").prop('checked') == true) {
$("#parcelado").prop("disabled", false);
}
else {
$("#parcelado").prop("disabled", true);
}
//Promissoria
if ($("#Pgtopromissoria").prop('checked') == true) {
$("#promissoria").prop("disabled", false);
}
else {
$("#promissoria").prop("disabled", true);
}
}
<script>
bom agora vem o que esta pegando, esse javaScript acima esta habilitando certinho conforme clicado na forma, mais negocio é que tenho por exemplo 30 cursos cadastrados e na hora de habilitar ele só habilita o primeiro valor entendem..
vou explicar minha logica...
estou querendo somar os cursos que o aluno escolher fazer tipo tenho um **whilePHP **que esta me retornando todos os 30 cursos
<input type="text" name="cursoPretendido[]" id="Avista" value="<?php echo $resultListCursos->valorCursoVista?>" id="<?php echo $resultListCursos->idCurso?>" disabled />
<input type="text" name="cursoPretendido[]" id="parcelado" value="<?php echo $resultListCursos->valorCursoParcelado?>" id="<?php echo $resultListCursos->idCurso?>" disabled />
<input type="text" name="cursoPretendido[]" id="promissoria" value="<?php echo $resultListCursos->valorCursoPromissoria?>" id="<?php echo $resultListCursos->idCurso?>" disabled /><br>
<label style="margin:0 0% 0 0%; font-size:1.3em" class="form-check-label" for="<?php echo $resultListCursos->idCurso?>">
<?php echo $resultListCursos->nomeCurso?></div>
</label>
ai quero pedir pra habilitar apenas os valores conforme clicado, se for aVista, mostro-o, e desabilito o parcelado e o promissoria se for parcelado mostro-o e desabilito o aVista e o Promissoria, se for promissoria, mostro-o e deabilito o avista e parcelado certo,
assim vou cadastrar pegando apenas o valor habilitado(eu acho) rsss
mais o problema é que ele esta desabilitando apenas o primeiro registro do whilePHP
acredito que tenho que fazer um forJavascritp, seria isso
me ajudem pfvuia amigão esta quase funfando, matou a pau rssss
só estou tentando adaptar nessa minha pegada do curso e sem sucesso olha o q fiz...
<?php $sqlListCursos = "select * from cursos";
$conectaListCursos = $conecta->query($sqlListCursos);?>
<?php while($resultListCursos = $conectaListCursos->fetch_object()){?>
<div style="width:auto; padding:1%; margin:2px 2px 0px 0px; float:left;border:0px red solid">
<input type="text" name="Valor_a_Vista_vindo_do_Bando" id="a-a" value="aVista" class="alvo_a" data-tipo="vista" disabled=""/>
<input type="text" name="Valor_Parcelado_vindo_do_Bando" id="a-b" value="parcelado" class="alvo_a" data-tipo="parcelado" disabled="" />
<input type="text" name="Valor_promissoria_vindo_do_Bando" id="a-c" value="promissoria" class="alvo_a" data-tipo="promissoria" disabled="" />
<input type="hidden" name="cursos[]" value="<?php echo $resultListCursos->idCurso?>" checked>
<input type="checkbox" name="cursoPretendido[]" value="<?php echo $resultListCursos->idCurso?>" id="<?php echo $resultListCursos->idCurso?>">
<label style="margin:0 0% 0 0%; font-size:1.3em" class="form-check-label" for="<?php echo $resultListCursos->idCurso?>">
<?php echo $resultListCursos->nomeCurso?>
</div>
</label>
<?php }?>
como pode ver, estou fazendo uma consulta no banco de dados ai ele me lista todos os cursos ja com os valores, cada um no seu quadrado aVista - parcelado - promissória
nesse script acima, quando eu clico que vou pagar aVista, ele me HABILITA apenas os 2primeiros registros e assim suscetivamente , quando clico no Parcelado, ele me libera apenas os 2primeiros registros e quando clico na promissória e me libera apenas os 2primeiros registros
qual a cagada que estou fazer??Novamente seu html está em em conflito.
Você tem um elemento pai <div style="width:auto; ......
Você tem um elemento filho <label style="margin:0 0% 0 0%; .......
Então você termina o elemento filho fora de elemento pai que dar conditos no DOM
>
Em 10/03/2020 at 12:29, helkton disse:
</div> </label>
A tag label que é filha deviria ser encerrada antes da tag div
Compor HTML em laços de repetição do PHP é muito simples, só que temos que ficar atento quando elementos gerados dentro desse laço tendem a ser manipulados por script de forma distinta.
Nesse caso precisamos no laço fazer algo que possa distinguir um elemento do outro de forma que uma função saiba exatamente o que fazer com cada elemento.
No meu exemplo eu usei a própria chave do índice do array de resultados.
Spoiler
<?php
$resultado_do_banco_de_dados = [
[
'idcurso' => 1,
'nomecurso' => 'HTML'
],
[
'idcurso' => 2,
'nomecurso' => 'Javascript'
],
[
'idcurso' => 3,
'nomecurso' => 'PHP'
]
];
?>
<div>
<?php foreach ($resultado_do_banco_de_dados as $key => $value) { ?>
<p>Curso <?= $value['nomecurso'] ?></p>
<input
type="radio"
value="avista[]"
name="pagamento_<?= $key ?>"
id="a_<?= $key ?>"
class="alvo_da_funcao"
data-alvo="alvo_<?= $key ?>"
data-tipo="avista"
/>
<label for="a_<?= $key ?>">À Vista</label>
<input type="radio" value="parcelado[]" name="pagamento_<?= $key ?>" id="b_<?= $key ?>" class="alvo_da_funcao" data-alvo="alvo_<?= $key ?>" data-tipo="parcelado" />
<label for="b_<?= $key ?>">Parcelado</label>
<input type="radio" value="promissoria[]" name="pagamento_<?= $key ?>" id="c_<?= $key ?>" class="alvo_da_funcao" data-alvo="alvo_<?= $key ?>" data-tipo="promissoria" />
<label for="c_<?= $key ?>">Promissoria</label>
<p>Pagamentos para o Curso <?= $value['nomecurso'] ?></p>
<input
type="text"
name="cursoPretendido[]"
value="<?= $value['idcurso'] ?>"
class="alvo_<?= $key ?>"
data-tipo="avista"
disabled=""
/>
<input type="text" name="cursoPretendido[]" value="<?= $value['idcurso'] ?>" class="alvo_<?= $key ?>" data-tipo="parcelado" disabled="" />
<input type="text" name="cursoPretendido[]" value="<?= $value['idcurso'] ?>" class="alvo_<?= $key ?>" data-tipo="promissoria" disabled="" />
<input type="hidden" name="cursos[]" value="<?= $value['idcurso'] ?>" checked="" />
<?php } ?>
</div>
Aqui cada volta do loot $key representa o índice do array atual que está sendo processado, então uso isso para compor quantos cursos existirem sem duplicar itens iguais.
No mais mesmo script que dei de exemplo antes interage com os elementos uma vez que cada pode ser distinto a cada volta do loop.
Algo me chamou a atenção de como pretende validar dados via serve-side.
Se fosse eu faria diferente eliminando os input's text pois eles são inúteis, e ficaria só com com label para saber o tipo de pagamento e outro para poder saber de qual se trata, uma vez que o usuário marca um radio automaticamente ele assimila o curso.
Veja como eu faria de forma bem mais simples:
Spoiler
<?php
$resultado_do_banco_de_dados = [
[
'idcurso' => 1,
'nomecurso' => 'HTML'
],
[
'idcurso' => 2,
'nomecurso' => 'Javascript'
],
[
'idcurso' => 3,
'nomecurso' => 'PHP'
],
];
?>
<?php foreach ($resultado_do_banco_de_dados as $value) { ?>
<p>Curso <?= $value['nomecurso'] ?></p>
<input
type="radio"
value="avista"
name="pagamento_<?= $value['idcurso'] ?>"
id="a_<?= $value['idcurso'] ?>"
class="alvo_da_funcao"
data-alvo="id_<?= $value['idcurso'] ?>"
data-tipo="avista"
/>
<label for="a_<?= $value['idcurso'] ?>">À Vista</label>
<input type="radio" value="parcelado" name="pagamento_<?= $value['idcurso'] ?>" id="b_<?= $value['idcurso'] ?>" class="alvo_da_funcao" data-alvo="id_<?= $value['idcurso'] ?>" />
<label for="b_<?= $value['idcurso'] ?>">Parcelado</label>
<input type="radio" value="promissoria" name="pagamento_<?= $value['idcurso'] ?>" id="c_<?= $value['idcurso'] ?>" class="alvo_da_funcao" data-alvo="id_<?= $value['idcurso'] ?>" />
<label for="c_<?= $value['idcurso'] ?>">Promissoria</label>
<!-- Esse input podemos deixar visível caso o usuário queira desmacar ou usar o CSS para ocultar -->
<input id="id_<?= $value['idcurso'] ?>" type="checkbox" name="cursos[]" value="<?= $value['idcurso'] ?>" />
<?php } ?>
<script>
var alvo = document.getElementsByClassName('alvo_da_funcao');
for (var i = 0; i < alvo.length; i++) {
alvo[i].addEventListener('change', habilitar, false);
}
function habilitar(e) {
var marcado = e.target;
var qualCurso = marcado.dataset.alvo; // como o data-alvo é o mesmo ID do ckeckBox é só marcar ele
document.getElementById(qualCurso).setAttribute('checked', '');
}
</script>
E no lado do servidor fica fácil depurar:
<?php
foreach ($_POST['cursos'] as $value) {
$curso = $value;
$pagStr = "pagamento_{$value}";
$typo = $_POST[$pagStr];
echo ("<p>O usuário selecionou o curso de ID \"{$curso}\" e a forma de paramento é \"{$typo}\"</p>");
}
Vamos lá se eu entendi direito.
Primeiramente preste mais atenção na composição do HTML para não cometer erros grotescos como os que cometeu
>
13 horas atrás, helkton disse:
<input type="radio" name="comoPagar" id="Pgtovista" onclick="habilitar()" /> <label class="form-check-label" for="aVista"> à Vista </label>
>
13 horas atrás, helkton disse:
<!-- Vão ser os inputs type text com class "alvo_a" --> <input type="radio" name="pagamento_a" id="a-a" class="alvo_da_funcao" data-alvo="alvo_a" data-tipo="avista" /> <!-- Vão ser os inputs type text com class "alvo_b" --> <input type="radio" name="pagamento_b" id="b-a" class="alvo_da_funcao" data-alvo="alvo_b" data-tipo="avista" /><!-- TIPOS DE PAGAMENTO -->
<p>Pagamentos para o Curso HTML</p>
<input
type="text"
name="cursoPretendido[]"
id="a-a-a" value="a a"
class="alvo_a"
data-tipo="avista"
disabled=""
/>
<input
type="text"
name="cursoPretendido[]"
id="b-a-a"
value="b a"
class="alvo_b"
data-tipo="avista"
disabled=""
/>