1

我对执行以下操作的正确方法有些困惑。这是一个类,一个函数还是一个对象?(不确定)所以这里(请善待)我正在同时学习 codeigniter/php。

    $is_live = $this->session->userdata('email');
    $is_live = ucwords($is_live);
            if (!$is_live == null)
                   echo 'Hello, '.$is_live.
                   ' <b>(Not you? '.'<a href="' .base_url().
                   'main/logout">Log Out</a>) </b>'; 

我编写了这段代码,它检查是否设置了会话以及是否为 true 回显详细信息。我目前有这个代码view/main但是我想在所有页面上显示这个代码。

这样做的正确方法是什么?

  1. 我是否创建一个view/header在每个页面上自动加载的并将其插入code那里?
  2. 我是否class/public functionhelper文件中创建一个并在需要的地方加载它?
  3. 我是否class/public functionlibrary文件中创建一个并在需要的地方加载它?
  4. 我是否public function在控制器中创建一个?

-EXTRA- 我的假设是选项1,但我很好奇如果我想在特定页面的另一个位置显示此信息怎么办?我不想复制/粘贴代码块,因为那太草率了。

我将如何设置它以便我可以在需要的地方调用它?例如$this->load->helper('check_for_sess');

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class isLive
{   
    public function is_live() {

        $is_live = $this->session->userdata('email');
        $is_live = ucwords($is_live);
             if (!$is_live == null)
               echo 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>'; 

    }
}

view我试过这个:

<?php 
    $isLive = new isLive;
    $isLive->is_live(); 
?>

然而,这不起作用并导致'函数 userdata() on a non-object error'

有人可以解释实现我想要的解决方案和正确语法的正确方法。提前致谢!

-UPDATE-- 试图创建一个库 - 仍然出现错误。

#Created a library 
class CheckSess 
{   
    function IsLive() 
    {   
    $is_live = $this->session->userdata('email');
    $is_live = ucwords($is_live);

            if (!$is_live == null) 
            {
               $check_msg = 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>';
            }

    return $check_msg;
    }

}


#In the View
<?php echo $this->CheckSess->IsLive();  ?>

#in the controller
$this->load->library('CheckSess');

- 更新 -

class CheckSess {

    function IsLive() 
    {   
    $CI =& get_instance();
    $is_live = $CI->session->userdata('email');
    $is_live = ucwords($is_live);

            if (!$is_live == null) 
            {
               return 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>';
            }

    }

}

设置这个^是libraries文件夹

view节目_<?php echo $this->CheckSess->IsLive(); ?>

controller节目$this->load->library('CheckSess');

请指教。再次感谢!

错误 - -

( ! ) SCREAM: ( ! ) 忽略错误抑制 致命错误: 在 C:\wampserver\www\test-app\application\views\homepage.php 第 56 行调用非对象上的成员函数 IsLive()调用堆栈

时间记忆功能位置

1 0.0005 151432 {main}( ) ..\index.php:0 2 0.0014 187792 require_once('C:\wampserver\www\test-app\system\core\CodeIgniter.php') ..\index.php:202 3 0.0277 1537000 call_user_func_array ( ) ..\CodeIgniter.php:359 4 0.0277 1537048 Main->index( ) ..\CodeIgniter.php:359 5 0.0283 1540200 CI_Loader->view( ) ..\main.php:8 6 0.0283 1540640 CI_Loader->_ci_load( ) ..\Loader.php:419 7 0.0287 1566584 包括('C:\wampserver\www\test-app\application\views\homepage.php') ..\Loader.php:833

4

2 回答 2

4

在 CodeIgniter 中编写此类可重用的最佳方法是模型和库。

由于库更好,因为您使用的代码和逻辑实际上并不是 MVC 中的模型,但是使用 CodeIgniter,特别是对于初学者,如果您不打算在模型中分发或共享此代码,则可以在模型中编写它反正。

我建议阅读更多关于 CodeIgniter 中哪些内容的信息,您可以在此处、SO 或官方 CI 论坛上找到大量信息,但作为快速参考,我将写一份内容清单。

意见

静态、哑数据输出、格式化、迭代(用于显示表格、列表等)。

在这里你想要使用的唯一的东西是一些基本的 PHP 函数、CodeIgniter 助手、、、循环for和条件 ( , )foreachwhileifcase

控制器

表单数据捕获和验证,从模型中捕获数据,将数据发送到视图,重定向。

楷模

从数据库、远程源 (API)、文件中查询、读取、写入和更新数据。

帮手

预计将在视图中使用的常用函数 - 格式化 HTML,将树解析和显示为列表<ul><li></li></ul>,其他函数的速记函数,如

function mydate() {
    return date("d.m.Y");
}

不使用任何 CodeIgniter 库/模型的东西(技术上它可以使用,但在大多数情况下应避免使用)。

图书馆

自定义类和对象、数据处理、API 接口、上述的复合体



如果你想显示一些带有数据的视图文件,我会把它放在一个库中。您可以将其放入模型中。在我的项目中,当我使用某些部件时,我有一个库/模型(在我们的案例中差异很小),我们称之为pmodel.

class Pmodel extends CI_Model() {
    function ShowHeader() {
        $data = array(
            'user' => $this->usermodel->GetCurrentUser()
        }
        $this->load->view('header', $data);
    }

    function ShowMyPart() {
        $is_live = $this->session->userdata('email');
        $is_live = ucwords($is_live);
        if (!$is_live == null)
               echo 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().
               'main/logout">Log Out</a>) </b>'; 

    }
}

现在,如果您之前加载过视图文件,您可以调用它的任何位置$this->pmodel->ShowMyPart()(无论如何都应该自动加载这种类型的模型)。

我会做一点改变,因为它被认为是一种很好的做法 -echo除了视图文件和return值之外,从任何地方都没有任何东西。

echo将关键字更改为return并在您的视图文件中简单地写入echo $this->pmodel->ShowMyPart().

你为什么要这样做?因为,如果您想在加载页眉和页脚(例如)之间调用任何从控制器回显某些内容的方法,CodeIgniter 将在页眉之前回显此内容,因为 CodeIgniter 不会立即回显您加载的视图,它会将它们保存到输出存储并在销毁自己之前发送最终输出。更多阅读可以在这里找到。

但是你可以做得更好——使用视图文件来输出你想要的任何数据,只需创建一个帮助程序并从你的模型/库中加载它,就像你在控制器中所做的那样。

希望有帮助!


编辑

对于您编辑的问题,您的库出现错误的原因是您的库不知道 CodeIgniter 的实例甚至存在,因为您没有从它扩展您的库,就像您对模型和控制器所做的那样。您不使用$this引用库中的 CodeIgniter 类,因为$this引用您的库本身,它是一个单独的类。要使用 CodeIgniter 类,您应该获得一个 CodeIgniter 实例:

$CI =& get_instance();

然后您可以通过更改以下行来使用$CI而不是$this调用 CodeIgniter 类:

$is_live = $this->session->userdata('email');

$is_live = $CI->session->userdata('email');
于 2012-09-28T00:19:31.083 回答
0

您可以制作一个基本的 html 帮助程序并将其自动加载到配置文件中。

然后你可以为此创建一个函数......

function displayLoginStatus($em)
{ 
    $html = '';
    if($em)
    {
        $html = 'Hello, '.ucwords($em).' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>';
    }

    return $html;
}

然后你像普通函数一样调用它:

<?php echo displayLoginStatus($this->session->userdata('email')); ?>

但理想情况下,您会将类似的内容放置在包含标准页面视图的模板或头文件中。没有必要用这样的东西来做一个功能,因为通常你没有在页面上的多个地方登录/注销。它可以简单地浓缩为:

<?php if($this->session->userdata('email')): ?>
Hello, <?php echo ucwords($this->session->userdata('email')); ?> <b>(Not you? <a href="<?php echo base_url(); ?>main/logout">Log Out</a>) </b>
<?php endif; ?>

我更喜欢制作一个站点模板并用它包装视图。使通用元素更容易处理。有些人这样模板: http ://codeigniter.com/forums/viewthread/88335/

有很多方法可以处理这个问题,但总体思路是将最常见的元素分离到一个模板视图中。我不知道有一种简洁的方式来指导你如何做到这一点,所以如果你觉得需要更多关于模板的解释,我只会更新这篇文章。

帮助文档: http ://codeigniter.com/user_guide/general/helpers.html

于 2012-09-28T00:34:14.953 回答