【问题标题】:How to get a $_POST request from view module?如何从视图模块获取 $_POST 请求?
【发布时间】:2015-07-12 07:39:47
【问题描述】:

我想从视图模块中的表格中获取复选框,但我无法让它工作。这是表格:

     <form action="" method="post">
     <TABLE id="dt_basic" class="table table-striped table-bordered table-hover dataTable">
        <THEAD>
          <TR>
            <TH></TH>
            <TH>ID</TH>
            <TH>Client</TH>
            <TH>User</TH>
            <TH>Role</TH>
            <TH>Projects</TH>
          </TR>
        </THEAD>
        <TBODY>
<?php
/* @var $item Admin\Model\User */
foreach ($this->users as $item) {
    ?>
    <TR>
        <TD class='admin'><input type="checkbox" name="users[<?php echo $item->id; ?>]" value=<?php echo $item->id; ?> checked/></TD>
        <TD class='admin c'><?= $item->id ?></TD>
        <TD class='admin'><?= $item->getClientObject() ?></TD>
        <TD class='admin'>
            <img src="<?= $item->getAvatarPath() ?>" alt="me" class="online avatar"/>
            <a title='details'
               href='/admin/user/detail/id/<?= $item->id ?>'><?= $item->name . " " . $item->surname ?> </a>
        </TD>
        <TD class='admin'><?= $item->getRoleObject() ?></TD>
        <TD class='admin'>
            <a title='projects' class='btn btn-default btn-sm'
               href='/admin/user/project/id/<?= $item->id ?>'><i
                    class='fa fa-icon-fix fa-briefcase'></i></a>
            <?
            foreach ($this->projects[$item->id] as $i => $project) {
                echo $project->getName();
                if ($i != sizeof($this->projects[$item->id]) - 1)
                    echo " • ";
            }
            ?>
        </TD>
    </TR>
<?php
}
?>
        </TBODY>
      </TABLE>
    </form>

整个.phtml : http://pastebin.com/8paJZgjb

我想获取users[] 数组并在控制器中使用它的元素,但我找不到获取它的方法。到目前为止,这是我尝试过的:

           if (!empty($_POST["users"])) {
            foreach (($_POST["users"]) as $selectedUsers) {
                $users = $this->getUserTable()->fetchAll(false, "id=" .  $selectedUsers);
            }
        } else {
            $this->cache->error = "Please choose at least one user.";
            return $this->view;
        }

全功能:http://pastebin.com/pE4afemx

...但显然它是空的。 var_dump 显示邮件表单中的元素,但没有用户的迹象:

array (size=2)
'subject' => string 'hello' (length=5)
'message' => string 'message' (length=7)

有什么建议吗?

【问题讨论】:

  • 你应该使用$this-&gt;getRequest()-&gt;getPost('users');,或者如果你使用的是zend表单,你应该使用$form-&gt;getValue('users');。 $_POST 应该可以工作...您是否尝试过像 var_dump($_POST); 这样的简单调试?
  • 我按照你说的做了,现在并没有说它是空的,但是它也没有将它们显示为 $_POSTS,很奇怪。是不是因为我没有把控制器作为表单的动作?
  • 请编辑您的问题,以包含您在提交表单后从控制器获得的var_dump($_POST);exit; 的内容。空白操作不是问题。
  • @TimFountain 我按照你的要求做了
  • 好的,如果您可以编辑您的问题以包含整个表单,这可能会有所帮助,因为问题不在您发布的代码中。您问题中的表单没有“主题”或“消息”字段,但它们就是您所得到的。

标签: php html forms zend-framework zend-framework2


【解决方案1】:

根据您的 pastebin 链接中的代码,您在页面上有 两个 表单。一个从第 16 行开始,包含您的用户复选框,然后在第 61 行结束。然后第二个从第 77 行开始,在第 79 行结束。我猜这是由第 86 行的 javascript 提交按钮提交的.

由于您要提交第二个表单,因此只会发布其数据。如果您希望提交所有内容,则所有内容都需要采用一种形式。理想情况下,您会将用户复选框移出此模板,它们作为$form 的一部分输出,但以这种方式将它们保留在表格布局中可能会很棘手,因此更简单的解决方法是移动包含的表格用户复选框,因此它在echo $this-&gt;formCollection($form); 之后输出,但在该表单以echo $this-&gt;form()-&gt;closeTag(); 结束之前。去掉第 16 行和第 61 行的表单标签,因为您只需要一个表单。

编辑:要解决其他问题,请尝试将控制器代码更改为:

if (!empty($_POST["users"])) {
    $userIDs = array();
    foreach ($_POST["users"] as $selectedUser) {
        if (is_numeric($selectedUser) && $selectedUser > 0) {
            $userIDs[] = $selectedUser;
        }
    }

    if (count($userIDs) > 0) {
        $users = $this->getUserTable()->fetchAll(false, "id IN (".implode(', ', $userIDs).")");
    }

【讨论】:

  • 谢谢!那行得通!但现在它只将消息发送给最后选择的人......
  • 您的控制器代码循环通过提交的用户,并为每个用户从数据库加载它并将其存储在$users。所以每次迭代都会覆盖前一个用户。您可以将 fetchAll() 函数的代码添加到您的问题中吗?
  • 查看我的答案的编辑。这不是真正的“正确”方式,您的 fetchAll() 函数确实需要修改,但它应该可以快速修复。
  • 它现在可以完美运行了,感谢您所做的一切!神速! :)
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多