Ajax-загрузка для сложных проектов - PullRequest
6 голосов
/ 27 ноября 2011

Моя проблема на самом деле не в самой загрузке ajax, а в возможности загрузить его без JavaScript. Я имею в виду, я легко справляюсь, когда кодирую весь мой проект просто на основе доступности ajax ИЛИ просто без использования ajax.

// РЕДАКТИРОВАТЬ: Хотя у Аренд уже был более или менее правильный ответ, в то же время «нет прямого ответа на этот вопрос». Тем не менее, я хотел бы увидеть некоторые другие подходы разработчиков для сценариев, как у меня, хотя! Даже несколько ссылок могут помочь!

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

Когда я обновляю, например, два div с зависимостью от одних и тех же переменных, это становится грязным. Вот пример:

без JS-версия

require 'classobject.class.php';
$another_var = 'something';
$class = new classobject($_POST['variable']); // just an example to show that this is dynamic - I'm aware of injection!
$function = $class->returnsth(); // returns 1

if(isset($_POST)) {
    echo '<div id="one">Module 1 says:'; $require 'module_one.php'; echo '</div>';
    echo '<br /><br />';
    echo '<div id="two">Module 2 says:'; $require 'module_two.php'; echo '</div>';
}

Теперь в module_two.php и module_two.php у меня есть код, который выполняется по-разному в зависимости от возвращаемой переменной $ function. Как:

if($function >= 1 && another_var != 'something') {
   // do stuff
}
else { 
   // do other stuff 
}

Теперь, когда это легко работает с перезагрузкой, когда я хочу загрузить два модуля в keyUp / enter / submit или что-то еще, у меня в основном есть несколько проблем:

  • Я должен отправить переменные $_POST вручную модулям, чтобы использовать их
  • Мне нужно повторно выполнить класс и его методы и сделать ссылку (require_once) на них в каждом из файлов-модулей.
  • Так как $ another_var не существует в модулях, я должен был бы отправить эту переменную также каждому модулю (например, с post), а затем, прежде чем его можно будет использовать, мне придется «изменить» его следующим образом $another_var = $_POST['another_var'];

Я нахожу это немного раздражающим, и мне интересно, как вы, ребята, делаете это. Я надеюсь, что мой способ кодирования не слишком глуп, но я не могу придумать другой способ. Вероятно, это трудно соотнести с моим очень простым примером, но привести целый проект с кодом было бы слишком много. Подводя итог, я ищу лучший способ кодирования и устранения этого беспорядка - должен быть способ! Я думал о сессиях, но для совместимости я не хочу полагаться на них либо (если кто-то не разрешает файлы cookie).

В случае, если вы не можете соотнести то, что я пытаюсь выполнить с помощью этого способа сборки моего кода, я объясню сценарий, с которым я сталкиваюсь довольно часто ( не важно, если вы уже понимаете, мои страдания ):

  1. По сути, у меня есть index.php страница, где все выполняется, с использованием html body, css style и так далее. На этой странице ожидаются переменные, которые устанавливаются со страницы, для которой требуется индекс (например, $another_var в моем примере).
  2. Теперь можно установить и другие переменные (например, из формы). В зависимости от этого разные классы и методы загружают новые переменные (массивы), которые используются в циклах while в моих модулях, чтобы выводить все.

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

Ответы [ 2 ]

11 голосов
/ 27 ноября 2011

Нет прямого ответа на ваш вопрос, но есть пища для размышлений.

Отделение концернов Вы можете подумать, можете ли вы разделить свою логику бизнеса и логику компоновки. Часто использование шаблонизатора может сильно помочь в этом. У меня был положительный опыт, например, с Twig или Smarty (некоторое время назад я не был уверен, как они себя сейчас оценивают). Это требует от вас написания кода (менее линейным), но более логичным.

Типичным примером ООП-подобного разделения интересов может быть что-то вроде этого:

$this->setParam('Myparam','myvalue');

if ($this->isAjax())
{
    $this->setTemplate('ajax.php');        
    $this->setLayout(false);
} else {
    $this->setTemplate('normal.php');
    $this->setLayout('Mylayout');
}

return $this->render();

Это образная ситуация, которая встречается во многих MVC, таких как приложения и фреймворки. Основная идея заключается в том, что у вас должна быть возможность отделить макет от ваших данных. Я бы посоветовал взглянуть на некоторые современные фреймворки для вдохновения (такие как symfony, codeigniter, zend framework).

Глоссарий / Часто применяемые концепции в отделенном PHP-приложении Вот краткий список понятий, которые можно использовать.

Пример mvc в php: http://www.phpro.org/tutorials/Model-View-Controller-MVC.html

Примечание: мне не очень нравится реализация. Я гораздо больше предпочитаю существующие рамки. Мне нравится объяснение всего этого урока. Например. для меня эта ссылка для обучения, а не для реализации.

Silex Для простого развязанного php-микро-фреймворка я бы по-настоящему порекомендовал Silex, созданный Symfony2. Его легко реализовать и изучить, но он содержит в себе основные понятия, описанные здесь; и использует все вкусности php 5.3+, такие как пространство имен и замыкания.

см .: http://silex.sensiolabs.org/

Шаблон FrontController Только один и только одна точка входа для вашего кода. У меня обычно только один и только один пункт в вашей заявке. Обычно фронт-контроллер «отправляет» запрос остальной части приложения

http://en.wikipedia.org/wiki/Front_Controller_pattern

Маршрутизация

Система маршрутизации часто используется в сочетании с шаблоном фронт-контроллера. Это в основном описывает, какой URL подключен к какому модулю / контроллеру. Это позволяет вам изменять способ доступа людей к вашему приложению без изменения URL.

См .: https://stackoverflow.com/questions/115629/simplest-php-routing-framework

Контроллер

Контроллер - это место, где применяется логика бизнеса. Получение данных из базы данных, проверка привилегий, настройка шаблона, настройка макета и т. Д. (Хотя это также перемещается за пределы контроллера, если он становится слишком большим из-за отдельной проблемы).

Модель Модель в основном представляет собой уровень, в котором используется управление вашей базой данных. Это может быть простой класс, куда вы перемещаете все свои функции mysql_ *, или это может быть полнофункциональный ORM. Основная философия заключается в том, что вся логика, связанная с извлечением и размещением информации в базе данных, разделена.

Один шаг вверх: ORM В приложениях часто используются методы объектно-реляционных моделей, которые сопоставляют записи SQL с объектами PHP. Doctrine и Propel - две из этих хорошо проработанных библиотек. Я сильно полагаюсь на эти системы в своем развитии. В этом смысле часть доктрины или движущей силы будет представлять модельный слой.

Вид: Представление обычно состоит из шаблонизатора. Некоторые используют обычный PHP в качестве шаблона, другие, такие как Symfony, создают отдельную область, в которой размещаются переменные. Есть много дискуссий и мнений о том, что лучше, один прямо здесь на stackoverflow:

Мне нравятся: - Веточка: http://twig.sensiolabs.org/ - sfTemplate: http://components.symfony -project.org / templating / - Smarty: http://components.symfony -project.org / templating /

Разъединяющие механизмы:

  • Системы, основанные на событиях Использование событий в вашем может помочь отделить код. Например, если вы хотите отправить электронное письмо после сохранения записи, события - хорошее решение для этого; в общем, модель не должна знать об электронной почте. Таким образом, события являются способом их подключения: вы можете позволить вашему -email-send-class прослушивать определенные записи, чтобы они могли отправлять правильные электронные письма. (Возможно, вы захотите, чтобы ваши электронные письма отправлялись с вашего контроллера, это, вероятно, дело вкуса).

  • Инъекция зависимости При использовании ООП-кода в PHP многие полагались на использование одноэлементных классов (конфигурация и т. Д.). С точки зрения ООП, это может считаться плохим, потому что это сложно проверить, и не так уж и элегантно иметь такие зависимости. Внедрение зависимостей - это паттерн, пришедший из Java и теперь используемый в более новых средах для решения этой проблемы. Может быть немного сложно обернуть голову, но вы увидите, что это возвращается в нескольких новых рамках.

Внедрение зависимостей в php: Внедрение зависимостей в PHP 5.3

рамочные:

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

Фреймворки php без фреймворка: https://stackoverflow.com/questions/694929/whats-your-no-framework-php-framework

Хорошие привычки: https://stackoverflow.com/questions/694246/how-is-php-done-the-right-way

Фреймворки, на которые стоит обратить внимание (imho): CodeIgniter, Kahona, CakePHP, Symfony (1.4 / 2.0), Silex, Zend Franework, Yii. Их намного больше, каждый со своими преданными поклонниками и ненавистниками.

0 голосов
/ 05 декабря 2011

Я написал что-то подобное с PHP.Я уже абстрагировал рендеринг каждой страницы так, что я определяю переменную $content, а затем require('layout.php').Переменная $content - это просто большая строка HTML.

Я написал функцию PHP, чтобы определить, был ли запрос AJAX или нет.

Ответы, не относящиеся к AJAX, отображают макет с $contentв середине b / t содержимое макета верхнего и нижнего колонтитула.

AJAX-запросы в основном получают это: json_encode(Array("content"=>$content)).И я использую jQuery, чтобы получить HTML-код из ответа JSON и изменить DOM.Использование json_encode() будет обрабатывать экранирование строки для javascript.

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

Любой браузер, поддерживающий AJAX, можеттакже откройте ссылку в новой вкладке / окне, чтобы имитировать не-AJAX-запрос.(Или добавьте в закладки / поделитесь ссылкой тоже.)

...