0

关于我的功能的一点背景:

我们已经构建了一个应用程序,允许您创建和共享某些内容,最后一步是与其他用户共享它。

我有一个打印出所有用户的视图和每个名称旁边的复选框。使用 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,则对输入应用“检查”。这很好用,但仅适用于一个用户,而不是循环遍历所有用户。

一切都在共享并正常工作,但是只会选中一个复选框,而不是检查所有用户是否已共享。

我相信我需要以某种方式将这两个循环结合起来,显然只是拉入最后一个共享的人并检查他们的框。

我已经尝试将这两个循环组合大约一天了,有人可以帮忙吗?

谢谢!

编辑

以下是从我的控制器中创建变量的方式:

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

出品:

共享用户电子邮件:

Array (
    [2] => 2
    [3] => 3
    [17] => 17
    [19] => 19
)

共享用户:

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”

4

1 回答 1

1

您很可能在 foreach 中打错了字。

在您的控制器中,您可以这样做:

$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 循环中使用相同的变量两次。它总是看起来像是一个错误,即使它可能不是一个。由于您抱怨某些东西不起作用,因此这是一个错误,它从您的控制器中开始。没有理由不将列表命名为“用户”,将单个用户命名为“用户”。

所以你想遍历所有共享用户。对于您要输出的每一个:

<?= $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>

但前提是这个“麦克”在共享用户列表中,否则复选框不会被选中。

我认为您只需要将第一个循环扩展到第二个循环之外。目前它们不重叠,因此除了由于拼写错误而错误地使用了第一个 foreach 循环之外,您还一个接一个地执行了两个循环。

但是你真的不需要第二个内循环。此时您的问题是: users 数组是否包含共享用户 ID?为此有一个 PHP 函数:in_array(). 这让你更清楚你想要什么。

<?php $checked = (in_array($shared_user_emails[set_default($shared_user->user_id)], $user->id))? 'checked' : '' ; ?>
于 2013-05-02T18:45:56.000 回答