Команда GotoIf()
Назначение
Переход по условиюОписание
GotoIf(condition?label1[:label2])Переход к команде label1, если условие condition истина, или выполнение следующей, по приоритету, команды (или, если определено, переход к команде label2) если условие condition ложно, или:
GotoIf(condition?[label1]:label2)
Выполнение следующей, по приоритету, команды (или команды label1, если определено) если условие condition истина, или переход к команде label2, если условие condition ложно.
Параметры label1 или label2 могут быть опущены (в этом случае, ветвление возможно только по одному из условий). Отсутствие обоих точек перехода не допускается.
Условие condition - это текстовая строка. Если строка пустая или содержит "0", то условие будет считаться ложью. Если она содержит что-то другое, то условие будет истиной. Это сделано для совместимости с механизмом регулярных выражений, используемых в Asterisk.
Метка перехода задается в виде '[[контекст,]екстеншен,]приоритет. Итак, для нее мы можем задать следующие комбинации: (a) только приоритет, (b) екстеншен и приоритет, или (c) контекст, екстеншен и приоритет. Этот формат такой же, как и формат аргумента команды Goto.
Пример 1
exten => 206,1,GotoIf($["${CALLERIDNUM}" = "303"]?3:2) exten => 206,2,GotoIf($["${CALLERIDNUM}" = "304"]?5:7) exten => 206,3,Dial(${SPHONE1},15,rt) exten => 206,4,Hangup exten => 206,5,Dial(${PHONE2},15,rt) exten => 206,6,Hangup exten => 206,7,MusicOnHold(default)25-07-2005 - Обратите внимание, что ${CALLERIDNUM} может содержать пробелы (например: "No CID available", для некоторых Zap каналов), и в этом примере проверка скорректирована, чтобы справиться с этой ситуацией - без этой корректировки, метки перехода вокруг переменной {CALLERIDNUM} работать не будут!
Пример 2
; Надо определить, являются ли первые три символа, полученного значения в переменной ; ${ENUM}, значениями SIP или IAX. Если нет, игнорируем эту переменную и переходим к ; приоритету 4, где осуществляем стандартный набор номера exten => _011X.,2,GotoIf($[$["${ENUM:0:3}" = "SIP"] | $["${ENUM:0:3}" = "IAX"]]?3:4)
Пример 3
; Этот пример проверяет на пустое значение callerID или на номер 800 серии. ; Вызывающим абонентам с номерами на 800 (обычно "telemarketers") или ; те, у которых не представлено caller ID, будет предложено нажать 1 для разговора. exten => s,1,NoOp(${CALLERID}) ; просто смотрим на callerID ; проверяем callerID. Если не задан, предлагаем абоненту нажать 1. exten => s,2,GotoIf($["${CALLERIDNUM}" = ""]?s|1000) ; Если номер начинается на 800, предлагаем абоненту нажать 1. exten => s,3,GotoIf($["${CALLERIDNUM:0:3}" = "877"]?s|1000) exten => s,4,GotoIf($["${CALLERIDNUM:0:3}" = "800"]?s|1000) ; OK, тут у нас нормальный callerID и точно не номер из 800 серии. ; Теперь вызываем нужный нам телефон: exten => s,5,Dial(SIP/604&SIP/602,25,tr) exten => s,1000,Background(press1tospeaktome)
Hint
Тут мы рассмотрим одну стоящую того проверку на значение NULL, даже учитывая то, что современные версии Asterisk и/или Bison обычно знают, как обрабатывать такие ситуации.
Небольшой хак, для проверки на значения NULL может все же иногда потребоваться:
GotoIf($["foo${CALLERIDNUM}" = "foo"]?3:2)
Если значение переменной (в данном случае CALLERIDNUM) не установлено, Вы можете увидеть сообщение об ошибке, типа той, что приведена ниже, если не применяется уловка с добавлением "foo".
27-04-2005 - Обратите внимание, что переменная помещена в двойные кавычки, для исключения ошибок в команде GotoIf для случаев, когда ${CALLERIDNUM} содержит пробелы.
Также, без применения этого небольшого хака, вы можете увидеть, а скорее всего и увидите, сообщение об ошибке.
WARNING[65553]: ast_expr.y:346 ast_yyerror: ast_yyerror(): syntax error: parse error
И еще одно, использование пробелов очень важно, если Вы не используете значения, помещенные в кавычки, для обоих параметров при сравнении. Итак, проверим символ 2 и 3 переменной ARG1, притом, что ARG1 = "u6432":
; тут корректно проверка вернет false (и будет выполнена команда с приоритетом 3): exten => s,2,GotoIf($[${ARG1:1:2} = 61]?6100) ; тут всегда проверка будет давать true (и будет совершен ошибочный переход на приоритет 6100): exten => s,2,GotoIf($[${ARG1:1:2}=61]?6100) ; тут мы получим сообщение об ошибке, что сравнивается несогласованное число ; символов (обратите внимание на пробел): exten => s,2,GotoIf($[${ARG1:1:2} =61]?6100)
ast_yyerror: ast_yyerror(): syntax error: syntax error; Input: 64 =61
Ссылки по теме
- Команда Goto - Переход на заданный приоритет, екстеншен или контекст в плане набора
- Команда Random - Перехода в плане набора с определенной вероятностью
- Asterisk Expressions
- Переменные, используемые при конфигурировании плана набора
- План набора: extensions.conf
Список команд