【问题标题】:HTML Checkbox and Single Input in FormHTML 复选框和表单中的单个输入
【发布时间】:2017-03-05 04:55:10
【问题描述】:

我正在使用基于LaravelOctoberCMS

我使用Twig 使用循环生成一个简单的图库。

您可以删除单个图像,或使用复选框选择,然后单击任意删除按钮提交。

{{ record.name }}是数据库中的图片名称。

用 Twig 形成表格

<form method="POST" action="/">

    <input type="hidden" name="_handler" value="onDelete" >

    <!-- Gallery -->
    {% for record in records %}

        <!-- Image -->
        <img src="images/{{ record.name }}.jpg">

        <!-- Single Image Name -->
        <input type="hidden" name="single" value="{{ record.name }}" />
        <!-- Checkbox Image Name -->
        <input type="checkbox" name="queued[]" value="{{ record.name }}">
        <!-- Delete -->
        <button type="submit" name="submit" value="delete">Delete</button>

    {% endfor %}

</form>

PHP

function onDelete() {

    $path = '/var/www/mysite/images/';
    $single = $_POST['single'];
    $checkboxes = '';
    $checkboxes = isset($_POST['queued']) ? $_POST['queued'] : array();

    # Checkbox Delete
    if(isset($_POST['queued'])) {
        # Delete each in queued array
        foreach($checkboxes as $name) { 
            File::delete("$path$name.jpg");
        }
    }

    # Single Delete
    else {
        File::delete("$path$single.jpg");
    }

}

问题

渲染的 HTML

<form>
    <img src="images/image1.jpg">
    <input type="hidden" name="single" value="image1" >
    <input type="checkbox" name="queued[]" value="image1" />

    <img src="images/image2.jpg">
    <input type="hidden" name="single" value="image2" >
    <input type="checkbox" name="queued[]" value="image2" />

    <img src="images/image3.jpg">
    <input type="hidden" name="single" value="image3" >
    <input type="checkbox" name="queued[]" value="image3" />
</form>

Checkbox Delete 运行 for 循环并有效。

但单次删除总是删除表单上的最后一个name="single"image3

我尝试将$_POST['single'] 设置为数组name="single[]",但它删除了所有 个文件,因为它们不是type="checkbox",而是始终为isset 并添加到数组中。

我该如何解决这个问题并在同一个表单中使用复选框删除和单次删除?

【问题讨论】:

    标签: php html checkbox twig


    【解决方案1】:

    你的用户体验对我来说不是很直观。添加一个名为“删除检查的图像”的按钮会更好。 无论如何,您可以设置提交的动态值

    {% for record in records %}
        <!-- [...] -->
        <button type="submit" name="submit" value="{{ record.name }}">Delete</button>
    {% endfor %}
    

    然后

    function onDelete() {
    
        $checkboxes = isset($_POST['queued']) ? $_POST['queued'] : array();
    
        // Checkbox Delete
        if(isset($_POST['queued'])) {
            // Delete each in queued array
            foreach($checkboxes as $name) { 
                File::delete("$path$name.jpg");
            }
        }
    
        // Single Delete
        else {
    
            $nameFile = $_POST['submit']; // <-----
    
            File::delete("$path$nameFile.jpg");
        }
    
    }
    

    【讨论】:

    • 当您将属性类型与名称混为一谈时不起作用。此外,您不需要使名称动态,因为单击按钮的值将设置为帖子值
    • 感谢您帮助我解决这个问题,我花了很多时间和解决方案。它现在通过复选框和单个按钮删除。我还添加了一个 Delete Checked 按钮。
    • @DarkBee 它工作正常,我已经测试了好几次。虽然你说 type="submit_{{ record.name }}" 应该只是 type="submit"?
    • 是的,这就是我要说的。没有像submit_blabla 这样的类型,只找到有效类型here
    • 是的,抱歉,谢谢@DarkBee,我写的很匆忙
    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多