Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отличия работы обычного и AJAX веб-приложения, по следам обсуждений 
:(
    Опции темы
Fortop
Дата 11.5.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Собственно тема, отчасти является продолжением двух дискуссий развернувшихся
тут
и 
тут

Вкратце, хотелось бы обсудить и разобрать методику построения, разбиения на модули и взаимодействия между ними и пользователем.
В чем существенные отличия между обычным и ajax-приложением.
Как организовать сохранение view-state для ajax-реализации. (в обычном все очевидно - передавать параметры состояния через url).

Добавлено через 2 минуты и 13 секунд
Цитата(solenko @ 10.5.2008,  23:50)

Цитата(Fortop @  10.5.2008,  13:46 Найти цитируемый пост)
Почему не получать готовый HTML и не выводить его без танцев с бубнами?JSON - может пригодиться для вывода небольшой порции данных.

Обновление блока корзины это большая порция данных? Представьте себе, если бы тот же gmail обновлял при каждом запросе новых писем весь блок сообщений. Лично мне бы такое не понравилось. В случае обновления корзины ответ будет выглядеть как:
Код

{state: success,
  data: {
     sum: 1000,
     quantity: 5
  },
  message: "Товар добавлен в корзину"
}


В этом весь и фокус, что в случае HTML это выглядело бы примерно так
Код

<ul class="basket">
    <li>Сумма: 1000,00</li>
    <li>Кол-во: 5шт.</li>
    <li><div class="info">Товар добавлен в корзину</div></li>
</ul>

И загружалось бы непосредственно в 
Код

<div id="basketplaceholder"></div>


Цитата(solenko @ 10.5.2008,  23:50)

Цитата(Fortop @  10.5.2008,  13:46 Найти цитируемый пост)
 предлагаю разделить view - на блоки.И в данном конкретном случае использовать только блок корзины, а не всей страницы. 

Он и так разделен. Вот только, как я уже писал, в случае plain html у акшина, обрабатывающего добавление в корзину, нет view в принципе, то, в случае axaj, нужно отдавать хоть что-то, т.е. этот view создать.

Это как раз то, на чем я акцентировал внимание. Если у тебя приложение уже разбито на некоторые минимальные блоки, то для него нет разницы как работать в ajax-режиме или нет. Оно великолепно будет работать в обоих случаях.

Цитата(solenko @ 10.5.2008,  23:50)

Цитата(Fortop @  10.5.2008,  13:46 Найти цитируемый пост)

Например вся старница
http://shop/catalog/video/view/full
только корзина
http://shop/catalog/video/view/basket

Ну и? ДО этого был только полный просмотр. И как теперь отдавать другой? Длеать отдельный action? 
Анализировать в action/view параметр и отдавать кусок? Я же и не говорил что нужно будет переверстать все по-другому. Речь как раз о том, что прийдется отдавать не страницу полностью, а только какой-то кусочек (формат абсолютно не важен). 

Именно отдельный action/view
Просто твоя базовая страница - на самом деле представляет собой лишь агрегатор более мелких частей, таких как корзина, линия товара - не весь список, а именно линия 1го конкретного товара. Тогда и обновляться у тебя будет не весь список сообщений в gmail, 
а только конкретное письмо.

Цитата(solenko @ 10.5.2008,  23:50)

Попутно предлагаю решить задачку с предлагаемым вами обменом кусками html )
У пользователя отвалилась сессия. Стандартная реакция -- редирект на форму логина. А как быть если в ответ от сервера ждем кусочек html?
 
Кто нам мешает в этом html - прислать кусочек javascript?
Что-то вроде такого.

Код

window.location = 'труля-ля форма логина';



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 11.5.2008, 16:14 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Я бы посоветовал углубиться в изучение jquery.
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 11.5.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



awers, обалденный совет не в тему smile
jQuery и так пользуюсь smile

Но здесь речь идет о другом. Об организации и архитектуре приложения в целом.
Какие есть варианты правильно все спроектировать, чтобы потом не было мучительно больно, от очередного извращения заказчика smile

По-большому счету приложению должно быть до лампочки, выводишь ты все как обычно, фреймами или через AJAX. Вот мнения как этого достичь и интересуют smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 11.5.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



я использую что то вроде

service->| Frontend |->| js
              | Backend        | php

если по архитектуре. в основном приложении есть Frontend loader (js+html), автоматическая инициализация загружаемого куска module_init .. 

про это? (что то вообще с мыслями собраться немогу)
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 11.5.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



awers, 
Вот смотри. Допустим у нас есть страница/каталог магазина. Накидаем на нее побольше ерунды, чтобы разбирать было интереснее
На которой
а) список товаров
б) лента каких-нибудь новостей
в) корзина
г) меню

Это если крупным планом smile

Соответственно имеем к примеру 
action/catalog/ 
который рендерит один view. В который входит список и корзина. Новости и меню - у нас общие на весь сайт и за них допустим отвечает класс предок.

Но при такой детализации.... захотели обновить список - и обновляем его весь, а это не кошерно, на что и указывал solenko
Какие будут мнения? smile

Добавлено через 2 минуты и 5 секунд
Да и упустил, работать варианты должны, как под AJAX, так и стандартно, без существенных архитектурных изменений.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 11.5.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Fortop, а вот скажи, оправдано ли усложнение такого характера? по моему мнению - это по большей части - трата собственного времени впустую. это и не такая уж и необходимая феничка. 
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 11.5.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



awers, smile пока это сферические кони в вакууме. 
Для конкретного магазина - проще новый написать, если изначально писал криво.

Но так сложилось, что есть системы с затратами труда более 5ти человеколет. И тут переписывать все заново - не самое лучшее решение.

Это сообщение отредактировал(а) Fortop - 11.5.2008, 16:49


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
solenko
Дата 12.5.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(Fortop @  11.5.2008,  14:59 Найти цитируемый пост)

В этом весь и фокус, что в случае HTML это выглядело бы примерно так ...
И загружалось бы непосредственно в ...

Т.е. общесистемное сообщение показывается неизвестно где в блоке корзины...
Случаи когда мы можем показать просто полученный html еденичны. Намного ведь лучше если обновится блок корзины, а сообщение появится с какаим-то ярким оформлением под шапкой сайта и потом будет "затухать" вплоть до полного ищезновения. 

Цитата(Fortop @  11.5.2008,  14:59 Найти цитируемый пост)
Именно отдельный action/viewПросто твоя базовая страница - на самом деле представляет собой лишь агрегатор более мелких частей, таких как корзина, линия товара - не весь список, а именно линия 1го конкретного товара. Тогда и обновляться у тебя будет не весь список сообщений в gmail, а только конкретное письмо.

Пример в студию! Если я себе прекрастно представляю как может быть достпна корзина через front_controller, то отдельное сообщение... 
Да и смысл вопроса моего вы поняли не верно. Не важно что у вас уже есть сверстаный отдельно блок корзины. У вас запрос приходит на ОБНОВЛЕНИЕ корзины. И в него вам все равно прийдется внести изменения (разговор то был изначально о трудоемкоти добавлния ajax на сайт без оного). 
Если у вас просмотр части корзины оформлен как отдельный action (хотя я против такого подхода), то вам нужно добавить анализ "а не от xmlhttp ли у нас запрос пришел" и редирект на просмотр блока корзины, а не на Referer.
Если как некий компонент, подключаемый только из view, то прийдется добавить этот самый view и в нем подключать этот самый блок.

Цитата(Fortop @  11.5.2008,  14:59 Найти цитируемый пост)
Кто нам мешает в этом html - прислать кусочек javascript?

Браузеры мешают. Они его просто не выполнят )

Ну и в конце по уже новой теме )
Разници нет никакой. Есть просто некий объем дополнительной работы, коотрый приходится выпонять. А именно, добавлять альтернативное отображение. Я считаю, что за отображение данных должен отвечать JS на стороне клиента, а не отданный с сервера ответ. Именно потому не признаю обмен кусками html. 



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 12.5.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



box.phtml
Код

<?php
$this->render('header');
$this->render('list');
$this->render('footer');
?>

list.phtml
Код

<?php
foreach ($this->data as $row) {
    $this->render('line');
}
?>

Соответсвенно. 

Я специально упростил. Вообще тут должны быть еще имена контролеров и возможно параметры.

Цитата(solenko @  12.5.2008,  13:09 Найти цитируемый пост)
Пример в студию!

Доступ к отдельному сообщению

Код

http://site/app/box/in/line/1


controller - box
view - in
params - line/1
Рендерим только     
Код

$this->render('line');


Обработка списка, если он вызван как обычно
Код

$this->render('box');
//или
$this->render('box/in');


Цитата(solenko @  12.5.2008,  13:09 Найти цитируемый пост)
Браузеры мешают. Они его просто не выполнят )

Ты знаешь, у меня в jQuery - выполняют. И сообщение я могу вывести где угодно и как угодно затухающим.

Сохранить на диске как a.html
Код

<html><head><title>Sample</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head><body>
<div id="tableContainer" class="tableContainer">
<table class="scrollTable" border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody class="scrollContent">
    <tr class="normalRow">
        <td>Cell Content 1</td>
        <td>Cell Content 2</td>
        <td>Cell Content 3</td>
    </tr>
    <tr class="alternateRow">
        <td>More Cell Content 1</td>
        <td>More Cell Content 2</td>
        <td>More Cell Content 3</td>
    </tr>
    <tr class="normalRow">
        <td>Cell Content 1</td>
        <td>Cell Content 2</td>
        <td>Cell Content 3</td>
    </tr>
    <tr class="alternateRow">
        <td>More Cell Content 1</td>
        <td>More Cell Content 2</td>
        <td>More Cell Content 3</td>
    </tr>
</tbody>
</table>
</div>
<div id="ajax">
</div>
<input type="button" onclick="$('#ajax').load('a.html');" value="Load">
</body>
<script type="text/javascript">
$(document).ready(function () {
alert('loaded');
});
</script>
</html>


Добавлено @ 13:50
Цитата(solenko @  12.5.2008,  13:09 Найти цитируемый пост)
Разници нет никакой. Есть просто некий объем дополнительной работы, коотрый приходится выпонять. А именно, добавлять альтернативное отображение

Ок, мысль я понял.

Тогда вопрос. Если разбивать на блоки-модули, как я предлагаю, - насколько существенной будет разница между стандартной и ajax реализацией?
Насколько я вижу, дополнительный объем работы будет заключаться только в подключении ajax-обработчиков. Весь необходимый функционал уже реализован.

Это сообщение отредактировал(а) Fortop - 12.5.2008, 13:51


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
solenko
Дата 12.5.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Fortop, вот на приере строки сообщений. Ваш render -- обращение к модулю через контроллер, приравниваемый к обычному вызову?
->render('line'); выполняет какие-то запросы к базе или он принимает данные, которые рендерит параметрами?
Если он принимает данные параметрами, то откуда он их возимет при "http://site/app/box/in/line/1"?
Если выполняет запросы, то не много ли запросов на одну страницу (список из 50 сообщений это минимум 50 запросов)? 
Если "смотрит откуда его вызвали", то не черезмерное ли это усложенеие таких простых операций как рендеринг html?

Цитата(Fortop @  12.5.2008,  12:46 Найти цитируемый пост)
Тогда вопрос. Если разбивать на блоки-модули, как я предлагаю, - насколько существенной будет разница между стандартной и ajax реализацией?

Функционал реаизован при любом подходе ) Данные то у вас и так загрухались/изменялись ) Все остальное вам все так же прийдется делать. Все на том же замученном примере корзины. Было:
Код

function addBasketAction() {
  $this->validateBasketData();
  $this->saveBasketData();
  $this->redirect($this->getReferer());
}

В моем варианте это превратиться в:
Код

function addBasketAction() {
  $this->validateBasketData();
  $basket = new Basket($this->getUser());
  $basket->add($_POST['basket']);
  $basket->save();
  if ($this->isXMLHTTPRequest())
    $response = array("Status"=> "success", 
       "data" => array(
          "sum" => $basket->getSum(),
          "quantity" => $basket->getQuantity(),
       ),
       "message" => "Товар добавлен в корзину");
    $this->renderText(json_encode($response));
  else
    $this->redirect($this->getReferer());
}

А с вашим подходом изменения по трудоемкости будут отличатся? На стороне js, да. На стороне сервера -- очень врядли.

Цитата(Fortop @  12.5.2008,  12:46 Найти цитируемый пост)
Ты знаешь, у меня в jQuery - выполняют. И сообщение я могу вывести где угодно и как угодно затухающим.

Т.е. html, приходящий на вход все равно аназируется, разбивается на части, показывается в разных частях страници? Тогда вообще становится сомнительным обмен html-ем. Хотя вру, конечно, есть разница. При изменении верски какого-то блока нет необходимости вносить изменения в js.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 12.5.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(solenko @  12.5.2008,  14:28 Найти цитируемый пост)
Если он принимает данные параметрами, то откуда он их возимет при "http://site/app/box/in/line/1"?
Если выполняет запросы, то не много ли запросов на одну страницу (список из 50 сообщений это минимум 50 запросов)? 
Если "смотрит откуда его вызвали", то не черезмерное ли это усложенеие таких простых операций как рендеринг html?

Очень важные моменты smile
Надо подумать.

Какие есть идеи?

Цитата(solenko @  12.5.2008,  14:28 Найти цитируемый пост)
Данные то у вас и так загрухались/изменялись ) Все остальное вам все так же прийдется делать

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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Fortop
Дата 22.5.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Итак smile поскольку свежих идей не появилось, то мусолим старые.

Цитата(solenko @  12.5.2008,  14:28 Найти цитируемый пост)
Если он принимает данные параметрами, то откуда он их возимет при "http://site/app/box/in/line/1"?
Если выполняет запросы, то не много ли запросов на одну страницу (список из 50 сообщений это минимум 50 запросов)? 
Если "смотрит откуда его вызвали", то не черезмерное ли это усложенеие таких простых операций как рендеринг html?


Ответ на все эти если. Получив вызов мы из имеющихся параметров строим условие фильтра и выполняем 1! запрос.
Если параметры есть, то взапрос нам отдаст line = 1
Если параметров нет - то запрос нам отдаст весь список.

Соответственно при первой загрузке нам нужен весь, параметров нет - выводим все одним махом.
Если происходит обращение к какой-то конкретной записи, параметр появляется - выводим только одну запись.

Никаких 50 запросов не будет. Только если пользователь решит поочередно все 50 записей просмотреть в одиночном режиме. Но в этом случае обходных путей по-большому счету - нет.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.