如何从Laravel中的HTML表单填充字段?

时间:2018-08-22 20:33:11

标签: php laravel forms laravel-5.4 contact-form

我正在构建一个表单,该表单中我要填充表单中的字段(我将其命名为posting.blade.php

我为此使用的控制器是:

public function store(Request $request)
{
    $this->validate($request, [
    'name' => 'required',
    'email' => 'required|email',
    'number' => 'required',
    'city' => 'required',
    'post' => 'required'
    ]);

    Mail::send('emails.posting-message', [
    'msg'=> $request->message
    ], function($mail) use($request) {
        $mail->from($request->email, $request->name);
        $mail->to('helloworld@gmail.com')->subject('Contact Message');
    });
    return redirect()->back()->with('flash_message', 'Thank you for your message');
}


问题陈述:

当前控制器未返回任何内容,如'msg'=> $request->message行中所示,validate中没有消息。但是,如果我使用

'msg'=> $request->name(返回名称)

我想知道我应该在控制器中进行哪些更改,以便它返回验证中存在的每个字段。

我尝试过这个,但是它只返回最后一个值post。

       'msg'=> $request->name,
       'msg'=> $request->email,
       'msg'=> $request->number,
       'msg'=> $request->city,
       'msg'=> $request->post

8 个答案:

答案 0 :(得分:9)

首先,您需要将->withInput()添加到您的重定向中:

return redirect()->back()->with('flash_message', 'Thank you for your message')->withInput();

这会将所有提交的表单字段刷新到会话中。

重定向后,例如,要获取名称为title的表单字段的值,可以使用old()帮助程序,例如:

<input type="text" name="title" value="{{ old('title') }}">

您还可以将第二个参数传递给助手:

<input type="text" name="title" value="{{ old('title', $post->title) }}">

您明白了。

答案 1 :(得分:2)

听起来,您想要做的是从表单提交中获取所有输入,并将它们传递到名为posting-message的Laravel刀片模板中,该模板用于构建电子邮件。

如果我的理解是正确的,那么您就差不多到了-这只需要您将更多变量传递到您的电子邮件刀片模板中。目前,您只是通过了一个名为 msg 的变量。

因此,控制器的“邮件”部分变为:

Mail::send('emails.posting-message', [
    'name'=> $request->name,
    'email'=> $request->email,
    'number'=> $request->number,
    'city'=> $request->city,
    'post'=> $request->post
], function($mail) use($request) {
    $mail->from($request->email, $request->name);
    $mail->to('helloworld@gmail.com')->subject('Contact Message');
});

然后,在您的电子邮件刀片模板中,您可以访问{{ $name }}{{ $email }}等变量。

ps.s。 如果您想获取所有输入并将它们一次性放入控制器中的数组中,则Laravel provides some ways会批量获取输入,例如:

$allInputs = $request->all();

pps 考虑对每个表单输入执行validation而不只是必需,以确保用户提供的数据符合您的期望,并且不是恶意或不正确的。

答案 2 :(得分:2)

首先,您需要检查html中的字段名称,以确保其确切信息没有空格或拼写错误。

第二件事使用以下命令检查所有帖子字段 $request->all();并查看是否在帖子数组中获得“邮件”索引。

就像没有在验证中添加该字段一样,因此不会在POST中得到它。

但是,当您使用联系表时,应保持“消息”字段为必填字段,并应在验证中添加它。这样,您将始终在消息字段中获得一些数据。

您能否也将HTML张贴在问题中,以便每个人都对它有更多的了解。

对于将已经获取的数据发送到邮件模板的其他问题,可以使用以下方法

$msg = array('name' => $request->name,'email' => $request->email,'number' => $request->number,'city' => $request->city,'post' => $request->post,'message'=>$request->message);

您可以使用像

这样的数组
Mail::send('emails.posting-message', [$msg    
    ], function($mail) use($request) {
        $mail->from($request->email, $request->name);
        $mail->to('helloworld@gmail.com')->subject('Contact Message');
    });

然后,您可以轻松访问邮件模板中的所有变量以使其动态化。

答案 3 :(得分:0)

您提供的摘录如下:

   'msg'=> $request->name,
   'msg'=> $request->email,
   'msg'=> $request->number,
   'msg'=> $request->city,
   'msg'=> $request->post

表示阵列键msg被覆盖4次。

您将希望采用以下方法:

    $msg['name'] = $request->name;
    $msg['email'] = $request->email;
    $msg['number'] = $request->number;
    $msg['city'] = $request->city;
    $msg['post'] = $request->post;

答案 4 :(得分:0)

首先,您不需要将back方法与redirect一起使用,back()函数将始终重定向用户。

return back()->with('key','Val');

查看以下内容:Old Input

就像其他人所说的那样,要根据文件名使用withInput()函数将查询字符串/输入发送到cookie,它将刷新所有当前输入:

return back()->with('key','Val')->withInput();

如果您已经看到Laravel的默认注册和登录刀片,那么您就会知道可以使用old()帮助程序来基于cookie和会话获取以前的值。


   'msg'=> $request->name,
   'msg'=> $request->email,
   'msg'=> $request->number,
   'msg'=> $request->city,
   'msg'=> $request->post

有一些方法可以给数组赋值,但是请记住不要这样重写它们!

您可以使用自动索引方法,如果使用$msg[] = $request->bar,它将索引从0到您的作业长度的值

$data[] = $request->val1;
$data[] = $request->val2;
...

但是您也可以像这样确定每个元素的键:

$data['name'] = $request->name;
$data['email'] = $request->email;
...

毕竟,如果要发送所有输入作为第二个参数,只需使用$request->all()

Mail::send('emails.posting-message', $request->all(), function($mail) use($request) {
        $mail->from($request->email, $request->name);
        $mail->to('helloworld@gmail.com')->subject('Contact Message');
});

答案 5 :(得分:0)

前段时间我遇到了类似的问题,经过几次尝试,我将字段名从SELECT Users.Name, (SELECT TOP 1 Payment FROM UserPayments WHERE UserID = Users.UserID AND DateTime Between #01/01/2018# And #04/23/2018# ORDER BY DateTime DESC) / (SELECT TOP 1 Payment FROM UserPayments WHERE UserID = Users.UserID AND DateTime Between #01/01/2018# And #04/23/2018# ORDER BY DateTime ASC) -1 AS PercentChange FROM Users; 更改为message,这是解决方案。

我怀疑comments可能是框架在会话中使用的变量名或类似名称。

希望对您有帮助。

答案 6 :(得分:0)

您需要在返回的响应中添加sns.jointplot(leagueWinners_season['Wins'], leagueWinners_season['Goals'], kind = 'reg', color = 'b') plt.title('Season Winners Goal and Win Regression', loc = 'right', fontsize = 16) plt.show() 方法为

withInput()

要在下一个请求中保留来自一个请求的输入,您需要使用return redirect()->back()->with('flash_message', 'Thank you for your message')->withInput(); 帮助程序。在https://laravel.com/docs/5.6/requests#old-input

处查看文档
old()

Laravel将自动将用户重定向回其先前的位置。此外,所有验证错误都会自动刷新到会话中。请在https://laravel.com/docs/5.6/validation#quick-displaying-the-validation-errors中查看文档。要显示验证错误消息,您可以这样使用

<input type="text" name="title" value="{{ old('username') }}">

或更具体地说

@foreach ($errors->all() as $error)
    <li>{{ $error }}</li>
@endforeach

答案 7 :(得分:0)

据我了解,您在问如何将输入内容发送到邮件模板。

尝试一下

public function store(Request $request)
{
    $this->validate($request, [
        'name' => 'required',
        'email' => 'required|email',
        'number' => 'required',
        'city' => 'required',
        'post' => 'required'
    ]);

    Mail::send('emails.posting-message', $request->all(), function($mail) use($request) {
            $mail->from($request->email, $request->name);
            $mail->to('helloworld@gmail.com')->subject('Contact Message');
    });
    return redirect()->back()->with('flash_message', 'Thank you for your message');
}

现在在 emails / posting-message.blade.php 中,您将可以访问$ name,$ email,$ number,$ city,$ post和您在请求中发送的任何其他输入


现在是否要恢复验证错误。用这个

$validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
]);
if ($validator->fails()) {
    //you can get the errors with $validator->errors. and redirect/mail as you want.
}
//here the inputs are valid.