CakePHP是一个面向PHP的开源Web快速开发框架,它为开发,维护和部署应用程序提供了可扩展的体系结构。它使用公知的设计模式,如MVC和ORM,在约定范围内超过配置范例。
CakePHP 2.1:使用组件重定向时,使用 $this->testAction() 测试控制器时,$this->headers 未设置
我开始为应用程序编写测试,并且我已经制作了一个包装器 RedirectComponent 来处理所有重定向。 现在我开始测试我的应用程序(我对测试还很陌生)我
在我看来,我有 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;
我正在上传文件,我想告诉用户是否要删除或覆盖他以前的文件...所以我想在删除之前从控制器操作中显示一个弹出窗口,所以如果用户说是,那么.. .
CakeDC 评级插件 - 任何地方都有教程/说明吗? [已关闭]
是否有关于 CakeDC 评级插件的良好教程/说明? 我在网站上呆了 4 个小时,但仍然没有结束 - 自述文件毫无用处。
我在数据库表中使用排序列。 每当我保存新的数据条目时,我想选择排序的最大计数并将这个新的排序编号与新条目一起保存。 我怎么...
我的表格中有这个 表单->创建('供应商', array( 'url' => array_merge(array('action' => 'index'), $this->params['pass']) )); echo $this->表单->输入('
我正在使用 CakePHP v3.x,我正在尝试弄清楚如何通过迁移工具插入一些记录。该文档仅列出了修改架构的方法。我需要插入记录吗
我正在使用此链接中的反馈插件,使用 PolymorphicBehavior 在我的应用程序中的任何模型上添加评论。我的应用程序出现 2 个错误,内容是 严格 (2048):
我希望使用 JOIN 从 CakePHP 中的表和视图中选择数据,如下所示: $this->Annonces->find('all') ->其中($arrFiltres) ->订单($arrOrder) ->...
我尝试在 cakephp 中使用 TinyMce 插件,但编辑器未加载,但助手加载了。即使将文件解压到插件文件夹并在 bootstrap.php 文件中添加代码后,它的...
CakePHP 使用 FilterComponent “致命错误:无法访问空属性”
我累了。我搜索了几个组件和插件来实现带有过滤器的简单表格。 CakePHP对于那些占主导地位的人来说是美丽的,但是对于初学者来说却是令人头疼的。我是初学者:S 经过 tr...
我正在使用树行为来存储有序的项目列表。 当我向树中添加新元素时,我会调用“reorder()”函数对其进行重新排序。它非常慢。我一直在尝试很多事情。我的
我正在使用CakePHP 1.3,并尝试使用ajax制作一个简单的留言板。我正在尝试使用 Js 助手在索引页上提交表单,然后刷新留言板的 div 以包含...
我正在尝试将 facebook 连接到我的 cakephp 应用程序。我正在使用 Nick 的 Facebook 插件。 我想这样实现 当用户访问该网站时,他应该能够通过
我已经尝试了所有简单的 cakedc 搜索设置,并遵循了之前帖子中的代码示例,但它似乎不适合我。 我不确定,但似乎没有任何搜索...
如何在 CakePHP3 中创建使用 TemplaterTrait 的新 Helper?
我正在尝试创建一个新的助手,我打算使用模板器。 我的代码如下。 我正在尝试创建一个新的 Helper,并且我打算使用模板器。 我的代码如下。 <?php /** * KimSia * * Licensed under The MIT License * For full copyright and license information, please see the LICENSE.txt * Redistributions of files must retain the above copyright notice. * * @copyright TBD * @link TBD * @since 0.1 * @license http://www.opensource.org/licenses/mit-license.php MIT License */ namespace Metronic\View\Helper; use Cake\Core\Configure; use Cake\View\Helper; use Cake\View\StringTemplateTrait; use Cake\View\View; /** * Portlet helper library. * * Automatic generation of Portlet divs and HTML FORMs from given data. * * @property HtmlHelper $Html * @property FormHelper $Form * @link TBD */ class PortletHelper extends Helper { /** * Other helpers used by PortletHelper * * @var array */ public $helpers = ['Url', 'Html', 'Form']; /** * Default config for the helper. * * @var array */ protected $_defaultConfig = [ 'templates' => [ 'portletStart' => '<!-- BEGIN FORM PORTLET--><div class="portlet box {{color}}">', 'portletEnd' => '</div><!-- END FORM PORTLET-->', ] ]; /** * Construct the widgets and binds the default context providers * * @param \Cake\View\View $View The View this helper is being attached to. * @param array $config Configuration settings for the helper. */ public function __construct(View $View, array $config = []) { parent::__construct($View, $config); } /** * Returns an Portlet DIV element. * * ### Options: * * - `color` Color for the Portlet * * @param array $options An array of html attributes and options. * @return string An formatted opening FORM tag. * @link TBD */ public function create(array $options = []) { $defaultOptions = [ 'color' => 'yellow', ]; $options = array_merge($options, $defaultOptions); $templater = $this->templater(); return $templater->format('portletStart', [ 'color' => $options['color'] ]); } /** * Closes a Portlet DIV, cleans up values set by PortletHelper::create(), and writes hidden * input fields where appropriate. * * @return string A closing DIV tag. * @link TBD */ public function end() { $out = ''; $templater = $this->templater(); $out .= $templater->format('portletEnd', []); $templater->pop(); return $out; } /** * Restores the default values built into FormHelper. * * This method will not reset any templates set in custom widgets. * * @return void */ public function resetTemplates() { $this->templates($this->_defaultConfig['templates']); } } 我在 $templater->format 处收到错误消息,表示我有 $templater 的非对象。 FormHelper和HtmlHelper如何使用模板器而不会出现相同的错误? 您实际上并没有使用该特征,您所做的只是将其导入到当前命名空间中。要实际使用它,您必须使用 use 语句在类定义中指定它。 class PortletHelper extends Helper { use StringTemplateTrait; // ... } 另请参阅 http://php.net/manual/en/language.oop5.traits.php
我有一个嵌套的 foreach 循环,可以迭代类和产品。在一种情况下,我的瑜伽课程有两种课程:第 1 节和第 2 节。 报名参加会议意味着参加所有...
我已经使用 CakePHP 框架开发了一个完整的网站,我们想为移动设备(主要是 iPhone/iPad)制作一个非常轻量级的网站版本。 有没有办法利用现有的网站...
CakePHP 2.4 从插件中抛出主应用程序异常? (干扰requestAction?)
我正在将 CakePHP(v 2.44)应用程序的一个运行良好的部分变成一个插件,当我从插件中的控制器中抛出异常时,我得到了最奇怪的行为:异常
我的cakephp应用程序(2.2)应用程序具有以下内容: 新闻文章 HMBTM 新闻类别 新闻类别 HMBTM 新闻文章 在我的新闻文章控制器函数index()中,我试图获取新闻的分页列表