首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Easypost.com集成--发送表单

Easypost.com集成--发送表单
EN

Stack Overflow用户
提问于 2021-08-04 13:15:22
回答 3查看 113关注 0票数 0

我在Laravel还是个初学者。我理解CRUD,OOP,创建了一些小应用程序。但现在我需要将easypost.com应用程序接口集成到Laravel项目中。现在我想创建一个简单的邮资计算器。我有一个页面,其中表格在底部和下面的表格,我想显示所有邮资选项与费率等。现在我有PostageCalculator控制器和the到索引函数这:

代码语言:javascript
复制
public function index()
{
   
    \EasyPost\EasyPost::setApiKey(env('EASYPOST_API'));

    $shipment = \EasyPost\Shipment::create(array(
        "to_address" => array(
          'name' => 'Dr. Steve Brule',
          'street1' => '3993 Glen Meadow Dr',
          'city' => 'Norcross',
          'state' => 'GA',
          'zip' => '30092',
          'country' => 'US',
          'phone' => '3331114444',
          'email' => 'dr_steve_brule@gmail.com'
        ),
        "from_address" => array(
          'name' => 'EasyPost',
          'street1' => '417 Montgomery Street',
          'street2' => '5th Floor',
          'city' => 'Brno',
          'state' => 'CZ',
          'zip' => '60200',
          'country' => 'CZ',
          'phone' => '3331114444',
          'email' => 'support@easypost.com'
        ),
        "parcel" => array(
          "length" => 1,
          "width" => 1,
          "height" => 1,
          "weight" => 352.74
        )
      ));

      
    return view ('pages.rates', [
        'shipment' => $shipment
        
     ]);
        
  
}

因此,我将$shipment变量发送到rates.blade.php视图,并使用foreach来显示我需要的所有信息。但我也有一个表单,我想在其中选择例如发货和交付国家,并允许用户键入他们的重量,尺寸等,所以我创建了这个表单

代码语言:javascript
复制
     <form action="/rates" method="post">
        @csrf
        @method('post')
        
    {{-- Zeme odeslani --}}
      <div class="container">
        <div class="row">
        <div class="col">
        <div class="form-group">
        <label>Země odeslání</label>
        @error('text')
        <div class="alert alert-danger" role="alert">{{$message}}
          </div>
        @enderror
      <select class="form-select" aria-label="Default select example">
        <option selected>Vyberte zemi</option>
        <option value="CZ" name="CZ">Česká republika</option>
        <option value="US" name="US">USA</option>
        <option value="SK" name="SK">Slovensko</option>
      </select>
    </div>
</div>

<div class="col">
    <div class="form-group">
    <label>Země doručení</label>
    @error('text')
    <div class="alert alert-danger" role="alert">{{$message}}
      </div>
    @enderror
  <select class="form-select" aria-label="Default select example">
    <option selected>Vyberte zemi</option>
    <option value="CZ" name="CZ">Česká republika</option>
    <option value="US" name="US">USA</option>
    <option value="SK" name="SK">Slovensko</option>
  </select>
</div>
</div>
</div>
</div>

<div class="container">
    <div class="form-group">
        <label>Rozměry:</label>
        @error('text')
        <div class="alert alert-danger" role="alert">{{$message}}
          </div>
        @enderror
    <div class="row">
        
      <div class="col"><input type="text" class="form-control" name="weight" placeholder="Váha (kg)" ></div>
      <div class="col"><input type="text" class="form-control" name="width" placeholder="Šířka (cm)" ></div>
      <div class="col"><input type="text" class="form-control" name="height" placeholder="Výška (cm)" ></div>
      <div class="col"><input type="text" class="form-control" name="`lenght`" placeholder="Délka (cm)" ></div>
    </div>
<br>
      < button type="submit" class="btn btn-primary">Spočítat cenu</button>
    </form>
    </div>

和带有type=“提交”的按钮。我的问题是,我知道我需要以某种方式使用我的控制器的store ()函数来从表单中获取请求,但是,我不知道怎么做。

我想从索引()函数获取$shipment请求,但我在刀片上使用了foreach,它不知道变量$shipment。而且我也不知道如何使用2个选项表单。如果我选择了

代码语言:javascript
复制
<select class="form-select" aria-label="Default select example">
        <option selected>Vyberte zemi</option>
        <option value="CZ" name="CZ">Česká republika</option>
        <option value="US" name="US">USA</option>
        <option value="SK" name="SK">Slovensko</option>
      </select>

一个选择表单用于发货地址发件人,第二个表单用于发货地址。如何从表单中获取请求,并在同一个包计算器页面上显示来自EasyPost的结果?尝试了一些类似的东西:

代码语言:javascript
复制
'country' => $request->input['formname'],

但没那么走运。此外,我不知道如何为发货人和收货人选择表单创建和分隔值。你能给点建议吗?非常感谢,这对我来说是很新鲜的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-04 14:04:42

为了满足您的需求,您必须将此过程视为一个应用程序生命周期。

基本上,你想在页面上显示一个表单,用户需要填写并发布它,你将使用输入来准备你的地址参数并将它们提供给Easypost api,当你从api获得响应时,你将把它传递给一个视图以在屏幕上显示结果。

当我检查您的表单刀片时,您的选择字段上没有任何name属性。你需要这样的东西;

代码语言:javascript
复制
<select name="from_country" class="form-select" aria-label="Default select example">
    <option selected>Vyberte zemi</option>
    <option value="CZ" name="CZ">Česká republika</option>
    <option value="US" name="US">USA</option>
    <option value="SK" name="SK">Slovensko</option>
</select>

和另一种;

代码语言:javascript
复制
<select name="to_country" class="form-select" aria-label="Default select example">
    <option selected>Vyberte zemi</option>
    <option value="CZ" name="CZ">Česká republika</option>
    <option value="US" name="US">USA</option>
    <option value="SK" name="SK">Slovensko</option>
</select>

现在您可以从请求中选择访问此字段的选项;

代码语言:javascript
复制
public function show_result(Request $request)
{
    $from_country = $request->from_country;
    // OR
    $from_country = $request->input('from_country');
}

您可以在此处找到$request->input(...)的其他用法示例:https://laravel.com/docs/8.x/requests#retrieving-an-input-value

因此,您需要创建2条路由;1条用于显示表单,1条用于流程表单和显示结果。

routes/web.php文件中;

代码语言:javascript
复制
Route::get('form', [\App\Http\Controllers\PostageCalculator::class, 'form']); // to show form
Route::post('result', [\App\Http\Controllers\PostageCalculator::class, 'result']); // to show results

app/Http/Controllers/PostageCalculator.php文件中;

代码语言:javascript
复制
// define your methods in your Controller class
public function form()
{
    $data = []; // prepare any daha if you need anything on your form but as I see you don't need any
    return view('form', $data);
}

public function result(Request $request)
{
    // if you need any validation for form fields you can use $request->validate([...]);
    // you can access all posted input fields which specified with a name
    $to_address = array(
          'name' => $request->input('to_address_name'),
          'street1' => $request->input('to_address_street1'),
          'city' => $request->input('to_address_city'),
          'state' => $request->input('to_address_state'),
          'zip' => $request->input('to_address_zip'),
          'country' => $request->input('to_address_country'),
          'phone' => $request->input('to_address_phone'),
          'email' => $request->input('to_address_email')
        );
    $from_address = array(
          'name' => $request->('from_address_name'),
          'street1' => $request->('from_address_street1'),
          'city' => $request->('from_address_city'),
          'state' => $request->('from_address_state'),
          'zip' => $request->('from_address_zip'),
          'country' => $request->('from_address_country'),
          'phone' => $request->('from_address_phone'),
          'email' => $request->('from_address_email')
        );
    $parcel = array(
          "length" => $request->input('length'),
          "width" => $request->input('width'),
          "height" => $request->input('height'),
          "weight" => $request->input('weight'),
        );

    \EasyPost\EasyPost::setApiKey(env('EASYPOST_API')); // you should use config('services.easypost.api_key') instead of env(...)

    $shipment = \EasyPost\Shipment::create([$to_address, $from_address, $parcel]);

    return view('result', compact('shipment'));
}

要使用$request->input('name')访问输入数据,需要为所有字段指定唯一的名称。

resources/views/form.blade.php

代码语言:javascript
复制
<form action="{{ url('result') }}" method="post">
    @csrf
    From address:<br>
    <input name="from_address_name" placeholder="from_address_name"><br>
    <input name="from_address_street1" placeholder="from_address_street1"><br>
    <input name="from_address_city" placeholder="from_address_city"><br>
    <input name="from_address_state" placeholder="from_address_state"><br>
    <input name="from_address_zip" placeholder="from_address_zip"><br>
    <select name="from_address_country" class="form-select">
        <option selected>Select Country</option>
        <option value="CZ" name="CZ">Česká republika</option>
        <option value="US" name="US">USA</option>
        <option value="SK" name="SK">Slovensko</option>
    </select><br>
    <input name="from_address_phone" placeholder="from_address_phone"><br>
    <input name="from_address_email" placeholder="from_address_email">
    <hr>
    To address:
    From address:<br>
    <input name="to_address_name" placeholder="to_address_name"><br>
    <input name="to_address_street1" placeholder="to_address_street1"><br>
    <input name="to_address_city" placeholder="to_address_city"><br>
    <input name="to_address_state" placeholder="to_address_state"><br>
    <input name="to_address_zip" placeholder="to_address_zip"><br>
    <select name="to_address_country" class="form-select">
        <option selected>Select Country</option>
        <option value="CZ" name="CZ">Česká republika</option>
        <option value="US" name="US">USA</option>
        <option value="SK" name="SK">Slovensko</option>
    </select><br>
    <input name="to_address_phone" placeholder="to_address_phone"><br>
    <input name="to_address_email" placeholder="to_address_email">
    <hr>
    Parcel:
    <input type="text" class="form-control" name="weight" placeholder="Váha (kg)" ><br>
        <input type="text" class="form-control" name="width" placeholder="Šířka (cm)" ><br>
        <input type="text" class="form-control" name="height" placeholder="Výška (cm)" ><br>
        <input type="text" class="form-control" name="`lenght`" placeholder="Délka (cm)" ><br>
    <button type="submit">Show Results</button>
</form>

(我在这里没有使用任何类/样式,但每个输入字段都有一个名称)

现在您的/form路由可以工作了,并显示了一个表单。然后将其发布到/result路由,以捕获输入字段并计算$shipment结果。您需要在resources/views/result.blade.php文件上显示$shipment数据。

resources/views/result.blade.php文件中;

代码语言:javascript
复制
<h1>Calculation Result</h1>
@foreach($shipment->rates as $rate)
    {{ $rate->service }} <br>
    {{ $rate->carrier }} <br>
    {{ $rate->rate }}
    <hr>
@endforeach

实际上,我以前没有使用过easypost api,但我查看了文档:https://www.easypost.com/docs/api/php#shipments-create-codesample

我想这就是全部,你需要检查和编辑我的答案中的代码样本。

票数 0
EN

Stack Overflow用户

发布于 2021-08-04 14:24:27

哦,我终于明白了!我稍后会再试一次,我会让你知道的,谢谢。

票数 0
EN

Stack Overflow用户

发布于 2021-08-05 16:21:38

我执行了session::put请求,并使用这个session for将数据传递给index()。这个解决方案行得通,如果你有更好的办法,请告诉我,谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68651936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档