cakephp:从下拉列表中向报告添加过滤器
cakephp: add filter to a report from dropdown list
我有一份报告要生成为视图和 excel 文件。我愿意在两者中显示其所有行。用户需要根据日期字段 "end_date" 过滤数据。在我看来,我把这个:
<?php
$options = array();
$options[0] = 'All';
$options[1] = 'Due last 6 months';
$options[2] = 'Due current month';
$options[3] = 'Due next 3 months';
$options[4] = 'Due next 6 months';
$options[5] = 'Due next 12 months';
?>
<div class="row">
<?= $this->Form->create() ?>
<fieldset>
<div class="col-sm-2"><?= $this->Form->input('select_period', array('options' => $options)); ?></div>
<div class="col-sm-2" style="padding-top:25px;"><?= $this->Form->button('Search', ['type' => 'submit', 'class' => 'btn btn-primary']); ?></div>
</fieldset>
<?= $this->Form->end() ?>
</div>
在我的控制器中,我使用了这个函数:
public function reportReplacement()
{
$assetsAssignations = $this->AssetsAssignations->find()
->contain([
'AssetStatuses',
'Assets' => [
'AssetTypes'
],
'Clients' => [
'ClientTypes'
],
])
->order([
'AssetTypes.name' => 'asc',
]);
$filter = $this->Filter->prg($assetsAssignations);
$_filename = "xls_report_replacement_" . date('Ymd');
$this->set(compact('assetsAssignations', '_filename'));
}
我试图将它放入我的控制器初始化中,但没有成功:
if ($this->request->param('action') == 'reportReplacement') {
$select_period = $this->request->query('select_period'); // I want to get the selected [0], [1], etc.. when I debug, I always get null.
我也没有找到我必须在查询中将选项作为条件的位置,例如:
如果选项[1],则 'end_date' >=(今天 - 6 个月)并且 'end_date' <= 今天;
如果选项[2],则'end_date' = 今天(月);
如果选项[1],则'end_date'>=今天并且'end_date'<=(今天+3个月);
等等
有什么帮助吗?
感谢 Greg,我找到了解决方案:
在视图中:
<?php
$options = array();
$options[0] = 'Due last 6 months';
$options[1] = 'Due current month';
$options[2] = 'Due next 3 months';
$options[3] = 'Due next 6 months';
$options[4] = 'Due next 12 months';
?>
<div class="row">
<?= $this->Form->create() ?>
<fieldset>
<div class="row">
<div class="col-xs-3"><?= $this->Form->input('select_period_id', ['options' => $options, 'empty' => true, 'label' => __('Select Period')]) ?></div>
<div class="col-sm-2" style="padding-top:25px;"><?= $this->Form->button(__('Submit')) ?></div>
</div>
</fieldset>
<?= $this->Form->end() ?>
</div>
在控制器中:
use Cake\I18n\Time;
在函数中:
$data = $this->request->data;
$select_period = $this->request->data('select_period_id');
$today = Time::now()->format('Y-m-d');
$second_date = Time::now();
$assetsAssignations = $this->AssetsAssignations->find()
->contain(['Assets']);
if($this->request->is(['patch', 'post', 'put']))
{
if ($select_period == 0) {
$second_date = $second_date->modify('-6 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $second_date,
'end_date <=' => $today
]);
} elseif ($select_period == 1) {
$second_date = $second_date->modify('1 month');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
} elseif ($select_period == 2) {
$second_date = $second_date->modify('3 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
} elseif ($select_period == 3) {
$second_date = $second_date->modify('6 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
} elseif ($select_period == 4) {
$second_date = $second_date->modify('12 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
}
}
$this->set(compact('assetsAssignations'));
}
我有一份报告要生成为视图和 excel 文件。我愿意在两者中显示其所有行。用户需要根据日期字段 "end_date" 过滤数据。在我看来,我把这个:
<?php
$options = array();
$options[0] = 'All';
$options[1] = 'Due last 6 months';
$options[2] = 'Due current month';
$options[3] = 'Due next 3 months';
$options[4] = 'Due next 6 months';
$options[5] = 'Due next 12 months';
?>
<div class="row">
<?= $this->Form->create() ?>
<fieldset>
<div class="col-sm-2"><?= $this->Form->input('select_period', array('options' => $options)); ?></div>
<div class="col-sm-2" style="padding-top:25px;"><?= $this->Form->button('Search', ['type' => 'submit', 'class' => 'btn btn-primary']); ?></div>
</fieldset>
<?= $this->Form->end() ?>
</div>
在我的控制器中,我使用了这个函数:
public function reportReplacement()
{
$assetsAssignations = $this->AssetsAssignations->find()
->contain([
'AssetStatuses',
'Assets' => [
'AssetTypes'
],
'Clients' => [
'ClientTypes'
],
])
->order([
'AssetTypes.name' => 'asc',
]);
$filter = $this->Filter->prg($assetsAssignations);
$_filename = "xls_report_replacement_" . date('Ymd');
$this->set(compact('assetsAssignations', '_filename'));
}
我试图将它放入我的控制器初始化中,但没有成功:
if ($this->request->param('action') == 'reportReplacement') {
$select_period = $this->request->query('select_period'); // I want to get the selected [0], [1], etc.. when I debug, I always get null.
我也没有找到我必须在查询中将选项作为条件的位置,例如:
如果选项[1],则 'end_date' >=(今天 - 6 个月)并且 'end_date' <= 今天;
如果选项[2],则'end_date' = 今天(月);
如果选项[1],则'end_date'>=今天并且'end_date'<=(今天+3个月);
等等
有什么帮助吗?
感谢 Greg,我找到了解决方案:
在视图中:
<?php
$options = array();
$options[0] = 'Due last 6 months';
$options[1] = 'Due current month';
$options[2] = 'Due next 3 months';
$options[3] = 'Due next 6 months';
$options[4] = 'Due next 12 months';
?>
<div class="row">
<?= $this->Form->create() ?>
<fieldset>
<div class="row">
<div class="col-xs-3"><?= $this->Form->input('select_period_id', ['options' => $options, 'empty' => true, 'label' => __('Select Period')]) ?></div>
<div class="col-sm-2" style="padding-top:25px;"><?= $this->Form->button(__('Submit')) ?></div>
</div>
</fieldset>
<?= $this->Form->end() ?>
</div>
在控制器中:
use Cake\I18n\Time;
在函数中:
$data = $this->request->data;
$select_period = $this->request->data('select_period_id');
$today = Time::now()->format('Y-m-d');
$second_date = Time::now();
$assetsAssignations = $this->AssetsAssignations->find()
->contain(['Assets']);
if($this->request->is(['patch', 'post', 'put']))
{
if ($select_period == 0) {
$second_date = $second_date->modify('-6 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $second_date,
'end_date <=' => $today
]);
} elseif ($select_period == 1) {
$second_date = $second_date->modify('1 month');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
} elseif ($select_period == 2) {
$second_date = $second_date->modify('3 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
} elseif ($select_period == 3) {
$second_date = $second_date->modify('6 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
} elseif ($select_period == 4) {
$second_date = $second_date->modify('12 months');
$second_date = $second_date->format('Y-m-d');
$assetsAssignations->where([
'end_date >=' => $today,
'end_date <=' => $second_date
]);
}
}
$this->set(compact('assetsAssignations'));
}