Yii - 在保留或删除GET参数的同时生成URL

时间:2011-11-28 16:48:30

标签: php yii

我目前有一个列出数据项的视图管理。我没有使用单独的视图运行“编辑”和“添加”操作,而是在需要时在页面中显示内联的相应表单。在表单上是一个“取消”按钮,将隐藏它。

现在我决定通过名为mode的GET参数内联显示的内容(如果有)。因此/controller/manage将显示项目,而/controller/manage?mode=edit将显示项目并显示正确数据项的编辑表单。

该操作接受各种其他GET参数,例如日期间隔。

为了激活表单,我正在生成一个指向当前操作的链接,mode参数与$_GET中的现有参数拼接在一起。我正在使用以下单行:

<?php echo CHtml::link('Edit', array_merge(array('/session/manage', 'mode' => 'edit', 'id' => 6), $_GET)); ?>

要实现“取消”链接,我正在使用:

<?php echo CHtml::link('Cancel', array_diff(array_merge(array('/session/manage'), $_GET), array('edit'))); ?>

我的问题是:有更清洁的方法吗?虽然这个工作,但感觉就像一个黑客。我没有找到任何关于生成包含现有GET参数的URL的文档。 Yii是否提供内置方法来做我想做的事情?我是否应该重新评估我对条件视图的一般方法,这可能会产生更清晰的解决方案?

1 个答案:

答案 0 :(得分:2)

一种方法是将所有最新的_GET变量保存在会话状态中。然后,您的控制器将对存储的数据执行操作,并使用新的_GET变量来覆盖它。使用该方法,您不需要将现有的_GET变量合并回新请求。权衡的是,您最终必须管理该会话数据并处理可能的特殊情况(例如重新开始新状态)。

另一种方法是使用Ajax调用一个动作,该动作返回带有渲染编辑表单的局部视图。然后你的链接只需要调用一些使用当前ID进行Ajax调用的javascript,并在页面上显示返回的表单。您的链接最终会看起来像这样:

<a href="#" onclick="showEdit(6)">

由于使用Ajax不会导致页面重新加载,因此您无需担心显示列表所需的任何_GET参数。并且您的取消链接将成为一个javascript调用,只需从DOM中删除编辑表单。使用jQuery:

$('#editform').remove();

使其更清洁的另一种方法是将所有array_merge()内容封装到自定义组件或帮助器的方法中。然后你的代码看起来像:

echo CHtml::link('Edit', URLHelper::mergeGet(array('/session/manage', 'mode' => 'edit', 'id' => 6));

甚至在您自己的CHtml类中使用

echo MyCHtml::link('Edit', array('/session/manage', 'mode' => 'edit', 'id' => 6));

除了MyCHtml::link()之外,CHtml::link()执行array_merge所做的所有操作。 MyCHtml甚至可以扩展CHtml,以便它拥有所有CHtml的方法。