@hollanditkzn

Можно ли так в detailView сделать?

Ситуация, есть user, User на данный момент является магазин. В магазине есть сотрудники, нужно сделать так чтобы фиксировалась какие сотрудники в смене находятся. Я примерно реализовал, но как-то все громоздко получилось, и хотелось бы узнать, может есть какой-то альтернативный способ решение данной проблемы.
Сразу скажу что есть 3 таблиы это model User-хранятся юзеры, на данный момент это магазины, Personnel-хранится персонал, Shifts-хранятся смены.
Весь модели реализованы User
public function rules()
    {
        return [
            [['username', 'auth_key', 'password_hash', 'email', 'created_at', 'updated_at', 'name'], 'required'],
            [['status', 'created_at', 'updated_at'], 'integer'],
            [['phone'], 'number'],
            [['username', 'password_hash', 'password_reset_token', 'email'], 'string', 'max' => 255],
            [['auth_key'], 'string', 'max' => 32],
            [['name', 'telegram_chat_id', 'telegram_token', 'address'], 'string', 'max' => 50],
            [['username'], 'unique'],
            [['email'], 'unique'],
            [['password_reset_token'], 'unique'],
            [['otdel_id'], 'exist', 'skipOnError' => true, 'targetClass' => Otdel::className(), 'targetAttribute' => ['otdel_id' => 'id']],
        ];
    }
...
/**
     * @return string
     */
    public function getNameSotrud()
    {
        return $this->last_name.' '.$this->name;//Показывает Фамилия Имя сотрудника
    }
/**
     * @return \yii\db\ActiveQuery
     */
    public function getShifts()
    {
        return $this->hasMany(Shifts::className(), ['id_user' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getShiftSotrud()
    {
        return $this->hasMany(Personnel::className(), ['id' => 'id_sotrud'])->via('shifts');
    }

    public function getPersonnelAsString()
    {
//Проверяем кто начал смену сегодня
        $arr = \app\models\Shifts::find()->andWhere(['id_user' => $this->id])
            ->andWhere(['between', 'start', date('Y-m-d 00:00:00'), date('Y-m-d 23:59:59')])
            ->andWhere(['end' => '0000-00-00 00:00:00'])
            ->all();
        $sotrud = ArrayHelper::map($arr, 'id', 'id_sotrud');//Получаем массив из данных
        foreach ($sotrud as $key => $id_sotrud){
//Перебираем массив и выводим Фамилию Имя каждого сотрудника который имеется в массиве
            $user = \app\models\Shifts::findOne(['id_sotrud' => $id_sotrud]);
            return $user->idSotrud->nameSotrud;
        }
    }

Personnel
public function rules()
    {
        return [
            [['last_name', 'name', 'phone'], 'required'],
            [['action'], 'integer'],
            [['last_name', 'name', 'shedule'], 'string', 'max' => 50],
            [['job_duties'], 'string', 'max' => 86],
            [['phone'], 'string', 'max' => 15],
        ];
    }

Shitts
return [
            [['start', 'end'], 'safe'],
            [['id_sotrud', 'id_user'], 'integer'],
            [['id_user'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['id_user' => 'id']],
            [['id_sotrud'], 'exist', 'skipOnError' => true, 'targetClass' => Personnel::className(), 'targetAttribute' => ['id_sotrud' => 'id']],
        ];
/**
     * @return \yii\db\ActiveQuery
     */
    public function getIdUser()
    {
        return $this->hasOne(User::className(), ['id' => 'id_user']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getIdSotrud()
    {
        return $this->hasOne(Personnel::className(), ['id' => 'id_sotrud']);
    }

Ну Detailview
use kartik\detail\DetailView;

<?= DetailView::widget([
    'model' => $model,
    'hover' => false,
    'mode'=>DetailView::MODE_VIEW,
    'striped' => false,
    'attributes' => [
        'email:email',
        'address:text',
        'phone',
        'personnelAsString',
    ]
]) ?>

У меня только выходит одно значение
  • Вопрос задан
  • 304 просмотра
Решения вопроса 1
kawabanga
@kawabanga
В DetailView можно выводить все что душе угодно.
'attributes' => [
        'email:email',
'attribute'=>'email', // можно использовать без модели, например добавить 'label'
'format'=>'raw',
'value'=>function($model) {
echo Html::a('Это емаил'.$model->email, '#');
}

        'address:text',
        'phone',
        'personnelAsString',
    ]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы