getPath( 'front_html' )); require_once("$mosConfig_absolute_path/includes/irbis_api/lib/jwrapper.php"); $task = mosGetParam( $_REQUEST, 'task', '' ); // Определение базовой директории компонента $component_dir='com_passreq'; $basepath="$mosConfig_absolute_path/components/$component_dir"; $netpath="$mosConfig_live_site/components/$component_dir"; if (count($params)<1 && $task!=='autocomplete') mosErrorAlert('Определите параметры компонента!'); // Внимание! Как и интерфейс, библиотеки и стили JQuery нужно брать из INCLUDES! $header_tags=<< H; $mainframe->addCustomHeadTag($header_tags); $category=array(); for($i=1;$i<5;$i++){ if (@$params["category$i"]) $category[$params["category$i"]]=$params["category$i"]; } $header='Основные данные'; $f['surname']=array('id'=>true,'field'=>10,'subfield'=>'','prf'=>'','value'=>'','header'=>$header,'label'=>'Фамилия'); $f['name']=array('id'=>true,'field'=>11,'subfield'=>'','prf'=>'','value'=>'','header'=>$header,'label'=>'Имя'); $f['patronymic']=array('id'=>true,'field'=>12,'subfield'=>'','prf'=>'','value'=>'','header'=>$header,'label'=>'Отчество'); $f['year']=array('id'=>true,'field'=>21,'subfield'=>'','prf'=>'RG=','value'=>'','header'=>$header,'label'=>'Год рождения'); $f['passport_number']=array('id'=>false,'field'=>14,'subfield'=>'','prf'=>'PSP=','value'=>'','header'=>$header,'label'=>'Номер и серия паспорта'); $f['category']=array('id'=>false,'field'=>50,'subfield'=>'','prf'=>'KAT=','value'=>'','header'=>$header,'options'=>$category,'label'=>'Категория'); $f['gender']=array('id'=>true,'field'=>23,'subfield'=>'','prf'=>'','value'=>'','options'=>array('М'=>'Мужской','Ж'=>'Женский'),'header'=>$header,'label'=>'Пол'); $f['e-mail']=array('id'=>true,'field'=>32,'subfield'=>'','prf'=>'','value'=>'','header'=>$header,'label'=>'e-mail'); $header='Контактные данные'; $f['city']=array('id'=>false,'field'=>13,'subfield'=>'C','prf'=>'','value'=>'','header'=>$header,'label'=>'Город'); $f['house']=array('id'=>false,'field'=>13,'subfield'=>'E','prf'=>'','value'=>'','header'=>$header,'label'=>'Номер дома'); $f['street']=array('id'=>false,'field'=>13,'subfield'=>'D','prf'=>'','value'=>'','header'=>$header,'label'=>'Название улицы'); $f['flat']=array('id'=>false,'field'=>13,'subfield'=>'H','prf'=>'','value'=>'','header'=>$header,'label'=>'Номер квартиры'); $f['home_telephone']=array('id'=>false,'field'=>17,'subfield'=>'','prf'=>'','header'=>$header,'value'=>'','label'=>'Домашний телефон'); $f['mobile_telephone']=array('id'=>false,'field'=>18,'subfield'=>'','prf'=>'','header'=>$header,'value'=>'','label'=>'Мобильный телефон'); $header='Общие сведения'; $f['education']=array('id'=>false,'field'=>20,'subfield'=>'','prf'=>'','value'=>'','header'=>$header,'label'=>'Образование'); $f['job']=array('id'=>false,'field'=>15,'subfield'=>'','prf'=>'','value'=>'','header'=>$header,'label'=>'Должность'); $header='Студенческие данные'; $f['student_book_number']=array('id'=>false,'field'=>22,'subfield'=>'','prf'=>'','value'=>'','header'=>$header,'label'=>'Номер студенческого билета'); $f['fak']=array('id'=>false,'field'=>90,'subfield'=>'A','prf'=>'FAK=','value'=>'','header'=>$header,'label'=>'Факультет'); $f['fo']=array('id'=>false,'field'=>90,'subfield'=>'O','prf'=>'FO=','value'=>'','header'=>$header,'label'=>'Форма обучения'); $f['spec']=array('id'=>false,'field'=>90,'subfield'=>'C','prf'=>'SPEC=','value'=>'','header'=>$header,'label'=>'Специальность'); $f['sem']=array('id'=>false,'field'=>90,'subfield'=>'F','prf'=>'SEM=','value'=>'','header'=>$header,'label'=>'Семестр'); //$script_url="$mosConfig_live_site/index.php?com_passreq&Itemid=".$Itemid; //http://localhost/Joomla/index.php?option=com_passreq&Itemid=1492 $passreq=new ps($f); try{ switch( $task ) { case 'check': $passreq->answer(); break; case 'autocomplete': $passreq->autocomplete(); break; //Показ формы default: $passreq->show_form(); break; } }catch (Exception $e){ show::message($e->getMessage().'('.$e->getCode().')'); } class ps { public $f,$irb; private $is_in_rdr=false,$is_sended=false,$is_writed=false; public function __construct($f){ global $f; $this->f=$f; } public function show_form(){ if (@$_COOKIE['PASSREQ4']) throw new Exception('Вы уже запрашивали пароль. Повторный запрос пароля запрещён!',1); if (@$_SESSION['irbis']['Z21ID']) throw new Exception('Вы уже авторизованы. Повторный запрос пароля запрещён!',1); $this->field_list_work(); show::form($this->f); } public function autocomplete(){ // Получение параметров запроса. $q = mosGetParam( $_REQUEST, 'q', '' ); $prf = mosGetParam( $_REQUEST, 'prf', '' ); // Обработка и реагирование на параметры запроса if ($q==='') die(); $q=u::win_utf(strtoupper(u::utf_win($q))); // Поиск /* @var $irb jwrapper */ $irb=new jwrapper('utf'); $terms=$irb->GetTermList('RDR',$prf,$q,10,'','',0); if ($terms<0) { echo u::win_utf($irb->get_last_error_message()).'('.$terms.')'."\r\n"; die(); } if (!$terms) die(); if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } ob_end_clean(); header('Content-type: text/html; charset=utf-8'); foreach ($terms as $term){ if (@strpos($term['key'],$q)==0 && @strpos($term['key'],$q)!==false) echo $term['key']."\r\n"; } die(); } public function answer(){ global $params; setcookie( 'PASSREQ4', '1', time() + $params['reg_repeat_time'], '/' ); $this->irb=new jwrapper('win'); $this->field_list_work(); foreach($this->f as $key=>$field_params){ if (!$this->f[$key]['value']){ show::form($this->f,'Не заполнено поле "'.$this->f[$key]['label'].'"'); return; } } $current_category_number=(string)$this->get_category_number(mosGetParam( $_REQUEST, 'category', '' )); $possible_action=$params["category{$current_category_number}_al"]; // ---------------Проверка наличия записи в RDR, Создание новой записи, если допустимо-------------------------------------------------- if (!($rec=$this->find_reader())){ if ($possible_action!=='abort'){ $rec=$this->write_reader($possible_action); $this->is_writed=true; } }else{ if ($possible_action==='reg_only') $this->deactivate_record($rec); $this->is_in_rdr=true; } //\ ---------------Проверка наличия записи в RDR, Создание новой записи, если допустимо-------------------------------------------------- //---------------Отправка по E-mail------------------------------------------------------------------------------------ if ($params['e-mail_par']==='e-mail' || $params['e-mail_par']==='show_and_e-mail'){ // Если запись была в RDR, или была создана полноценная запись if ($this->is_in_rdr || $possible_action=='reg' ) if (!$this->send_password($this->f['e-mail']['value'],$rec->GetField(11,1).' '.$rec->GetField(12,1),$rec->GetField(30,1))) $this->is_sended=false; else $this->is_sended=true; } //\---------------Отправка по E-mail------------------------------------------------------------------------------------ //----------------Запись протокола-------------------------------------------------------------------------------------- if ($params['protocol_path']){ @@$this->log_write($params['protocol_path'],date('Y m d H:i:s').";{$this->f['surname']['value']};{$this->f['name']['value']};{$this->f['patronymic']['value']};{$this->f['year']['value']};{$this->f['rbook_number']['value']};{$this->f['pasport_number']['value']};{$this->f['email']['value']};{$this->is_in_rdr};{$this->is_writed};{$this->is_sended}\n\r"); } //----------------Запись протокола-------------------------------------------------------------------------------------- //---------------Сообщение пользователю--------------------------------------------------------------------------------- if ($possible_action==='abort' && !$this->is_writed && !$this->is_in_rdr) show::message('Введённые данные неверны, или отсутствуют в базе читателей. Пожалуйста, обратитесь в библиотеку лично'); if ($possible_action==='temp' && $this->is_writed && !$this->is_in_rdr) show::message('Ваш запрос будет обработан. Ваши данные отсутствуют в базе читателей, но их аутентичность будет проверена по другим источникам. Вы получите ответ по E-mail.'); if ($possible_action==='reg_only' && $this->is_in_rdr) show::message('Ваш запрос будет обработан. Ваши данные найдены в базе читателей.'); if ($params['e-mail_par']==='e-mail' && $this->is_sended && $possible_action!=='reg_only') show::message('Ваш пароль послан по указанному Вами адресу электронной почты.'); // Пароль демонстрируется если: //1. создана новая запись //2. или найдена существующая запись читателя //3. если предусмотрено, что новая запись создаётся сразу полноценной //4.Если не удалось выполнить запланированную отсылку пароля или предусмотреа его демонстрация пользователю if (( ( ($params['e-mail_par']==='show_and_e-mail' || ($params['e-mail_par']==='e-mail' && !$this->is_sended)) ) || $params['e-mail_par']==='show') && (($this->is_writed && $possible_action!=='temp') || $this->is_in_rdr ) && $possible_action!=='reg_only') show::message('Ваш пароль для авторизованного доступа к сервисам сайта: '.$rec->GetField(30,1)); //\---------------Сообщение пользователю--------------------------------------------------------------------------------- } //=======================PRIVATE===================================================== private function deactivate_record($rec){ if ($rec->GetField(3030,1)){ $rec->SetField(3031,1,$rec->GetField(3030,1)); $rec->RemoveField(3030); if (($this->irb->RecWrite('RDR', true, true, $rec))<0) throw new Exception('Ошибка при деактивации записи: '.$this->irb->get_last_error_message(),$this->irb->get_last_error_code()); } } // Удаление неактуальных параметров, заполнение значениями запроса F->values private function field_list_work(){ global $params; // Возможность вывода полей не определяется, поэтому требуется добавить их искусственно. $params['surname']='1,2,3,4'; $params['name']='1,2,3,4'; $params['patronymic']='1,2,3,4'; $current_category_number=(string)$this->get_category_number(mosGetParam( $_REQUEST, 'category', '' )); foreach($this->f as $key=>$field_params){ if (strpos($params[$key],$current_category_number)!==false){ if (($field_falue=mosGetParam( $_REQUEST, $key, '' ))!=='') $this->f[$key]['value']=$this->data_normalisation($key,$field_falue); }else{ unset($this->f[$key]); } } } // Создание новой записи private function write_reader($mode){ $rec=new Record(); foreach($this->f as $cf){ if ($cf['subfield']) $rec->SetSubField($cf['field'],1,$cf['subfield'],$cf['value']); else $rec->SetField($cf['field'],1,$cf['value']); } // Генерация уникального случайного пароля $pass=mt_rand(100000,9999999999); do{ $pass++; }while($this->irb->FindRecords('RDR','(<.>RI='.$pass.'<.>)','',1,1)); //\ Генерация уникального случайного пароля if ($mode==='temp') $rec->AddField(3031,$pass); else $rec->AddField(30,$pass); if (($this->irb->RecWrite('RDR', true, true, $rec))<0) throw new Exception('Ошибка при создании новой записи в БД: '.$this->irb->get_last_error_message(),$this->irb->get_last_error_code()); return $rec; } private function find_reader(){ $req=array(); $req[]='(<.>RI='.$this->f['surname']['value'].' '.$this->f['name']['value'].' '.$this->f['patronymic']['value'].'$<.>)'; foreach($this->f as $key=>$fp){ if ($fp['id'] && $fp['prf']) $req[]='(<.>'.$fp['prf'].$fp['value'].'<.>)'; } if (($present_recs=$this->irb->FindRecords('RDR',join('*',$req),'',100,0))<0) throw new Exception('Ошибка при работе с интерфейсом к БД: '.$this->irb->get_last_error_message(),$this->irb->get_last_error_code()); if (!is_array($present_recs)) return null; foreach($present_recs as $prec){ $pair=true; foreach($this->f as $cf){ if ($cf['id']){ if ($cf['subfield']){ if ($prec->GetSubField($cf['field'],1,$cf['subfield'])!==$cf['value'] && $prec->GetSubField($cf['field'],1,$cf['subfield'])){ $pair=false; break; } } else{ if ($prec->GetField($cf['field'],1)!==$cf['value'] && $prec->GetSubField($cf['field'],1,$cf['subfield'])) { $pair=false; break; } } } if ($pair) return $prec; } } return null; } private function data_normalisation($key,$value){ global $params; switch( $key ) { case 'surname': return $this->get_good_name($value); case 'name': return $this->get_good_name($value); case 'patronymic': return $this->get_good_name($value); default: return trim($value); } } private function get_category_number($category){ global $params; if ($category==='')return 1; switch( $category ) { case @$params['category1']: return 1; case @$params['category2']: return 2; case @$params['category3']: return 3; case @$params['category4']: return 4; default: return 1; } } private function get_good_name($name){ if (preg_match('{[A-zА-я\-]+}',$name,$res)) return $res[0]; else return ''; } private function log_write($path,$string){ @$file=fopen($path,'a+'); @fwrite($file,$string); @fclose($file); } private function send_password($email,$fio,$password){ global $mosConfig_mailfrom,$mosConfig_fromname,$mosConfig_MetaKeys; $letter=" Уважаемый $fio!\n Ваш пароль для доступа к сайту библиотеки и виртуальным сервисам: $password"; if(@mosMail( $mosConfig_mailfrom, $mosConfig_fromname, $email, "Пароль для работы с сайтом $mosConfig_MetaKeys", $letter )) return true; else return false; } } ?>