У меня проблема с использованием 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();
}
}
Заранее спасибо, с наилучшими пожеланиями!