过去几个月我一直在与Yii合作,但我遇到了一个障碍:
在我的基本控制器中,我有一个属性public $currentUserOrganisations = NULL;
,在加载时会为所有已登录的用户组织填充它。
现在我有一个页面,我可以获得所有组织,用户可以连接到它们,但我已经拥有的那些必须说“已连接”而不是能够添加。我正在使用bootstrap 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");
}
如果有什么不清楚的话,非常感谢大家并给我一个大喊大叫!
答案 0 :(得分:0)
好的,所以我做了一个与Martin说的非常接近的工作。
在特定字段的视图中我做了:
'value' => 'Organisation::model()->getConnectionAction($data->id, ' . $this->currentOrganisation->id . ')',
id是列出的组织的id,currentOrganization-&gt; id是用户当前组织的id。
然后在我的模型中,我得到了用户的所有组织:
$currentOrganizations = $this->findAllForUserByOrganizationId($currentOrgId);
通过他们,并检查他们是否匹配,完整功能如下。
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"));
}
答案 1 :(得分:-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,则显示已连接。