关于我的特性的一些背景:
我们已经建立了一个应用程序,允许你创建和共享一些东西,最后一步是与其他用户共享。
我有一个视图,输出所有用户和每个名称旁边的复选框。使用AJAX,如果您选中或取消选中某个框,它将在数据库表中插入用户id和共享项的id。
因此,我需要连接两个表来查看谁与他们共享了项目。一个表保存条目,另一个表保存与之共享的对象。
现在,我有一个foreach循环,它取出所有已共享的用户ID:
<?php foreach($shared_user as $shared_user):?>
<?= $shared_user_emails[set_default($shared_user->user_id)]; ?><br />
<?php endforeach; ?>
然后,一个foreach循环,取出所有用户和他们的复选框:
<?php foreach($users1 as $user):?>
<?php $checked = ($user->id == $shared_user_emails[set_default($shared_user->user_id)])? 'checked' : '' ; ?>
<label class="checkbox"><input type="checkbox" class="template_permissions" data-id="<?= $user->id?>" <?= $checked ?> /><?= $user->email ?></label>
你会看到在上面的每一个foreach中,我做了:
$user->id == $shared_user_emails[set_default($shared_user->user_id)])? 'checked' : '' ;
也就是说,如果共享用户ID等于用户ID,则对输入应用"checked"。这工作得很好,但只适用于一个用户,而不是遍历所有用户。
一切都是共享和正常工作,但是只有一个复选框将被选中,而不是所有的用户被选中,如果他们已经共享。
我认为我需要以某种方式将这两个循环结合起来,它显然只拉入最后一个被共享的人并勾选他们的复选框。
我试着把这两个循环结合起来已经有一天了,有人能帮帮忙吗?谢谢!
编辑
下面是如何从我的控制器中创建变量:
load_model('user_model', 'users');
$users = $this->users->users_by_company($company_id);
load_model('template_user_model', 'template_users');
$shared_users = $this->template_users->get_many_by('template_id', $template_id);
$this->data['shared_user'] = $shared_users;
$this->data['shared_user_emails'] = $this->user_model->dropdown('id');
不能100%确定set_default做什么,但这应该不是一个问题,当试图解决这个…
编辑
这是包含在print_r变量中的内容:
使用:<p>shared_user_emails:</p>
<?php print_r($shared_user_emails); ?>
<p>shared_user:</p>
<?php print_r($shared_user); ?>
<p>User:</p>
<?php print_r($user); ?>
生产:shared_user_emails:
Array (
[2] => 2
[3] => 3
[17] => 17
[19] => 19
)
shared_user:
stdClass Object (
[template_id] => 58
[user_id] => 3
)
用户:stdClass Object (
[id] => 19
[name] => Steve
[title] =>
[phone] =>
[ext] =>
[email] => mike+whatev@fake.com
[active] => 1
[group_id] => 3
[group] => users
)
和:$shared_user_emails[set_default($shared_user->user_id)]
打印出"3"
你很可能在你的文章中打错了。
在你的控制器中你这样做:
$shared_users = $this->template_users->get_many_by('template_id', $template_id);
$this->data['shared_user'] = $shared_users;
请注意,变量$shared_users
没有在此名称下分配给模板数据,但最后一个s
丢失了。
在你的模板中:
<?php foreach($shared_user as $shared_user):?>
变量$shared_user
使用了两次!这将用列表中的当前用户("as"后面的右侧变量)覆盖控制器中的用户列表(左侧变量)。在这个循环中,这是可以的,因为foreach在内部创建了数组的副本,以避免这里的混乱,但是在循环结束后,你不能访问列表,因为列表中的最后一个用户覆盖了列表。
不要在foreach循环中两次使用同一个变量。它总是看起来像一个错误,即使它可能不是一个错误。因为你在抱怨东西不工作,这是一个错误,它从你的控制器开始。没有理由不将列表命名为"users",将单个用户命名为"user"。
你想遍历所有共享用户。对于其中的每一个,您都希望输出:
<?= $shared_user_emails[set_default($shared_user->user_id)]; ?><br />
<label class="checkbox"><input type="checkbox" class="template_permissions" data-id="<?= $user->id?>" <?= $checked ?> /><?= $user->email ?></label>
理论上这将导致类似这样的HTML:
3<br />
<label class="checkbox"><input type="checkbox" class="template_permissions" data-id="19" checked />mike+whatev@fake.com</label>
但只有当这个"mike"在共享用户列表中,否则该复选框将不被选中。
我认为你只需要将第一个循环扩展到第二个循环之外。目前它们没有重叠,所以除了由于打印错误而错误地使用第一个foreach循环外,您还一个接一个地执行了两个循环。
但是你真的不需要第二个内循环。此时您的问题是:users数组是否包含共享用户id?有一个PHP函数:in_array()
。这使你想要的更清楚。
<?php $checked = (in_array($shared_user_emails[set_default($shared_user->user_id)], $user->id))? 'checked' : '' ; ?>