Какая альтернатива для javascript onchange приемника событий в торт php 3? - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблема с использованием javascript onchange обработчика событий в cakephp3.7. На самом деле у меня есть веб-приложение для электронной коммерции, созданное с помощью cakephp3.7. Теперь я хочу улучшить форму представления продаж на веб-сайте, динамически загружая дополнительные поля, которые продавцы заполняют на основе категории продуктов, выбранных продавцом. Это означает, что если продавец выберет electronic из поля ввода категории, то теперь будут отображаться поля Electroni c exta, которые ранее имели стиль display: none в CSS. Дополнительные поля Electroni c следующие с id=elctronic:

<div id="electronic">
<?php echo $this->Form->control('subcategorie',['label'=>'choose sub category', 'class'=>'form-control', 'option'=>['Computer','Phone','Multimedia'],'empty'=>'choose'); ?>
<?php echo $this->Form->control('brand',['class'=>'form-control', 'placeholder'=>'the brand']); ?>
<?php echo $this->Form->control('model',['class'=>'form-control', 'placeholder'=>'the model']); ?>
</div>

Тогда, если произведение составляет, например, clothes, поля ввода electronic будут скрыты, а дополнительные поля одежды будет отображаться с id=clothe, как показано ниже:

   <div id="clothe">
    <?php echo $this->Form->control('Gender',['label'=>'What gender?', 'class'=>'form-control', 'option'=>['Males','Females'],'empty'=>'choose'); ?>
    <?php echo $this->Form->control('Size',['class'=>'form-control', 'placeholder'=>'Size']); ?>
    <?php echo $this->Form->control('model',['class'=>'form-control', 'placeholder'=>'the model']); ?>
    </div>

Поле ввода категория , где используется прослушиватель событий onchange, является ниже, а функция javascript extraForm() должен вызываться, но это не так, и есть проблема:

<?php echo $this->Form->control('category',['id'=>'categ','label'=>'choose category', 'class'=>'form-control', 'options'=>['electronics','clothes'],'empty'=>'choose'),'onchange'=>'extraForm("categ"); ?>

А затем в макете для метода add () ProductsController я установил функцию extraForm (), как показано ниже:

<script>
function extraForm(s1){
 var s1=documentgetElementById(s1);
 var s2=documentgetElementById("electronics");
 var s3=documentgetElementById("clothes");
  if(s1.value == "electronics"){
    s2.style.display = "bloc"
} else {
    s3.style.display = "bloc"
}
}
</script>

Уже три дня, как я не могу понять, что мне не хватает. Yesterday I searched through the net and there were people saying that event listener such as onchange, onclick and onselect event listeners are deprecated for cakephp 3 and I don't understand how. Как получить динамическую c загрузку дополнительной формы ввода, запускаемой выбранной опцией в cakephp3.7.

**

  • ПЕРВОЕ РЕДАКТИРОВАНИЕ

**

Как я уже говорил в комментариях, я упростил вопрос, чтобы сделать его понятно. Полный контекст заключается в том, что у меня есть 2 стандартных поля category и subcategory. Когда пользователь выбирает категорию, функция AJAX представляет пользователю список подкатегорий на выбор. My AJAX:

$(document).ready(function(){

$('#getSubCat').change(function(e){

    $.ajax({
        type: "POST",
        url:  "/products/getsubsaterogie",
        data: {categ: $(this).find('option:selected').text()},
        dataType: 'json',
        cache: false,
        headers : {
            'X-CSRF-Token': $('[name="_csrfToken"]').val()
        },
        success: function(data){
            console.log(data);
            let subcat = $('#subcategories')

            for (let sc of data) {
                console.log(sc.subcategorie)
                $('<option />', {value: sc.subcategorie_id, text: sc.subcategorie}).appendTo(subcat);
            }
        }
    });

    e.preventDefault();
})

}) Поле ввода категории ie:

  <?php echo $this->Form->control('categorie_id', ['id'=>'getSubCat', 'options' => $categories, 'label' => __("What category ?"), 'class'=>'form-control', 'empty' => '(choose)']); 
                                               ?>

После того, как пользователь выберет категорию, список подкатегория, извлеченная из базы данных с помощью AJAX, хорошо отображается в этой форме ввода, и именно здесь onchange настроен на вызов функции extraForm () , но не:

 <?php echo $this->Form->control('subcategorie_id', ['id'=>'subcategories', 'label' => __("What subcategory ?"), 'class'=>'form-control', 'options'=> [],'empty' => '', 'onchange' => 'myFormShow("getSubCat","subcategories")']); 
                                               ?>

И после выбора подкатегории соответствующая дополнительная форма не появляется, но если я вручную изменю display на bloc в CSS, она отобразится, что означает, что функция javascript не вызывается onchange событие, я даже использовал onselect, но все еще не имея его И функция javascript extraForm фактически получает 2 аргумента, например extraForm(s1, s2). Это мой настоящий контекст.

Я действительно застрял здесь. Любая помощь действительно приветствуется, спасибо заранее.

- РЕДАКТИРОВАТЬ ПО ЗАПРОСУ ГРЕГА: Согласно комментарию Грега, это мой код для создания списка внутри подкатегории. Я не знал, что все эти детали были необходимы, так как я думал, что это был торт php 3 вопроса о javascript слушателях событий.

public function getsubsaterogie(){
            if($this->request->is('ajax')){
                $d = $this->request->getData();
                $subcat = '';
                $cat = TableRegistry::get('Categories')->find()
                ->where(['categorie' => $d['categ']])
                ->select('id')
                ->first();

                if(!empty($cat)){
                    $subcat = TableRegistry::get('Subcategories')->find()
                    ->where(['categorie_id' => $cat->id])
                    ->all();
                }

                echo json_encode($subcat);
                exit();
            }
        }

Заранее спасибо, с наилучшими пожеланиями!

1 Ответ

0 голосов
/ 30 апреля 2020

Всегда очень страшно не знать, в чем настоящая проблема, так как это не первая моя попытка использовать ajax вместе с тортом php. Я могу засвидетельствовать Greg Schmidth отличный опыт, когда он сказал "подкатегории не будут отображаться вообще". Фактически, через 2 дня и при попытке выследить реальную проблему,

  • Я очистил кеш,
  • Я удалил файлы cookie браузера

И вдруг все приложение начало работать неожиданно,

  • подкатегории больше не отображаются

  • Коды анимаций на основе jQuery, которые я сделал для анимации рекламы на веб-сайте, также становились странными.

Все это заставило меня задуматься о проблеме jQuery, и действительно, это была настоящая проблема. Я использую 3 разные версии jQuery, и все 3 версии необходимы для моих проектов. Версии 3 jquery бесшумно конфликтовали и не давали мне подсказки, чтобы разобраться, что происходит не так. Теперь, когда я знаю, что это проблема jquery, я использовал подход jQuery noConflict, описанный в этой ссылке

 <?= $this->Html- >script('http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js') ?>
    <?= $this->Html->script('lecker/ajax/getSubCategorie.js') ?>
    <script>
        var jQuery_1_12 = $.noConflict(true);
    </script>
<?= $this->Html->script('https://code.jquery.com/ui/1.12.1/jquery-ui.js') ?>
// This for the second jquery version

Описание было не таким простым, как казалось, но другие вопросы stackoverflow также помог мне.

В конечном счете, проблема не в том, сможем ли мы по-прежнему использовать событие enchange с помощником по формам для тортов php версии 3, а в проблеме правильной переменной $ , используемой jquery в ajax коде для получения подкатегорий он не уступал.

...