【问题标题】:CodeIgniter: View name different than Controller name, URL showing Controller's function name after POST instead of viewCodeIgniter:视图名称与控制器名称不同,URL 在 POST 后显示控制器的函数名称而不是视图
【发布时间】:2017-02-08 17:54:13
【问题描述】:

我正在使用 CodeIgniter v3.1.3

我有一个名为 User.php 的控制器,它主要包含所有用户管理功能(登录、注册、update_user、forgot_password、update_settings...)

我有一个名为 Profile.php 的视图,在该视图中,有两种可用的表单,我们称之为 Form1,用于更新用户信息(电子邮件、名字、姓氏)和另一个,我们称之为 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 (因为我的视图称为 profile ) .

我的路线如下:

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

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

我怎样才能使提交后,URL 保持 /profile 而不是 /update_user 或 /update_settings ?

您还应该知道一件事,提交后我无法重定向到个人资料页面,因为我正在使用 load->view,因为我也在传递数据。

谢谢!

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

【问题讨论】:

  • 显示你的控制器功能
  • 这是我在 User.php 控制器中的 update_user 函数:pastebin.com/zQNn6Ykz
  • 先 update_user 并隐藏 update_settings 之后您可以尝试 update_setting
  • 抱歉,您能详细说明一下吗?
  • 到 server.com/profile?这就是视图的名称?这是否意味着您有一个$route['profile']['POST'] = 'user/profile'; 和一个打开该视图的函数profile

标签: php codeigniter


【解决方案1】:

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

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

最简单的方法是操纵历史浏览器的对象以使用 Javascript 对其进行更改。

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

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

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

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

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

【讨论】:

  • 我想到了您的第二个解决方案,如果没有找到其他解决方案,我会这样做。我认为这是最好的解决方案,但我更喜欢将我的函数称为与它们所做的事情相关的东西,我必须调用函数 Profile(与视图相同)
  • 嗯,这取决于你如何看待它。 Profile 离函数的作用不远。它加载用户的个人资料$this->view('profile', $this->data);。它只是这个函数中的一行代码,对你来说,这个函数会做其他事情,但对用户来说,这就是函数(URL 接口)所做的事情。了解 CI 如何将 URL 与函数映射在一起,您必须决定从哪个角度来命名函数。
  • 我一直在想,server.com/profile/save_settings 可以接受吗?我想答案是否定的,但如果是,那么您可以将其路由到 user/save_settings。
  • 不行,已经试过了。同样的事情会发生,网址将开始显示 /profile/save_settings
【解决方案2】:

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

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

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

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

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

希望对你有帮助。

【讨论】:

  • 好吧,我可以简单地添加名为 action 的隐藏输入:&lt;input type="hidden" name="action" value="update_user" &gt; 并将我的表单发布到我的用户控制器中名为 Profile 的函数中,并形成该输入的函数检查并决定更新配置文件或更新设置。但我在寻找另一种方式?
  • @Lambasoft :) 这是我的建议之一。
  • 当提交事件被触发时,url必然会发生变化...你可以在完成user/update_user和user/update_settings中的内容后进行重定向(返回配置文件)跨度>
猜你喜欢
  • 2021-11-17
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2012-08-10
  • 2012-11-14
相关资源
最近更新 更多