Php Yii将数据传回模型

Php Yii将数据传回模型,php,yii,Php,Yii,在过去的几个月里,我一直与Yii合作,但我遇到了一些障碍: 在我的基本控制器中,我有一个属性public$currentUserOrganizations=NULL加载时,它使用所有登录的用户组织填充它 现在我有了一个页面,在那里我可以看到所有的组织,用户可以连接到它们,但是我已经有的组织必须说“已连接”,而不是能够添加。我正在使用bootstrapTbGridView小部件,并在我的organization模型中创建了一个函数getConnectionAction,该函数根据组织是否已连接到用

在过去的几个月里,我一直与Yii合作,但我遇到了一些障碍:

在我的基本控制器中,我有一个属性
public$currentUserOrganizations=NULL加载时,它使用所有登录的用户组织填充它

现在我有了一个页面,在那里我可以看到所有的组织,用户可以连接到它们,但是我已经有的组织必须说“已连接”,而不是能够添加。我正在使用bootstrap
TbGridView
小部件,并在我的
organization
模型中创建了一个函数
getConnectionAction
,该函数根据组织是否已连接到用户,返回锚或标签

这里是我的问题:我找不到一种方法来访问
组织
模型中已经加载的用户组织,因为它是我的模型类上的一个属性

代码见下文:

控制器中的操作

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'
                )
            ),
        )
    );
?>

非常感谢各位,如果有什么不清楚的地方,请给我一声大叫

我想你应该避免这一次的活动记录。您可以使用加载
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
那个?是一个参数标记,允许您在参数数组中传入用户id,而不仅仅是将其串联。连接为SQL注入提供了一个开口


然后在gid视图的列列表中测试user.name是否为null,如果为null,则显示add按钮。如果不为空,则显示已连接。

好的,因此我管理了一个与Martin所说非常接近的工作

在特定字段的视图中,我执行以下操作:

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

id是所列组织的id,currentOrganization->id是当前组织用户的id

然后在我的模型中,我得到了用户的所有组织:

$currentOrganizations=$this->findAllForUserByOrganizationId($currentOrganizationId)

浏览它们并检查它们是否匹配,完整功能如下

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"));
    }

$currentOrganizations不属于controller,而是属于模型,因此只需将其移动到那里即可。它实际上属于用户,属于每个页面上的用户的所有组织,这就是为什么我们在基本控制器中设置它为什么不使用user()->currentOrganizations then?因为对于每个结果,我将查询服务器并再次获取它…您的
getConnectionAction
方法除了
CHtml::Link
之外不会做任何事情,因为
$currentOrganizations
在到达
foreach
时总是
null
,因此,每次都会跳过该循环。不起作用,它来自一个DB,但来自一个api,我们有一个ActiveRecord adpater,
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"));
    }