Laravel - JQuery Ошибка проверки ключа при обновлении в Laravel - PullRequest
0 голосов
/ 30 марта 2020

В моем проекте Laravel -5.8 я разрабатываю проект для полей ввода Dynami c. Я пытаюсь изменить значение в раскрывающемся списке в текстовом поле при изменении. Проверка выполняется по ключу.

У меня есть две таблицы:

CREATE TABLE `appraisal_goal_types` (
 `id` int(11) NOT NULL,
 `name` varchar(200) NOT NULL,
 `parent_id` int(11) DEFAULT NULL,
 `max_score` int(11) DEFAULT 0,
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
table diagram: https://i.stack.imgur.com/hfVuJ.png

CREATE TABLE `appraisal_goals` (
  `id` int(11) NOT NULL,
  `goal_type_id` int(11) DEFAULT NULL,
 `employee_id` int(11) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Контроллер

public function findScore(Request $request)
{
    $userCompany = Auth::user()->company_id;
    $userEmployee = Auth::user()->employee_id;

    $identities                     = DB::table('appraisal_identity')->select('id')->where('company_id', $userCompany)->where('is_current', 1)->first()->id;      
    $child  = DB::table('appraisal_goal_types')->where('company_id', $userCompany)->where('id',$request->id)->first();

    $parentid  = DB::table('appraisal_goal_types')->select('parent_id')->where('company_id', $userCompany)->where('id',$request->id)->first()->parent_id;

   if(empty($child))
   {
       abort(404);
   }  
   $weightedscore = 0;
   $weightedscore = DB::table('appraisal_goals')->select(DB::raw("IFNULL(SUM(weighted_score),0) as weighted_score"))->where('appraisal_identity_id', $identities)->where('employee_id', $userEmployee)->where('parent_id', $parentid)->first(); 

   $maxscore = DB::table('appraisal_goal_types')->select('max_score')->find($child->parent_id);
    return response()->json([
        'maxscore' => $maxscore->max_score,
        'weightedscore' => $weightedscore->weighted_score
    ]);        
}

Также у меня есть маршруты / Интернет. php

Route::get('get/findScore','Appraisal\AppraisalGoalsController@findScore')->name('get.scores.all');

create.blade. php

  <div class="col-12 col-sm-6">
    <div class="form-group">
      <label class="control-label"> Goal Type:<span style="color:red;">*</span></label>
      <select id="goal_type" class="form-control" name="goal_type_id">
      <option value="">Select Goal Type</option>

        @foreach ($categories as $category)
          <option hidden value="{{ $category->id }}" {{ $category->id == old('category_id') ? 'selected' : '' }}>{{ $category->name }}</option>

          @if ($category->children)
            @foreach ($category->children as $child)
              <option value="{{ $child->id }}" {{ $child->id == old('category_id') ? 'selected' : '' }}>&nbsp;&nbsp;{{ $child->name }}</option>
            @endforeach
          @endif
        @endforeach
      </select>
    </div>
  </div> 

<input type="hidden" id="max_score" class="form-control" >
<input type="hidden" id="weighted_score" class="form-control" value="0" >


<div class="col-12 col-sm-6">
 <div class="form-group">
    <label class="control-label"> Weight(%):<span style="color:red;">*</span></label>
    <input  type="number" name="weighted_score" id="total_weighted_score" placeholder="Enter weighted score here" class="form-control" max="120" onkeyup="checkScore(this.value)">
 </div>
</div>  

    <script type="text/javascript">
    $(document).ready(function() {
        $(document).on('change', '#goal_type', function() {
            var air_id =  $(this).val();

            var a = $(this).parent();

            console.log("Its Change !");

            var op = "";      

            $.ajax({
                type: 'get',
                url: '{{ route('get.scores.all') }}',
                data: { 'id': air_id },
                dataType: 'json',      //return data will be json
                success: function(data) {
                    console.log(data.maxscore);
                    console.log(data.weightedscore);
                     $('#max_score').val(data.maxscore);
                     $('#weighted_score').val(data.weightedscore);
                },
                error:function(){

                }
            });
        });
    });
    </script>
    <script type="text/javascript">
        function checkScore(value){
            let max_score = $("#max_score").val();
            let weighted_score = $("#weighted_score").val();
            let sumValue = parseInt(weighted_score) + parseInt(value);

            if (sumValue > max_score) {
              alert("sum value is greater than max score");
              $("#total_weighted_score").val('');
              return false;
            }
        }
    </script>

edit.blade. php

  <div class="col-12 col-sm-6">
    <div class="form-group">
      <label class="control-label"> Goal Type:<span style="color:red;">*</span></label>
      <select id="goal_type" class="form-control" name="goal_type_id">
      <option value="">Select Goal Type</option>

        @foreach ($categories as $category)
          <option hidden value="{{ $category->id }}" {{ $category->id == old('category_id') ? 'selected' : '' }}>{{ $category->name }}</option>

          @if ($category->children)
            @foreach ($category->children as $child)
              <option value="{{ $child->id }}" {{ $child->id == old('category_id') ? 'selected' : '' }}>&nbsp;&nbsp;{{ $child->name }}</option>
            @endforeach
          @endif
        @endforeach
      </select>
    </div>
  </div> 

<input type="hidden" id="max_score" class="form-control" >
<input type="hidden" id="weighted_score" class="form-control" value="0" >


<div class="col-12 col-sm-6">
 <div class="form-group">
    <label class="control-label"> Weight(%):<span style="color:red;">*</span></label>
    <input id="total_weighted_score" type="number" name="weighted_score" value="{{old('weighted_score',$goal->weighted_score)}}"  placeholder="Enter weighted score here" class="form-control"  max="120" onkeyup="checkScore(this.value)">
 </div>
</div>  

    <script type="text/javascript">
    $(document).ready(function() {
        $(document).on('change', '#goal_type', function() {
            var air_id =  $(this).val();

            var a = $(this).parent();

            console.log("Its Change !");

            var op = "";      

            $.ajax({
                type: 'get',
                url: '{{ route('get.scores.all') }}',
                data: { 'id': air_id },
                dataType: 'json',      //return data will be json
                success: function(data) {
                    console.log(data.maxscore);
                    console.log(data.weightedscore);
                     $('#max_score').val(data.maxscore);
                     $('#weighted_score').val(data.weightedscore);
                },
                error:function(){

                }
            });
        });
    });
    </script>
    <script type="text/javascript">
        function checkScore(value){
            let max_score = $("#max_score").val();
            let weighted_score = $("#weighted_score").val();
            let sumValue = parseInt(weighted_score) + parseInt(value);

            if (sumValue > max_score) {
              alert("sum value is greater than max score");
              $("#total_weighted_score").val('');
              return false;
            }
        }
    </script>

Обмен с использованием:

$ (document) .on ('change', '#goal_type', function () {

Значения этой функции контроллера:

publi c Функция findScore (Запрос $ request)

загружается в:

<input type="hidden" id="max_score" class="form-control" >
<input type="hidden" id="weighted_score" class="form-control" value="0" >

, используя эту jquery функцию:

    <script type="text/javascript">
    $(document).ready(function() {
        $(document).on('change', '#goal_type', function() {
            var air_id =  $(this).val();

            var a = $(this).parent();

            console.log("Its Change !");

            var op = "";      

            $.ajax({
                type: 'get',
                url: '{{ route('get.scores.all') }}',
                data: { 'id': air_id },
                dataType: 'json',      //return data will be json
                success: function(data) {
                    console.log(data.maxscore);
                    console.log(data.weightedscore);
                     $('#max_score').val(data.maxscore);
                     $('#weighted_score').val(data.weightedscore);
                },
                error:function(){

                }
            });
        });
    });
    </script>

Из create.blade, для keyup для определенного сотрудника я хочу, чтобы приложение суммировало #weighted_score с текущим значением в total_weighted_score. Затем, если сумма больше, чем #max_score, оно должно отобразить это сообщение:

alert ("значение суммы больше, чем максимальный балл ");

Проверка выполняется по keyup, когда пользователь вводит здесь:

<div class="col-12 col-sm-6">
 <div class="form-group">
    <label class="control-label"> Weight(%):<span style="color:red;">*</span></label>
    <input  type="number" name="weighted_score" id="total_weighted_score" placeholder="Enter weighted score here" class="form-control" max="120" onkeyup="checkScore(this.value)">
 </div>
</div>

Это прекрасно работает для create.blade.

Но для редактирования. e, при keyup проверка не вступает в силу, и это:

alert («значение суммы больше, чем max Score»);

не отображается до тех пор, пока я щелкните по раскрывающемуся списку ..

Проблема в том, что поскольку edit.blade сначала загружает свои данные из загрузки из базы данных, в отличие от create.blade, edit.blade ничего не загружает в

<input type="hidden" id="max_score" class="form-control" >
<input type="hidden" id="weighted_score" class="form-control" value="0" >

Как создать файл edit.blade для загрузки данных в

<input type="hidden" id="max_score" class="form-control" >
<input type="hidden" id="weighted_score" class="form-control" value="0" >

, используя приведенный здесь код, без использования раскрывающегося списка здесь

    <script type="text/javascript">
    $(document).ready(function() {
        $(document).on('change', '#goal_type', function() {
            var air_id =  $(this).val();

            var a = $(this).parent();

            console.log("Its Change !");

            var op = "";      

            $.ajax({
                type: 'get',
                url: '{{ route('get.scores.all') }}',
                data: { 'id': air_id },
                dataType: 'json',      //return data will be json
                success: function(data) {
                    console.log(data.maxscore);
                    console.log(data.weightedscore);
                     $('#max_score').val(data.maxscore);
                     $('#weighted_score').val(data.weightedscore);
                },
                error:function(){

                }
            });
        });
    });
    </script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...