$ composer require everlutionsk/ajaxcom-bundle
<?php
// app/AppKernel.php
// ...
class AppKernel extends Kernel
{
public function registerBundles ()
{
$ bundles = array (
// ...
new Everlution AjaxcomBundle EverlutionAjaxcomBundle (),
);
// ...
}
// ...
}
Установите @everlutionsk/ajaxcom-js
через npm
и включите ajaxcom.js
в свой макет TWIG:
< script type = " text/javascript " src = " {{ asset( ' build/ajaxcom.js ' ) }} " ></ script >
Последнее, что вам нужно сделать, это предоставить некоторый обработчик JavaScript в вашем макете TWIG — следуйте документации @everlutionsk/ajaxcom-js
.
Вам не нужно ничего настраивать, если вы хотите использовать шаблоны флэш-сообщений, предоставляемые пакетом.
# all configuration is optional - following values are default
everlution_ajaxcom :
flash_template : @EverlutionAjaxcom/flash_message.html.twig
flash_block_id : flash_message
persistent_class : ajaxcom-persistent
blocks_to_render : # default value is empty array - when you provide this value, AjaxcomBundle will automatically render these blocks within each AJAX request
- id : ' content '
- id : ' navigation '
- id : ' flash_message '
refresh : true
По умолчанию AjaxcomBundle игнорирует пустые блоки, и если разработчик просит отобразить пустой блок, мы отфильтровываем эти экземпляры. Если вы хотите повторно отобразить блок с пустым содержимым, вам следует установить флаг refresh
в значение true, как вы можете видеть в примере выше.
Если вы хотите установить флаг обновления с контроллера, вам нужно сначала добавить блок, а затем обновить его:
<?php
public function exampleAction ()
{
$ this -> addAjaxBlock ( ' example ' );
$ this -> refreshAjaxBlock ( ' example ' );
return $ this -> render ( ' some/template ' );
}
Пакет лучше всего работает с CSS-фреймворком Bootstrap 3+.
Расширьте свой контроллер из EverlutionAjaxcomBundleControllerController
или используйте черту EverlutionAjaxcomBundleControllerAjaxcomTrait
с вашим контроллером, чтобы получить функциональность Ajaxcom.
По умолчанию библиотека ajaxcom-js
обрабатывает все клики по ссылкам, кроме одного с target="_blank"
и всех отправок форм. Если вам нужно изменить селектор или вы хотите иметь некоторый контроль над тем, какие ссылки обрабатываются ajaxcom-js
, а какие нет, вы можете переопределить селекторы по умолчанию при инициализации ajaxcom-js
. Пожалуйста, ознакомьтесь с документацией @everlutionsk/ajaxcom-js
.
Пример:
< a href = " https://www.google.com " >External link</ a > <!-- won't be handled by Ajaxcom -->
< a href = " {{ path( ' remove_user ' ) }} " >Remove user</ a > <!-- will be handled by Ajaxcom -->
Следующие методы могут быть объединены - например. вы можете отображать несколько блоков, удалять несколько блоков и добавлять столько обратных вызовов JavaScript в одном запросе, сколько пожелаете.
public function render($view, array $parameters = array(), Response $response = null)
Пакет Ajaxcom от Everlution расширяет стандартный метод render()
Symfony, поэтому вы можете интегрировать Ajaxcom с вашим проектом без каких-либо дальнейших изменений в вашей кодовой базе.
Метод render()
автоматически решает, отвечает ли он на вызов Ajax или не Ajax, поэтому вам не нужно обрабатывать специальные сценарии в вашем приложении.
Пакет Ajaxcom будет автоматически обрабатывать действия вашего контроллера Symfony с помощью Ajax- и не-Ajax-запросов, поэтому вам не нужно писать код дважды — пакет всегда будет вызывать одно и то же действие.
В рамках действия вашего стандартного контроллера Symfony у вас будут лишь небольшие накладные расходы, которые будут настраивать поведение действия для обработки запросов Ajax. Методы накладных расходов описаны в следующих нескольких разделах.
renderAjaxBlock(string $id)
Чтобы динамически отображать только один блок на странице, вам необходимо выполнить следующие два условия:
block
веткиblock
ветки заключен в элемент DOM с ID
, имеющим то же имя, что и блок По умолчанию TWIG не поддерживает дефисы в именах блоков, поэтому, если вам нужно использовать дефисы в ваших идентификаторах, мы автоматически преобразуем дефисы в символы подчеркивания. Следовательно, вы можете использовать дефисы в своих идентификаторах с одноимённой комбинацией для блока TWIG — вам просто нужно заменить дефисы символами подчеркивания. Пример: id='custom-block'
и {% block custom_block %}
будут автоматически сопоставлены AjaxcomBundle.
Ветка:
< div id = " list " >
{% block list %}
// this is the HTML which will be replaced/removed ...
{% endblock %}
</ div >
PHP:
$ this -> renderAjaxBlock ( " list " );
В действии вашего контроллера просто вызовите renderAjaxBlock
, где вам нужно указать идентификатор блока (например, имя блока TWIG).
Когда ваше действие вызывается через запрос Ajax, ответ JSON для библиотеки Ajaxcom будет содержать информацию о том, какой блок и какой HTML следует повторно отобразить.
removeAjaxBlock(string $selector)
Если вы хотите динамически удалить какой-либо элемент DOM, например, после удаления какой-либо строки из таблицы, вы можете использовать метод removeAjaxBlock()
, где вы просто предоставляете CSS-селектор элемента, который вы хотите удалить.
Ветка:
< table >
< tbody >
< tr id = " row-1 " >< td >1.</ td ></ tr >
< tr id = " row-2 " >< td >2.</ td ></ tr >
< tr id = " row-3 " >< td >3.</ td ></ tr >
</ tbody >
</ table >
PHP:
$ this -> removeBlock ( " #row-2 " );
// OR you can use any CSS selector
$ this -> removeBlock ( " tr:nth-child(2) " );
Приведенный выше код (оба примера) удалит среднюю строку из таблицы после вызова действия.
Результат:
< table >
< tbody >
< tr id = " row-1 " >< td >1.</ td ></ tr >
<!-- the #row-2 has been removed -->
< tr id = " row-3 " >< td >3.</ td ></ tr >
</ tbody >
</ table >
addCallback(string $function, array $parameters = [])
Вы можете добавить столько обратных вызовов JavaScript, сколько пожелаете. Первый аргумент addCallback()
— это имя функции, которую следует вызвать после рендеринга HTML, второй — массив параметров, которые будут переданы функции как объект.
Пример:
PHP:
$ this -> addCallback ( ' Table.init ' , [ ' some ' => ' data ' , ' other ' => [ ' data ' , ' etc ' ]]);
var Table = function ( ) {
return {
init : function ( data ) {
var some = data . some ;
var otherArray = data . other ;
// initialize table with provided data
} ;
}
} ;
На самом деле вам не нужно использовать эту функцию, если вы пишете свой JavaScript следующим образом:
// additional.js
var App = {
additional : function ( ) {
// some additional functionality
console . log ( 'executing App.additional' ) ;
} ,
// more functions within App namespace
}
App . additional ( ) ;
App.additional()
будет выполняться каждый раз, когда браузер загружает файл additional.js
— независимо от того, обрабатывается ли запрос с помощью Ajaxcom или без него. Вам просто нужно убедиться, что вы добавляете <script src="additional.js"></script>
в свой DOM через Ajaxcom там, где это необходимо.
AjaxcomBundle автоматически добавит все скрипты из блока javascripts
на вашу страницу (они будут вставлены после последнего <script>
в вашем коде).
replaceClass()
Вы можете легко заменить класс в любом объекте DOM, вызвав replaceClass()
с двумя аргументами: первый — это селектор CSS по вашему выбору, а второй — класс, которым вы хотите заменить текущий.
doNotChangeUrl()
Вы можете легко избежать замены URL-адреса целевой страницы, вызвав doNotChangeUrl()
.
Флэш-сообщения автоматически обрабатываются пакетом Ajaxcom. При вызове запроса через Ajax флэши, находящиеся в пакете сеансов, рендерятся автоматически.
Вам нужно только включить предоставленный шаблон ветки где-нибудь в макете ветки:
{% include " @EverlutionAjaxcom/flash_message.html.twig " %}
Когда вы вызываете addFlash()
со своего контроллера, используйте EverlutionAjaxcomBundleFlash
чтобы указать тип флэш-сообщения:
$ this -> addFlash ( Everlution AjaxcomBundle Flash:: SUCCESS , ' Your request has been successfully handled by Ajaxcom bundle ' );
// you can use following constants:
// EverlutionAjaxcomBundleFlash::SUCCESS
// EverlutionAjaxcomBundleFlash::ERROR
// EverlutionAjaxcomBundleFlash::WARNING
// EverlutionAjaxcomBundleFlash::INFO
Все формы по умолчанию обрабатываются ajaxcom-js
. Вы можете изменить это поведение, переопределив селектор форм по умолчанию при инициализации ajaxcom-js
. Пожалуйста, следуйте документации @everlutionsk/ajaxcom-js
.
Чтобы повторно использовать источник данных, например, между несколькими вкладками, вы можете легко создать функции Twig, расширив наш BaseDataSource
.
Просто добавьте в свой файл Services.yml следующее утверждение:
AppBundleDataProvider :
resource : ' ../../src/AppBundle/DataProvider '
tags : ['twig.extension']
Вы можете указать любую папку внутри вашего проекта. В этом примере мы выбрали пространство имен AppBundleDataProvider
.
Каждый класс в этом пространстве имен, который расширяет EverlutionAjaxcomBundleDataSourceBaseDataSource
сканируется на наличие общедоступных методов с суффиксом Provider
посредством отражения, и мы создаем простые функции Twig из этих методов. Давайте посмотрим пример:
// AppBundleDataProviderExample.php
// simple function which returns static array
public function navigationProvider () {
return [
// some data...
];
}
// you can use parametrical functions and injected services as well
public function userProfileProvider ( int $ id ) {
return $ this -> someService -> getData ( $ id );
}
После создания такого класса вы можете просто вызвать функцию внутри ветки:
{{ dump (navigation()); }} {# will dump static array #}
{% for item in userProfile( 2 ) %}
{{ dump ( item ) }}
{% endfor %}
Если вы хотите беспрепятственно использовать AjaxcomBundle, вам следует скопировать @EverlutionAjaxcomlayout_bootstrap_4.html.twig
в свой проект (например, AppBundle) и изменить его в соответствии со своими потребностями.
Таким образом, AjaxcomBundle будет выполнять за вас такие задачи, как замена JavaScript, таблиц стилей и метатегов.
Когда вы используете блоки из @EverlutionAjaxcomlayout_bootstrap_4.html.twig
у вас все должно быть настроено.
Если вы решите настроить макет вручную, следующие разделы помогут вам понять, как работает автоматическая замена.
class='ajaxcom-persistent'
(или что-нибудь, что вы установили в конфигурации пакета){% block javascripts %}{% endblock %}
javascripts
AjaxcomBundle автоматически загрузит для вас скрипты из этого блока.class='ajaxcom-persistent'
(или все, что вы установили в конфигурации пакета){% block stylesheets %}{% endblock %}
stylesheets
AjaxcomBundle автоматически загрузит для вас стили из этого блока.class='ajaxcom-persistent'
(или что-нибудь, что вы установили в конфигурации пакета){% block metatags %}{% endblock %}
metatags
AjaxcomBundle автоматически загрузит метатеги из этого блока для вас.title
страницы, ваш макет должен содержать <title>{% block title %}{% endblock %}</title>
и вам нужно переписать title
внутри шаблона, в котором вы расширяете свой основной шаблон