Почему через AJAX не загружается php файл

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Почему через AJAX не загружается php файл

Сообщение alexa777 »

Привет есть js код который должен загружать php фаил с формами

Код: Выделить всё

$(function() {
    $('#choose_forms').click(function () {
        var vibor =  $('#choose_forms').find('input').val();
        if(vibor == '16') {
        	$( ".element" ).load( "/frontend/views/board/form_avto.php", function() {
                    alert( "Load was performed." );
});
        } else if(vibor == '17') {
        	$('.element').text('Контент 2');
        } else if(vibor == 'str3') {
        	$('.element').text('Контент 3');
        } 
    });
 
});
Но дебагер показывает что такого файла form_avto.php нет, хотя он существует по данному пути
Почему?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Почему через AJAX не загружается php файл

Сообщение zelenin »

аякс работает на клиенте, т.е. в вашем браузере. таким образом работает с урлами, а не с файлами.
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Почему через AJAX не загружается php файл

Сообщение alexa777 »

zelenin писал(а): 2018.07.11, 18:01 аякс работает на клиенте, т.е. в вашем браузере. таким образом работает с урлами, а не с файлами.

А как тогда сделать правильно?
Этот скрипт должен выводить разные формы при выборе определенных категорий
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Почему через AJAX не загружается php файл

Сообщение zelenin »

alexa777 писал(а): 2018.07.11, 18:07
zelenin писал(а): 2018.07.11, 18:01 аякс работает на клиенте, т.е. в вашем браузере. таким образом работает с урлами, а не с файлами.

А как тогда сделать правильно?
делать запрос на урл
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему через AJAX не загружается php файл

Сообщение Dominus »

alexa777 писал(а): 2018.07.11, 18:07
zelenin писал(а): 2018.07.11, 18:01 аякс работает на клиенте, т.е. в вашем браузере. таким образом работает с урлами, а не с файлами.

А как тогда сделать правильно?
Этот скрипт должен выводить разные формы при выборе определенных категорий
Как то так:

Код: Выделить всё

<?php
//...
$script = "
$(function() {
    $('#choose_forms').change(function (e) {
        var select = e.currentTarget,
            vibor =  select.value,
            element = $('.element'),
            callUrl = select.dataset.url;            
               
        if(vibor == '16') {            
            $.ajax({
                type: 'post',                
                url: callUrl,
                data: ({vibor: vibor})
            }).done(function (response) {
                element.html(response.body);
            });        	
        } else if (vibor == '17') {
        	element.text('Контент 2');
        } else if(vibor == 'str3') {
        	element.text('Контент 3');
        } 
    });
 
});
";
$this->registerJs($script);
?>
<select id="choose_forms" data-url="<?= yii\helpers\Url::to(['/main/default/test']) ?>">
    <option value="16">16</option>
    <option value="17">17</option>
    <option value="str3">str3</option>
</select>
<div class="element">...</div>
Controller:

Код: Выделить всё

public function actionTest()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return [
                'body' => $this->renderPartial('_form1',[
                    'vibor' => Yii::$app->request->post('vibor'),
                ]),
            ];
        }
        throw new yii\web\NotFoundHttpException('The requested page does not exist.');
    }
_form1.php

Код: Выделить всё

<h1>Это Форма 1</h1>
<p>Выбрано: <?= $vibor ?></p>
А вообще, в зависимости какое значение пришло в контроллер, рендерить соответствующую форму.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему через AJAX не загружается php файл

Сообщение Dominus »

То есть получается как то так:

Код: Выделить всё

<?php
//...
$script = "
$(function() {
    $('#choose_forms').change(function (e) {
        var select = e.currentTarget,
            vibor =  select.value,
            element = $('.element'),
            callUrl = select.dataset.url;
            
        $.ajax({
            type: 'post',                
            url: callUrl,
            data: ({vibor: vibor})
        }).done(function (response) {
            element.html(response.body);
        });
    });
});
";
$this->registerJs($script);
?>
<select id="choose_forms" data-url="<?= yii\helpers\Url::to(['/main/default/test']) ?>">
    <option value="16">16</option>
    <option value="17">17</option>
    <option value="str3">str3</option>
</select>
<div class="element">...</div>
Controller:

Код: Выделить всё

public function actionTest()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            if ($vibor = Yii::$app->request->post('vibor')) {
                if ($vibor == 16) {
                    return [
                        'body' => $this->renderPartial('_form1', [
                            'vibor' => $vibor,
                        ]),
                    ];
                } else if ($vibor == 17) {
                    return [
                        'body' => $this->renderPartial('_form2', [
                            'vibor' => $vibor,
                        ]),
                    ];
                } else {
                    return [
                        'body' => $vibor,
                    ];
                }
            }
        }
        throw new yii\web\NotFoundHttpException('The requested page does not exist.');
    }
_form1.php

Код: Выделить всё

<h1>Это Форма 1</h1>
<p>Выбрано: <?= $vibor ?></p>
_form2.php

Код: Выделить всё

<h1>Это Форма 2</h1>
<p>Выбрано: <?= $vibor ?></p>
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Почему через AJAX не загружается php файл

Сообщение alexa777 »

Dominus писал(а): 2018.07.11, 19:37

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

вот так у меня реализован вывод категорий, вот тут присваивается value при выборе категории <input type="hidden" id="board-category_id" name="Board[category_id]" value="'.($model->isNewRecord ? '' : $category_id).'"/>

Код: Выделить всё

<div id="choose_forms">
        
         <?php

         
         
         
        function getChildOptions($cats, $offset) {
            $str = "<ul class='dropdown-menu'>";
            foreach($cats as $cat) {
                if (empty($cat['children'])) {
                    $str .= "<li class='cat-select-item' data-value='".$cat['id']."' >".$offset.$cat['name']."</li>";
                } else {
                    $str .= "<li class='cat-select-item dropdown-submenu' data-value='".$cat['id']."' >".$offset.$cat['name'];
                    if (!empty($cat['children'])) $str .= getChildOptions($cat['children'], $offset);
                    $str .= "</li>";
                }
            }
            $str .= "</ul>";
            return $str;
        }

        $categories = \common\models\Category::getCategorys();
        if(!$model->isNewRecord){
        $id_category = \common\models\Board::getBoard($model->id);
        $category = \common\models\Category::getOneCategory($id_category->category_id);
            if($id_category->category_id == 0){
               $category_name = 'Выберите категорию...'; 
               $category_id = '';
                
            }else{
                 $category_name = $category->name; 
                 $category_id = $id_category->category_id;
            }
        }
  
        $dropdownMenu = '<div class="dropdown"><button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">'.($model->isNewRecord ? 'Выберите категорию...' : $category_name).'<span class="caret"></span></button>' . getChildOptions($categories, '') . '<input type="hidden" id="board-category_id" name="Board[category_id]" value="'.($model->isNewRecord ? '' : $category_id).'"/></div>';
        
        echo $dropdownMenu;
?>

</div><br />

Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему через AJAX не загружается php файл

Сообщение Dominus »

Покажите HTML код

Код: Выделить всё

<div id="choose_forms">
<!-- что тут генерируется?  -->
</div>
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Почему через AJAX не загружается php файл

Сообщение alexa777 »

Dominus писал(а): 2018.07.12, 17:26 Покажите HTML код

Код: Выделить всё

<div id="choose_forms">
<!-- что тут генерируется?  -->
</div>

Многоуровневый вывод выбора категорий
https://screenshots.firefox.com/4tjkHvR ... MX/test.ku
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему через AJAX не загружается php файл

Сообщение Dominus »

Ну это я понял, только не то что я просил, не внешний вид, а HTML)
Вот например с dropdown.
Dropdown может быть сгенерирован на подобии такого же, то есть скрытого поля по сути и не надо.

Код: Выделить всё

<?php
//...
$script = "
$(function() {
     $('#choose_forms li').click(function(e){
        e.preventDefault();
        var callUrl = $(this).parent().get(0).dataset.url, // URL берем из атрибута data-url тега ul
            select = e.currentTarget,
            vibor =  select.dataset.value, // Получаем значение из data-value тега li
            element = $('.element'); // Контейнер куда будем выводить результат
        
        // Отправляем
        $.ajax({
            type: 'post',                
            url: callUrl,
            data: ({vibor: vibor})
        }).done(function (response) {
            // Выводим результат
            element.html(response.body);
        });
     });
});
";
$this->registerJs($script);
?>
<div id="choose_forms">
<!-- Single button -->
    <div class="btn-group">
        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            Выберите категорию <span class="caret"></span>
        </button>
        <ul class="dropdown-menu" data-url="<?= yii\helpers\Url::to(['site/test']) ?>">
            <li data-value="16"><a href="#">Категория 16</a></li>
            <li data-value="17"><a href="#">Категория 17</a></li>
            <li data-value="str3"><a href="#">Категория str3</a></li>
            <li role="separator" class="divider"></li>
            <li data-value="18"><a href="#">Категория 18</a></li>
        </ul>
    </div>
</div>
<div class="element">...</div>
Контроллер такой же как и выше.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Почему через AJAX не загружается php файл

Сообщение alexa777 »

Dominus писал(а): 2018.07.12, 17:55
[/code]
Контроллер такой же как и выше.

Вот html код

Код: Выделить всё

 <div id="choose_forms">
        
         <div class="dropdown">
         <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Выберите категорию...<span class="caret"></span></button>
         <ul class='dropdown-menu'>
         <li class='cat-select-item dropdown-submenu' data-value='9' >Авто, транспорт
         <ul class='dropdown-menu'>
         <li class='cat-select-item' data-value='16' >Иномарки</li>
         <li class='cat-select-item' data-value='17' >Отечественные </li>
         </ul>
         </li>
         <li class='cat-select-item dropdown-submenu' data-value='10' >Недвижимость
         <ul class='dropdown-menu'>
         <li class='cat-select-item' data-value='14' >Аренда</li>
         <li class='cat-select-item' data-value='15' >Продажа</li>
         </ul>
         </li>
         <li class='cat-select-item dropdown-submenu' data-value='11' >Работа
         <ul class='dropdown-menu'>
         <li class='cat-select-item dropdown-submenu' data-value='12' >
         Вакансии
         <ul class='dropdown-menu'>
         <li class='cat-select-item' data-value='18' >Водители</li>
         </ul>
         </li>
         <li class='cat-select-item' data-value='13' >Резюме</li>
         </ul>
         </li>
         <li class='cat-select-item dropdown-submenu' data-value='22' >Водитель
         <ul class='dropdown-menu'>
         <li class='cat-select-item' data-value='24' >ghghbj,
         </li>
         </ul>
         </li>
         <li class='cat-select-item' data-value='23' >Автоkmkmkm</li>
         </ul>
         <input type="hidden" id="board-category_id" name="Board[category_id]" value=""/>
         </div>
</div>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему через AJAX не загружается php файл

Сообщение Dominus »

Ну тоже самое, с небольшой коррекцией

Код: Выделить всё

<?php
//...
$script = "
$(function() {
     $('#choose_forms .dropdown-menu li').click(function(e){
        e.preventDefault();
        var callUrl = $('#choose_forms').get(0).dataset.url,
            select = e.currentTarget,
            vibor =  select.dataset.value,
            element = $('.element'),
            hidden = $('#board-category_id');
            
            // console.log(vibor);
        
        $.ajax({
            type: 'post',                
            url: callUrl,
            data: ({vibor: vibor})
        }).done(function (response) {
            element.html(response.body);
            hidden.val(vibor);
        });
     });
});
";
$this->registerJs($script);
?>
<div id="choose_forms" data-url="<?= yii\helpers\Url::to(['site/test']) ?>">
    <!-- ... -->
    <input type="hidden" id="board-category_id" name="Board[category_id]" value=""/>
</div>
<div class="element">...</div>
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Почему через AJAX не загружается php файл

Сообщение alexa777 »

Тут на что надо урл указывать? data-url="<?= yii\helpers\Url::to(['site/test']) ?>">
пробую на board/create дебагер показывает два невыполненных Ajax запроса

И почему то список категорий выпадающих при открытии, уехал вниз браузера за пределы видимости
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему через AJAX не загружается php файл

Сообщение Dominus »

В текущем случае url указывает на контроллер SiteController и в нем экшен actionTest()
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Почему через AJAX не загружается php файл

Сообщение alexa777 »

Dominus писал(а): 2018.07.12, 18:49 В текущем случае url указывает на контроллер SiteController и в нем экшен actionTest()
Спасибо сейчас буду разбирается, если что отпишусь
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Почему через AJAX не загружается php файл

Сообщение alexa777 »

Dominus писал(а): 2018.07.12, 18:49 В текущем случае url указывает на контроллер SiteController и в нем экшен actionTest()
Все получилось, еще раз спасибо
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему через AJAX не загружается php файл

Сообщение Dominus »

AlbertInsOm писал(а): 2018.07.17, 10:30 Есть некоторый текст, который храниться в переменной. Вопрос, как с помощью PHP записать его содиржимое в файл?
Запись в файл

Код: Выделить всё

$content = "Какой то текст";
file_put_contents(Yii::getAlias('@runtime').'/my_text.txt', $content);
Чтение из файла

Код: Выделить всё

$content = file_get_contents(Yii::getAlias('@runtime').'/my_text.txt');
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить