stream_file ждёт ввода только 1 DTMF, wait_for_digit тоже, get_data ждёт ввода нескольких, но нельзя явно указать значение DTMF для прерывания ввода.
Пока только такой вариант видится:
while(true){
$button=$agi->wait_for_digit(1000);
if(chr($button['result'])!="*"){
$buttons.=$chr($button)
}elseif(chr($button)=="*" && strlen($buttons)<11){
$agi->exec("Playback","wrong_number");
}else{
break;
}
}
Есть решение лучше?
Задача довольно проста, нужно получить от звонящего номер телефона вида 8хххххххххх. Ввод номера заканчивается по нажатию "*".
UPD (30/12/2015):
Пока остановился на таком решении:
function ask_msisdn($iswrong=false){
global $agi,$main_cfg;
$msisdn='';
//Промт ввода номера
if(!$iswrong){
$agi->exec("Playback",$main_cfg['sound_dir'].MSISDN_INPUT);
}
//допустимые значения
$correct_numbers=array('0','1','2','3','4','5','6','7','8','9');
while(true){
//ждём DTMF полсекунды
$pressed=$agi->wait_for_digit(500);
$digit=chr($pressed['result']);
if(in_array($digit,$correct_numbers)){
//корректное значение, добавляем к массиву
$msisdn[]=$digit;
}elseif($digit=="*"&&count($msisdn)==11){
//Набраны все 11 цифр, завершен набор нажатием звездочки
break;
}elseif($digit=="*"&&count($msisdn)<11){
//Набрано меньше 11 цифр, запрашиваем снова
$agi->exec("Playback",$main_cfg['sound_dir'].MSISDN_WRONG);
$msisdn=ask_msisdn(true);
}else{
//ничего не нажали
continue;
}
if(isset($msisdn[0])&&$msisdn[0]!='8'){
//проверка первой цифры, нужна строго 8, иначе снова запрашиваем ввод номера
$agi->exec("Playback",$main_cfg['sound_dir'].MSISDN_WRONG);
$msisdn=ask_msisdn(true);
}
}
return $msisdn;
}