jquery Uncaught SyntaxError: неверный или неожиданный токен - у входного текста есть апостроф - PullRequest
2 голосов
/ 13 января 2020

У меня есть текущая проблема с вводом, который я использую для поиска по множеству статей. Чтобы получить более подробную информацию, дело в том, что когда я вставляю текст с апострофом, я получаю следующую ошибку: Uncaught SyntaxError: Invalid or unexpected token

  function set_id_article_popover(id, name){
   $('#articles_search_input').val(id);
   $('#articles_search_popover').val(name);
   $('#articles_search_popover').blur();
   $('[data-toggle="popover"]').each(function () {
    $(this).popover('hide');
  });

$('#articles_search_popover').val(name); - это место, где я вставляю название статьи. $('#articles_search_input').val(id); получает идентификатор статьи для поиска. Первый номер правильно вставлен в функцию, которая является идентификатором статьи set_id_article_popover(id, name)

          <div class="item" id="articles_search_popover_container">
              <i class="fa fa-newspaper-o placeholder_input_icotext-muted_light"></i>
                    <input name='name_busqueda' 
                        autocomplete ='off' <?php if(!empty($value1)) 
                           {echo 'value="'.$value1.'"';} ?> type="text" 
                           data-texts='1' 
                           data-toggle="popover" 
                           title="<i class='fa fa-exclamation-triangle'></i>&nbsp;<span class='text-muted'><?php echo __('Busca por especialidad o tratamiento');?></span>" data-lang="<?php echo $this->params['language'];?>" 
                            data-search="articles" 
                            id="articles_search_popover" 
                            data-lang="<?php echo $lang; ?>"
                            class="form-control" 
                            placeholder="<?php echo __('Buscar en artículos');?>">
                             <!-- Popover "Especialidad / Especialista" -->
                           <?php echo $this->element(
                            '/main_search/custom_autocomplete', 
                            array(
                             'id' => 'articles_search_popover', 
                             'headers' => false,
                             'specialties' => true,
                            'specialist'=> false,
                            'top_specialties' => false,
                            'treatments' => true,
                            'cols' => '1')
                            ); ?>
      </div>

Теперь я прикреплю вас к части контроллера, чтобы получить лучшую asp того, что происходит на заднем плане.

  if(isset($this->request->query['name_busqueda']) 
   && $this->request->query['name_busqueda'] != ""){
      $word = $this->request->query['name_busqueda'];
   }

    if(isset($word) && $word != "" && !strpos($word, "-")){
        $words_titulo = $word;
    }

    if(isset($articles_search) && $articles_search != ""){
        $word_search = false;
        //specialty or treatment is selected
        $data = $this->request->query['articles_search'];
        $data = explode("_",$data);
        $tipo = $data[0];

        if($tipo === 'specialty'){
            //search by specalty
            $specialty_id = $data[1];//id

            if(!empty($this->params['language']) && $this->params['language'] != 'es'){
                $name_field_sufix = '_' . $this->params['language'];
            } else {
                $name_field_sufix = '';
            }

            $specialty = $this->Specialization->find('first', array(
                'fields' => array(
                    'name' . $name_field_sufix .' AS name'
                ),
                'conditions' => array(
                    'id' => $specialty_id
                )
            ));

            if(!empty($specialty)) {
                $words_titulo = $specialty['Specialization']['name'];
            }


            $options['conditions'] = array(
                'ArticlesSpec.specialization_id' => $specialty_id
            );
            $this->set('specialty_id', $specialty_id);

        }else{

            //search by treatment
            $treatment_id = $data[1];//id

            if(!empty($this->params['language']) && $this->params['language'] != 'es'){
                $name_field_sufix = '_' . $this->params['language'];
            } else {
                $name_field_sufix = '';
            }

            $treatment = $this->Treatment->find('first', array(
                'fields' => array(
                    'name' . $name_field_sufix .' AS name'
                ),
                'conditions' => array(
                    'id' => $treatment_id
                )
            ));

            $aux_join = array(
                array(
                    'table' => 'td_articles_treatments',
                    'alias' => 'ArticlesTreat',
                    'type' => 'LEFT',
                    'conditions' => array(
                        'ArticlesTreat.article_id = Article.id',
                    )
                ),
                array(
                    'table' => 'td_treatments',
                    'alias' => 'Treatments',
                    'type' => 'LEFT',
                    'conditions' => array(
                        'ArticlesTreat.treatment_id = Treatments.id',
                    ),
                )
            );

            $options['joins'] = array_merge($joins, $aux_join);
            $campos_aux = ', ArticlesTreat.*, Treatments.*';
            $options['conditions'] = array('ArticlesTreat.treatment_id' => $treatment_id);

            if(!empty($treatment)) {
                $words_titulo = $treatment['Treatment']['name'];
            }

        }

    }

Знаете ли вы, есть ли возможность трансформировать апостроф с помощью Cake или было бы лучше сделать это через Javascript?

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

enter image description here На этом первом я начинаю писать в поисковой строке. Я заполняю его любой информацией, которую хочу.

enter image description here На втором этапе, когда я выполняю поиск и нажимаю кнопку, появляется сообщение об ошибке: Uncaught SyntaxError: Invalid or unexpected token Это то, что происходит на моем сервере разработки.

Спасибо

1 Ответ

0 голосов
/ 11 февраля 2020

Я наконец нашел проблему после долгого времени. В строке, где функция вызывается для события onclick внутри этого представления, я применил функцию json_encode с PHP для имени, и поэтому смог решить и выполнить запрос. Таким образом, имя значения, которое я искал, возвращается с json, и нет необходимости экранировать символ одинарной кавычки или делать другие лишние преобразования.

  <section class="item list-group-item">
            <input type="hidden" id="treat_id" value="treatment_<?php echo $id;?>">
            <input type="hidden" id="treat_name" value="<?php echo $name;?>">
            <a onclick='set_id_article_popover("treatment_<?php echo $id;?>",  <?php echo json_encode($final_name); ?>)' class="center-block thumb_xxs">
                <i class="fa fa-heart"></i>
                <?php 
                if(strlen($name) > 50){
                    $name_short= substr($name, 0, 50).' ...';
                }else{
                    $name_short = $name;
                }
                $bname = returnBold($name_short, $search_text);
                ?>
                <span title="<?php echo $name ?>" class="text-muted"><?php echo $bname; ?></span>
            </a>
        </section>
...