【问题标题】:CodeIgniter: Create new helper?CodeIgniter:创建新的助手?
【发布时间】:2010-10-22 17:00:43
【问题描述】:

我需要以不同的方式循环大量数组并将其显示在页面中。数组由模块类生成。我知道最好不要在“视图”中包含函数,我想知道在哪里插入函数文件。

我知道我可以“扩展”助手,但我不想扩展助手。我想用我的循环函数创建一个助手。让我们称之为 loops_helper.php

【问题讨论】:

  • 为什么不能直接将这些数组传递给视图?
  • 我可以,但这忽略了将视图与功能分开的意义..

标签: php codeigniter codeigniter-helpers


【解决方案1】:

CodeIgniter 助手是一个具有多种功能的 PHP 文件。 它不是一个类

创建一个文件并将以下代码放入其中。

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

if ( ! function_exists('test_method'))
{
    function test_method($var = '')
    {
        return $var;
    }   
}

将此保存到 application/helpers/ 。我们称之为“new_helper.php”

存在第一行是为了确保文件不能被包含并从 CodeIgniter 范围之外运行。这之后的一切都是不言自明的。

使用助手


这可以在您的控制器模型视图中(不推荐)

$this->load->helper('new_helper');

echo test_method('Hello World');

如果您在很多位置使用此帮助程序,您可以通过将其添加到自动加载配置文件(即&lt;your-web-app&gt;\application\config\autoload.php)来自动加载它。

$autoload['helper'] = array('new_helper');

-马修

【讨论】:

  • 始终使用辅助文件名附加“_helper”,否则会出错。所以“helper_name”将不起作用,但将您的文件命名为“name_helper”。
  • 从 CI2 开始,您还需要获取 CI 实例才能在模型中使用帮助器:$ci = get_instance(); $ci->load->helper('name_helper');
  • 请注意,帮助器没有是一个函数。它也可以是一个类。例如,查看在EllisLab's Forum 创建“小部件”的策略。然后你可以在任何地方使用那个类......从技术上讲,如果你愿意,你可以通过获取实例然后将$this设置为它的属性来将你的助手加载到CI实例中......如果你想当然。
  • if function_exists 检查有什么用?它是一个代码点火器,它是一个通用的 php 良好实践吗?为什么需要它?
  • @skrln 您有可能自动加载了一个助手(我们称之为cool_helper),如果您忘记了这一点并在自动加载后手动调用$this-&gt;load-&gt;helper('cool_helper'),您将得到一个“已经定义”的 PHP 错误或其他东西。这可以防止两次加载相同的代码(类似于include_once() PHP 函数,但用于 CodeIgniter 帮助程序,以避免出现问题)。基本上,稍微翻译一下:如果函数不存在,则表示之前没有加载帮助程序。让我们定义它。
【解决方案2】:

一些允许您在帮助程序中使用 CI 实例的代码:

function yourHelperFunction(){
    $ci=& get_instance();
    $ci->load->database(); 

    $sql = "select * from table"; 
    $query = $ci->db->query($sql);
    $row = $query->result();
}

【讨论】:

  • @r4ccoon,没错。我什至没花 5 分钟就回来查看实例定义。 :)
  • @r4ccoon,这是一个很棒的提示
【解决方案3】:

对我来说,只适用于在 php 文件中添加文本 "_helper",例如:

并自动加载文件夹aplication -> 文件autoload.php 中的帮助器,在数组中添加不带“_helper”的名称,例如:

$autoload['helper'] = array('comunes');

这样我就可以使用助手的所有功能了

【讨论】:

  • 我刚刚发现就像你说的那样,CodeIgniter 需要在文件名末尾加上_helper
  • @Jared,是的,我也是这样,它需要文件名末尾的_helper!
【解决方案4】:

要创建一个新的助手,您可以关注instructions from The Pixel Developer,但我的建议是不要仅仅为特定应用程序的特定部分所需的逻辑创建助手。相反,在控制器中使用该逻辑将数组设置为其最终预期值。一旦你得到它,你就可以使用Template Parser Class 将它们传递给视图,并且(希望)你可以使用简单的变量或变量标签对而不是 echo 和 foreachs 来保持视图与任何看起来像 PHP 的东西无关。即:

{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}

而不是

<?php foreach ($blog_entries as $blog_entry): ?>
<h5><?php echo $blog_entry['title']; ?></h5>
<p><?php echo $blog_entry['body']; ?></p>
<?php endforeach; ?>

这种方法的另一个好处是,您不必担心添加 CI 实例,就像使用自定义帮助程序来完成所有工作一样。

【讨论】:

    【解决方案5】:

    /application/helpers 中创建一个名为您的助手名称的文件,并将其添加到自动加载配置文件/手动加载。

    例如在 /application/helpers 中放置一个名为 user_helper.php 的文件,其中包含以下内容:

    <?php
      function pre($var)
      {
        echo '<pre>';
        if(is_array($var)) {
          print_r($var);
        } else {
          var_dump($var);
        }
        echo '</pre>';
      }
    ?> 
    

    现在您可以通过 $this-&gt;load-&gt;helper(‘user’); 加载帮助程序或将其添加到 application/config/autoload.php 配置中。

    【讨论】:

      【解决方案6】:

      只需在应用程序助手目录中定义一个助手 然后从您的控制器调用函数名称,如

      helper name = new_helper.php
      function test_method($data){
       return $data
      }   
      

      在控制器中 加载助手

      $this->load->new_helper();
      $result =  test_method('Hello world!');
      if($result){
       echo $result
      }
      

      输出将是

      Hello World!
      

      【讨论】:

        【解决方案7】:

        要从配置文件中检索项目,请使用以下函数:

        $this-&gt;config-&gt;item('item name'); 其中 item name 是您要检索的 $config 数组索引。例如,要获取您的语言选择,您将执行以下操作:

        $lang = $this-&gt;config-&gt;item('language'); 如果您尝试获取的项目不存在,该函数将返回 FALSE(布尔值)。

        如果您使用 $this->config->load 函数的第二个参数来将配置项分配给特定索引,您可以通过在 $this- 的第二个参数中指定索引名称来检索它>config->item() 函数。示例:

        // 加载名为 blog_settings.php 的配置文件并将其分配给名为“blog_settings”的索引

        $this->config->load('blog_settings', TRUE);
        

        // 检索 blog_settings 数组中包含的名为 site_name 的配置项

        $site_name = $this->config->item('site_name', 'blog_settings');
        

        // 指定相同项目的另一种方式:

        $blog_config = $this->config->item('blog_settings');
        

        $site_name = $blog_config['site_name'];

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多