如何区分 phalcon 框架控制器中的多个按钮操作?例子;提交并更新和清除按钮

how to differentiate multiple button action in the controller for phalcon framework? example; submit and update and clear button

<?php echo $this->tag->form("index/index"); ?>
    <label for="nameInput">name</label>
    <?php echo $this->tag->textField("nameInput"); ?>
    <label for="typeInput">type</label>
    <?php echo $this->tag->textField("typeInput"); ?>
    
    <input type="submit" value="submit">
    <input type="submit" value="update">
</form>

在控制器中..类似这样的东西..

if (isset($_POST['update'])) {
    //example
    echo 'update';
}
elseif (isset($_POST['submit'])) {
    //example
    echo 'submit';
}

我仍在尝试逐步学习 Phalcon。对我来说,关于这个特定问题的文档并不多。我认为这与我没有完全理解 Phalcon 有关。如果有人可以帮助指导我,将不胜感激。

解决方案很多,我对你的代码重构会是:

  1. 不要在同一个表单上使用多个 Submit 按钮。在渲染表单时使用简单表单和 IF-logic
  2. 完成 API 和 UI 分离(表单按钮有 JS 处理程序,Phalcon 只是 API 后端)
  3. 您的示例,但 route/dispatch 不同的操作 (if _POST['submit'] && _POST['somethingelse']),更通用

您需要为提交按钮命名。

<input type="submit" name="submit" value="submit">
<input type="submit" name="update" value="update">

当使用提交按钮提交表单时,其 name:value 对随表单一起发送。您需要为其命名,以便在 $_POST 数组中找到它。另外,请避免将名称 "submit" 用于提交按钮,因为它可能会给 JavaScript 的 submit() 方法带来问题。不要同时检查 $_POST['update'] 和 $_POST['submit'],您应该为两个提交按钮使用相同的名称,并在后端用它们的值区分它们,如下所示:

<input type="submit" name="act" value="submit">
<input type="submit" name="act" value="update">

然后你会检查

if (isset($_POST['act']) && $_POST['act'] === 'update') {
    echo 'update';
}
elseif (isset($_POST['act']) && $_POST['act'] === 'submit') {
    echo 'submit';
}

假设您没有像这样使用 scream, this can actually be shortened with the silence operator

if (@$_POST['act'] === 'update') {
    echo 'update';
}
elseif (@$_POST['act'] === 'submit') {
    echo 'submit';
}

如果您需要提交按钮显示一个值并提交另一个值,您可以像这样使用按钮元素:

<button type="submit" name="act" value="submit">New Entry</button>
<button type="submit" name="act" value="update">Edit Entry</button>

您也可以使用隐藏元素来做到这一点,并使用多种形式。

由于您是 Phalcon 的新手,我建议您尝试一些更简单的示例,例如出现在下页 "tutorials" 部分的 invoice and vökuró
https://docs.phalconphp.com/3.4/en

Phalcon 提供了一个可从控制器访问的 Phalcon\Http\Request 对象。
强烈推荐使用。

这是一个带有 POST 请求的简单示例:

<?php

use Phalcon\Mvc\Controller;

class MyController extends Controller
{
    public function processFormAction()
    {
        // Retrieve value of <input name="foo" />
        $form_field = $this->request->getPost('foo');

        if ($form_field === "bar") {
            echo "Foo = bar";
        } else {
            echo "Foo != bar";
        }

        // ...
    }
}

在您的情况下,如果您希望表单中的两个提交按钮具有不同的功能,那么您有多种解决方案:

第一个解决方案

使用 JavaScript 提交表单并定义两条路线,一条用于保存,另一条用于更新。

<input type="submit" name="saveBtn" value="Click me">
<input type="submit" name="updateBtn" value="Click me">

绑定点击每个按钮,根据需要的动作设置路由url。

$(function() {
    $('input[name="saveBtn"]').on('click', function(event) {
        event.preventDefault();

        form.attr('action', 'url-to-save');
        form.submit();
    });

    $('input[name="updateBtn"]').on('click', function(event) {
        event.preventDefault();

        form.attr('action', 'url-to-update');
        form.submit();
    });
});

在你的控制器中,你有两种方法

public function saveAction() {
    // Do save
}

public function updateAction() {
    // Do update
}

第二种解法

给每个人一个名字,点击的人将像任何其他输入一样被发送

<input type="submit" name="saveBtn" value="Click me">
<input type="submit" name="updateBtn" value="Click me">

在你的控制器中:

$submitSave = $this->request->getPost('saveBtn', 'string', false);
$submitUpdate = $this->request->getPost('updateBtn', 'string', false);

if ($submitSave) {
    echo "This is a save";
} elseif ($submitUpdate) {
    echo "This is an update";
}

第三种解法

将名称定义为数组

<input type="submit" name="submit[save]" value="Click me">
<input type="submit" name="submit[update]" value="Click me">

在你的控制器中:

$submit = $this->request->getPost('submit');

if (!empty($submit)) {
    if (!empty($submit['save'])) {
        echo "This is a save";
    } elseif (!empty($submit['update'])) {
        echo "This is an update";
    }
}