siftal
Version:
CSS Framework, not bad ;)
123 lines (88 loc) • 7.09 kB
Markdown
ایژکس
===
وظیفه این ماژول استفاده از فناوری Ajax برای ارسال فرم ها و درخواستهای بدون ورودی (لینک) به سرور است.
نحوه کار
---
نحوهی کار این ماژول نسبتا ساده است و نیاز به تنظیمات خاصی از سمت شما ندارد و تنها کاری که شما باید انجام دهید اضافه کردن تگ های `data-*` به عناصر HTML برای تعیین تنظیمات است.
رویداد های این ماژول روی عنصری که رویداد روی آن اجرا شده جرقه میخورند.
مراحل کاری
---
مراحل کاری این ماژول برای لینکها و فرمها متفاوت است:
در ابتدای اجرای این متد رویداد `ajaxify:init` و سپس `ajaxify:send:before` جرقه میخورند.
####فرم
برای فرمها، متد ارسال درخواست از مشخصه `method` و آدرس هدف از مشخصه `action` فرم خوانده
میشود.
سپس اطلاعات فرم به صورت `FormData` در میآید و درخواست ایژکس ارسال میشود. پس از ارسال درخواست، تمامی ورودی های از نوع `input` و عناصر `[contenteditable]` غیر فعال میشوند.
####لینک
برای لینک ها اطلاعات درخواست از جمله متد و آدرس از مشخصههای `data-method` و `href` خوانده می شوند.
اطلاعات درخواست با اجرای `JSON.parse` بر روی مشخصه `data-data` لینک خوانده شده و همراه با دادهها، این تنظیمات به `jQuery.ajax` داده میشوند:
```javascript
{
data: JSON.parse(el.attr('data-data')),
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
processData: true
}
```
قبل از ارسال اطلاعات عناصر `[data-ajaxify]` غیر فعال میشوند.
####مشترک
بعد از جمعآوری اطلاعات در مورد درخواست رویداد `ajaxify:send:ajax:start` جرقه خورده و `jQuery.ajax` اجرا میشود.
پس از دریافت پاسخ از سمت سرور رویداد `ajaxify:complete` جرقه میخورد، عناصر غیر فعال شده به حالت خود بازمیگردند و کلاس `loading-form` از بادی حذف میشود.
پس از این مراحل، بسته به پاسخ دریافتی از سرور دو حالت وجود دارد:
#####موفقیت
در صورت موفق بودن درخواست متد `ajaxify.showResults` اجرا میشود که نوتیفیکیشن مناسب را نمایش میدهد.
سپس در صورت وجود مشخصه `redirect` در جواب، کاربر به صفحه مورد نظر منتقل میشود.
در صورت وجود مشخصه `refresh` هنگام اجرای متد و یا وجود مشخصه `data-refresh` روی عنصر صفحه رفرش میشود.
رویداد `ajaxify:success` جرقه میخورد.
#####اختلال
رویداد `ajaxify:fail` جرقه میخورد.
استفاده
---
برای استفاده از این ماژول شما از متد `ajaxify` اضافه شده به جیکوری استفاده میکنید که خواندن و ارسال دادهها و در نهایت نمایش نتیجه را بر عهده دارد.
این متد یک شی به عنوان آرگومان قبول میکند که شامل تنظیمات میشود. تنظیمات این متد در زیر توضیح داده شده اند:
```javascript
$('#myform').ajaxify({
ajax: {
cache: true,
...
},
noLoading: false,
link: false,
refresh: false
});
```
######ajax
این شی با تنظیمات پیشفرض ایژکسی ادغام شده و به `jQuery.ajax ` داده میشود. دقت کنید که مشخصه `data`ی این شی در آخر با اطلاعات گرفته شده از عنصر جایگزین میشود پس استفاده از این مشخصه بیفایده و نادرست است.
بجای اینکار باید اطلاعات مورد نظرتان را به عنصر اضافه کنید (برای مثال اضافه کردن ورودیهای مخفی به فرم.
######noLoading
در صورت مثبت بودن این مشخصه از اضافه کردن کلاس `loading-form` به بدنه صفحه خودداری میشود.
######link
این مشخصه تعیین میکند که رفتار متد باید مانند لینک باشد یا خیر.
######refresh
در صورت مثبت بودن این مشخصه بعد از دریافت پاسخ برای درخواست، صفحه با استفاده از دستور `Navigate` رفرش میشود.
متدها
---
######showResults
######(data: Object, form: DOMNode, jq: jQuery Object)
این متد وظیفهی نمایش نتیجهی درخواست را دارد. در اجرای این متد رویداد `ajaxify:render:start` جرقه میخورد.
در ابتدا این متد کلاسهای `error` و `warn` را از روی تمامی ورودیهای فرم حذف میکند.
سپس یک عنصر `ul` ساخته میشود که با اطلاعات `data.messages` پر میشود. برای اطلاع از نحوه رندر نوتیفیکشن به فایل`includes/mvc/display.html` مراجعه کنید.
```php
<div id="formError" class="error_{{debug.status}} unselectable">
{%for key, mydebug in debug.messages if mydebug is iterable %}
<ul class="{{key}}">
{%for key, err in mydebug%}
{%if err.title is defined%}
<li class="{{err.group}} {{err.redirect}}">{{err.title}}</li>
{%else%}
<li class="n_{{key}}">{{err}}</li>
{%endif%}
{%endfor%}
</ul>
{%endfor%}
</div>
```
پس از اتمام پر کردن عناصر رویداد `ajaxify:render:done` جرقه میخورد.
در صورتی که خطایی در فرم وجود نداشته باشد و مشخصه `data-clear` روی عنصر مشخص شده باشد، مقدار تمام عناصری که مشخصه `data-unclear` را نداشته باشند خالی میشود. رویداد `ajaxify:render:clear` اجرا میشود.
سپس در صورت نبودن خطا، اولین `input` در فرم دارای فوکوس میشود. رویداد `ajaxify:render:focus` اجرا میشود.
سپس با استفاده از `notify` پیغام نمایش داده می شود و رویداد `ajaxify:notify` جرقه میخورد.
در صورت مشخص کردن `data-delay` این تنظیم به `notify` داده میشود که تعیین کنندهی زمان ماندن روی صفحهی نوتیفیکیشن است.