1

Q: BootDetailView をこのように表示するにはどうすればよいですか?

Users

name : aa
company : test
department : dep1
section : sec1.1
team : team1.1.1

私は2つのtbls(部門とユーザー)を持っています

これは部門のテーブル構造です

department
id | name      | p_id | company_id
1  | dep1      | 0    | 1
2  | dep2      | 0    | 1
3  | sec1.1    | 1    | 1
4  | sec2.1    | 2    | 1
5  | team1.1.1 | 3    | 1
6  | team1.1.2 | 3    | 1
7  | team2.1.1 | 4    | 1

これはユーザーの tbl 構造です

user
id | name | company_id | team_id
1  | aa   | 1          | 5
2  | bb   | 1          | 5
3  | cc   | 1          | 7
4  | dd   | 1          | 6
5  | ee   | 1          | 6

ユーザーモデルに関係を追加しました

public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'ranks' => array(self::BELONGS_TO, 'Rank', 'rank_id'),
            'companies' => array(self::BELONGS_TO, 'Company', 'company_id'),
            'departments' => array(self::BELONGS_TO, 'Department', 'team_id'),
        );
    }

このビュー(CGridViewはindex.php(ビュー)で使用しています)

<?php $this->widget('bootstrap.widgets.BootDetailView', array(
            'data'=>$model,
            'attributes'=>array(
                //array('name'=>'id', 'label'=>'ID'),
                array('name'=>'login_name', 'label'=>'Name'),
                array('name'=>'first_name', 'label'=>'First Name'),
                array('name'=>'last_name', 'label'=>'last Name'),
                array('name'=>'email', 'label'=>'Email'),
                array('name'=>'created', 'label'=>'Created'),
                array('name'=>'ranks.name', 'label'=>'Rank'),
                array('name'=>'companies.name', 'label'=>'Company'),
                array('name'=>'departments.name', 'label'=>'Team'),
            ),
        )); ?>

これはコントローラーです

public function actionView($id)
{
    $model = $this->loadModel($id);
    $sql = 'SELECT id, name FROM rank r WHERE r.id = '. $model->rank_id;
    $rank = Yii::app()->db->createCommand($sql)->queryAll();

    $sql = 'SELECT id, name FROM company c WHERE c.id = '. $model->company_id;
    $company = Yii::app()->db->createCommand($sql)->queryAll();         

    $dst = $this->getDST($model->team_id);

    $this->render('view',array(
        'model'=>$model,
        'rank'=>$rank[0]['name'],
        'company'=>$company[0]['name'],
        'department'=>$dst['department'],
        'section'=>$dst['section'],
        'team'=>$dst['team'],
    ));
}

public function getDST($team_id) // Getting the Department, Section and Team
{
    $records = Department::model()->find('id=:id', array(':id'=>$team_id));
    if($records->p_id == 0 ) {
    $dst['department'] = $model->team_id;
        $dst['section'] = NULL;
        $dst['team'] = NULL;
    } else {
        $records = Department::model()->find('id=:id', array(':id'=>$records->p_id));
        if($records->p_id == 0 ) {
            $dst['department'] = $records->id;
            $dst['section'] = $model->team_id;
            $dst['team'] = NULL;
        } else {
            $dst['section'] = $records->id;
            $dst['team'] = NULL;
            $records = Department::model()->find('id=:id', array(':id'=>$records->p_id));
            if($records->p_id == 0 ) {
                $dst['department'] = $records->id;
                $dst['team'] = $model->team_id;
            }
        }
    }   
    return $dst;
} 
4

1 に答える 1

1

Yii の関係は単純です。

// User model
public function relations()
{
    return array(
        'rank' => array(self::BELONGS_TO, 'Rank', 'rank_id'),
        'company' => array(self::BELONGS_TO, 'Company', 'company_id'),
        'department' => array(self::BELONGS_TO, 'Department', 'team_id'),
    );
} // User have only one rank, company and department

// Department model
public function relations()
{
    return array(
        'parent'   => array(self::BELONGS_TO, 'Department', 'p_id'),
        'children' => array(self::HAS_MANY, 'Department', 'p_id'),
        'company'  => array(self::BELONGS_TO, 'Company', 'company_id'),
        'users'    => array(self::HAS_MANY, 'User', 'team_id'),
    );
} 

理由: class BootDetailView extends CDetailView それで
十分です:

// usercontroller
function actionView($id)
{
    $this->render('view', array('model' => $this->loadModel($id));
    // or for optimize sql query
    $this->render('view', array('model' => User::model()->with(array('rank', 'company', 'department'))->findByPk($id));
}

// view.php
$details = array(
         'login_name',
         'first_name',
         'last_name',
         'email',
         'rank.name',
         'company.name',
     );
$departments = array();
$d = $model->department;
$departments[] = 'department.name';
$s = 'parent.';
while ($d->parent != null) {
    $departments[] = 'department.'.$s.'name';
    $s .= 'parent.';
    $d = $d->parent;
}

$this->widget('bootstrap.widgets.BootDetailView', array(
    'data'=>$model,
    'attributes'=> array_merge($details, $departments),
)); 
于 2012-07-26T05:20:11.560 に答える