2011-11-28 133 views
1

我现在有一个观点,管理,列出的数据项。不需要使用单独的视图来执行“编辑”和“添加”操作,而是在需要时在页面上内嵌适当的表单显示。在表单上是一个“取消”按钮,将隐藏它。的Yii - 生成URL,同时保留或删除GET参数

现在我决定什么,如果有的话,形式直列通过名为mode GET参数显示。因此/controller/manage将显示这些项目,而/controller/manage?mode=edit将显示这些项目并显示正确数据项目的编辑窗体。

动作接受各种其它GET参数诸如日期间隔。

为了激活表单,我使用$_GET中的现有参数与mode参数拼接,生成当前操作的链接。我使用下面的一行代码:

<?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是否提供了一种内置的方法来做我想做的事情?我是否应该重新评估对条件视图的一般方法,这可能会产生更清晰的解决方案?

+0

我打算做类似的事情,但基于ajax,如果您在每个请求中加载页面,我都没有意见将所有项目+表单放在一个视图中。 – Asgaroth

+0

我发现的唯一方法是交出一个return_url参数并将其解析到视图的链接中。 – schmunk

+0

@Asgaroth我从JavaScript/AJAX“很高兴”的角度出发,即可能被禁用,核心功能不应该依赖它。我只有在应用程序完全没有它的功能后才尝试添加AJAX功能。 – LostSalad

回答

2

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

另一种方法是使用Ajax调用返回与您呈现编辑表单的局部视图的操作。然后,您的链接只需调用一些JavaScript,即使用当前ID进行Ajax调用,并在页面上显示返回的表单。您的联系将最终看起来是这样的:

<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));

甚至ecapsulate 在你自己的了CHtml类:

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

其中MyCHtml::link()做的一切,CHtml::link()确实,除了array_merge东东。 MyCHtml甚至可以扩展CHtml,以便它拥有CHtml的所有方法。

+0

我喜欢最后一种方法,实际上(Yii是否有这个功能?不是吗?自己写,现在'不行')。如果可以的话,请查看我对schmunk的评论,以上为什么我试图避免使用AJAX。最终,我可以将AJAX加入其中(它会产生最干净,功能最强大的结果),但是我希望在没有它的情况下可以访问核心功能。 编辑:我留下这个打开的时间,以防万一有更多的建议,但这是一个很好的答案,3种非常合理的方法。 – LostSalad

+0

谢谢。关于最后一个选项,我在答复中增加了更多细节。 –

+0

我已经接受了这个答案,但我没有足够的代表upvote,对不起。 – LostSalad