Как различить действие нескольких кнопок в контроллере для платформы phalcon? пример; отправить и обновить и очистить кнопку - PullRequest
2 голосов
/ 13 марта 2019

<?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 шаг за шагом.Theres не много документации по этой конкретной проблеме для меня.я думаю, это как-то связано со мной, не понимая Фалкона полностью.если бы кто-то мог помочь мне, я был бы очень признателен.

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

Вам нужно дать названия кнопок отправки.

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

Когда форма отправляется с кнопкой отправки, ее имя: значение пары отправляется вместе с формой.Вам нужно дать ему имя, чтобы найти его в массиве $ _POST.Также, пожалуйста, избегайте названия «submit» для кнопок отправки, поскольку это может создать проблемы для метода submit () в JavaScript.Вместо того, чтобы проверять и $ _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 , это может быть сокращено с помощью оператора Silence следующим образом:

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, я бы посоветовал поиграть с более простыми примерами, такими как invoice и vökuró , которые появляются нараздел "учебники" следующей страницы:
https://docs.phalconphp.com/3.4/en

0 голосов
/ 20 марта 2019

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

<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";
    }
}
0 голосов
/ 13 марта 2019

солютонов много, и мой рефакторинг вашего кода будет:

  1. Не используйте несколько кнопок Submit в одной форме. Используйте простые формы и IF-logic при отображении формы
  2. полное разделение API и пользовательского интерфейса (кнопки формы имеют обработчики JS, а Phalcon - просто API-интерфейс)
  3. ваш пример, но маршрут / отправка для различных действий (if _POST['submit'] && _POST['somethingelse']), более общий
...