0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

条件分岐で属性値を変更する

Posted at

条件分岐はおおきくきりわけたほうがよかったかもと
思いますが
これできるんだ...となったので記録です

きっかけ

リクエストユーザーに応じてフォームリクエストURLを変更したい
フォーム入力内容が同じなので、フォームは使いまわしたい

環境

laravel
viewにbladeを利用している

bladeテンプレートを利用

テンプレート設定はこちらにてまとめています

かんがえたこと

  1. formタグごと条件分岐で表示わけする
    @if (Auth::user()->role === 'admin')
    <form method="post" action="{{ route('admin.label')}}">
    {{ csrf_field() }}
      <label for="">ラベル名</label>
      <input type="text" name="label_name" value="{{ old('label_name') }}">
      <button type="submit">送信</button>
    </form>
    @else
    <form method="post" action="{{ route('users.label')}}">
    {{ csrf_field() }}
      <label for="">ラベル名</label>
      <input type="text" name="label_name" value="{{ old('label_name') }}">
      <button type="submit">送信</button>
    </form>
    @endif
    @foreach ($errors->all() as $error)
      <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p>
    @endforeach
    
  2. jquery関数で条件分け
    @section('js')
    
    <script>
    function requestSend(event, form) {
        event.preventDefault();
        event.stopPropagation();
    
        let user = <?php echo \Illuminate\Support\Facades\Auth::user() ?>;
        form = $(form);
        if (user.role === 'admin') {
          form.attr('action', "{{ route('admin.label') }}");
        } else if (user.role === 'user') {
          form.attr('action', "{{ route('user.label') }}");
        }
        form.removeAttr('onsubmit');
        form.submit();
    }
    </script>
    
    @endsection
    
    <form id="label_form" method="post" onsubmit="requestSend(event, $('#label_form'));">
    {{ csrf_field() }}
      <label for="">ラベル名</label>
      <input type="text" name="label_name" value="{{ old('label_name') }}">
      <button type="submit">送信</button>
    </form>
    @foreach ($errors->all() as $error)
      <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p>
    @endforeach
    
  3. formタグに条件分岐を追記
    その1: 条件に応じてリクエスト先を変更
    <form method="post" action="@if (Auth::user()->role === 'admin') {{route('admin.label')}} @else {{route('user.label')}} @endif">
    {{ csrf_field() }}
      <label for="">ラベル名</label>
      <input type="text" name="label_name" value="{{ old('label_name') }}">
      <button type="submit">送信</button>
    </form>
    @foreach ($errors->all() as $error)
      <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p>
    @endforeach
    
    その2: action属性を指定するのは条件一致時のみとする場合
    <form method="post" @if (Auth::user()->role === 'admin') action="{{route('admin.label')}}" @endif>
    {{ csrf_field() }}
      <label for="">ラベル名</label>
      <input type="text" name="label_name" value="{{ old('label_name') }}">
      <button type="submit">送信</button>
    </form>
    @foreach ($errors->all() as $error)
      <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p>
    @endforeach
    

    指定なしの場合、"route('user.label')"にリクエストされるよう設定していることが前提

気づき

  • 属性の定義自体を@ifで分岐できる
    → 属性値の値を@if分岐で設定できることはドキュメントにも記載があったのだが定義そのものもできるとは思っていなかった
  • html内のタグ属性値にphpコードを含めるには""(ダブルクォーテーション)で囲む必要がある

参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?