我有一个视图中的页面实际上有两个部分可以通过#标签访问,例如login#signin
和login#signup
。第一次加载页面时,它显示登录表单而没有#signin
没有问题。
因此登录不会导致问题,因为它在folder/login
加载。但是当我尝试将folder/login#signup
加载到直接注册部分时,它会给出一个错误,即没有查看login#signup.php
。如何应对这种情况?
$this->load->view('workers/login#signup');
无效。
当我不放#signup
时,它会加载奇怪的登录表单。
答案 0 :(得分:0)
我会针对此错误的原因以及如何解决问题,对我的初始评论进行更多扩展。
正如评论中所提到的,您无法使用锚点进行查看。例如,这不工作:
view('workers/login#signup'); // The #signup should not be here.
加载视图
要加载特定的视图文件,您将使用以下方法:
$this->load->view('name');
其中name是视图文件的名称。
名称是"名称",而不是"名称#signup"。
再往下,
除非使用.php以外的其他内容,否则不需要指定.php文件扩展名。
这意味着,当您使用view('name')
时,CodeIgniter默认会加载文件name.php
。如果其中包含#signup
,则CodeIgniter将无法找到name#signup.php
,因为该文件不存在。
您提到您正在使用表单验证,因此我们需要确保在转换过程中不会丢失任何值。
以下是如何处理它的简化说明:
function login() {
// Data to be passed to the view (you may or may not already have this)
// More info: https://codeigniter.com/user_guide/general/views.html#adding-dynamic-data-to-the-view
$data = array();
// Validation has failed...
$this->form_validation->run() == FALSE ) {
// Set variable to redirect to #signup upon page load
$data['redirect_to_signup'] = true;
}
// Load view with $data which contains values to be passed to the view
$this->load->view('workers/login', $data);
}
在workers/login
视图文件中,我们只需要检查redirect_to_signup
值是否存在。如果确实存在,那么我们可以使用some simple JavaScript to scroll down #signup
形式:
<?php if (isset($redirect_to_signup) && $redirect_to_signup === true): ?>
<script>
var top = document.getElementById('signup').offsetTop;
window.scrollTo(0, top);
</script>
<?php endif; ?>
因为验证对象仍然有效,所以可以使用内置的CodeIgniter函数使用set_value()
辅助函数预加载表单元素。例如:
<input type="text" name="email" value="<?php echo set_value('email'); ?>">
希望能够解释如何实现您的目标:
#signup
表单。另一种方法是使用redirect('login#signup')
,但我不建议使用此方法。您需要将表单值和验证错误保存到会话中,以便在下一页显示它们。您还遇到了用户可能单击刷新按钮的问题,然后所有值都将丢失。