Интегрируйте приложение Ext JS 4.1 MVC в переписанный URL-адрес (mod_rewrite) в разработке и производстве.

Создание нового приложения Ext JS 4.1.1 на основе раздела файловой структуры в Руководство по архитектуре приложения MVC В итоге я получил следующую структуру:

/wwwroot
    /myapplication
        /app
            /controller
            /view
        app.js
    /extjs-4.1.1

Файл app.js содержит:

Ext.Loader.setConfig({
    enabled: true
});

Ext.application({
    appFolder: '/myapplication/app',
    autoCreateViewport: true,
    name: 'MyApplication',
    controllers: [
        ...
    ]
});

Все в порядке. Затем я включаю файл app.js для вывода в мое серверное приложение MVC (не путать со структурой клиентского Ext JS MVC). Используемый язык и структура серверного приложения не имеют значения для этого вопроса, важен результат вывода. В разработке URL-адрес приложения:

http://servername/someidentifier1/someidentifier2

Как и во многих приложениях, mod_rewrite используется для придания значения идентификаторам и сопоставления URL-адреса с кодом на стороне сервера. Эти идентификаторы не сопоставляются с "физическими" каталогами. Вывод этого URL:

<!DOCTYPE html>
<html>
<head>
<title>MyApplication</title>
<link href="/extjs-4.1.1/resources/css/ext-all-debug.css" media="screen" rel="stylesheet" type="text/css" >
<script type="text/javascript" src="/extjs-4.1.1/ext-debug.js"></script>
<script type="text/javascript" src="/myapplication/app.js"></script>
</head>
<body>
</body>
</html>

Ext JS находится не в рекомендуемом по умолчанию расположении, т. е. в /wwwroot/myapplication/extjs-4.1.1, а на один уровень выше, поскольку он используется несколькими приложениями. Если вы посмотрите на app.js выше, вы также заметите параметр appFolder, который необходимо установить, чтобы это работало с «несуществующим» URL-адресом.

Все это прекрасно работает при разработке, но следующим шагом будет создание «сборки» кода с Инструменты Sencha SDK (вопрос основан на версии 2.0.0 Beta 3 для Windows). Вот где это идет не так. Я делаю следующие шаги:

  1. В командной строке я захожу в каталог /wwwroot/myapplication.
  2. Я выполняю sencha create jsb -a http://servername/someidentifier1/someidentifier2 -p myapplication.jsb3 для создания файла jsb3.
  3. Я выполняю sencha build -p myapplication.jsb3 -d .

Сборка не работает. В этом случае, потому что он пытается найти пользовательский код, например. контроллеры по пути c:\...\myapplication\myapplication\app\controller: текущий путь + параметр appFolder. Вы могли бы предположить, что лучше запустить его на один уровень выше, но тогда он не может найти (общий) каталог extjs-4.1.1.

Я предполагаю, что время сделает структуру Ext JS MVC и инструменты SDK более гибкими, и не рекомендуется немного отклоняться от структуры по умолчанию. Все приемлемо, но с другой стороны: интеграция Ext JS 4.x (Ext JS в стиле MVC) с перезаписью URL (mod_rewrite) тоже должна быть очень распространенной практикой?

Любая предложенная рабочая установка/структура будет высоко оценена.

Цели должны быть:

  • Нет ручного редактирования файла jsb3.
  • Сохранение каталога extjs-4.1.1 на верхнем уровне для совместного использования приложениями.
  • Отсутствие файла app.html, поскольку он никогда не используется в серверных приложениях MVC и в противном случае требует обновления вручную.
  • Приятным дополнением было бы иметь содержимое app.js внутри сгенерированного на стороне сервера HTML, поскольку тогда он сможет получать динамически генерируемые параметры.

person smhg    schedule 29.07.2012    source источник
comment
Для тех, кто заинтересован: эта запись в блоге поможет вам двигаться в правильном направлении (хотя и не связана конкретно с переписанными URL-адресами).   -  person smhg    schedule 03.08.2012
comment
Вы нашли ответ на свой первоначальный вопрос?   -  person sha    schedule 03.08.2012
comment
Нет, самое близкое, что я мог бы достичь, — это указать абсолютный путь в appFolder и вручную заменить его в файле JSB3 между sencha create jsb и sencha build. Как бы странно не звучал мой первоначальный вопрос, если вы не привыкли к перезаписи URL, я более чем убежден, что это должно быть распространенной (но довольно новой) проблемой.   -  person smhg    schedule 03.08.2012
comment
Я делаю то же самое (переименовывая app.js туда и обратно во время сборки), чтобы создать несколько веб-приложений из одной кодовой базы.   -  person sha    schedule 03.08.2012


Ответы (3)


Пара вещей.

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

...
appFolder: 'app' // should be enough
...

Во-вторых, что касается различий между сборкой и производством, у меня получилось два файла .html — index.html и index-dev.html. Эти файлы не изменяются (после того, как вы их настроите), поэтому синхронизировать их не проблема.

Вы используете index-dev.html для своих нужд разработки, отладки, а также для процесса сборки. В основном этот файл настроен для вашей локальной среды разработки.

index.html просто использует комбинированную и минимизированную версию вашего app.js и настроен для производственного развертывания.

person sha    schedule 29.07.2012
comment
Спасибо за ваш отзыв, но то, что вы заявляете, применимо только к автономному приложению Ext Js. Нет интеграции с настройкой на стороне сервера (за исключением возможных вызовов Ajax). Но вопрос в интеграции в серверный проект, который выводит html (и желательно javascript). Такие проекты часто основаны на перезаписи URL-адресов, и это создает проблему для упомянутой вами настройки по умолчанию. - person smhg; 29.07.2012
comment
Я не понимаю. Вы генерируете свой код ExtJs с помощью кода на стороне сервера? - person sha; 29.07.2012
comment
Есть ли у вас опыт перезаписи URL? Иначе это было бы трудно объяснить. Доступ к приложению осуществляется через URL-адрес, указанный выше, servername/someidentifier1/someidentifier2, и это возвращает HTML, похожий на app .html, но содержит другие теги и контент, специфичные для приложения (например, тег title и многое другое). Но это выходит за рамки вопроса. Дело в том, что приложение MVC на стороне сервера должно иметь возможность генерировать HTML (и, что предпочтительнее, содержимое app.js). - person smhg; 30.07.2012
comment
Я знаю, что такое перезапись URL. Я не уверен, как именно вы будете генерировать app.js... Что именно вы хотите динамически изменить в app.js? - person sha; 30.07.2012
comment
app.js, потому что я думаю, что это был бы самый простой способ передать динамически сгенерированные параметры конфигурации в приложение JS? Единственные другие способы, о которых я мог думать, это: глобальные переменные в HTML (плохо) или вызов Ajax после запуска (плохо, замедление). Но я могу ошибаться в этой части: может быть, есть другие способы. Но опять же: это не совсем вопрос. Сама настройка должна быть очень распространенной, когда вы интегрируете Ext JS с (существующим) серверным приложением. Интересно, как другие решили это. - person smhg; 30.07.2012
comment
Я не думаю, что вы можете это сделать (динамически создать минимизированный полный файл app.js). Я бы выбрал вызовы Ajax. - person sha; 30.07.2012
comment
Я предполагаю, что вы можете заменить некоторые элементы в уже сгенерированном файле app.js на стороне вашего сервера, но это не имеет ничего общего с созданием полного файла app.js — эта часть по-прежнему должна выполняться статически на вашей машине разработки. - person sha; 30.07.2012
comment
Боюсь, вы не сможете ответить на вопрос. Речь идет об интеграции Ext JS 4.x/4.1.x в приложение на стороне сервера (MVC) и о том, как эта версия Ext JS поддерживает это. Поскольку у вас нет опыта работы с этой стороной, я надеюсь, что кто-то еще может пролить свет на то, как они подошли к этому. Но спасибо за ваши усилия! - person smhg; 30.07.2012
comment
Я не думаю, что вы четко описали, чего именно вы пытаетесь достичь. У вас были какие-то проблемы со строительством, и я это понял. Но что касается integrating - вам, вероятно, нужно быть более конкретным. - person sha; 30.07.2012
comment
Как указано в исходном посте, вопрос не в самой неудачной сборке, а в фактическом способе внедрения Ext JS 4.x в проекты MVC на стороне сервера. Я попытался описать эту ситуацию, оставаясь как можно ближе к руководству по архитектуре приложения Sencha MVC и указывая на возникающие проблемы. Я, конечно, понимаю, что Ext JS 4.x очень хорошо работает автономно, но это только часть реальных приложений. Посмотрим, может ли кто-нибудь еще добавить к этому... - person smhg; 30.07.2012

С помощью перезаписи мода вы можете использовать слегка измененный файл .htaccess от Symfony.

<IfModule mod_rewrite.c>
    RewriteEngine On

    #<IfModule mod_vhost_alias.c>
    #    RewriteBase /
    #</IfModule>

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

Этот файл позволит вам

  • получить ресурс с сервера, если это настоящие файлы (css, js, изображения и т. д.)
  • преобразовать части URL-адреса в параметры запроса, если в файловой системе сервера нет совпадений.

Это должно работать в вашей настройке, просто измените строку app.php на точку входа вашего приложения.

для настройки каталога у вас все в порядке, всего пара вещей:

  • ваши инструменты SDK устарели, так как вы можете загрузить: http://www.sencha.com/products/sencha-cmd/download/ (v3.0.0)

  • следующие документы на http://docs.sencha.com/ext-js/4-1/#!/guide/command вы можете получить "сборку" с нужным вам классом, но в итоге либо вы вручную переключаетесь между файлом javascript разработки/производства, либо вы переключаетесь с помощью окружения переменные в вашем коде.

  • На самом деле, я думаю, вы могли бы использовать «поддельный» index.html в каталоге сборки для изменения с помощью инструмента сборки, а затем в производственном коде вы можете имитировать код, сгенерированный сборкой sencha.

person Valentino Dell'Aica    schedule 28.11.2012
comment
Спасибо за ваш пост, но вопрос связан с тем, как настроить Ext JS в среде с переписанным URL-адресом. Само переписывание URL-адреса не имеет отношения к вопросу (и зависит от серверной платформы, чего вопрос не имеет). - person smhg; 28.11.2012

Одним из способов будет создание файла index.html для создания файла проекта. Я также обнаружил, что сенча-архитектор очень жесткий и сложный в использовании. Больше всего раздражает то, что я не могу использовать внешний редактор для редактирования сгенерированного кода. Все должно быть сделано в дизайнере, и это нормально, если дизайнер может предоставить все необходимые мне функции. Но это невозможно.

person user650749    schedule 14.04.2013