cakephp-3.x 相关问题

关于CakePHP MVC框架的3.x分支的问题。将此标记与一般[cakephp]标记结合使用。如果您的问题更普遍适用于CakePHP,请仅使用[cakephp]标签。

cakephp:将过滤后的数据导出到Excel

在我看来,我有 2 个按钮,一个在表单中,用于根据下拉列表过滤数据,另一个用于将过滤后的数据导出到 Excel。 在我看来,我有 2 个按钮,一个在表单中用于根据下拉列表过滤数据,另一个用于将过滤后的数据导出到 Excel。 <?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="row"> <div class="col-xs-3"><?= $this->Form->input('select_period_id', ['options' => $options, 'empty' => false, 'label' => __('Select Period')]) ?></div> <div class="col-sm-2" style="padding-top:25px;"><?= $this->Form->button(__('Search'), ['class' => 'btn btn-primary']) ?></div> </div> </fieldset> <?= $this->Form->end() ?> </div> <div class="timetables index large-9 medium-8 columns content"> <?= $this->Html->link(__('Export to xlsx'), array_merge($this->request->query, ['_ext' => 'xlsx']), ['class' => 'btn btn-primary']) ?> </div> 我假设第一个按钮是 POST,第二个按钮是 GET。 我可以使用第一个按钮获得过滤后的数据,但不能使用第二个按钮: $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'); } elseif ($select_period == 1) { $second_date = $second_date->modify('-6 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'end_date >=' => $second_date, 'end_date <=' => $today ]); // etc.. } elseif($this->request->is(['get'])) { ??? } $_filename = "xls_report_replacement_" . date('Ymd'); $this->set(compact('assetsAssignations', '_filename')); } 我没有找到导出到 Excel 按钮 (GET) 时应该放什么。 请问有什么帮助吗? _ 更新:我尝试了这个,打开excel文件时出现错误 { $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'); debug($this->request->data); if (isset($this->request->data['btn1'])) { if ($select_period == 0) { $second_date = $second_date->modify('-6 months'); $second_date = $second_date->format('Y-m-d'); } elseif ($select_period == 1) { $second_date = $second_date->modify('-6 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $second_date, 'Assets.life_end_date <=' => $today ]); } elseif ($select_period == 2) { $second_date = $second_date->modify('1 month'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } elseif ($select_period == 3) { $second_date = $second_date->modify('3 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } elseif ($select_period == 4) { $second_date = $second_date->modify('6 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } elseif ($select_period == 5) { $second_date = $second_date->modify('12 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } } elseif (isset($this->request->data['btn2'])) { if ($select_period == 0) { $second_date = $second_date->modify('-6 months'); $second_date = $second_date->format('Y-m-d'); } elseif ($select_period == 1) { $second_date = $second_date->modify('-6 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $second_date, 'Assets.life_end_date <=' => $today ]); } elseif ($select_period == 2) { $second_date = $second_date->modify('1 month'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } elseif ($select_period == 3) { $second_date = $second_date->modify('3 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } elseif ($select_period == 4) { $second_date = $second_date->modify('6 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } elseif ($select_period == 5) { $second_date = $second_date->modify('12 months'); $second_date = $second_date->format('Y-m-d'); $assetsAssignations->where([ 'Assets.life_end_date >=' => $today, 'Assets.life_end_date <=' => $second_date ]); } debug($select_period); die(); return $this->redirect(['action' => 'test.xlsx']); } $_filename = "xls_report_replacement_" . date('Ymd'); $this->set(compact('assetsAssignations', '_filename')); } 在我看来,我在表单中包含了第二个按钮: <div class="row"> <?= $this->Form->create('form_name') ?> <fieldset> <div class="row"> <div class="col-xs-3"><?= $this->Form->input('select_period_id', ['options' => $options, 'empty' => false, 'label' => __('Select Period')]) ?></div> <div class="col-sm-2" style="padding-top:25px;"><?php echo $this->Form->submit('Search', array('name'=>'btn1'))?></div> <div class="col-sm-2" style="padding-top:25px;"><?php echo $this->Form->submit('Excel', array('name'=>'btn2'))?></div> </div> </fieldset> <?= $this->Form->end() ?> </div> 当我使用第一个按钮进行调试时: [ 'select_period_id' => '1', 'btn2' => 'Excel' ] select_period_id = '1' 使用 Excel 按钮调试: [ 'select_period_id' => '2', 'btn2' => 'Excel' ] select_period_id = '2' 通过在生成 xlsx 文件时包含调试语句,您会破坏输出。如果不带任何参数重定向到 test.xlsx,您将丢失发布的数据。你可以搞乱这样的事情: $this->redirect(['action' => 'test.xlsx', 'select_period_id' => $select_period]) 但这很丑。无需重定向,只需设置响应类型,如下所示: $this->RequestHandler->renderAs($this, 'xlsx'); 此外,你还有很多重复的代码;其中大部分是可以消除的。 并且您不需要在将日期传递给查询生成器之前设置日期格式,方法是从 Time 类切换到 Date。 这是我建议的版本: { $data = $this->request->data; $select_period = $this->request->data('select_period_id'); $today = FrozenDate::now(); $assetsAssignations = $this->AssetsAssignations->find() ->contain('Assets'); // This block could be done with a switch instead of if-elseif if ($select_period == 0) { $start_date = $end_date = null; } elseif ($select_period == 1) { // Alternately, $start_date = $today->subMonths(6); $start_date = $today->modify('-6 months'); $end_date = $today; } elseif ($select_period == 2) { $start_date = $today; // Alternately, $start_date = $today->addMonth(); $end_date = $today->modify('1 month'); } elseif ($select_period == 3) { $start_date = $today; // Alternately, $start_date = $today->addMonths(3); $end_date = $today->modify('3 months'); } elseif ($select_period == 4) { $start_date = $today; $end_date = $today->modify('6 months'); } elseif ($select_period == 5) { $start_date = $today; $end_date = $today->modify('12 months'); } if ($start_date) { $assetsAssignations->where([ 'Assets.life_end_date >=' => $start_date, 'Assets.life_end_date <=' => $end_date ]); } // Personally, I'd rename this from btn2 to something like xlsx, here and in the form template if (isset($this->request->data['btn2'])) { $this->RequestHandler->renderAs($this, 'xlsx'); } $_filename = "xls_report_replacement_" . date('Ymd'); $this->set(compact('assetsAssignations', '_filename')); } 如您所见,代码更短,并且功能应该相同。 更新:在控制器中,在顶部添加: use Cake\I18n\FrozenDate;

回答 1 投票 0

如何在cakephp中组合来自两个模型的数据并按创建日期(时间对象)对它们进行排序?

消息和文件模型属于对话。 消息和文件都有一个创建的 DATETIME 字段。 我想选择属于特定对话的所有消息和文件,然后...

回答 1 投票 0

CakePHP 3 - 如何在视图单元格内设置 CSS / 脚本块

我正在使用 CakePHP 3.9 我正在尝试在我的视图单元格内设置 css / 脚本依赖项块。 我希望将其提取到布局的头部内,但它不起作用。如果我想让它发挥作用,我必须......

回答 3 投票 0

Cakephp - 禁用 CSRF 以在 Android 应用程序中使用 api

这里有cakephp版本3.7.2。 Cakephp 在浏览器中将 Csrf 设置为 cookie,但我们希望从没有要设置 cookie 的移动应用程序 [Android] 调用 Api。 我在本地主机中禁用了 Csrf

回答 2 投票 0

CakePHP 3 中动态加载插件配置文件

问题:如何从插件/配置目录加载配置文件? 演示项目:https://github.com/CakePHPKitchen/CakeDC-Users-Permissions-Example 我正在使用 CakeDC/users 插件,它......

回答 1 投票 0

CakePHP 3 - 如何在视图中生成结合当前 URL 参数的链接?

CakePHP 的朋友们大家好。 我可以建议一下如何在视图中生成链接吗? 哪个有“?” => [] 但不会清除用户正在浏览的URL中的原始参数?...

回答 2 投票 0

CakePHP 3.x 合并查找结果

我目前正在从具有相同列结构的两个不同表中获取两个结果集。 是否可以对这两组数据进行类似 array_merge 的操作并将它们合并为一组......

回答 1 投票 0

CakePHP 3:获取所有表对象的列表时排除供应商表

在我的数据库中,我有一些插件创建的表。我需要在下拉列表中仅显示我的模型。 在 bootstrap.php 中: 配置::write('ReportManager.modelIgnoreList',array( 'acl_phinxlog', ...

回答 1 投票 0

在cakephp中使用SQL函数返回错误

我正在按照使用 SQL 函数来构建我的查询。我倾向于获得第一笔到期分期付款。在将 cakephp 更新到版本 3.3(由作曲家)之前,我的查询正在运行(在 cakephp3.1 上)。 在我的

回答 2 投票 0

CakePHP 3.x:记录为序列化数组

我正在为 CakePHP 编写自己的解析器日志。 我只需要一件事:这不是写入日志“消息”(作为字符串),而是包含各种日志信息(日期、类型、行、堆栈tr...

回答 2 投票 0

Cakephp 3 - 手动修补和保存相关数据

我正在尝试手动更新主记录和关联记录(销售订单及其行项目)。两个表中需要更新的字段恰好是完全相同的字段(

回答 1 投票 0

cakephp 3 中的配置助手 bootstrap 4

我已经通过composer安装了cakephp插件twbs/bootstrap 作曲家需要 twbs/bootstrap:4.0.0 已成功加载到 bootstrap.php 普金::loadAll(); 下一个设置是修改助手,...

回答 2 投票 0

如何在不使用cakephp3中的验证的情况下将错误消息注入实体?

我有一个模型,可以在 beforeSave 回调中检查很多内容。我不想为此目的使用 cakephp 验证系统,因为在这种情况下它对我来说更简单。 如果检查ch...

回答 1 投票 0

在CakePHP 3.7.4中缓存翻译的问题

我在cakephp上接手了一个项目。问题是我不能改变翻译文本。在 srcLocale 下,我有:en_EN default.mo default.po no_NO default.mo default.po cake.pot ...。

回答 1 投票 0

将CakePHP安装从3.0.13升级到3.8

我的CakePHP 3.0.13安装正常。在尝试跳转到4.x分支之前,我想升级到3.8。我已经启动了:作曲家需要cakephp / cakephp:3.8.12,然后得到下一个...

回答 1 投票 0

通过计数关联数据过滤查询Cakephp 3

我想查询“ Articles”,但我只希望“ Articles”具有两个或更多“ Comments”。因此,我必须计算“注释”并在where子句中使用计数结果。我知道下一个代码是错误的...

回答 1 投票 0

CakePHP 3.x案例说明

我试图在CakePHP 3.x应用程序中按MySQL语句的顺序使用CASE语句。简单选择如下:$ articles = $ this-> Articles-> find()-> where($ conditions)...

回答 1 投票 0

如何为插件禁用CSRF?

我开发了CakePHP 3插件,该插件必须处理没有CSRF令牌的POST请求。在使用插件的应用程序中,我将中间件应用于根范围。路由器:: scope('/',函数(...

回答 1 投票 0

查询匹配()导致重复的行,而distinct()无效

[我正在尝试通过关联的表格发票上的字段过滤一个表格付款。在查询对象上使用功能match()可以正确过滤,但会导致重复行。好像...

回答 1 投票 0

如何将继承了auth的插件作为其他插件的子代使用

对于我的应用程序,我想编写一个具有自己的auth-component的名为“ db”的“ admin”插件。为了管理ACL,我尝试将ivanamat / cakephp3-aclmanager作为我的管理工具的一部分,因为我的应用程序不会...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.