in my view I did this and $checked doesnt exist on my controller.
View ->
foreach($payamentSlips as $payamentSlip) {
$test returns null, why?
update: I replaced postButton to submit and got a array “flag” but only with the “0” as value
in my view I did this and $checked doesnt exist on my controller.
View ->
foreach($payamentSlips as $payamentSlip) {
$test returns null, why?
update: I replaced postButton to submit and got a array “flag” but only with the “0” as value
There are several fundamental things wrong here.
This is questionable:
'checked' => in_array($payamentSlip, $checked)
in_array( $value-to-look-for, $array-to-look-in ) is the proper construction.
Your code places (what appears to be) an Entity object in the value position and an undefined variable in the array position. I’m not sure what your intention is here but it’s hard to imagine $checked
is an array of entities.
Another problem: Your form control will be made for flag
and that is the index you will get back on the data array in your controller. Your expectation for the data return is wrong.
//$this->request->getData() produces
[
'flag' => '1'
]
// or
[
'flag' => '0'
]
Also: When you loop through $paymentSlips
you will reset the value for flag
again and again.
You need to look at the documentation for the Form helper to understand how the field name you provide the helper creates the name
attribute in your HTML and how that translates into the post data array.
This may help some,
https://book.cakephp.org/3/en/views/helpers/form.html#field-naming-conventions
I’ve cleaned up the code in case someone else wants to provide better input than I have:
//View ->
foreach($payamentSlips as $payamentSlip) {
echo $this->Form->control(
'flag',
[
'type' => 'checkbox',
'data-payable-id' => $payamentSlip->id,
'checked' => in_array($payamentSlip, $checked)
]
);
}
//->Controller
$test = $this->request->getData('checked');
dump($test);
Best of luck with your project.
Thanks. to explain what I want to achieve with that code, is to get all Payamentslip->id and save into the array $checked when you click in the checkbox.
Look at my project ->
I have a download button for every row, but I want to select which rows I want to download so all I have to do is get their ID and search into database and pass the data to the download function ( that I did with pdftohtml)
Something like this will get you back an array of the record ids and an indication of checked/not checked. You should be able to work from that in your controller.
echo $this->Form->create(null);
foreach ($paymentSlips as $slip) {
echo $this->Form->control("flag.{$slip->id}", [ 'type' => 'checkbox' , label = '']);
}
echo $this->Form->submit();
echo $this->Form->end();
$this->request->getData() will return:
[
'flag' => [
(int) 3 => '1',
(int) 19 => '0',
(int) 20 => '1',
(int) 50 => '0',
(int) 74 => '0'
]
]
Thanks for your answer, but the result Im getting is a single array with the first flag selected. I’m not getting all selected checkboxes
without seeing code there’s not much to say about that
oh sorry.
View:
foreach ($payamentSlips as $payamentSlip) {
<?phpecho $this->Form->control("flag.{$payamentSlip->nosso_numero}", [ 'type' => 'checkbox', 'label' => false, 'data-payable-id' => $payamentSlip->id, ]); // dump($checked); ?> </td>
Controller
public function gerarPdfSelecionados()
{
// dump($checked);
if ($this->request->is(‘post’)) {
$boletosel = ;
$data = ;
$session = $this->request->session();$data = $session->read('boletosel'); $session = 2; // dump($data); // $checked = $this->request->getData('inpute.checked'); if ($data) { $this->Flash->Error('Por favor selecione ao menos um boleto '); $this->setAction('index'); } else { $this->Flash->Error('Não existe '); // dump($data); } $texto = $this->request->getData(); dump($texto); // $this->set('checked', $boletosel); } }
result from $texto
array:1 [▼
“flag” => array:1 [▼
“00012931” => “0”
]
]
only show the first selected item.
One explanation for your result would be if each line in your table was in a separate form or if all but one was outside your form.
An important detail of my example is that all 5 checkboxes are wrapped in a single form and so, they all post together.
You would have to do something like this:
<form method="post" action="/gerarPdfSelecionados">
<table>
<tr><td> <input ... name="form[111]" > </td></tr>
<tr><td> <input ... name="form[222]" > </td></tr>
<tr><td> <input ... name="form[333]" > </td></tr>
</table>
<input type="submit">
</form>
<input name="form[444]" > // this input would not be returned with the form data
This form would return
['form' =>
[
'111' => 0,
'222' => 0,
'333' => 0,
]
]
//input 'form[444]' would be lost
Its not clear from your code if this is what is being produced.
Within the form, each input will have a ‘name’ attribute and that ‘name’ will match the structure of the array that will post.
Just like with any array, two matching entries will cancel, but it looks like that isn’t a problem here as long as nosso_numero are unique values.
Your browser probably has developers tools that will let you look at the html.
the Form->postbutton have the same function as Form create?
Because I only have one Form Create on my view
After I removed the postbutton(with different action) I got the full array but they do not change between 0 and 1(checked and unchecked
I want to send action with a variable to another action thats why I’m using postbutton, how I can replace for soemthing compatible with the Form I’m using?
postButton makes its own form. That was surly causing problems.
You can have as many forms on your page as you want. Just make sure the inputs for each falls inside the opening and closing tag for the form.
AND each form must have a unique id attribute.
<form id='111' >
<input name='xxx' >
</form>
<form id='222' >
<input name='yyy' >
<input name='rrrr' >
<input name='sss' >
</form>
form 111 would post [‘xxx’ => ‘value’]
form 222 would post an array with 3 elements.
how to set a form id to the postbutton? because I need it to put inside a form tag but not connecting to that form
You can’t nest one form inside of another.
You can have multiple submit buttons in your single form. And they can send the form data to different actions:
https://www.w3schools.com/tags/att_button_formaction.asp
With this technique you could include the input that is currently part of the postbutton
in the general set of inputs in your form. Just make sure each one gets a unique name attribute you can target with your controller logic.
Then your one form will have ALL inputs and many submit buttons. All buttons will post all the inputs. One button will submit the form to do your download process. The other buttons will go to another destination that looks for one entry of the many in the post, and takes action on that value.
Each one of the second class of buttons will have to pass a second parameter in the action url to identify which one was activated. This will give the action a key to use when extracting the post datum.
<button type="submit" formaction="/action.php/9">Submit to another page</button>
or
<button type="submit" formaction="/action.php?id=9">Submit to another page</button>
Or you could use javascript the handle things.
Thanks! I thought i saw some similar on stackoverflow but wasnt sure that would fit for cake php 3.8
It worked!
But I still have the problem of all getting all arrays => 0 (unchecked) but I checked them… What could be the possible issues for this?
I can’t think of anything that would cause that…
Is there any javascript running on the page?
If you post more code snippets, please use ```php on a line by itself just before your code.
and ``` on a line by itself just after your code to format it in the message. It will make things much easier to read.
Seeing the entire block of code, from where you start the form to where you close it, would be very helpful. What you originally posted wasn’t sufficient, and is surely quite a bit different from what you’re working with now anyway.
Thanks, on the specifc view there’s no javascript that are messing with Forms
Here’s the code!
<script>
$(document).ready(function() {
$("input:checkbox").iCheck({
checkboxClass: 'icheckbox_flat-blue',
radioClass: 'iradio_flat',
increaseArea: '20%'
});
});
</script>
<?php
use App\Controller\ShowPayamentSlipController;
$this->Breadcrumbs->add([
['title' => $this->Html->tag('i', '', ['class' => 'fa fa-home']), 'url' => ['controller' => 'Home', 'action' => 'index']],
['title' => 'Impressão de boletos']
]);
echo $this->Breadcrumbs->render();
$checked = array();
?>
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col">
<h3>IMPRESSÃO DE BOLETOS</h3>
<?= $this->Form->create('user', ['url' => ['action' => 'gerarPdfSelecionados']]); ?>
<?= $this->Form->submit(
'BAIXAR BOLETOS SELECIONADOS',
['action' => 'gerarPdfSelecionados'],
['confirm' => 'Deseja Imprimir Todos os Boletos Selecionados?', 'class' => 'btn btn-outline-primary statement']
)
?>
<br>
</div>
<div class="col-md-12 col-sm-12">
<table class="table table-hover extra-slim-row">
<tr>
<th>SELECIONAR</th>
<th> Nosso Numero </th>
<th><?= $this->Paginator->sort('data_vencimento', 'Data Vencimento') ?></th>
<th><?= $this->Paginator->sort('valor', 'Valor') ?></th>
<th>Data Emissão</th>
<th>Ação</th>
</tr>
<?php
foreach ($payamentSlips as $payamentSlip) {
?>
<tr<?= $payamentSlip->boleto_emitido ? ' style="background-color: lightgray"' : '' ?>>
<td style="text-align: center">
<?php
echo $this->Form->control("flag.{$payamentSlip->nosso_numero}", [
'type' => 'checkbox',
'label' => false,
'data-payable-id' => $payamentSlip->id,
]);
?>
</td>
<td><?= $payamentSlip->nosso_numero ?></td>
<?php $dataf = $payamentSlip->data_vencimento ?>
<td><?= $dataf; ?></td>
<?php $numero_formatado = substr($payamentSlip->valor_cobrado, 0, 15) . "." . substr($payamentSlip->valor_cobrado, 15); ?>
<td style=" " text-align: right"><?= $this->Number->currency(number_format($numero_formatado, 2, '.', '')) ?></td>
<td><?= $payamentSlip->data_emissao ?></td>
<td>
<?=
$this->Form->button('DOWNLOAD DO BOLETO', array('type' => 'submit', 'formaction' => ['gerarPdf/', $payamentSlip->id]));
?>
</td>
</tr>
<?php
}
echo $this->Form->end();
?>
<?php if ($payamentSlips->count() > 0) {
} else {
?>
<tr>
<td colspan="10" class="no-data-found">Nenhum registro encontrado</td>
</tr>
<?php
}
?>
<?php ?>
</table>
<?= $this->element('paginator', ['paginator' => $this->Paginator]) ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
I’ll look at this in more detail later.
One problem I see right now, the tag opens before the
Thanks I cleaned the code above!
I will look into the tags
I put checked = “true” on all checkboxes, and still got 0 value, strange? why