دستور Goto
یکی از اساسیترین ابزارهای برنامهنویسی در Dialplan است. با استفاده از این دستور، میتوان به سادگی جریان تماس را از یک مرحله یا کانتکست به مرحلهی دیگر هدایت کرد.
ساختار دستور Goto
Goto([context][,extension][,priority])
-
context (کانتکست): جایی که میخواهید پرش انجام شود (میتواند خالی باشد)
-
extension (اکستنشن یا شماره مقصد): مقصدی که میخواهید به آن بروید
-
priority (اولویت): شماره مرحلهای که باید اجرا شود
اگر context
مشخص نشود، استریسک از کانتکست جاری استفاده میکند.
مثال ساده در کانتکست [voipiran]
[voipiran]
exten => 100,1,Answer()
same => n,Goto(200,1)
exten => 200,1,Playback(welcome)
same => n,Hangup()
در این مثال اگر کاربر ۱۰۰ را بگیرد، پس از اتصال، به داخلی ۲۰۰ منتقل میشود و پیام “welcome” پخش میشود.
Goto بین Contextهای مختلف
Goto(context-name,extension,priority)
مثال:
Goto(from-internal,300,1)
با این دستور تماس به داخلی ۳۰۰ در کانتکست from-internal
هدایت میشود.
نکته مهم: کانتکست from-internal-additional
در ایزابل چیست؟
در سیستمهای مبتنی بر ایزابل یا FreePBX، زمانی که شما از طریق رابط گرافیکی داخلی (extension)، صف (queue)، گروه زنگ (ring group) یا IVR تعریف میکنید، این تعریفها بهطور خودکار در کانتکستی به نام from-internal-additional
اضافه میشوند.
پس اگر شما میخواهید از یک کانتکست سفارشی مثل [voipiran]
به یکی از داخلیهای تعریفشده در ایزابل بروید، باید تماس را به from-internal-additional
هدایت کنید.
مثال: ارسال تماس به داخلی ۲۰۱ در ایزابل
[voipiran]
exten => 500,1,Answer()
same => n,Goto(from-internal-additional,201,1)
مثال: ارسال تماس به صف ۶۰۰۰ در ایزابل
[voipiran]
exten => 501,1,Answer()
exten => 501,n,Goto(from-internal-additional,6000,1)
در اینجا ۶۰۰۰ یک صف (Queue) است که در رابط ایزابل تعریف شده.
مثالهای بیشتر از Goto
پرش به اکستنشن دیگر در همان کانتکست
exten => 100,1,Answer()
exten => 100,n,Goto(200,1)
پرش به یک Context دیگر (مثلاً منوی شب)
exten => 105,1,Goto(nightmenu,s,1)
پرش شرطی با ExecIf + Goto
exten => 106,1,ExecIf($["${CALLERID(num)}" = "09121234567"]?Goto(vip,s,1))
exten => 106,n,Playback(access-denied)
اگر شماره تماسگیرنده ۰۹۱۲۱۲۳۴۵۶۷ باشد، تماس به کانتکست vip
منتقل میشود، در غیر این صورت پیام «دسترسی غیرمجاز» پخش میشود.
ترکیب Goto با منطق تماس
مسیر تماس برای ساعات مختلف
exten => 108,1,Set(TIME=${STRFTIME(${EPOCH},,%H)})
exten => 108,n,GotoIf($[${TIME} < 17]?day,s,1:night,s,1)
اگر ساعت کمتر از ۱۷ باشد، به منوی روز برو، در غیر این صورت به منوی شب.
استفاده از Goto در فایلهای شامل (includes)
در فایلهای dialplan سفارشی مثل [voipiran]
، اگر بخواهید از اکستنشنهای تعریفشده در ایزابل استفاده کنید، راه حرفهای این است که کانتکستهای استاندارد را include
کنید یا با Goto
تماس را به آنها منتقل نمایید.
مثال:
[voipiran]
exten => 600,1,Answer()
exten => 600,n,Goto(from-internal-additional,700,1) ; ارسال به داخلی ۷۰۰ ایزابل