$ 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
เป็นจริงเหมือนที่คุณเห็นในตัวอย่างด้านบน
เมื่อคุณต้องการตั้งค่าสถานะการรีเฟรชจากคอนโทรลเลอร์ คุณต้องเพิ่มบล็อกก่อนแล้วจึงรีเฟรช:
<?php
public function exampleAction ()
{
$ this -> addAjaxBlock ( ' example ' );
$ this -> refreshAjaxBlock ( ' example ' );
return $ this -> render ( ' some/template ' );
}
บันเดิลทำงานได้ดีที่สุดกับเฟรมเวิร์ก Bootstrap 3+ CSS
ขยายคอนโทรลเลอร์ของคุณจาก 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 ไม่รองรับเครื่องหมายยัติภังค์ในชื่อบล็อก ดังนั้นหากคุณจำเป็นต้องใช้เครื่องหมายยัติภังค์ภายใน ID ของคุณ เราจะแปลงยัติภังค์เป็นขีดล่างให้คุณโดยอัตโนมัติ ดังนั้น คุณสามารถใช้ยัติภังค์ภายใน ID ของคุณโดยใช้ชื่อเดียวกันสำหรับบล็อก 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
.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, StyleSheets และ MetaTags ให้กับคุณ
เมื่อคุณใช้บล็อกจาก @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
ใหม่ภายในเทมเพลตที่คุณขยายเทมเพลตหลักของคุณ