我的View页面上有这个功能,它截断了一些数据,将它呈现在我的桌面上。
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架构上应用它? 如果有人有想法让我知道,谢谢!
答案 0 :(得分: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范式。
答案 1 :(得分:2)
由于您已经有了一个正常工作的代码,所以您需要决定的是,应该将其转移到MV的MVC范例中。我建议把它放在helper内。 CI中的助手就是名字所暗示的,一个简单的php文件,其中包含一系列功能,可帮助您完成某些任务。假设你把它放在名为&#39; utility.php&#39;的文件中。然后,您可以使用
将此文件包含在任何需要的位置$this->load->helper('utility');
然后调用截断函数。
现在,如果您想要在基于类的结构中整齐地组织一系列相关任务,则可以创建自己的CI library。假设您创建了一个名为&#39; truncate&#39;的库,那么类似于帮助者,这些库被加载为
$this->load->library('truncate');
就个人而言,对于一堆实用程序,我只是将它们全部放入帮助程序,而不是扩展核心CI类或创建自定义库。
答案 2 :(得分: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 stuff,这完全不是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>
答案 3 :(得分: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.
?>
答案 4 :(得分: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
类需要在您使用的任何地方自动加载/调用。