尝试通过conroller

时间:2017-10-30 11:29:10

标签: php codeigniter url anchor

我有一个视图中的页面实际上有两个部分可以通过#标签访问,例如login#signinlogin#signup。第一次加载页面时,它显示登录表单而没有#signin没有问题。

因此登录不会导致问题,因为它在folder/login加载。但是当我尝试将folder/login#signup加载到直接注册部分时,它会给出一个错误,即没有查看login#signup.php。如何应对这种情况?

$this->load->view('workers/login#signup');无效。

当我不放#signup时,它会加载奇怪的登录表单。

1 个答案:

答案 0 :(得分:0)

我会针对此错误的原因以及如何解决问题,对我的初始评论进行更多扩展。

问题的原因

正如评论中所提到的,您无法使用锚点进行查看。例如,这工作:

view('workers/login#signup'); // The #signup should not be here.

documentation州:

  

加载视图

     

要加载特定的视图文件,您将使用以下方法:

     

$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'); ?>">

希望能够解释如何实现您的目标:

  1. 验证用户提交的表单;和
  2. 如果有错误,请使用验证消息重新加载表单;和
  3. 向下滚动到页面上的#signup表单。
  4. 另一种方法是使用redirect('login#signup'),但我不建议使用此方法。您需要将表单值和验证错误保存到会话中,以便在下一页显示它们。您还遇到了用户可能单击刷新按钮的问题,然后所有值都将丢失。