Yii Framework Forum: Результат Запроса Ajaxlink - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Результат Запроса Ajaxlink Rate Topic: -----

#1 User is offline   ipotupchik 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 02-October 13

Posted 27 March 2014 - 03:29 AM

Добрый день.

Задача следующая: по нажатию на ссылку, поменять контент в двух местах, используя технологию 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')и распределить по ним результат в контроллере?? Или каким образом вообще нужно реализовывать подобную задачу?
0

#2 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 27 March 2014 - 03:34 AM

Мне кажется, люди стали забывать румынского диктатора как пользоваться jquery.
Замените ajaxlink на обычную ссылку и прикрепите к ней свой обработчик, в нем и делайте что душе угодно.
God is real unless declared as integer
0

#3 User is offline   ipotupchik 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 02-October 13

Posted 27 March 2014 - 04:02 AM

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

#4 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 27 March 2014 - 04:16 AM

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

Преимущества - не нужно заморачиваться на регистрацию js-кода в document.ready, не нужно заморачиваться на включение jquery на страницу итд. Короче, враппер такой. Теоретически в ней можно вообще всё что угодно прописать, включая коллбеки success и error (ajaxOptions, http://www.yiiframew...tml#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-разметки?! по возможности избегайте этого.

Отмечу, впрочем, что мнение конкретных авторов может не совпадать с мнением редакции.
God is real unless declared as integer
0

#5 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 27 March 2014 - 04:23 AM

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

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

Для себя я решил это следующим образом. Написал небольшой виджет (по аналогии с CClip), который оборачивается вокруг блока script, выгребает контент и регистрирует в нужное место.
Типа так:
<?php начало виджета ?>
<script>
$('#w0').on('click', function() {...});
</script>
<?php конец виджета ?>


Это позволяет мне с одной стороны держать все обработчики на виду, сохраняя подсветку синтаксиса(!),
с другой - создает корректные зависимости от jquery и прочих библиотек.
God is real unless declared as integer
0

#6 User is offline   ipotupchik 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 02-October 13

Posted 27 March 2014 - 04:53 AM

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

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

#7 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,689
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 27 March 2014 - 05:41 AM

Ну вот с 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">


Так что каждому свое, полагаю.
God is real unless declared as integer
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users