CodeIgniter:视图名称与Controller名称不同,URL显示控制器在POST后的函数名称而不是查看

时间:2017-02-08 17:54:13

标签: php codeigniter

我正在使用CodeIgniter v3.1.3

我有一个名为User.php的Controller,主要包含所有用户管理功能(login,register,update_user,forgot_password,update_settings,...)

我有一个名为Profile.php的视图,在此视图中,有两种表单可用,一种叫它 Form1 ,它会更新用户信息(email,first_name,last_name )和另一个,我们称之为 Form2 ,更新用户设置(news_letter_subscription,website_theme,allowed_countries_login ......)

Form1 提交到用户控制器中的 update_user 功能

Form2 在用户控制器中提交 update_settings 功能

每当我提交其中一个表单时,提交后,我的网址就会变成www.example.com/update_user或www.example.com/update_settings而不是停留在www.example.com/profile(因为我的视图称为个人资料)

我的路线如下:

$route['update_user']['POST'] = 'user/update_user';
$route['update_settings']['POST'] = 'user/update_settings';

User.php控制器中的我的update_user函数: http://pastebin.com/zQNn6Ykz

如何在提交后将URL保留/配置文件而不是/ update_user或/ update_settings?

您应该知道的一件事是,我无法在提交后重定向到个人资料页面,因为我正在使用load-&gt;视图,因为我也传递数据。< / p>

谢谢!

编辑:我可以通过许多其他转换来解决这个问题,例如我可以进行AJAX调用,或者将update_user和update_settings函数合并到一个与视图,Profile()相同的函数,并通过动作发送隐藏值采取。但我老老实实地寻找解决方案来解决我的问题,是否可能?

2 个答案:

答案 0 :(得分:1)

如果我理解,你在server.com/profile,你通过在同一个控制器中调用另一个函数来保存表单,但仍然让浏览器说你在server.com/profile。

如果这是我能想到的两种方法来实现这一目标。

简单/ hacky将是操纵历史浏览器的对象以使用Javascript更改它。

如果您在个人资料视图中添加此Javascript代码,则每次加载时都会显示new_url。相应地更改参数。

window.history.pushState("object or string", "Title", "/new-url");

https://developer.mozilla.org/en-US/docs/Web/API/History_API

另一个解决方案是从每个表单调用/配置文件。这将调用用户控制器中的配置文件功能。在那里你可以先检查已经通过的内容。

如果有数据的$ _POST,您知道在显示配置文件之前必须先保存。然后,只需要检测发送哪个表单来调用用户控制器中的正确功能(即$this->update_settings())。

答案 1 :(得分:0)

您可以在视图中添加带有名称(例如my.my_iframe)的隐藏iframe(您需要添加一些css才能隐藏它):

<iframe src="_blank" name="my_iframe"></iframe>

然后,将“target”属性与您的iframe名称匹配:

<form action="update_settings" method="post" target="my_iframe">

因此,当您提交表单时,它将在后台执行。也许你需要使用一些javascript来检索结果。

希望它有所帮助。