如何将函数从PHP过程转换为PHP MVC?

如何将函数从PHP过程转换为PHP MVC?,php,codeigniter,procedural-programming,Php,Codeigniter,Procedural Programming,我在我的视图页面上有这个函数,它会截断一些数据以将其显示在我的表中 function truncate($mytext) { //Number of characters to show $chars = 100; $mytext = substr($mytext,0,$chars); $mytext = substr($mytext,0,strrpos($mytext,' ')); return $mytext; }

我在我的视图页面上有这个函数,它会截断一些数据以将其显示在我的表中

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体系结构?
如果有人有想法,请告诉我,谢谢

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

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 stuff,这完全不是Codeigniter MVC

这就是MVC中的情况:

控制器 模型 看法
您可以在控制器中执行此操作:

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 stuff,这完全不是Codeigniter MVC

这就是MVC中的情况:

控制器 模型 看法
控制器:创建一个控制器truncate.php

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


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

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


您至少应该将此函数定义为模型的一种方法,从中获取此描述

class TextModel extends CI_Model {
   ...
   public function getShortDescription(){
       $chars = 100;  
       $mytext = substr($this->mytext,0,$chars);  
       $mytext = substr($mytext,0,strrpos($mytext,' '));    
       return $mytext;
   }
}
以及控制器smth中的以下各项:

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范式。

你至少应该将这个函数定义为你的模型的一种方法,从中你可以得到这个描述

class TextModel extends CI_Model {
   ...
   public function getShortDescription(){
       $chars = 100;  
       $mytext = substr($this->mytext,0,$chars);  
       $mytext = substr($mytext,0,strrpos($mytext,' '));    
       return $mytext;
   }
}
以及控制器smth中的以下各项:

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范式。

既然你已经有了一个工作代码,你需要决定的是这应该转移到CI的MVC范式中的什么地方。我建议把这个放在一个盒子里。CI中的助手正是顾名思义,一个简单的php文件,包含一系列函数,可以帮助您完成某些任务。假设您将其放在一个名为“utility.php”的文件中,然后您可以在需要使用

$this->load->helper('utility');
然后调用truncate函数

现在,如果您有一系列相关的任务,您希望在基于类的结构中整齐地组织这些任务,那么您可以创建自己的CI。假设您创建了一个名为“truncate”的库,然后类似于helpers,它们被加载为

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

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

既然您已经有了一个可运行的代码,那么您需要决定的就是在CI的MVC范例中,该代码应该转移到哪里。我建议把这个放在一个盒子里。CI中的助手正是顾名思义,一个简单的php文件,包含一系列函数,可以帮助您完成某些任务。假设您将其放在一个名为“utility.php”的文件中,然后您可以在需要使用

$this->load->helper('utility');
然后调用truncate函数

现在,如果您有一系列相关的任务,您希望在基于类的结构中整齐地组织这些任务,那么您可以创建自己的CI。假设您创建了一个名为“truncate”的库,然后类似于helpers,它们被加载为

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

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

当前的答案说明您可以将方法添加到模型和控制器中。 从功能上来说,这没有问题,正如您所说的,无论您将其放置在何处,该功能都能完美工作

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

最有可能的结果是代码重复

作为一个可能的解决方案,您可以创建一个类库,允许您保留所有字符串 在一个地方操纵。只需向类中添加更多方法

// 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类需要从您使用它的任何地方自动加载/调用。

当前的答案说明您可以将该方法添加到模型和控制器中。 从功能上来说,这没有问题,正如您所说的,无论您将其放置在何处,该功能都能完美工作

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

最有可能的结果是代码重复

作为一个可能的解决方案,您可以创建一个类库,允许您保留所有字符串 在一个地方操纵。只需向类中添加更多方法

// 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类需要从您使用它的任何地方自动加载/调用。

我尝试了您的代码,但在我看来如何使用它?您必须记住,im发送1个值以在此函数中进行计算,通常在

MVC Codeigniter视图中的动态文本来自控制器。如果需要,控制器会与模型对话以获取数据,并将其发送到视图。我在那里的注释解释了如何在视图中调用它。在这种情况下,我试图从视图发送一个值,以便在控制器上对其求值。我这样做对吗?回显“”.$mytext$mydescription.;?>

不,文本是如何进入视图的?你在那里硬编码吗?它是动态的吗?通常,动态文本通常通过模型在控制器中开始使用。如果在视图中实例化了动态文本,则说明您做得不对。请编辑您的帖子,并包括您正在使用的控制器和视图。它是来自my DB的动态文本,然后在我的视图中声明了一个局部变量,这样我就可以在我的函数中使用它:$mydescription=$value['PROBLEM\u DESCRIPTION']我尝试了您的代码,但在我看来如何使用它?您必须记住,im发送1个值以在该函数中进行计算,通常在MVC Codeigniter中,视图中的动态文本来自控制器。如果需要,控制器会与模型对话以获取数据,并将其发送到视图。我在那里的注释解释了如何在视图中调用它。在这种情况下,我试图从视图发送一个值,以便在控制器上对其求值。我这样做对吗?回显“”.$mytext$mydescription.;?>

不,文本是如何进入视图的?你在那里硬编码吗?它是动态的吗?通常,动态文本通常通过模型在控制器中开始使用。如果在视图中实例化了动态文本,则说明您做得不对。请编辑您的帖子,包括您正在使用的控制器和视图。它是来自my DB的动态文本,然后在我的视图中声明了一个局部变量,这样我就可以在我的函数中使用它:$mydescription=$value['PROBLEM\u DESCRIPTION']我喜欢您的方法,我以前读过关于“瘦”控制器和“胖”模型的文章,但是我如何发送数据以在该函数上进行求值呢?我喜欢你的方法,我以前读过关于“瘦”控制器和“胖”模型的文章,但是我如何发送数据以在该函数上进行求值呢?我喜欢这个函数的简单性,但我的值显示为NULL,也不应该像echo“”。$mytext$mydescription.”;?>

@cyberjas2001:谢谢你。总之,我想我现在不必编辑我的答案了我喜欢这一点的简单性,但我的值显示为NULL,也不应该像echo“”。$mytext$mydescription.;?>

@cyberjas2001:谢谢你。总之,我想我现在不必编辑我的答案了CodeIgniter没有实现MVC设计模式,所以你到底在说什么。CodeIgniter没有实现MVC设计模式,所以你到底在说什么。