افزودن یک قاعدهٔ اعتبارسنجی سمت سرور
هدف
یک قاعدهٔ سمت سرور ثبت کنید که رکورد نامعتبر را پیش از ذخیره شدن رد میکند — برای نمونه، نپذیرفتن فاکتوری که جمع کل آن منفی است.
چنین قاعدهای یک گام افزونه است: یک اسکریپت بیاس لنگ که به نوشتن یک جدول بسته شده است. همان زبانی است که یک اپیآی سفارشی اجرا میکند، اما بهجای یک مسیر، به یک ذخیره نشانه رفته است.
پیشنیازها
- جدولی که گام به آن پیوست شود (برای نمونه،
par_invoiceبا فیلدpar_total). - نقش
Maker. - یک راهحل باز — گام یکی از مؤلفههای آن میشود.
گامها
-
در ناحیهٔ سازنده، راهحل خود را باز کنید و گامهای افزونه را برگزینید.
-
جدید را بزنید.
-
یک نام نمایشی بدهید («رد جمع کل منفی»). نام منطقی همزمان با تایپ شما پر میشود، با پیشوند ناشرِ راهحل خودتان — گام به راهحل تعلق دارد، هر جدولی را هم که بپاید.
-
جدولی که گام میپاید، نوشتنی که به آن واکنش نشان میدهد (ایجاد، بهروزرسانی یا حذف) و مرحله را برگزینید:
- پیش از نوشتن جایی است که رکورد را رد یا اصلاح میکنید. رد کردن در اینجا یعنی رکورد هرگز ذخیره نمیشود.
- پس از نوشتن جایی است که بر آنچه ذخیره شد عمل میکنید. پس از ذخیره شدن رکورد اجرا
میشود، پس نمیتواند آن را رد کند: اگر
throwValidationErrorرا صدا بزند، فرم روی رکورد ذخیرهشده میماند و میگوید تغییر ذخیره شد، اما گامی که پس از نوشتن اجرا میشود سپس گفت…. - پیش از اعتبارسنجی زودتر از همه اجرا میشود، بر ای بررسیهای درشت. درون همان تراکنشِ پیش از نوشتن است، پس رد کردن در آنجا هم یعنی چیزی ذخیره نمیشود.
-
اجرا را روی پیش از پاسخ بگذارید مگر دلیلی خلاف آن داشته باشید — یادداشت پایین را ببینید.
-
اگر بیش از یک گام همین جدول، نوشتن و مرحله را دارند، ترتیب را تعیین کنید؛ کوچکترین عدد زودتر اجرا میشود.
-
ذخیره را بزنید. گام با یک اسکریپت آغازین ساخته میشود.
-
آن را در فهرست برگزینید و ویرایش کد را بزنید. فهرست جای خود را به ویرایشگر میدهد:
if (getValue("par_total") < 0) {throwValidationError("جمع کل نمیتواند منفی باشد.");}چشم در نوار ابزار هر تابعی را که اسکریپت میتواند فراخوانی کند، با ورودی و خروجیاش نشان میدهد. ذخیره و سپس بستن را بزنید تا به فهرست بازگردید.
-
رکوردی بسازید که قاعده را نقض کند. ذخیره با همان جملهای که به
throwValidationErrorدادهاید رد میشود و چیزی ذخیره نمیگردد.
پشت صحنه چه میگذرد
هنگام ایجاد، بهروزرسانی یا حذف یک رکورد، پلتفرم هر گام فعالِ ثبتشده برای آن جدول و آن نوشتن را
به ترتیب صعودی و در مرحلهٔ منطبق اجرا میکند. گامِ پیش از نوشتن درون تراکنش اجرا میشود، پس رد
کردن در آنجا یعنی رکورد هرگز ذخیره نمیشود. گام میتواند در همان مرحله با
setValue("field", value) مقداری را پیشفرض بگذارد یا اصلاح کند.
ثبت هنگام ذخیره اعتبارسنجی میشود — پوشش در برابر شمای گام افزونه و اسکریپت در برابر دستور زبان بیاس لنگ — پس اسکریپتی که تجزیه نشود با ذکر شمارهٔ خط رد میشود، نه اینکه بعدها پیش چشم کاربر شکست بخورد.
چرا این و نه یک قاعدهٔ کسبوکار
قاعدهٔ کسبوکار در مرورگر و روی یک فرم اجرا میشود. ابزار درست برای چیزی است که کاربر میبیند: نمایش یک فیلد، الزامی کردن آن، پیشفرض گذاشتن مقداری هنگام تایپ.
گام افزونه روی سرور و درون تراکنش اجرا میشود. هرگونه ذخیرهٔ رکورد را پوشش میدهد — از فرم، از اپیآی، از درونریزی راهحل، از یک برنامهٔ سفارشی. اگر قیدی باید واقعاً برقرار باشد، جایش اینجاست. این دو مکمل یکدیگرند: قاعده فرم را دلپذیر میکند، گام داده را درست نگاه میدارد.
خواندن و نوشتن رکوردهای دیگر
یک گام میتواند به رکوردهایی فراتر از رکوردی که ذخیره میشود دسترسی داشته باشد:
// خواندن یک رکورد. فیلدهایش ویژگیهای چیزی هستند که برمیگردد، بهعلاوه ٔ id.
var account = getRecord("par_account", getValue("par_account_id"));
if (account.par_status == "on hold") {
throwValidationError("این حساب متوقف است.");
}
// خواندن چند رکورد، و پیمودن آنها.
var open = queryRecords("par_invoice", "par_status", "open");
for (var i: int = 0; i < open.length; i++) {
// open[i].par_total، open[i].id، ...
}
// نوشتن: همهٔ فیلدها یکجا. شناسهٔ رکورد تازه را میگیرید.
var noteId = createRecord("par_audit_note", { par_text: "بهصورت خودکار تأیید شد." });
updateRecord("par_account", account.id, { par_reviewed: true });
سه نکتهٔ دانستنی:
- با هویت همان کسی اجرا میشود که رکورد را ذخیره کرده است، نه با هویت یک مدیر. اگر او نتواند جدولی را بخواند، گام شما هم نمیتواند. اسکریپت هرگز راهی برای دور زدن یک دسترسی نیست.
- یک نوشتن، یک بار. همهٔ فیلدها را در یک بسته بدهید. قواعد معمول را هم اجرا میکند، پس گامی که روی آن جدول ثبت شده نیز اجرا میشود.
- جدولی را که گامتان میپاید ننویسید مگر با یک شرط محافظ — آن نوشتن، گام خودتان را دوباره
فعال میکند. پلتفرم پس از هشت سطح جلوی حلقه را میگیرد، اما راهحل یک شرط است نه آن سقف.
depth()میگوید چند سطح عمیق هستید.
رکوردی که وجود ندارد بهصورت «هیچ» برمیگردد، پس پیش از خواندن فیلدی از آن بررسی درست این است:
if (isEmpty(getRecord(...))). خواندن چند رکورد حداکثر ۲۰۰ سطر است — پرسش دربارهٔ همهٔ سطرها
پرسش یک گزارش است و جای آن طراح پرسوجوست. countRecords سقف ندارد: بهجای واکشی سطرها از پایگاه
داده شمارش میخواهد، پس هر چند تا هم که باشند پاسخش درست است.