Форум программистов, компьютерный форум, киберфорум
Наши страницы
Symfony
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.85
DEA7H
.NET ONLY
66 / 66 / 7
Регистрация: 05.10.2011
Сообщений: 495
#1

Ajax запросы в Symfony 2 - Symfony

31.07.2013, 21:01. Просмотров 4274. Ответов 11
Метки нет (Все метки)

Здравствуйте.

Как в Symfony правильно использовать AJAX? Тоесть, как мне асинхронно сделать запрос к определенному Action-у контроллера и получить ответ?

А то сколько искал в мануалах да и вообще, нигде не видел создание XMLHttpRequest(). Так вот и думаю, может Symfony позволяет осуществлять асинхронные запросы как-то по своему?

Заранее благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 21:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ajax запросы в Symfony 2 (Symfony):

Перенаправить запросы в подпапку Symfony 3.2
Все как бы гениально просто и типично)) 100500 туториалов, но ни один не...

Как отправить Ajax в Symfony
Всем привет. Подскажите как в Symfony правильно отправлять Ajax запросы. Делаю...

Doctrine | Symfony | Lazy | ajax Очень много страшных слов
Здравствуйте, помогите пожалуйста сделать красиво и правильно. Есть страница...

Symfony 2.*
Всем привет. Недавно начал изучать Symfony. Я так думаю у меня будет возникать...

Symfony 2
Я новичок в symfony и поэтому решил посоветоватся с теми у кого больше опыта ....

Symfony + Angular 4
Здравствуйте. Вопрос по общей архитектуре проекта с использованием Symfony +...

11
Alorian
691 / 531 / 40
Регистрация: 22.06.2009
Сообщений: 1,291
01.08.2013, 06:17 #2
Цитата Сообщение от DEA7H Посмотреть сообщение
нигде не видел создание XMLHttpRequest()
А какое отношение к созданию XMLHttpRequest имеет symfony?
Для работы ajax нужны две стороны — клиентская и серверная.
Symfony работает на сервере, объект xmlhttprequest создается на клиенте, в браузере, с помощью javascript.

Для работы ajax нужно чтобы клиент сделал обычный GET или POST запрос на сервер. На сервере уже в зависимости от запроса отработается определенный action. Что вернется на клиент зависит уже от этого конкретного action. Можно json вернуть, можно кусок html, можно xml. Смотря что вы в action напишите.
0
KOPOJI
01.08.2013, 09:37
  #3

Не по теме:

Alorian, большинство фреймворков имеют готовые компоненты для быстрого создания AJAX-запросов. Например, в Yii это такое http://www.yiiframework.com/doc/api/1.1/CHtml#ajax

1
Alorian
691 / 531 / 40
Регистрация: 22.06.2009
Сообщений: 1,291
01.08.2013, 10:18 #4
KOPOJI, не знал. Спасибо.
В любом случае пользоваться не стал бы. Я js даже от html стараюсь отделять, не то что от php.
0
DEA7H
.NET ONLY
66 / 66 / 7
Регистрация: 05.10.2011
Сообщений: 495
01.08.2013, 10:21  [ТС] #5
Цитата Сообщение от Alorian Посмотреть сообщение
А какое отношение к созданию XMLHttpRequest имеет symfony?
Я не говорил что этот компонент имеет какое-то отношение к Symfony. Я говорил что нигде нет примеров такого использования. Значит может правильнее будет как-то по другому. Спрашивал я именно о чем то типа этого:
Цитата Сообщение от KOPOJI Посмотреть сообщение
большинство фреймворков имеют готовые компоненты для быстрого создания AJAX-запросов. Например, в Yii это такое http://www.yiiframework.com/doc/api/1.1/CHtml#ajax
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
01.08.2013, 10:34 #6
зря, удобно. К примеру, такой код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo CHtml::ajaxLink(
    'Текст ссылки',
    Yii::app()->createUrl( 'контроллер/метод' ),
    array(
        'type' => 'POST',
        'beforeSend' => 'function( request )
        {
            alert("Бла бла бла");
        }',
        'success' => 'function( data )
        {
            $("#mposter").html(data);// получили данные - обновили DIV
        }',
        'data' => array( 'val1' => '1', 'val2' => '2' ), // посылаем значения
        'cache'=>'false' // если нужно можно закешировать
    ),
    array(
        'href' => Yii::app()->createUrl( 'ajax/new_link' ),// подменяет ссылку на левую
        'class' => "someclass" // добавляем какой-нить класс для оформления
    )
);
Генерирует
HTML5
1
<a href="/сайт.ru/ajax/new_link/" class="someclass" id="yt1">Текст ссылки</a>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
/*<![CDATA[*/
jQuery(function($) {
jQuery('body').on('click','#yt1',function(){jQuery.ajax({'type':'POST','beforeSend':function( request )
        {
            alert("Бла бла бла");
        },'success':function( data )
        {
            $("#mposter").html(data);// получили данные - обновили DIV
        },'data':{'val1':'1','val2':'2'},'cache':'false','url':'/сайт.ру/контроллер/метод/'});return false;});
});
/*]]>*/
</script>
Предварительно подключая jquery (если он еще не был подключен).
Удобно же

Добавлено через 4 минуты
http://habrahabr.ru/post/149378/
http://symfony.com/legacy/doc/jobeet/1_2/ru/18?orm=Propel
1
DEA7H
.NET ONLY
66 / 66 / 7
Регистрация: 05.10.2011
Сообщений: 495
01.08.2013, 10:37  [ТС] #7
Цитата Сообщение от KOPOJI Посмотреть сообщение
Спасибо. Почитаем.
0
Alorian
691 / 531 / 40
Регистрация: 22.06.2009
Сообщений: 1,291
01.08.2013, 11:11 #8
Цитата Сообщение от KOPOJI Посмотреть сообщение
зря, удобно
А в чем удобство? Какая то дикая смесь html, php и js. В чем преимущества?
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
01.08.2013, 11:21 #9
Где вы увидели дикую смесь?
И фреймворки вообще не нужны? Ведь даже простая ajax-пагинация, по сути, есть ничто иное, как смесь php, html и js. Впрочем, не буду спорить, не хотите использовать одно из преимуществ фреймворков - ваше право
0
Alorian
691 / 531 / 40
Регистрация: 22.06.2009
Сообщений: 1,291
01.08.2013, 11:43 #10
Цитата Сообщение от KOPOJI Посмотреть сообщение
Ведь даже простая ajax-пагинация, по сути, есть ничто иное, как смесь php, html и js.
Почему ajax-пагинация обязательно смесь? Можно же отдельно сделать.
В action собираем данные в зависимости от поступившего запроса.
В шаблоне данные превращаем в html
В js файле повесили обработчики на ссылки из пагинации и отправляем запросы по клику.
Все на своих местах.

А вот в коде который приведен выше нужно знать последовательность параметров функции-генератора. Я бы не хотел потом это редактировать, да еще и без подсветки синтаксиса.

Но кому-то нравится наверное. Не зря же функцию сделали.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
01.08.2013, 12:43 #11
Кликните здесь для просмотра всего текста
Цитата Сообщение от Alorian Посмотреть сообщение
Все на своих местах.
Да, только, если следовать стандартной структуре, то у вас будет один общий шаблон, вы редактируете только часть с контентом (в основном).
Итого, получается несколько возможных вариантов:
1. На всех страницах будет подключаться один и тот же скрипт (к примеру, слайдер картинок), т.к. придется закинуть его в лайоут, чтобы он был "на месте" (для валидатора)
2. Писать скрипт "не на месте" - посередине контента.
Цитата Сообщение от Alorian Посмотреть сообщение
А вот в коде который приведен выше нужно знать последовательность параметров функции-генератора
1. Не нужно, их можно размещать в любом порядке.
2. Документации полно.
3. Без подсветки синтаксиса - только часть кода(js). При желании этот код можно скопировать и отредактировать с подсветкой, а затем заменить обратно.
4. Имхо, куда удобнее писать интутивно понятный код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_viewBuy',
       /* 'sortableAttributes'=>array(
                'ads_name',
        ),*/
       'summaryText' => 'Отображены записи с <b>{start}</b> по <b>{end}</b> из <b class="count_list">{count}</b>',
        //'sorterHeader' => 'Сортировать по',
        'pager' => array(
            'firstPageLabel'=>'&laquo;&laquo;',
            'prevPageLabel'=>'&laquo;',
            'nextPageLabel'=>'&raquo;',
            'lastPageLabel'=>'&raquo;&raquo;',
            'maxButtonCount'=>'10',
            'header'=>'<span>Страницы:</span>',
            //'cssFile'=>false,
       ),
        'ajaxUpdate' => false,
        'enableHistory'=>true,
)); ?>
Нежели писать кучу кода на js (а ведь здесь автоматическая ajax-пагинация, с использованием history API)
Куда удобнее выводить форму, где идет автоматическая проверка корректности заполнения полей всего парой команд, нежели кучей кода. К тому же возможна гибкая настройка как правил валидации, так и сообщений об ошибках.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$change = array(
                    'type'  =>  'POST',
                    'url'   =>  CController::createUrl('upload/type'),
                    'data'  => array(
                        'type_id' => 'js:this.value',
                    ),
                    'dataType'  => 'json',
                    'success'   => 'function (data)
                                    {
                                        document.getElementById("first").innerHTML = data.first
                                        document.getElementById("second").innerHTML = data.second
                                    }'
                );
...........
 
$form=$this->beginWidget('CActiveForm', array(
            'id'=>'upload-form',
            'enableClientValidation'=>true,
            'clientOptions'=>array(
                    'validateOnSubmit'=>true,
                    'validateOnChange'=>true,
            ),
            'htmlOptions' => array('enctype' => 'multipart/form-data'),
    )); ?>
<div class="row">
<?php
echo $form->labelEx($model, 'type');
echo $form->dropDownList($model,'type',$select,array('onChange'=>CHtml::ajax($change)));
echo $form->error($model, 'type');
?>
</div>
HTML5
1
2
3
4
5
6
7
<select onchange="jQuery.ajax({'type':'POST','url':'/ads/upload/type/','data':{'type_id':this.value},'dataType':'json','success':function (data)
{
    document.getElementById(&quot;first&quot;).innerHTML = data.first
    document.getElementById(&quot;second&quot;).innerHTML = data.second
},'cache':false});" name="Upload[type]" id="Upload_type">
<option..............
</select>
Javascript
1
2
3
4
5
6
7
8
9
/*<![CDATA[*/
jQuery(function($) {
$('#upload-form').yiiactiveform({'validateOnSubmit':true,'validateOnChange':true,'attributes':[{'id':'Upload_type','inputID':'Upload_type','errorID':'Upload_type_em_','model':'Upload','name':'type','enableAjaxValidation':false,'clientValidation':function(value, messages, attribute) {
 
if($.trim(value)=='') {
    messages.push("\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0438\u043f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f");
}
});
/*]]>*/
Я правда не понимаю, как можно не пользоваться таким возможностями (в чем смысл с использования фреймворка тогда вообще? "Чтоб было"?)
0
Alorian
691 / 531 / 40
Регистрация: 22.06.2009
Сообщений: 1,291
01.08.2013, 13:35 #12
Цитата Сообщение от KOPOJI Посмотреть сообщение
Итого, получается несколько возможных вариантов:
1. На всех страницах будет подключаться один и тот же скрипт (к примеру, слайдер картинок), т.к. придется закинуть его в лайоут, чтобы он был "на месте" (для валидатора)
2. Писать скрипт "не на месте" - посередине контента.
Во первых, вовсе необязательно подключать скрипт на все страницы. Например в symfony можно объявить блок внутри head и потом из любого контроллера добавлять в него вызов js-скрипта. То есть скрипт будет добавлен только после выполнения соответствующего action, если action не выполняется, то и скрипт в область head не подставляется.

Во вторых, я ничего не вижу плохого в том, чтобы js скрипт был посередине контента. Перед или лучше даже сразу после того html кода с которым он работает. В этом случае не потребуется проверка window.onload или $(document).ready(). Вполне нормальная ситуация, хотя я стараюсь выносить все в head.

Цитата Сообщение от KOPOJI Посмотреть сообщение
4. Имхо, куда удобнее писать интутивно понятный код
...
Нежели писать кучу кода на js (а ведь здесь автоматическая ajax-пагинация, с использованием history API)
Может для вас этот код и является интуитивно понятным, но для меня нет. Вызывается какой то виджет, в него передается непонятная переменная $dataProvider и задаются какие то параметры.
Почему я сразу должен этот код понять, не знаю.

Цитата Сообщение от KOPOJI Посмотреть сообщение
Я правда не понимаю, как можно не пользоваться таким возможностями (в чем смысл с использования фреймворка тогда вообще? "Чтоб было"?)
Мне еще с wordpress не нравятся подобные методы. Под каждую какую то мелкую операцию написана микро функция, которая должна упростить программирование. Мне кажется это сомнительным. Фреймворк предоставляет удобный механизм хранения данных, структурирует код. Кроме того фреймворк предоставляет какой то готовый функционал. Это безусловно. Но вот степень готовости может отличаться, и здесь мы с вами расходимся во мнении.

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

Насчет пагинации я не уверен, если там можно просто сделать запрос к бд, и потом отдать результат запроса в какой то черный ящик, а на выходе мы получим html списка с ajax пагинацией, то это может быть удобно. Здесь не уверен, надо пробовать. Может там какой то неустраивающий меня html будет генерироваться, и будет проще вручную самому написать, чем исправить готовое.
0
01.08.2013, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2013, 13:35
Привет! Вот еще темы с решениями:

Блог на Symfony 2
Привет всем симфонистам, не так давно начал изучать симфони, сейчас делаю...

XAMPP+Symfony
Добрый день. Понимаю что тема очень простая, но все же никак не могу решить эту...

Книжка о Symfony
Кто-то может посоветовать какуе-то книжку кто можно прочитать о Symfony, или...

Symfony $_SESSION
Не могу понять как использовать $_SESSION на Symfony. Добавлено через 23...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru