如何发布带有条件的禁用/只读输入字段?

Posted

技术标签:

【中文标题】如何发布带有条件的禁用/只读输入字段?【英文标题】:How to POST input field that are disabled/readonly with condition? 【发布时间】:2019-11-21 07:27:42 【问题描述】:

如果尚未按下按钮,我正在尝试使我的输入字段禁用或只读,但在我添加了一个使其禁用或只读的条件后,我在将其发布/提交到数据库时遇到问题

    <form action=" route('amber.timestone.home.start', $task->id) " method="POST" class="align-center">
                                csrf_field()
                            <td>
                                <input class="my-2" type="text" name="ref" value=" $task->ref "
                                    @if(empty($task->start))
                                        readonly
                                    @endif
                                >


public function startTask($id)
    
        $user = Task::find($id);
        $user->start = Carbon::now();
        $user->save();
        return back();
    
public function endTask($id, Request $request)
    
        $user = Task::find($id);
        $user->end = Carbon::now();
        $start = Carbon::parse($user->start);
        $end = Carbon::parse($user->end);
$user->ref = request('ref');
        $user->remarks = request('remarks');
        $user->campaign = request('campaign');
        $user->type = request('type');
            $hours = $end->diffInHours($start);
            $minutes = $end->diffInMinutes($start);
            $seconds = $end->diffInSeconds($start);
            $user->duration = $hours . ':' . $minutes . ':' . $seconds;
            $user->update();
            return back();
        

我尝试添加与只读条件仍然无法工作的隐藏名称相同的隐藏

【问题讨论】:

你的问题到底是什么? 你不能有两个同名的字段,不是这样的 - php 将用最后一个覆盖在相同参数名称下接收到的所有值,除非你使用 square名称中的括号,例如name="ref[]"(或name="ref[0]"/name="ref[foobar]",如果您想预先指定索引) - 那么您将在$_POST['ref']中获得一个array > 顺便说一句,将字段标记为只读不会阻止用户操作发送的值,例如使用他们的开发工具。因此,如果您需要不惜一切代价接收此值不变,那么您应该将其保留在会话中。 【参考方案1】:

禁用的字段不会随请求一起发布,但是您可以添加只读属性。

您可以做的另一件事是为 UI 目的禁用该字段,并在下方添加一个具有相同名称和值的隐藏输入。

【讨论】:

【参考方案2】:

html 是一种标记语言,它突出数据语义,而不是数据的显示方式(例如,使用&lt;strong&gt; 使文本变为粗体是完全错误的方式)。因此,您应该使用 CSS 自定义的文本容器(主要是&lt;div&gt;&lt;span&gt;)来封装它并且顺便说一句是只读的。然后,就像 Adam abdul shakoor 建议的那样,您可以使用具有相同值的隐藏输入。 您还应该考虑使用 VueJS(已经打包在 Laravel 中),它的数据驱动方法使得保持容器和输入内容同步的事情变得微不足道。

【讨论】:

【参考方案3】:

你怎么看?如果您有需要发回的值,请将其放在隐藏的输入字段中。所以你可以使用 css 创建一个假字段,也许。但是如果你不想发送任何数据,只是为了显示它,你可能根本不包括隐藏的输入字段的值。

【讨论】:

以上是关于如何发布带有条件的禁用/只读输入字段?的主要内容,如果未能解决你的问题,请参考以下文章

使文本输入字段看起来被禁用,但只读

带有条件禁用控件的内联编辑

如何使用JavaScript只读输入字段?

如何设置表单元素的只读和禁用属性

HTML 输入只读安全风险?

有条件地在 Angular 2 或 4 中将输入字段设为只读:建议 + 最佳/采用哪种方式