Данные не вставляются на мобильное устройство, но работают на рабочем столе - Codeigniter и Ajax - PullRequest
0 голосов
/ 19 сентября 2019

Я пытался проанализировать данные на моем контроллере, чтобы я мог вставить их в базу данных, используя JQuery, и он возвращал ноль.Она предназначена для обзорной системы, поэтому не использует обычные поля формы, однако вкладка «Сеть» в элементах проверки показывает, что данные фактически отправляются на контроллер просто, и по какой-то странной причине не могут их прочитать.

Обновление:Данные корректно вставляются на рабочий стол, однако сообщение с подтверждением (флэш-данные) отображается правильно, не зная, почему.Кроме того, в мобильном представлении не отображаются данные или сообщения.Кто-нибудь знает почему?Я обновил код ниже ..

Вот код, на мой взгляд:

    <?php  if($this->session->flashdata('review_submitted')){  ?>
    <div class="alert alert-success alert-dismissible container show" role="alert">
      <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
      </button>
      <strong>Thank you!</strong> Your review has been submitted.
    </div>
    <?php } ?>

<form id="myForm" name="myForm">

<br>
            <div class="form-group text-left div-style">
             <h3 style="font-family: MontserratLight;letter-spacing: 2px; line-height: 32px;">Full Name <b>*</b></h3>
                <input name="name" class="form-control" style="background: #f7f7f7;  border: 1px solid #801424;" required />
            </div>

    <div class="rate">
        <div id="1" class="btn-1 rate-btn"></div>
    <div id="2" class="btn-2 rate-btn"></div>
    <div id="3" class="btn-3 rate-btn"></div>
    <div id="4" class="btn-4 rate-btn"></div>
    <div id="5" class="btn-5 rate-btn"></div>
</div>

  <script>
   $(function(){
 $('.rate-btn').hover(function(){
 $('.rate-btn').removeClass('rate-btn-hover');
    var therate = $(this).attr('id');
    for (var i = therate; i >= 0; i--) {
 $('.btn-'+i).addClass('rate-btn-hover');
     };
   });

 $('.rate-btn').click(function(){
    var therate = $(this).attr('id');
    var dataRate = 'rate='+therate; //
 $('.rate-btn').removeClass('rate-btn-active');
    for (var i = therate; i >= 0; i--) {
 $('.btn-'+i).addClass('rate-btn-active');
    };
$('#myForm').on('submit', function(e){
  var url = "<?php echo base_url(); ?>index.php/reviews/add_review";
//  $('#myForm').append(therate);
  var dataPost = $('#myForm').serialize() + "&rate=" + therate;
 $.ajax({
    type : "POST",
    url : url,
    data: dataPost,
    success:function(){

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

, и с помощью контроллера я просто использую следующее, чтобы получить данные и добавить их в базу данных:

   public function add_review(){

$name = $this->input->post('name');
$rating = $this->input->post('rate');


$dataDB = array(
  'full_name' => $name,
  'rating' => $rating
);

if($this->functions->submit($dataDB)){
  $this->session->set_flashdata('review_submitted', true);
  redirect(base_url() . 'reviews/index', 'refresh');
  }

 }

Вот какой-то CSS, который я использовал, возможно, проблема в том, что в мобильном браузере нет курсора?

.rate{
    width:245px; height: 40px;
    margin-bottom:0px;
}
 .rate .rate-btn{
    width: 45px; height:40px;
   float: left;
   background: url(rate-btn.png) no-repeat;
    cursor: pointer;
    cursor:hand;
    pointer-events: auto;

   }
  .rate .rate-btn:hover, .rate  .rate-btn-hover, .rate  .rate-btn-active{
    background: url(rate-btn-hover.png) no-repeat;
   }

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

При передаче данных через ajax, я думаю, что лучше использовать JSON dataType.Реформируйте тип данных (строка -> объект данных).Кроме того, я не думаю, что действительно необходимо объединять данные для отправки в строку.

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

$.ajax({
    type : "POST",
    dataType: 'text' //it is not necessary if you are not returning any data (if you return json, put 'JSON'),
    url : "<?php echo base_url(); ?>index.php/reviews/add_review",
    data: dataRate, //change to {key:value,key:value}
    success:function(data){

    }
});
0 голосов
/ 19 сентября 2019

Это просто для решения вашей проблемы с вашими объявленными значениями AJAX, которые не отображаются там, где вы ожидаете их ТОЛЬКО.

Существует миллиард способов, которыми вы можете кодировать это, но вот только один, который я изменил в отношениивыполнить отладку.Даже я узнал новый трюк, делающий это.

Просто Nit Picking, но то, что выделяется при чтении вашего кода, это использование therate, когда везде в вашем JS вы используете верблюжий чехол, поэтому он должен быть theRate . Хорошая идея - выбрать стандарт и придерживаться его.

Кроме того, в вашем JS появилось то, что казалось вложенными событиями.Некоторая попытка заставить theRate работать правильно?В любом случае ...

Перво-наперво. Вернитесь к чему-то основному и вернитесь обратно.(Хотя в этом случае я не раздевал ваш взгляд назад, но сделал это с вашим контроллером.

Ваш взгляд. Мне пришлось немного изменить это и, надеюсь,комментарии объясняют вещи.

Я назвал это rating_view.php

<form name="my-form" id="my-form">
    <div class="rate">
        <div id="1" class="btn-1 rate-btn">1</div>
        <div id="2" class="btn-2 rate-btn">2</div>
        <div id="3" class="btn-3 rate-btn">3</div>
        <div id="4" class="btn-4 rate-btn">4</div>
        <div id="5" class="btn-5 rate-btn">5</div>
    </div>
    <input type="submit">
</form>
<!-- Added for viewing debug response -->
<div id="json-debug-output"></div>

<!-- Some styles added as non were provided -->
<style>
    .rate-btn-hover {
        background: blue;
    }
    .rate-btn-active {
        background: yellow;
    }
</style>
<script src= <?= base_url('assets/js/jquery_v3.4.1.js'); ?>></script>

<script>
    $(document).ready(function () {
        // Define your Dom Elements ONCE for efficiency etc
        let domRateButton = $('.rate-btn');
        let domMyForm = $('#my-form');
        let theRate = 0; // Declares this as a Global Var.

        let domJsonDebugOutput = $('#json-debug-output');

        // Hover
        domRateButton.hover(function () {
            domRateButton.removeClass('rate-btn-hover');
            let theRate = $(this).attr('id');
            for (let i = theRate; i >= 0; i--) {
                $('.btn-' + i).addClass('rate-btn-hover');
            }
        });

        // Click
        domRateButton.click(function () {
            console.log('Rating Button Clicked');
            theRate = $(this).attr('id');
            domRateButton.removeClass('rate-btn-active');
            for (let i = theRate; i >= 0; i--) {
                $('.btn-' + i).addClass('rate-btn-active');
            }
        });

        // Submit
        domMyForm.on('submit', function (e) {
            e.preventDefault(); // This was missing
            console.log('Posting Rate = ' + theRate);

            $.ajax({
                type: "POST",
                // dataType: 'text',
                dataType: "json",
                url: "<?php echo base_url(); ?>reviews/add_review",
                data: {'act': 'rate', 'post_id':<?= $post_id; ?>, 'rate': theRate},

                success: function (data) {
                    let debugData = JSON.stringify(data);
                    domJsonDebugOutput.text(debugData); // Display in our Debug Div
                },
                error: function (data) {
                    let debugData = JSON.stringify(data);
                    domJsonDebugOutput.text(debugData); // Display in our Debug Div
                }
            });
        });
    });
</script>

Обратите внимание на AJAX изменения в dataType из текста до json . Также обратите внимание, что data является массивом .

Я также изменил область действия theRate с локального на глобальный, чтобы он был «доступным для поиска»среди функций.

НЕ УВЕРЕН, как была настроена ваша форма, но я добавил e.preventDefault (); чтобы предотвратить отправку формы на тестирование.

Лично я недоволен тем, что PHP-переменные встроены в любойJS-код и я обычно использую JS в качестве внешних файлов и передаем значения из PHP, читая их с помощью JS, но у него также есть свои плюсы и минусы. Поэтому я оставил это в покое, чтобы не заходить слишком далеко с этим.

Для вашего контроллера - называемые Reviews.php

public function show() {
    $data['post_id'] = 1; // This comes from somewhere
    $content = $this->load->view('rating_view', $data, TRUE);
    echo $content;
}

/**
 * Called by AJAX
 * Do we need to test this is only called by AJAX?
 */
public function add_review() {
    // Return everything that was sent for debugging
    echo json_encode($this->input->post());
//      var_dump($this->input->post());
    exit();
}

Так что здесь у меня только что был метод show (), показывающий форму и add_review, чтобы просто возвращать назад то, что было отправлено.Вы можете делать все что угодно с этим.Одним из приятных аспектов в этом случае является то, что вам не нужно использовать console.log), поскольку вы можете просмотреть все это на странице (НО ТОЛЬКО ДЛЯ ОТЛАДКИ).Это еще один вариант.

Так что поиграйте с этим и начните вносить изменения в свой код и посмотрите, что работает.Помните - вернитесь к основам и выберите бит, который не работает.

Далее вы обнаружите, что вас могут споткнуться о перенаправление.Но это для другого поста.

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