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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
imyapolzovatelya
Сообщения: 22
Зарегистрирован: 2018.03.02, 09:19

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

Сообщение imyapolzovatelya » 2018.05.18, 16:57

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

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

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;
Нормально ли? Какие другие есть хорошие способы это сделать?

Nex-Otaku
Сообщения: 809
Зарегистрирован: 2016.07.09, 21:07

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

Сообщение Nex-Otaku » 2018.05.18, 17:07

Можно положить этот код во вьюшку без каких-либо вмешательств в классы.

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]);

Аватара пользователя
Alexum
Сообщения: 582
Зарегистрирован: 2016.09.26, 10:00

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

Сообщение Alexum » 2018.05.18, 18:53

Можно одной строкой

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

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

Аватара пользователя
Dominus
Сообщения: 758
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus » 2018.05.19, 01:40

Еще можно в модели:

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

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
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!

Ответить