Ajax Select-Меню

Доброго времени суток, ув.участники форума Yii!

Я в Yii совсем начинающий и у меня появилась задача реализовать на Yii с использованием AJAX select-меню.

Задача механизма:

В select-меню имеется несколько пунктов. При выборе какого-либо пункта меню должна меняться вьюшка (сновной шаблон остается, а шаблон контентного наполнения меняется).

Подскажите пожалуйста, как такое реализовать в Yii или где можно почитать про реализацию такой задачи с использованием Yii?

P.S. Прошу прощения, если излагаю неправильными словами. Я ещё новичек тут.

Заранее благодарю за помощь! ::)

По моему роль Yii тут только в том, как "красиво" разместить JS код, который вы должны будете написать сами.

С помощью jQuery вы можете реализовать то, что хотите? Повесить обработчик onChange на ваш select в котором обновлять контент AJAX’ом?

И действительно ли вам нужен AJAX? Например когда задача только в изменении select’a B то порою легче при создании страницы разместить на ней все возможные наборы для SelectB и при переключении SelectA подставлять в SelectB данные со страницы (не обращаясь к AJAX)

Предварительно верстаете странички с наполнением контента.

Собственно вешаете обработчик события onchange на ваш select.

Далее делаете ajax запрос. Например:


$.ajax({

      type:'POST',

      url: "<?php echo CController::createUrl('controller/action');?>",//ваш контроллер или отдельный аякс контроллер

      update: '#content',//ваш ид контента

      data: {selected: $this.val()},// значение вашего селекта

      success:function(data) {

      $('#content').empty();

      $('#content').append(data);//добавляем ответ в контент

      }

    });

Далее переходим к контроллеру.Например:




public function actionAction()

{

   /**

   *Здесь делаете что вам нужно. Например определяете какой файл вывести 

   *в зависимости от select. Значение нам доступно как $_POST['selected']

   */

  $this->renderPartial('content_page',array());//рендерим нужный файл. 

}



Человек написал что он новичок, а вы на него набросились. Он ведь спросил как это реализовать в Yii а не на javascript.

Эта задача у меня возникает часто, например для рендера страниц статистики, на которых есть куча менюшек,grid-ов и графиков. Возможно это не самое лучшее решение но для меня оно работает просто,понятно и быстро.

У меня нет желания набрасываться на новичков, только желание внести ясность, что это задача гораздо более для JS (jQuery) а не Yii.

Касаемо Yii, Ineersa показал хороший пример JS кода, у меня как раз под рукой такого не было, а я тогда покажу как его использовать средствами Yii. Тут лучше не добавлять JS код прямо в представлении. Для этого рекомендую registerScript например:




<?php

$js="$('#Item_drop_from_type').change(function(){

//ваш JS код (AJAX запрос, как выше показал ineersa)

}

})

.trigger('change'); //благодаря этой строке обработчик сработает при отображении страницы (не дожидаясь пока вы первый раз его измените)

"; 


Yii::app()->clientScript->registerScript("SomeUniqString", $js, CClientScript::POS_READY); //таким образом в Yii добавляют JS код



PS: еще правильнее, было бы вынести весь JS код в .js файлы (размещяя их уровнем выше чем папка /protected) и подключая:


Yii::app()->clientScript->registerScriptFile('my_file.js')

таким образом удобнее редактировать сам файл, т.к. там будет подсветка синтаксиса именно JS. Но возникают сложности с передачей параметров из PHP, например нельзя вставить <?php echo CController::createUrl(‘controller/action’);?> но параметры можно передавать через HTML через атрибут data, или любой, который захотите, надеюсь вы понимаете что я имею в виду.

Charger, ineersa, благодарю за ответы и отзывчивость! :)

В приведенных примерах явно вижу много для себя интересного.

Как только выцеплю хоть часок свободного времени, обязательно изучу глубже :rolleyes:

Мне нужно не обновление контента второго select’а в зависисмости от первого. Select у меня один. В зависимости от того, что выбирается в Select - должна происходить смена формы ввода на странице.

Например: Наш Select находится на странице "Справочники". В перечне Select мы имеем такие пункты: "Справочник операционных систем", "Справочник типов подключения к сети", "Справочник производителей мониторов" и тд.

Выбираем в нашем Select "Справочник операционных систем" и на странице должен появится список систем и тд. Если выбирем "Справочник производителей мониторов", то видим список производителей и тд.

Задача состоит в смене контента на странице в зависимости от того, что было выбрано в Select.

Успел немного повникать в предложеные Вами коды.

Это как раз то, что нужно ::)

Спасибо огромное Вам за помощь! Жаль не могу никуда жмякнуть, чтоб + в репутацию поставить :(

Только сейчас смог добраться до исходников. Попытался сделать по предложенным вами вариантам, но ничего не получается :(

То браузер "вешается", то ошибка "Object of class SearchController could not be converted to string".

Браузер "вешается", если добавляю свой js-файл c ajax-запросом, обернутым в функцию в список пакетов Yii. В onchange ставлю ту функцию в которую обернул ajax-запрос. И вставляю js-файлы при помощи


Yii::app()->clientScript

->registerPackage('selsearchtype');

А ошибку "Object of class SearchController could not be converted to string" получаю если делаю следующим образом:

в свой layout до начала любого HTML кода ставлю 

$js="$('#search_th_sel').change(function(){


$.ajax({

      type:'POST',

      url: '<?php echo CController::createUrl('search/index');?>',

      update: '#main_wrapper',

      data: {selected: $this.val('computers')},

      success:function(data) {

      $('#main_wrapper').empty();

      $('#main_wrapper').append(data);

      }

    }).trigger('change'); 

}

})

.trigger('change'); 

"; 


Yii::app()->clientScript->registerScript("selsearchtype2", $js, CClientScript::POS_READY); 

?>

Сам чувствую, что что-то в коде не так, но понять не могу, что именно.

P.S. Ещё, когда браузер "вешается" на какое-то время, то веб-консоль говорит, что слишком много рекурсий

Избавился от всех подвисайний браузера и всего остального. Но теперь другая беда.

Запрос отправляет, но передаваемый аяксу параметр


url: "<?php echo CController::createUrl(search/index);?>",

не работает.

Firebug говорит что:

не отрабатывается php код.

Игрался с кавычками, но толку 0 :(

Спустя несколько минут…

Жаль, что на форуме никого нет :(

Но, монолог таки продолжу.

Решился на крайние меры вандализма.

Вместо


 url: "<?php echo CController::createUrl(search/index);?>",

поставил тупо


url: "http://имя_сайта/index.php?r=search/index",

Работать начало, но через одно (всем хорошо известное) место.

Спустя ещё какое-то время…

Всё стало работать как надо. Но, описанный выше вандальный костыль остался.

Если у кого-то найдётся вариант решения проблемы с этим костылём - буду крайне признателен :)

В вашем случае надо делать так:


url: '".CController::createUrl('search/index')."',

и кстати с $this в строке "[color="#008800"][size="2"]data:[/size][/color][size="2"]" я предполагаю будут проблемы. Вероятно $(this) имелось ввиду? [/size]

Спасибо за замечание. Да имелось ввиду именно


$(this)

. По поводу строки нужно обернуть правильно в кавычки. Если не находит URL попробовать через


Yii::app()->baseUrl

самому.