Страница 1 из 1

html представления свойств

Добавлено: 2018.05.18, 16:57
imyapolzovatelya
Всем привет
Например, во многих страницах сайта статус должен выводится так:

Код: Выделить всё

if($model->status == \app\models\Post::STATUS_ONLINE) {
    echo '<label class="text-primary">Online</label>';
} else {
    echo '<label class="text-danger">Offline</label>';
} 
Естественно, это лучше сделать в каком нибудь отдельном классе. Я пока придумал так:

Код: Выделить всё

// app\models\Post
class Post extends ActiveRecord 
{
    use PostHtml; // решил использовать трейт
    
...
}
// PostHtml
trait PostHtml {
    public function getStatusLabel() {
        if ($this->status == Post::STATUS_ONLINE) {
               return '<label class="text-primary">Online</label>';
        } else {
               return '<label class="text-danger">Offline</label>';
        }
    }
}

//Обращение
echo $model->statusLabel;
Нормально ли? Какие другие есть хорошие способы это сделать?

Re: html представления свойств

Добавлено: 2018.05.18, 17:07
Nex-Otaku
Можно положить этот код во вьюшку без каких-либо вмешательств в классы.

views/elements/post-status-label.php

Код: Выделить всё

<?php
        if ($post->status == Post::STATUS_ONLINE) {
               echo '<label class="text-primary">Online</label>';
        } else {
               echo '<label class="text-danger">Offline</label>';
        }
Использование

Код: Выделить всё

$this->render('/elements/post-status-label', ['post' => $model]);

Re: html представления свойств

Добавлено: 2018.05.18, 18:53
Alexum
Можно одной строкой

Код: Выделить всё

echo '<label class="text-' . ($model->status == Post::STATUS_ONLINE ? 'primary">On' : 'danger">Off') . 'line</label>';

Re: html представления свойств

Добавлено: 2018.05.19, 01:40
Dominus
Еще можно в модели:

Код: Выделить всё

class Post extends ActiveRecord {

    const STATUS_OFFLINE = 0;
    const STATUS_ONLINE = 1;    

    //...
    
    /**
     * Возвращает массив имён статусов
     * @return array
     */
    public static function getStatusesArray()
    {
        return [
            self::STATUS_OFFLINE => \Yii::t('app', 'Offline'),
            self::STATUS_ONLINE => \Yii::t('app', 'Online'),            
        ];
    }
    
    /**
     * Возвращает массив названий лейблов
     * @return array
     */
    public static function getLabelsArray()
    {
        return [
            self::STATUS_OFFLINE => 'danger',
            self::STATUS_ONLINE => 'primary',            
        ];
    }
    
    /**
     * Возвращает имя статуса
     * @return string
     */
    public function getStatusName()
    {
        return \yii\helpers\ArrayHelper::getValue(self::getStatusesArray(), $this->status);
    }
    
    /**
     * Возвращает html и имя статуса
     * @return string
     */
    public function getStatusLabelName()
    {
        $name = \yii\helpers\ArrayHelper::getValue(self::getLabelsArray(), $this->status);
        return \yii\helpers\Html::tag('label', $this->getStatusName(), ['class' => 'text-' . $name]);
    }
    
    //...
}
Вывод:

Код: Выделить всё

echo $model->statusLabelName; //<label class="text-primary">Online</label>
echo $model->statusName; //Online