@akula22

Как сделать ссылку с параметрами для Ajax?

Хочу при нажатие на ссылку получить данные из контроллера без обновления страницы, то есть аяксом
<?= Html::a('подробнее', ['/site/default/news', 'id'=>(int)$item->id], [ 
							'class' => 'btn btn-small', 
        					'data' => [ 
        					    'data-method' => 'post',
       						], 
    					]) ?>

<?php
$js = "$('.btn').on('click', function() 
    {
        $.post(
            \"/site/default/news\", {
                id :   тут надо передать айди новости
            },
           
        )
    }
)";
$this->registerJs($js, $this::POS_READY);
?>


Но при нажатие на ссылку меня перекидывает на страницу /site/default/news как сделать чтою страница оставалось той же? и как отправить айди в контроллер
  • Вопрос задан
  • 245 просмотров
Пригласить эксперта
Ответы на вопрос 2
@edojdikov
Senior PHP developer
Смотря какая версия Yii.
В 1 версии смотрите на CHtml::ajaxSubmitButton.
Во 2 версии не могу найти подобное, может кто подправит меня.

Но можно подобным способом, что вы написали, только не забудьте отменить действие клика по ссылке, например:
$('.btn').on('click', function(e){
    e.preventDefault();
    /** код */
});

А так же в обработчике укажите, куда грузить контент из ajax:
$.post(
    "/site/default/news",
    {id : /** id новости */},
    function(data){
        $('#content').html(data);
    }
);
Ответ написан
@akula22 Автор вопроса
Вот уже вторые сутки бьюсь с этим аяксом, получилось вот что:

Есть блок, который при нажатие на ссылку раскрывается скратким описанием новости, и ниже есть кнопка подробнее.
<td>
				<?= Html::a($item->title, 'javascript:show("newsid", ' . (int)$item->link . ')') ?> 
			</td>
			<tr>
				<td>
					<div style="display:none" id="newsid_<?= (int)$item->link ?>">
						<?= $item->description ?>

						<?= Html::a('подробнее', ['/site/default/footballnews', 'id'=>(int)$item->link], [ 
							'id' => 'link_fnews',
							'class' => 'btn btn-small', 
        					'data' => [ 
        					    'data-method' => 'post',
       						], 
    					]) ?>  
					</div>
				</td>


при нажатие подробнее срабатывает функция JS
<?php
$js = "$('#link_fnews').on('click', function(e) 
    {
    	e.preventDefault();
    	var link = $(this).attr('href');
		var id = link.split('?id=');  //  парсю строку и получаю чистый ID новости

    	$('#link_fnews').html('<i class=\"fa fa-spinner fa-pulse\"></i>');   //  здесь гружу анимацию(loading)
        
        $.post
        (
        	link, 
        	function(data)
        	{

        		$('#link_fnews').html('');  //  убираю анимацию
        		$('#newsid_'+id[1]).append(data)   //  грузим новость в блок с айди новостью
        	}
		);
    }
)";
$this->registerJs($js, $this::POS_READY);
?>


в контроллере я получаю новость по айди и возвращаю ее echo $content;

Если я запрашиваю первую новость, то все хорошо, все как надо, а если любую другую то меня кидает на станицу /site/default/footballnews?id=379255 и там текст новости, почему это происходит? как исправить
и второй вопрос, можно ли оптимизировать мой код?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы