Результат Запроса Ajaxlink

Добрый день.

Задача следующая: по нажатию на ссылку, поменять контент в двух местах, используя технологию ajax.

Я реализовал изменение контента по 1 селектору (все прекрасно работает)

Ниже листинг контроллера и частичный листинг views (ключевые моменты).

controllers/VacanciesController.php




class VacanciesController extends Controller

{

    public function actionIndex($currentCity = 1) {

        $model = new Vacancies();

        

        if(Yii::app()->request->isAjaxRequest){

            $this->renderPartial('vacanciesList', [

                'model' => $model,

                'currentCity' => $currentCity,

            ]);

        }

        else {

            $this->render('index', [

                'model' => $model,

                'currentCity' => $currentCity,

            ]);

        }       

    }

}



views/vacancies/index.php




<!--...-->

<div id = 'selector1'></div>

<!--...-->

<div class="container_vacancies">

    <?php $this->renderPartial('vacanciesList', [ 'model' => $model, 'currentCity' => $currentCity]); ?>

</div>

<!--...-->

<?= CHtml::ajaxLink($city->title, ['', 'currentCity' => $city['id']],

    ['update' => '.container_vacancies'],

    ['style' => 'font-weight: bold;', 'type' => 'submit']

) ?>



Каким образом можно прописать несколько ‘update’ в CHtml::ajaxLink (кроме ‘.container_vacancies’ использовать еще и ‘#selector1’)и распределить по ним результат в контроллере?? Или каким образом вообще нужно реализовывать подобную задачу?

Мне кажется, люди стали забывать румынского диктатора как пользоваться jquery.

Замените ajaxlink на обычную ссылку и прикрепите к ней свой обработчик, в нем и делайте что душе угодно.

Да, так можно сделать. Но меня тогда интересует вопрос, а в чем преимущество CHtml::ajaxLink, если технологию ajax можно в полной мере применять, используя jquery? Или CHtml::ajaxLink обладает своими плюсами только в сугубо конкретных случаях, а все остальное лучше реализовывать через сторонние библиотеки JavaScript с API для AJAX?

ajaxLink - это для ленивых, кому неохота пару строк кода писать.

Преимущества - не нужно заморачиваться на регистрацию js-кода в document.ready, не нужно заморачиваться на включение jquery на страницу итд. Короче, враппер такой. Теоретически в ней можно вообще всё что угодно прописать, включая коллбеки success и error (ajaxOptions, http://www.yiiframework.com/doc/api/1.1/CHtml#ajax-detail)

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

То есть, вместо


<a id="w0" href="/some/link">click me</a>

...

<script>

...

$('#w0').on('click', function() {...});

...

</script>

код вьюхи выглядит примерно как


<?= CHtml::ajaxLink($city->title, ['', 'currentCity' => $city['id']],

    ['success' => new CJavaScriptExpression('function(html){jQuery("'.$options['update'].'").html(html); console.log(html); doSomethingElse();}'),

    ['style' => 'font-weight: bold;', 'type' => 'submit']

) ?>



Лично мое мнение - это полный п*здец. Вызывать в html-файле php-инструкции для вывода html-разметки?! по возможности избегайте этого.

Отмечу, впрочем, что мнение конкретных авторов может не совпадать с мнением редакции.

И, да, к вопросу о регистрации кода в нужное место.

Понятно, что вся долбаная идея заключается в том, чтобы посадить обработчики ПОСЛЕ регистрации библиотеки jQuery, иначе будет $ is not defined.

Для себя я решил это следующим образом. Написал небольшой виджет (по аналогии с CClip), который оборачивается вокруг блока script, выгребает контент и регистрирует в нужное место.

Типа так:


<?php начало виджета ?>

<script>

$('#w0').on('click', function() {...});

</script>

<?php конец виджета ?>

Это позволяет мне с одной стороны держать все обработчики на виду, сохраняя подсветку синтаксиса(!),

с другой - создает корректные зависимости от jquery и прочих библиотек.

Спасибо за помощь, я так понимаю, преимущества и недостатки относятся не только к ajaxLink, а в принципе к CHtml (нормально работает только в простых случаях). А про ‘success’ для ajaxLink я чуть раньше наткнулся в ‘yii. Сборник рецептов’ и вот это как-то совсем не круто, писать код в строке без подсветки синтаксиса. Так что эту задачу я решу с помощью старого доброго jQuery))

Еще раз спасибо за помощь.

Ну вот с CHtml, кстати, ситуация немного другая.

При помощи CHtml хорошо делать формы, например. Скажем так, код типа


<?= CHtml::activeTextField($model, 'attribute') ?>

выглядит почище, чем


<input type="text" id="тут как-то id генерировать" name="НазваниеМодели[атрибут]" value="тут вообще фиг знает что" />

А уж про селекты и чекбокс-листы даже думать не хочется.

По крайней мере, в таком CHtml::activeПолеФормы() нет смешения html, php и js. Я рассматриваю его тупо как виджет и не парюсь.

Хотя чисто технически генерацию полей можно разобрать по кирпичикам, у CHtml есть внутренние методы для работы с каждым атрибутом (activeId(), activeName() и так далее).

Ну, то есть при написании подобного кода я руководствуюсь, в первую очередь, двумя вещами:

  1. как оно выглядит у меня в редакторе (подсветка, форматирование)

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

Пример: допустим, нам надо сделать кнопку сабмита формы.

Для этого, теоретически, есть submitButton(), но сразу появляются вопросы:

  • Зависит ли сгенерированный html от каких-то данных? Ну, скорее всего - нет, кнопка она и есть кнопка.

  • Зачем использовать php для вывода чистого html? Возможно, для того, чтобы навесить на нее какой-то дополнительный функционал, типа js.

  • Сработает ли этот функционал, если пользователь засабмитит форму нажатием enter? Вероятно, нет.

Ну значит делаю кнопку обычным html-тегом, а все события, которые в перспективе могут появиться, перевешиваю на on(‘submit’) формы.

Вот примерно такая логика.

PS. Хотя встречал людей, которым не нравится чистый html сразу после пхп-кода:


<?= Chtml::activeInput() ?>

<input type="submit">

Так что каждому свое, полагаю.