0

我已经在这里和论坛上尝试过代码,但我似乎无法让它工作。我有一个索引页面,它显示我的最新帖子,只想按 id 降序显示它们。我还想知道,正如您在下面看到的那样,我在下面用字符来限制我的文本,并且我希望它受到字数的限制,但是当我尝试时,它不会显示任何文本。谢谢这是我的代码。

_view.php

<div class="view">

 <? $this->pageTitle = "Latest Music"?>

<h4><?php echo CHtml::encode($data->id); ?>.
<?php echo CHtml::encode($data->title); ?></h4>

<p><?php 
$charLimit = 680; 
$myText = CHtml::encode($data->text); 
$teaserText = substr($myText,0,$charLimit) . "..."; 
echo $teaserText; 
?></p>

<p><?php echo CHtml::link('View Article', array('view', 'id'=>$data->id)); ?>
&nbsp
<?php echo CHtml::link('Update Article', array('update', 'id'=>$data->id)); ?></p>     
 </div>

新闻控制器/actionIndex

public function actionIndex()
{
   $this->pageTitle = "$TitleP";
   $TitleP = print CHtml::encode($data->title);

    $dataProvider=new CActiveDataProvider('news_model');
$this->render('index',array(
        'dataProvider'=>$dataProvider,

    ));
}

新闻模型

class news_model extends CActiveRecord
{

public static function model($className=__CLASS__)
{
    return parent::model($className);
}

public function tableName()
{
    return '{{news}}';
}

public function rules()
{

    return array(
        array('title, text', 'required'),
       array('title', 'length', 'max'=>128),
           array('id', 'length', 'max'=>128),
           array('text', 'length', 'max'=>1500),
        array('title, text', 'safe', 'on'=>'search'),
    );
}

public function relations()
{
    return array(
    );
}


public function attributeLabels()
{

    return array(
        'id' => 'ID',
        'title' => 'Title',
        'slug' => 'Slug',
        'text' => 'Text',
    );
}

public function search()
{
    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
$criteria->compare('title',$this->title,true);
    $criteria->compare('text',$this->text,true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}


}
4

3 回答 3

1

要将订单添加到您的构造函数中,请dataProvider添加 aCDbCriteria作为第二个参数。CActiveDataProvider

public function index(){
    ...
    $dataProvider=new CActiveDataProvider('news_model',array('criteria'=>array('order'=>'id DESC')));//corrected answer
    ...
}

限制字数(来自原始答案

$word_limit=100;

if (preg_match_all('/\s/', $text_to_shorten, $m, PREG_OFFSET_CAPTURE) && isset($m[0][$word_limit-1]) && $m[0][$word_limit-1][1]) 
        $shortened_text=substr($text_to_shorten, 0, $m[0][$word_limit-1][1]).'...';
else $shortened_text=$text_to_shorten;
echo $shortened_text;

PS你有简短的开放式PHP标签<? $this->pageTitle = "Latest Music"?>

不鼓励这样做,因为它们仅在使用 short_open_tag php.ini 配置文件指令启用,或者 PHP 使用 --enable-short-tags 选项配置时才可用。

于 2013-03-19T06:51:15.937 回答
0

顺便说一句,除了topher 的正确答案之外,如果您总是想在整个应用程序中按降序显示帖子,您可以为模型设置默认范围,如下所示:

class news_model extends CActiveRecord
{
    ...
    public function defaultScope()
    {
        $alias = $this->getTableAlias(false,false);
        return array(
            'order'=> "`$alias`.`id` DESC",
        );
    }
    ...
}

这将强制您的新闻模型的所有 Active Record 调用按 id 降序排列。

当然,如果您不希望在整个站点中出现这种行为,那么我不会费心添加默认范围;只需在需要时应用订单条款;)

于 2013-03-19T08:03:57.370 回答
0

使用以下代码设法找出控制器中的订单:感谢@Topher

public function actionIndex()
{
   $this->pageTitle = "$TitleP";
   $TitleP = print CHtml::encode($data->title);

    $dataProvider=new CActiveDataProvider('news_model', 
array('criteria'=>
              array('order' => ('id DESC')
              )));

    $this->render('index',array(
        'dataProvider'=>$dataProvider,
    ));
}
于 2013-03-19T17:13:54.633 回答