-1

私は過去数か月間 Yii を使用してきましたが、ちょっとした障害にぶつかりました。

私のベースコントローラーには、public $currentUserOrganisations = NULL;ロード時にログインしているすべてのユーザー組織を入力するプロパティがあります。

これで、すべての組織を取得し、ユーザーがそれらに接続できるページができましたが、既に持っている組織は、追加する機能ではなく、「接続済み」と表示する必要があります。私はブートストラップTbGridViewウィジェットを使用しており、私のOrganisationモデルgetConnectionActionでは、組織が既にユーザーに接続されているかどうかに応じて、アンカーまたはラベルを返す関数を作成しました。

ここに私の問題があります。モデルにすでにロードされているユーザー組織にアクセスする方法が見つかりませんOrganisation。これは、モデル クラスのプロパティであるためです。

コードについては以下を参照してください。

コントローラーでのアクション

public function actionNew()
    {
        $connectionModel = Connection::model();
        $organizationModel = Organisation::model();
        $this->selectedSubnav = "Add";
        $this->render('new', array("connectionModel" => $connectionModel, "organizationModel" => $organizationModel));
    }

ビュー内の TbGridView は次のとおりです。

<?php 
$this->widget(
        'bootstrap.widgets.TbGridView',
        array(
            'type'=>'striped',
            'enableSorting'=>true,
            'id' => 'connection-rest-data',
            'dataProvider' => $organizationModel->getConnectionsByOrganization($this->currentOrganisation->id),
            'ajaxUpdate' => true,
            'template'=>"{pager}<br>\n{items}\n{pager}",
            'rowHtmlOptionsExpression' => '',
            'emptyText' => Yii::t("site", "no_restults_found") . '.',
            "itemsCssClass" => "table table-first-column-number data-table display full dataTable transaction_tbl",
            'columns' => array(
                array(
                    'header' => Yii::t("site", "id"),
                    'value' => '$data->id',
                    'type' => 'raw',
                    'name' => 'id'
                ),
                array(
                    'header' => Yii::t("site", "from_unit"),
                    'type' => 'raw',
                    'value' => '$data->fromUnit["name"]',
                    'name' => 'fromUnit'
                ),
                array(
                    'header' => Yii::t("site", "to_unit"),
                    'type' => 'raw',
                    'value' => '$data->toUnit["name"]',
                    'name' => 'type'
                ),
                array(
                    'header' => Yii::t("site", "connection_type"),
                    'type' => 'raw',
                    'value' => '$data->type["name"]',
                    'name' => 'type'
                ),
                array(
                    'header' => Yii::t("site", "ended"),
                    'type' => 'raw',
                    'value' => '$data->ended',
                    'name' => 'ended'
                ),
                array(
                    'header' => Yii::t("site", "fees"),
                    'type' => 'raw',
                    'value' => 'empty($data->fees) ? "none" :  $data->fees["fee"]',
                    'name' => 'fees'
                ),
                array(
                    'header' => Yii::t("site", "actions"),
                    'type' => 'raw',
                    'value' => 'Organisation::model()->getConnectionAction($data->id, \'' . serialize($this->currentUserOrganisations) . '\'")',
                    'name' => 'fees'
                )
            ),
        )
    );
?>

Organisationsモデルの関数は次のとおりです。

public function getConnectionAction ($connectionId)
    {
        $currentOrganizations = null; //This I need to get the public $currentUserOrganisations = NULL; value
        foreach ($currentOrganizations as $org)
        {
            if($org->id == $connectionId)
            {
                return CHtml::label(Yii::t("site", "connected"), "", array("style" => "color:green;"));
            }
        }
        return CHtml::link("Add", "/connection/manage/addConnection?id=$connectionId");
    }

皆さんに感謝します。不明な点があれば大声で言ってください!

4

2 に答える 2

0

わかりましたので、マーティンが言ったことに非常に近い回避策を管理しました。

私が行う特定のフィールドのビューで:

'value' => 'Organisation::model()->getConnectionAction($data->id, ' . $this->currentOrganisation->id . ')',

id はリストされた組織の ID であり、currentOrganization->id はユーザーの現在の組織の ID です。

次に、私のモデルでは、ユーザーのすべての組織を取得します。

$currentOrganizations = $this->findAllForUserByOrganizationId($currentOrgId);

それらを foreach し、それらが一致するかどうかを確認します。以下の完全な機能。

public function getConnectionAction ($organizationId, $currentOrgId)
    {
        $currentOrganizations = $this->findAllForUserByOrganizationId($currentOrgId);
        foreach ($currentOrganizations as $org)
        {
            if(in_array($organizationId, array($org->fromUnit['id'], $org->toUnit['id'])))
            {
                return CHtml::label(Yii::t("site", "connected"), "", array("style" => "color:green;"));
            }
        }
        return CHtml::link(Yii::t("site", "add_connection"), "/connection/manage/addConnection?id=$connectionId", array("class" => "createConnection"));
    }
于 2013-09-12T14:42:33.090 に答える
-1

これについては、Active Recordを避けたいと思うでしょう。CSqlDataProviderを使用して、 TbGridView. このようなSQLを使用してください

select 
   org.organization_name,
   user.name
from organization org
   left outer join connection x on org.id = x.organization_id
   join user on user.id = x.user_id
where user.id = ? or user.id is null

それか ?user_id を単に連結するのではなく、パラメーター配列で渡すことができるようにするパラメーター マーカーです。連結は、SQL インジェクションの入り口を提供します。

次に、gid ビューの列リストで user.name の null をテストし、null の場合は追加ボタンを表示します。null でない場合は、接続済みを表示します。

于 2013-09-11T20:56:07.053 に答える