如何在不同的视图上重用此代码?适当的方法

时间:2012-09-27 23:51:05

标签: php oop codeigniter

我对执行以下操作的正确方法感到有些困惑。这是一个函数还是一个对象? (不确定)所以这里(请善待)我正在同时学习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>'; 

我写了这段代码,它检查会话是否已设置,如果是,则回显详细信息。我目前在view/main上有此代码但是我想在所有页面上显示此代码。

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

  1. 我是否在每个页面上创建了一个view/header自动加载并在此处插入code
  2. 我是否在class/public function文件中创建helper并在需要的地方加载?
  3. 我是否在class/public function文件中创建library并在需要的地方加载?
  4. 我是否在控制器中创建public function
  5. -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()”

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

    -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');
    

    - UPDATE -

    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');

    请指教。再次感谢!

    ERROR ---

    (!)SCREAM:忽略错误抑制 (!)致命错误:在第56行的C:\ wampserver \ www \ test-app \ application \ views \ homepage.php中的非对象上调用成员函数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-&gt; index().. \ CodeIgniter.php:359 5 0.0283 1540200 CI_Loader-&gt; view().. \ main.php:8 6 0.0283 1540640 CI_Loader-&gt; _ci_load().. \ Loader.php:419 7 0.0287 1566584 include('C:\ wampserver \ www \ test-app \ application \ views \ homepage.php').. \ Loader.php:833

2 个答案:

答案 0 :(得分:4)

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

库更好,因为你使用的代码和逻辑实际上并不是MVC中的模型,但是使用CodeIgniter,特别是对于初学者来说,如果你不打算分发或分享,那么在模型中写这个是非常好的这个代码无论如何。

我建议您阅读更多有关CodeIgniter的内容,您可以在此处或在官方CI论坛上找到大量信息,但作为快速参考,我将列出其中的内容。

浏览

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

这里唯一要使用的是一些基本的PHP函数,CodeIgniter助手,forforeachwhile循环和条件(if,{ {1}})

控制器

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

模型

查询,读取,编写和更新数据库,远程源(API),文件中的数据。

助手

常用于视图中使用的函数 - 格式化HTML,解析和显示树作为列表case,其他函数的简写函数,如

<ul><li></li></ul>

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

自定义类和对象,数据处理,API接口,前面提到的复杂



如果你想显示一些包含数据的视图文件,我会把它放在一个库中。你可以将它放入模型中。在我使用某些部件的项目中,我有一个库/模型(在我们的情况下差异很小),我们称之为function mydate() { return date("d.m.Y"); }

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。{/ p>

return关键字更改为echo,在视图文件中只需编写return

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

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

希望有所帮助!


修改

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

$this

然后您可以使用$CI =& get_instance(); 代替$CI通过更改行来调用CodeIgniter类:

$this

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

答案 1 :(得分: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