1

我的视图页面上有这个功能,它会截断一些数据以将其呈现在我的表格上。

function truncate($mytext) {  
    //Number of characters to show  
    $chars = 100;  
    $mytext = substr($mytext,0,$chars);  
    $mytext = substr($mytext,0,strrpos($mytext,' '));    
    return $mytext;  
    }  

我为我的动态文本设置了一个局部变量:

$mydescription = $value['PROBLEM_DESCRIPTION']

在同一页面上,我有这个:

echo '<td><p>' .truncate($mydescription). '; ?></p><</td>

它运行完美,所以我的问题是如何使用 Codeigniter 将其应用于 MVC 架构?如果有人有想法请告诉我,谢谢!!!

4

5 回答 5

2

由于您已经有一个工作代码,您需要决定的是应该将其转移到 CI 的 MVC 范式中的哪个位置。我建议把它放在一个helper里面。CI 中的 Helpers 顾名思义,就是一个简单的 php 文件,其中包含许多帮助您完成某些任务的函数。假设你把它放在一个名为“utility.php”的文件中,然后你可以在任何你需要的地方包含这个文件

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

然后调用截断函数。

现在,如果你有一堆相关的任务想要整齐地组织在一个基于类的结构中,你可以创建自己的 CI。假设您创建了一个名为 'truncate' 的库,然后类似于 helpers 这些加载为

$this->load->library('truncate');

就个人而言,对于一堆实用程序,我会将它们全部放入帮助程序中,而不是扩展核心 CI 类或创建自定义库。

于 2013-04-24T15:41:55.700 回答
2

您至少应该将此函数定义为模型的方法(您从中获取此描述)。

class TextModel extends CI_Model {
   ...
   public function getShortDescription(){
       $chars = 100;  
       $mytext = substr($this->mytext,0,$chars);  
       $mytext = substr($mytext,0,strrpos($mytext,' '));    
       return $mytext;
   }
}

并且在您的控制器中,类似于:

class Blog extends Controller {

    function index()
    {
            $this->load->model('TextModel');
        $data['short_description'] = $this->TextModel->getShortDescription();

        $this->load->view('blogview', $data);
    }
}

最后,在您看来:

echo '<td><p>'.$short_description.'</p></td>';

我不熟悉 CodeIgniter,但我想任何数据操作都应该在模型中完成,因此您将保持控制器“精简”并且不会违反 MVC 范式。

于 2013-04-24T15:35:00.077 回答
0

控制器:创建一个控制器truncate.php

<?php
 Class Truncate extends CI_Controller {

 function __construct() {
  parent::__construct();
 }

 function truncate_text($mytext) {  
     //Number of characters to show
     $chars = 100;
     if(empty($mytext))
         echo '$mytext is empty.';
     $mytext = substr($mytext,0,$chars);  
     $data['mytext'] = substr($mytext,0,strrpos($mytext,' '));    
     $this->load->view('truncate_view',$data);
 }


视图:创建视图文件truncate_view.php

<?php
    echo '<td><p>'.$mytext.'</p></td>';
   //Write your other view code if any are present.
?>
于 2013-04-24T15:32:16.447 回答
0

您可以在控制器中执行此操作:

class Something extends CI_Controller{
    public function index(){
        $data['mytext'] = $this->_truncate('some text to truncate');

        //truncated text will be available in the view as $mytext
        $this->load->view('some_view', $data);
    }

    private function _truncate($text = NULL){
        if($text){
            $chars = 100;  
            $mytext = substr($text,0,$chars);  
            $mytext = substr($text,0,strrpos($text,' ')); 
            return $mytext;
        }  
    }
}

编辑:

您在视图中调用 db 东西,这完全不是 Codeigniter MVC。

这可能是 MVC 中的样子:

控制器

class Something extends CI_Controller{
    public function index(){
        $test_text = $this->my_model->get_text();
        $data['test_text'] = $this->_truncate($test_text);

        //truncated text will be available in the view as $test_text
        $this->load->view('some_view', $data);
    }

    private function _truncate($text = NULL){
        if($text){
            $chars = 100;  
            $mytext = substr($mytext,0,$chars);  
            $mytext = substr($mytext,0,strrpos($mytext,' ')); 
            return $mytext;
        }  
    }
}

模型

class My_Model extends CI_Model{

    public function get_text(){
        //$this->db->get_where....or other db functions
        return "testing text... this is only a test";
    }

}

看法

<html>
<body>
<b><?php echo $test_text; ?></b>
</body>
于 2013-04-24T15:29:06.910 回答
0

当前的答案说明您可以将该方法添加到模型和控制器中。从功能上讲,这没问题,正如您所说,无论您放置它,该功能都可以完美运行。

当您需要在另一个控制器中调用相同的方法时会发生什么?还是使用不同的型号?

最有可能的是,您最终会出现一些代码重复。

作为一种可能的方案,您可以创建一个类库,允许您将所有字符串操作保存在一个地方。只需向您的课程添加更多方法...

// example/libary/path/TextFormatter.php
class TextFormatter
{
  protected $_text = '';

  public function __construct($text)
  {
    $this->_text = $text;

    return $this;
  }

  public function truncate($maxChars = 100)
  {
    $truncated = substr($this->_text, 0, $maxChars);  
    $truncated = substr($truncated, 0, strrpos($truncated,' '));    

    return $truncated;
  }

  public function stripHtml()
  {
    ///.....
  }

  public function doSomethingElseWithText()
  {

  }

}

然后在控制器...

// Controller.php

class SomeController extends Controller
{

  public function index()
  {
    $formatter = new TextFormatter('Example text string');  
    $data['formattedText'] = $formatter->truncate();

  }


}

唯一需要注意的是,TextFormatter该类需要从您使用它的任何地方自动加载/调用。

于 2013-04-24T16:06:03.650 回答