/** * Отрисовать одно поле. * @param array $_field массив с описанием поля * @return string HTML-текст */ public static function RenderField($_field) { if (ToLower($_field['TYPE']) != 'hidden') { $result = '<div class="rf_fwrapper_o ' . $_field['WCLASS'] . '" ' . ($_field['WSTYLE'] ? 'style="' . $_field['WSTYLE'] . '" ' : '') . 'id="rf_wrapper_o_' . $_field['ID'] . '"> <div class="rf_lwrapper" id="rf_lwrapper_' . $_field['ID'] . '"> <label for="' . $_field['ID'] . '" id="rf_label_' . $_field['ID'] . '">' . $_field['LABEL'] . '</label> ' . ($_field['REQUIRED'] ? '<span class="rf_required">*</span>' : '') . ' </div> <div class="rf_fwrapper_i" id="rf_fwrapper_i_' . $_field['ID'] . '">'; } else { $result = ''; } // общая строка для большинства элементов $field = 'name="' . $_field['NAME'] . '" id="' . $_field['ID'] . '"' . ($_field['DISABLED'] ? ' disabled' : '') . ($_field['CLASS'] ? ' class="' . $_field['CLASS'] . '"' : '') . ($_field['ONCLICK'] ? ' onclick="' . $_field['ONCLICK'] . '"' : '') . ($_field['ONHOVER'] ? ' onmouseover="' . $_field['ONHOVER'] . '"' : '') . ($_field['ONCHANGE'] ? ' onchange="' . $_field['ONCHANGE'] . '"' : '') . ($_field['ONHOUT'] ? ' onmouseout="' . $_field['ONHOUT'] . '"' : ''); // типы почти по алфавиту switch (ToLower($_field['TYPE'])) { // привязка к теме форума с возможностью создать новую case 'bind_forum_topic2': $result .= '<div class="rf_selectforum"> <select id="' . $_field['ID'] . '_selectforum" name="' . $_field['NAME'] . '_selectforum"> <option value="" selected></option>'; foreach ($_field['FORUMS'] as $k => $v) { $result .= '<option value="' . $k . '">' . $v . '</option>'; } $result .= '</select></div> <div class="rf_createtopic"> <div class="rf_inner_label" id="rf_inner_label_' . $_field['ID'] . '"> <label for="' . $_field['ID'] . '_createtopic">Название темы форума</label> </div> <div class="rf_inner_input" id="rf_inner_input_' . $_field['ID'] . '"> <input type="text" id="' . $_field['ID'] . '_createtopic" name="' . $_field['NAME'] . '_createtopic"> </div> </div>'; // обратите внимание - тут нет брейка, следом должен идти bind_forum_topic1 // привязка к теме форума // привязка к теме форума case 'bind_forum_topic1': $result .= '<input type="text" ' . $field . ' value="' . $_field['VALUE'] . '"> <input type="button" onclick="jsUtils.OpenWindow(\'/bitrix/admin/forum_topics_search_gs.php?FC=' . $_field['ID'] . ($_field['FORUM_ID'] ? '&FORUM_ID=' . $_field['FORUM_ID'] : '') . '\', 600, 500);" value="...">'; break; // привязка к элементу инфоблока с возможностью создать новый // привязка к элементу инфоблока с возможностью создать новый case 'bind_iblock_element2': $result .= '<span class="rf_command" onclick="document.getElementById(\'' . $_field['ID'] . '_creatediv\').style.display=\'block\';">Создать</span> <div class="rf_hidden" id="' . $_field['ID'] . '_creatediv">'; $result .= CFormRenderer::RenderFields($_field); $result .= '</div>'; // обратите внимание - тут нет брейка, следом должен идти bind_iblock_element1 // привязка к элементу инфоблока // привязка к элементу инфоблока case 'bind_iblock_element1': $result .= '<input type="text" ' . $field . ' value="' . $_field['VALUE'] . '"> <span id="sp_' . md5($_field['ID']) . '_text">' . $_field['SPAN_VALUE'] . '</span> <input type="button" onclick="jsUtils.OpenWindow(\'/bitrix/admin/iblock_element_search.php?IBLOCK_ID=' . (int) $_field['IBLOCK_ID'] . '&n=' . $_field['ID'] . '&k=text\', 600, 500);" value="...">'; break; // привязка к пользователю // привязка к пользователю case 'bind_user': $result .= '<input type="text" ' . $field . ' value="' . $_field['VALUE'] . '"> <span id="div_sp_' . md5($_field['ID']) . '_text">' . $_field['SPAN_VALUE'] . '</span> <input type="button" onclick="jsUtils.OpenWindow(\'/bitrix/admin/user_search.php?FN=' . CFormRenderer::$formname . '&FC=' . $_field['ID'] . '\', 600, 500);" value="...">'; // немного говнеца в стиле битрикса $result .= '<iframe id="rf_iframe_' . $_field['ID'] . '" style="width: 0; height: 0; border: none;"></iframe> <script type="text/javascript"> var prev_' . $_field['ID'] . '_val = \'' . $_field['VALUE'] . '\'; function rf_input_' . $_field['ID'] . '_check() { var val = document.getElementById(\'' . $_field['ID'] . '\').value; if(val != prev_' . $_field['ID'] . '_val) { document.getElementById("rf_iframe_' . $_field['ID'] . '").src=\'/bitrix/admin/get_user.php?ID=\' + val + \'&strName=sp_' . md5($_field['ID']) . '_text&lang=ru&admin_section=Y\'; prev_' . $_field['ID'] . '_val = val; } } setInterval(function() { rf_input_' . $_field['ID'] . '_check(); }, 1000); </script>'; break; // кнопарь // кнопарь case 'button': $result .= '<input type="button" ' . $field . ' value="' . $_field['VALUE'] . '">'; break; // обычный текстовый инпут с календариком // обычный текстовый инпут с календариком case 'date': ob_start(); global $APPLICATION; $APPLICATION->IncludeComponent("bitrix:main.calendar", "", array("SHOW_INPUT" => "Y", "FORM_NAME" => CFormRenderer::$formname, "INPUT_NAME" => $_field['NAME'], "INPUT_NAME_FINISH" => "", "INPUT_VALUE" => $_field['VALUE'], "INPUT_VALUE_FINISH" => "", "SHOW_TIME" => "N", "HIDE_TIMEBAR" => "N")); $result .= ob_get_clean(); /*$result .= '<input type="text" '.$field.' value="'.htmlspecialchars($_field['VALUE']).'">' .Calendar($_field['NAME'], CFormRenderer::$formname);*/ break; // файл // файл case 'file': $result .= '<input type="file" ' . $field . '>'; break; // хидден // хидден case 'hidden': $result .= '<input type="hidden" ' . $field . ' value="' . htmlspecialcharsEx($_field['VALUE']) . '">'; break; // множественная привязка к элементу инфоблока // множественная привязка к элементу инфоблока case 'multibind_iblock_element1': $max_i = 10; if (is_array($_field['VALUE'])) { $max_i = sizeof($_field['VALUE']) + 10; } for ($i = 0; $i < $max_i; $i++) { $result .= '<div class="rf_multielementbind_wrapper' . ($i && !$_field['VALUE'][$i] ? ' rf_hidden' : '') . '" id="multielementbind_wrapper_' . $_field['ID'] . '_' . $i . '">'; $result .= '<input type="text" ' . 'name="' . $_field['NAME'] . '_' . $i . '" id="' . $_field['ID'] . '_' . $i . '"' . ' value="' . $_field['VALUE'][$i] . '"> <span id="sp_' . md5($_field['ID']) . '_text">' . $_field['SPAN_VALUE'][$i] . '</span> <input type="button" onclick="jsUtils.OpenWindow(\'/bitrix/admin/iblock_element_search.php?lang=ru&IBLOCK_ID=' . (int) $_field['IBLOCK_ID'] . '&n=' . $_field['ID'] . '_' . $i . '&k=text\', 600, 500);" value="...">' . ($i == $max_i - 1 ? '' : '<span class="rf_command" onclick="document.getElementById(\'multielementbind_wrapper_' . $_field['ID'] . '_' . ($i + 1) . '\').style.display = \'block\';this.style.display=\'none\';">Ещё...</span>') . '</div>'; } break; // множественная привязка к элементу инфоблока с возможностью создать новый // множественная привязка к элементу инфоблока с возможностью создать новый case 'multibind_iblock_element2': $max_i = 10; if (is_array($_field['VALUE'])) { $max_i = sizeof($_field['VALUE']) + 10; } for ($i = 0; $i < $max_i; $i++) { $result .= '<div class="rf_multielementbind_wrapper' . ($i && !$_field['VALUE'][$i] ? ' rf_hidden' : '') . '" id="multielementbind_wrapper_' . $_field['ID'] . '_' . $i . '"> <span class="rf_command" onclick="document.getElementById(\'' . $_field['ID'] . '_creatediv_' . $i . '\').style.display=\'block\';">Создать</span> <div class="rf_hidden" id="' . $_field['ID'] . '_creatediv_' . $i . '">'; $result .= CFormRenderer::RenderFields($_field, 'sub_', '_' . $i); $result .= '</div>'; $result .= '<input type="text" ' . 'name="' . $_field['NAME'] . '_' . $i . '" id="' . $_field['ID'] . '_' . $i . '"' . ' value="' . $_field['VALUE'][$i] . '"> <span id="sp_' . md5($_field['ID'] . '_' . $i) . '_text">' . $_field['SPAN_VALUE'][$i] . '</span> <input type="button" onclick="jsUtils.OpenWindow(\'/bitrix/admin/iblock_element_search.php?lang=ru&IBLOCK_ID=' . (int) $_field['IBLOCK_ID'] . '&n=' . $_field['ID'] . '_' . $i . '&k=text\', 600, 500);" value="...">' . ($i == $max_i - 1 ? '' : '<span class="rf_command" onclick="document.getElementById(\'multielementbind_wrapper_' . $_field['ID'] . '_' . ($i + 1) . '\').style.display = \'block\';this.style.display=\'none\';">Ещё...</span>') . '</div>'; } break; // множественная привязка к пользователям // множественная привязка к пользователям case 'multibind_user': $max_i = 5; if (is_array($_field['VALUE'])) { $max_i = sizeof($_field['VALUE']) + 5; } for ($i = 0; $i < $max_i; $i++) { $result .= '<div class="rf_multielementbind_wrapper' . ($i && !$_field['VALUE'][$i] ? ' rf_hidden' : '') . '" id="multiuserbind_wrapper_' . $_field['ID'] . '_' . $i . '">' . '<input type="text" ' . 'name="' . $_field['NAME'] . '_' . $i . '" id="' . $_field['ID'] . '_' . $i . '"' . ' value="' . $_field['VALUE'][$i] . '"> <span id="div_sp_' . md5($_field['ID'] . '_' . $i) . '_text">' . $_field['SPAN_VALUE'][$i] . '</span> <input type="button" onclick="jsUtils.OpenWindow(\'/bitrix/admin/user_search.php?FN=' . CFormRenderer::$formname . '&FC=' . $_field['ID'] . '_' . $i . '\', 600, 500);" value="...">' . ('<iframe id="rf_iframe_' . $_field['ID'] . '_' . $i . '" style="width: 0; height: 0; border: none;"></iframe> <script type="text/javascript"> var prev_' . $_field['ID'] . '_' . $i . '_val = \'' . $_field['VALUE'][$i] . '\'; function rf_input_' . $_field['ID'] . '_' . $i . '_check() { var val = document.getElementById(\'' . $_field['ID'] . '_' . $i . '\').value; if(val != prev_' . $_field['ID'] . '_' . $i . '_val) { document.getElementById("rf_iframe_' . $_field['ID'] . '_' . $i . '").src=\'/bitrix/admin/get_user.php?ID=\' + val + \'&strName=sp_' . md5($_field['ID'] . '_' . $i) . '_text&lang=ru&admin_section=Y\'; prev_' . $_field['ID'] . '_' . $i . '_val = val; } } setInterval(function() { rf_input_' . $_field['ID'] . '_' . $i . '_check(); }, 1000); </script>') . ($i == $max_i - 1 ? '' : '<span class="rf_command" onclick="document.getElementById(\'multiuserbind_wrapper_' . $_field['ID'] . '_' . ($i + 1) . '\').style.display = \'block\';this.style.display=\'none\';">Ещё...</span>') . '</div>'; } break; // множественные файлы // множественные файлы case 'multifile': $result .= '<div id="multifile_wrapper_' . $_field['ID'] . '_0" class="rf_multifile_wrapper"> <input type="file" id="' . $_field['ID'] . '_0" name="' . $_field['NAME'] . '_0"> <span class="rf_command" onclick="document.getElementById(\'multifile_wrapper_' . $_field['ID'] . '_1\').style.display=\'block\';">Ещё</span></div>'; for ($i = 1; $i < 5; $i++) { $result .= '<div id="multifile_wrapper_' . $_field['ID'] . '_' . $i . '" class="rf_multifile_wrapper rf_hidden"> <input type="file" id="' . $_field['ID'] . '_' . $i . '" name="' . $_field['NAME'] . '_' . $i . '">'; if ($i < 4) { $result .= '<span class="rf_command" onclick="document.getElementById(\'multifile_wrapper_' . $_field['ID'] . '_' . ($i + 1) . '\').style.display=\'block\';">Ещё</span>'; } $result .= '</div>'; } break; // селект с возможностью создать новый элемент // селект с возможностью создать новый элемент case 'selectplus': $result .= '<div class="rf_hidden" id="' . $_field['ID'] . '_creatediv"> <input type="text" id="' . $_field['ID'] . '_addnew" name="' . $_field['NAME'] . '_addnew"> </div> <span class="rf_command" onclick="document.getElementById(\'' . $_field['ID'] . '_creatediv\').style.display=\'block\';">Добавить элемент</span>'; // обратите внимание на отсутствие брейка - далене должен идти case 'select' // селект // селект case 'select': $result .= '<select ' . $field . '> <option value=""' . ($_field['VALUE'] == '' ? ' selected' : '') . '></option>'; foreach ($_field['ITEMS'] as $k => $v) { $result .= '<option value="' . $k . '"' . ($_field['VALUE'] == $k ? ' selected' : '') . '>' . $v . '</option>'; } $result .= '</select>'; break; // сабмит // сабмит case 'submit': $result .= '<input type="submit" ' . $field . ' value="' . $_field['VALUE'] . '">'; break; // текстареа // текстареа case 'textarea': $result .= '<textarea ' . $field . ' rows="10" cols="60">' . htmlspecialchars($_field['VALUE']) . '</textarea>'; break; // массив текстовых полей с ключами // массив текстовых полей с ключами case 'textarray': if (is_array($_field['VALUE'])) { $sizeof = sizeof($_field['VALUE']); } else { $_field['VALUE'] = array(array('' => '')); $sizeof = 5; } $result .= '<table id="' . $_field['ID'] . '_table">'; $i = 0; foreach ($_field['VALUE'] as &$v) { $result .= '<tr id="' . $_field['ID'] . '_tr_' . $i . '"> <td><input type="text" class="' . $_field['CLASS'] . ' rf_textarray_key" name="' . $_field['ID'] . '_key[' . $i . ']" id="' . $_field['ID'] . '_key_' . $i . '" value="' . htmlspecialchars($k) . '"></td> <td><input type="text" class="' . $_field['CLASS'] . ' rf_textarray_value" name="' . $_field['ID'] . '_value[' . $i . ']" id="' . $_field['ID'] . '_key_' . $i . '" value="' . htmlspecialchars($v) . '"></td> </tr>'; $i++; } // тут немножко говнеца $result .= '</table> <script type="text/javascript"> var last' . $_field['ID'] . '_counter = "' . $i . '"; </script> <span class="rf_command" onclick=" var newtr = document.createElement(\'tr\'); newtr.id = \'' . $_field['ID'] . '_tr_\' + last' . $_field['ID'] . '_counter; document.getElementById(\'' . $_field['ID'] . '_table\').appendChild(newtr); var newinp = document.createElement(\'input\'); newinp.type = \'text\'; newinp.className = \'' . $_field['CLASS'] . ' rf_textarray_key\'; newinp.id = \'' . $_field['ID'] . '_key_\' + last' . $_field['ID'] . '_counter; newinp.name = \'' . $_field['ID'] . '_key[\' + last' . $_field['ID'] . '_counter + \']\'; var newtd = document.createElement(\'td\'); newtr.appendChild(newtd); newtd.appendChild(newinp); newinp = document.createElement(\'input\'); newinp.type = \'text\'; newinp.className = \'' . $_field['CLASS'] . ' rf_textarray_key\'; newinp.id = \'' . $_field['ID'] . '_value_\' + last' . $_field['ID'] . '_counter; newinp.name = \'' . $_field['ID'] . '_value[\' + last' . $_field['ID'] . '_counter + \']\'; newtd = document.createElement(\'td\'); newtr.appendChild(newtd); newtd.appendChild(newinp) last' . $_field['ID'] . '_counter++; ">Ещё</span>'; break; // привязка к Яндекс-карте // привязка к Яндекс-карте case 'yandexmap': require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/fileman/properties.php'; ob_start(); CIBlockPropertyMapYandex::GetPropertyFieldHtml(array('ID' => $_field['ID'], 'NAME' => $_field['LABEL'], 'ACTIVE' => 'Y', 'CODE' => $_field['NAME'], 'MULTIPLE' => 'N', 'USER_TYPE' => 'map_yandex', 'USER_TYPE_SETTINGS' => ''), array('VALUE' => $_field['VALUE']), array('VALUE' => $_field['NAME'], 'FORM_NAM' => CFormRenderer::$formname, 'MODE' => 'FORM_FILL')); $cart = ob_get_clean(); if ($_field['MAP_CENTER']) { $cart = str_replace('map.disableRuler();', 'map.disableRuler(); map.setCenter(new context.YMaps.GeoPoint(' . $_field['MAP_CENTER'] . '), 10, context.YMaps.MapType.MAP);', $cart); } $result .= $cart; break; //Пароль //Пароль case 'password': $result .= '<input type="password" ' . $field . '>'; break; // обычный текстовый инпут // обычный текстовый инпут case 'text': default: $result .= '<input type="text" ' . $field . ' value="' . htmlspecialchars($_field['VALUE']) . '">'; break; } if (ToLower($_field['TYPE'] != 'hidden')) { $result .= '</div></div>'; } return $result; }
/** * Запилить! * @param string $mode режим вызова * @param int $hole_id номер дефекта */ public static function Execute($mode, $hole_id) { global $USER; if($mode == 'pdf') { ob_start(); } // path $_path = explode('?', ltrim($_SERVER['REQUEST_URI'], '/')); $_path[0] = explode('/', trim($_path[0], ' /')); echo '<?xml version="1.0" encoding="UTF-8"?>'."\n"; // стандартный заголовок ответа { ?><st1234reply> <requesttime><?= $_SERVER['REQUEST_TIME'] ?></requesttime> <requestmethod><?= $_SERVER['REQUEST_METHOD'] ?></requestmethod> <replytime><?= time() ?></replytime> <? } // обработка вызова в зависимости от режима switch($mode) { case 'add': { // добавление ямы // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } // проверка адреса $_POST['address'] = trim($_POST['address']); if(!strlen($_POST['address'])) { echo C1234HoleApiXML::Error('NO_ADDRESS'); break; } $address = C1234Hole::Address($_POST['address']); $subject_rf = $address['subject_rf']; $city = $address['city']; $address = $address['address']; // ворнинги, если надо if(!$subject_rf) { echo C1234HoleApiXML::Warning('CANNOT_REALISE_SUBJECTRF'); } if(!$city) { echo C1234HoleApiXML::Warning('CANNOT_REALISE_CITY'); } // координаты $longitude = false; $latitude = false; if(isset($_POST['longitude'])) { $longitude = (float)$_POST['longitude']; } if(isset($_POST['latitude'])) { $latitude = (float)$_POST['latitude']; } if(!$latitude || !$longitude && isset($_POST['coordinates'])) { list($latitude, $longitude) = explode(',', $_POST['coordinates']); $latitude = (float)$latitude; $longitude = (float)$longitude; } elseif(!$latitude || !$longitude && isset($_POST['coordinatesr'])) { list($longitude, $latitude) = explode(',', $_POST['coordinatesr']); $latitude = (float)$latitude; $longitude = (float)$longitude; } if(!$latitude) { echo C1234HoleApiXML::Error('LATITUDE_NOT_SET'); break; } if(!$longitude) { echo C1234HoleApiXML::Error('LONGITUDE_NOT_SET'); break; } // типы дефектов if(in_array($_POST['type'], C1234HoleApi::$_deprecated_types)) { echo C1234HoleApiXML::Error('DEPRECATED_TYPE'); break; } if(!in_array($_POST['type'], C1234HoleApi::$_allowed_types)) { echo C1234HoleApiXML::Error('INCORRECT_TYPE'); break; } $files_count = 0; foreach($_FILES as $file) { if($file['error'] != 4) { if ( $file['type'] != 'image/png' && $file['type'] != 'image/x-png' && $file['type'] != 'image/jpeg' && $file['type'] != 'image/pjpeg' && $file['type'] != 'image/gif' && $file['type'] ) { echo C1234HoleApiXML::Error('UNKNOWN_MIME_TYPE'); break 2; } if($file['error'] == 1) { echo C1234HoleApiXML::Error('TOO_BIG_FILE'); break 2; } if($file['error'] == 3) { echo C1234HoleApiXML::Error('PARTIALLY_UPLOADED_FILE'); break 2; } if($file['error'] != 0) { echo C1234HoleApiXML::Error('CANNOT_UPLOAD_FILE'); break 2; } $files_count++; } } if(!$files_count) { echo C1234HoleApiXML::Error('NO_FILES'); break; } if($files_count > ini_get('max_file_uploads')) { echo C1234HoleApiXML::Error('TOO_MANY_FILES'); break; } if($files_count > 10) { echo C1234HoleApiXML::Warning('FILES_DROPPED'); $_FILES = array_slice($_FILES, 10); } // настройки по-умолчанию $arParams = array ( 'BIG_SIZEX' => 1024, 'BIG_SIZEY' => 1024, 'MEDIUM_SIZEX' => 600, 'MEDIUM_SIZEY' => 450, 'SMALL_SIZEX' => 240, 'SMALL_SIZEY' => 160, 'PREMODERATED' => 0, 'MIN_DELAY_TIME' => 60 ); // раздобудем настройки из компонента $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/index.php'); preg_match('/(\'|\")PREMODERATION\1 => (\"|\')(Y|N|)\2/', $raw, $_match); if($_match[3] == 'Y') { $arParams['PREMODERATED'] = 0; } preg_match('/(\'|\")MIN_DELAY_TIME\1 => (\"|\')\d\2/', $raw, $_match); if(isset($_match[3])) { $arParams['MIN_DELAY_TIME'] = $_match[3] * 60; } $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/personal/add/index.php'); foreach($arParams as $k => $v) { preg_match('/(\'|\")'.$k.'\1 => (\"|\')[\d]+\2/', $raw, $_match); if($_match[3]) { $arParams[$k] = (int)$_match[3]; } } $inserted_id = C1234Hole::Add ( array ( 'USER_ID' => $USER->GetID(), 'LATITUDE' => $latitude, 'LONGITUDE' => $longitude, 'ADDRESS' => $city.($address && $city ? ', ' : ' ').$address, 'COMMENT1' => $_POST['comment'], 'COMMENT2' => '', 'TYPE' => $_POST['type'], 'FILES' => $_FILES, 'ADR_SUBJECTRF' => $subject_rf, 'ADR_CITY' => $city, 'PREMODERATED' => $arParams['PREMODERATED'] ), array ( 'big_sizex' => $arParams['BIG_SIZEX'], 'big_sizey' => $arParams['BIG_SIZEY'], 'medium_sizex' => $arParams['MEDIUM_SIZEX'], 'medium_sizey' => $arParams['MEDIUM_SIZEY'], 'small_sizex' => $arParams['SMALL_SIZEX'], 'small_sizey' => $arParams['SMALL_SIZEY'], 'min_delay_time' => $arParams['MIN_DELAY_TIME'] ), &$error ); if(!$inserted_id) { echo "\t".'<error code="CANNOT_ADD_DEFECT">'.$error."</error>\n"; echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } echo "\t".'<callresult result="1" inserteddefectid="'.$inserted_id.'">ok</callresult>'."\n"; break; } case 'authorize': { // авторизация if($USER->IsAuthorized()) { $USER->Logout(); } $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); if($auth_result === true) { echo C1234HoleApiXML::UserAuthParams(); } else { echo C1234HoleApiXML::Error('WRONG_CREDENTIALS'); } break; } case 'checkauth': { // проверка авторизованности $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); if($auth_result === true) { echo "\t".'<checkauthresult result="1">ok</checkauthresult>'."\n"; } else { echo "\t".'<checkauthresult result="0">fail</checkauthresult>'."\n"; } break; } case 'delete': { // удаление ямы // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] != 'fresh') { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if(C1234Hole::Delete($hole_id)) { echo "\t".'<callresult result="1">ok</callresult>'."\n"; } else { echo "\t".'<error code="CANNOT_DELETE_DEFECT">'.$error.'</error>'."\n" ."\t".'<callresult result="0">fail</callresult>'."\n"; } break; } case 'exit': { // разлогиниться $USER->Logout(); echo C1234HoleApiXML::ProcedureResult(); break; } case 'geocode': { // предварительная авторизация if($_POST['passwordhash']) { $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } if(!strlen($_POST['geocode'])) { echo C1234HoleApiXML::Error('GEOCODE_EMPTY_REQUEST'); break; } require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/fileman/properties.php'); $c = curl_init('http://geocode-maps.yandex.ru/1.x/?format=xml&geocode='.urlencode($_POST['geocode']).'&key='.CIBlockPropertyMapYandex::_GetMapKey('yandex', $_SERVER['SERVER_NAME'])); ob_start(); curl_exec($c); $out = explode("\n", ob_get_clean()); $cinfo = curl_getinfo($c); unset($out[0]); curl_close($c); if ( $cinfo['http_code'] != 200 || !sizeof($out) || substr($cinfo['content_type'], 0, 8) != 'text/xml' || !$cinfo['size_download'] ) { echo C1234HoleApiXML::Error('GEOCODE_ERROR'); break; } echo "\t".'<geocode>'."\n"; foreach($out as $str) { echo "\t\t".str_replace(' ', "\t", $str)."\n"; } echo "\t".'</geocode>'."\n"; break; } case 'getgibddhead': { // узнать ФИО начальника ГИБДД // предварительная авторизация if($_POST['passwordhash']) { $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID'] || $hole['USER_ID'] != $USER->GetID()) { echo C1234HoleApiXML::Error('NOT_FOUND'); break; } if(!CModule::IncludeModule('iblock')) { echo C1234HoleApiXML::Error('INTERNAL'); break; } if(!$hole['ADR_SUBJECTRF']) { echo C1234HoleApiXML::Warning('NO_SUBJECTRF_ID'); } $res = CIBlockElement::GetList(array(), array('IBLOCK_CODE' => 'GIBDD_HEADS', 'PROPERTY_SUBJECT_ID' => $hole['ADR_SUBJECTRF']), array('PROPERTY_FIO', 'PROPERTY_POST', 'PROPERTY_POST_DATIVE', 'PROPERTY_FIO_DATIVE', 'PROPERTY_POST')); $arElement = $res->Fetch(); $arElement['GIBDD'] = explode(' ', $arElement['PROPERTY_POST_VALUE']); $arElement['GIBDD'] = array_slice($arElement['GIBDD'], 1); if(ToUpper($arElement['GIBDD'][0]) == 'УПРАВЛЕНИЯ') { $arElement['GIBDD'][0] = 'УПРАВЛЕНИЕ'; } $arElement['GIBDD'] = implode(' ', $arElement['GIBDD']); echo "\t".'<gibddhead subjectid="'.$hole['ADR_SUBJECTRF'].'">'."\n"; echo "\t\t".'<nominative post="'.htmlspecialchars($arElement['PROPERTY_POST_VALUE']).'" gibdd="'.htmlspecialchars($arElement['GIBDD']).'">'.htmlspecialchars($arElement['PROPERTY_FIO_VALUE']).'</nominative>'."\n"; echo "\t\t".'<dative post="'.htmlspecialchars($arElement['PROPERTY_POST_DATIVE_VALUE']).'">'.htmlspecialchars($arElement['PROPERTY_FIO_DATIVE_VALUE']).'</dative>'."\n"; echo "\t".'</gibddhead>'."\n"; break; } case 'getregions': { // список регионов echo C1234HoleApiXML::GetRegions(); break; } case 'getgibddheadbyregion': { $id=0; if (isset($_GET['region_id']) && $_GET['region_id']) $id=$_GET['region_id']; if (isset($_POST['region_id']) && $_POST['region_id']) $id=$_POST['region_id']; if ($id && CGreensightRFSubject::isID($id)) echo C1234HoleApiXML::GetRegionGIBDD($id); else echo C1234HoleApiXML::Error('NOT_FOUND'); break; } case 'getupdmethods': { // получить список возможных методов обновления дефекта if($hole_id) { // предварительная авторизация if($_POST['passwordhash']) { $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); break; } if($hole['USER_ID'] != $USER->GetID()) { echo C1234HoleApiXML::Error('NOT_FOUND'); break; } } if($hole['STATE'] == 'fresh' || !$hole_id) { ?> <state id="fresh"> <method name="update"> <field>address</field> <field>latitude</field> <field>longitude</field> <field>coordinates</field> <field>coordinatesr</field> <field>comment</field> <field>type</field> <field>files</field> <field>deletefiles</field> </method> <method name="set_inprogress"></method> <method name="set_fixed"> <field>files</field> <field>comment</field> </method> </state> <? } if($hole['STATE'] == 'inprogress' || !$hole_id) { ?> <state id="inprogress"> <method name="revoke"></method> <method name="set_replied"> <field>files</field> <field>comment</field> </method> <method name="set_fixed"> <field>files</field> <field>comment</field> </method> </state> <? } if($hole['STATE'] == 'fixed' || !$hole_id) { echo "\t".'<state id="fixed">'; if(!$hole && !sizeof($hole['pictures']['fixed'])) { echo "\n\t\t".'<method name="set_inprogress"></method>'."\n"; } echo "\t".'</state>'."\n"; } if($hole['STATE'] == 'achtung' || !$hole_id) { ?> <state id="achtung"> <method name="set_fixed"> <field>files</field> <field>comment</field> </method> <method name="to_prosecutor"></method> <method name="set_replied"> <field>files</field> <field>comment</field> </method> </state> <? } if($hole['STATE'] == 'prosecutor' || !$hole_id) { ?> <state id="prosecutor"> <method name="revoke_p"></method> <method name="set_fixed"> <field>files</field> <field>comment</field> </method> </state> <? } if($hole['STATE'] == 'gibddre' || !$hole_id) { ?> <state id="gibddre"> <method name="set_fixed"> <field>files</field> <field>comment</field> </method> <method name="set_replied"> <field>files</field> <field>comment</field> <field>deletefiles</field> </method> </state> <? } break; } case 'hole-cart': { // карточка ямы $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/index.php'); preg_match('/(\'|\")PREMODERATION\1[\s]*=>[\s]*(\"|\')(Y|N)\2/', $raw, $_match); $bPremoderation = $_match[3] == 'Y'; $hole = C1234Hole::GetById($hole_id); if($hole && (!$bPremoderation || ($bPremoderation && $hole['PREMODERATED']))) { echo C1234HoleApiXML::Hole($hole, 0); } else { echo C1234HoleApiXML::Error('NOT_FOUND'); } break; } case 'holes-list': { // список ям // получение настроек компонента списка ям $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/index.php'); preg_match('/(\'|\")HOLES_PER_PAGE\1[\s]*=>[\s]*(\"|\')([\d]+)\2/', $raw, $_match); $default_limit = $_match[3]; if(!$default_limit) { $default_limit = 30; } if($default_limit > 2000) { $default_limit = 2000; } preg_match('/(\'|\")PREMODERATION\1[\s]*=>[\s]*(\"|\')(Y|N)\2/', $raw, $_match); $bPremoderation = $_match[3] == 'Y'; // сортировка $arSort = array('ID' => 'desc'); // фильтр $arFilter = array(); if(isset($_REQUEST['filter_rf_subject_id'])) { $arFilter['ADR_SUBJECTRF'] = (int)$_REQUEST['filter_rf_subject_id']; } if($_REQUEST['filter_city']) { $arFilter['ADR_CITY'] = htmlspecialchars(str_replace('%', '', $_REQUEST['filter_city'])); } if($_REQUEST['filter_type']) { $arFilter['TYPE'] = htmlspecialchars($_REQUEST['filter_type']); } if($_REQUEST['filter_status']) { $arFilter['STATE'] = htmlspecialchars($_REQUEST['filter_status']); } if($bPremoderation) { $arFilter['PREMODERATED'] = 1; } // параметры навигации $arNavParams = array(); if($_REQUEST['limit']) { $arNavParams['limit'] = (int)$_REQUEST['limit']; } if(!$arNavParams['limit']) { $arNavParams['limit'] = $default_limit; } if($_REQUEST['offset']) { $arNavParams['offset'] = (int)$_REQUEST['offset']; } if(!$arNavParams['offset']) { $arNavParams['offset'] = (int)$_REQUEST['page'] * $default_limit; } if($_REQUEST['page']) { $arNavParams['limit'] = $default_limit; $arNavParams['offset'] = (int)$_REQUEST['page'] * $default_limit; } // выборка ям $_holes = C1234Hole::GetList($arSort, $arFilter, $arNavParams, &$pages_count); // вывод результатов $_users = array(); { ?> <sort><? if(sizeof($arSort)) { echo "\n\t"; } foreach($arSort as $k => $v): ?> <item code="<?= $k ?>"><?= $v ?></item> <? endforeach; ?></sort> <filter><? if(sizeof($arFilter)) { echo "\n\t"; } foreach($arFilter as $k => $v): ?> <item code="<?= $k ?>"><?= $v ?></item> <? endforeach; ?></filter> <navigation><? if(sizeof($arNavParams)) { echo "\n\t"; } foreach($arNavParams as $k => $v): ?> <item code="<?= $k ?>"><?= $v ?></item> <? endforeach; ?></navigation> <defectslist><? if(sizeof($_holes)) { echo "\n\t"; } foreach($_holes as $hole): echo C1234HoleApiXML::Hole($hole, 1); endforeach; ?></defectslist> <? } break; } case 'pdf': { // создание и выгрузка пдф // предварительная авторизация if($_POST['passwordhash']) { $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { ob_end_flush(); echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID'] || $hole['USER_ID'] != $USER->GetID()) { ob_end_flush(); echo C1234HoleApiXML::Error('NOT_FOUND'); break; } $date3 = $hole['DATE_STATUS']; $date2 = $hole['STATE'] == 'gibddre' || $hole['STATE'] == 'achtung' ? $hole['DATE_SENT'] : time(); if($hole['STATE'] == 'gibddre' && $_path[0][2] == 'pdf_prosecutor') { $state = 'prosecutor2'; } elseif($hole['STATE'] == 'achtung' && $_path[0][2] == 'pdf_prosecutor') { $state = 'prosecutor2'; } elseif(($hole['STATE'] == 'fresh' || $hole['STATE'] == 'inprogress') && $_path[0][2] == 'pdf_gibdd') { $state = $hole['TYPE']; } else { ob_end_flush(); echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); break; } header_remove('Content-Type'); $_images = array(); foreach($hole['pictures']['original']['fresh'] as $src) { $_images[] = $_SERVER['DOCUMENT_ROOT'].$src; } ob_end_clean(); $PDF = new pdf1234(); $PDF->getpdf ( $state, array ( 'chief' => iconv('utf-8', 'windows-1251', $_POST['to']), 'fio' => iconv('utf-8', 'windows-1251', $_POST['from']), 'address' => iconv('utf-8', 'windows-1251', $_POST['postaddress']), 'date1.day' => date('d', $hole['DATE_CREATED']), 'date1.month' => date('m', $hole['DATE_CREATED']), 'date1.year' => date('Y', $hole['DATE_CREATED']), 'street' => iconv('utf-8', 'windows-1251', $_POST['holeaddress']), 'date2.day' => date('d', $date2), 'date2.month' => date('m', $date2), 'date2.year' => date('Y', $date2), 'signature' => iconv('utf-8', 'windows-1251', $_POST['signature']), 'reason' => iconv('utf-8', 'windows-1251', $_POST['comment']), 'date3.day' => date('d', $date3), 'date3.month' => date('m', $date3), 'date3.year' => date('Y', $date3), 'gibdd' => iconv('utf-8', 'windows-1251', $_POST['gibdd']), 'gibdd_reply' => iconv('utf-8', 'windows-1251', $_POST['gibdd_reply']) ), $_images ); die(); break; } case 'personal-hole-cart': { // карточка своей ямы // предварительная авторизация if($_POST['passwordhash']) { $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } $hole = C1234Hole::GetById((int)$hole_id); if($hole['USER_ID'] != $USER->GetID()) { echo C1234HoleApiXML::Error('NOT_FOUND'); } else { echo C1234HoleApiXML::Hole($hole, 0); } break; } case 'personal-holes-list': { // список своих ям // предварительная авторизация if($_POST['passwordhash']) { $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } // получение настроек компонента списка ям $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/index.php'); preg_match('/(\'|\")HOLES_PER_PAGE\1[\s]*=>[\s]*(\"|\')([\d]+)\2/', $raw, $_match); $default_limit = $_match[3]; if(!$default_limit) { $default_limit = 30; } if($default_limit > 2000) { $default_limit = 2000; } // сортировка $arSort = array('ID' => 'desc'); // фильтр $arFilter = array('USER_ID' => $USER->GetID()); if(isset($_REQUEST['filter_rf_subject_id'])) { $arFilter['ADR_SUBJECTRF'] = (int)$_REQUEST['filter_rf_subject_id']; } if($_REQUEST['filter_city']) { $arFilter['ADR_CITY'] = htmlspecialchars(str_replace('%', '', $_REQUEST['filter_city'])); } if($_REQUEST['filter_type']) { $arFilter['TYPE'] = htmlspecialchars($_REQUEST['filter_type']); } if($_REQUEST['filter_status']) { $arFilter['STATE'] = htmlspecialchars($_REQUEST['filter_status']); } // параметры навигации $arNavParams = array(); if($_REQUEST['limit']) { $arNavParams['limit'] = (int)$_REQUEST['limit']; } if(!$arNavParams['limit']) { $arNavParams['limit'] = $default_limit; } if($_REQUEST['offset']) { $arNavParams['offset'] = (int)$_REQUEST['offset']; } if(!$arNavParams['offset']) { $arNavParams['offset'] = (int)$_REQUEST['page'] * $default_limit; } if($_REQUEST['page']) { $arNavParams['limit'] = $default_limit; $arNavParams['offset'] = (int)$_REQUEST['page'] * $default_limit; } // выборка ям $_holes = C1234Hole::GetList($arSort, $arFilter, $arNavParams, &$pages_count); // вывод результатов $_users = array(); { ?> <sort><? if(sizeof($arSort)) { echo "\n\t"; } foreach($arSort as $k => $v): ?> <item code="<?= $k ?>"><?= $v ?></item> <? endforeach; ?></sort> <filter><? if(sizeof($arFilter)) { echo "\n\t"; } foreach($arFilter as $k => $v): ?> <item code="<?= $k ?>"><?= $v ?></item> <? endforeach; ?></filter> <navigation><? if(sizeof($arNavParams)) { echo "\n\t"; } foreach($arNavParams as $k => $v): ?> <item code="<?= $k ?>"><?= $v ?></item> <? endforeach; ?></navigation> <defectslist><? if(sizeof($_holes)) { echo "\n\t"; } foreach($_holes as $hole): echo C1234HoleApiXML::Hole($hole, 1); endforeach; ?></defectslist> <? } break; } case 'update-common': { // обычное обновление ямы // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID() && !$USER->IsAdmin()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] != 'fresh') { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_fields = array('COMMENT1' => trim($_POST['comment'])); $_params = array ( 'big_sizex' => 1024, 'big_sizey' => 1024, 'medium_sizex' => 600, 'medium_sizey' => 450, 'small_sizex' => 240, 'small_sizey' => 160 ); // проверка адреса $_POST['address'] = trim($_POST['address']); if(strpos($_POST['address'], $hole['ADDRESS']) === 0) { // уродливая подпорка // если адрес совпадает с тем, или больше чем, что уже есть, // меняем только адрес $_fields['ADR_SUBJECTRF'] = $hole['ADR_SUBJECTRF']; $_fields['ADR_CITY'] = $hole['ADR_CITY']; $_fields['ADDRESS'] = $_POST['address']; } elseif(strlen($_POST['address'])) { $address = C1234Hole::Address($_POST['address']); $_fields['ADR_SUBJECTRF'] = $address['subject_rf']; $_fields['ADR_CITY'] = $address['city']; $_fields['ADDRESS'] = $address['city'].(strlen($address['address']) && strlen($address['city'])? ', ' : '').$address['address']; // ворнинги, если надо if(!$_fields['ADR_SUBJECTRF']) { echo C1234HoleApiXML::Warning('CANNOT_REALISE_SUBJECTRF'); } if(!$_fields['ADR_CITY']) { echo C1234HoleApiXML::Warning('CANNOT_REALISE_CITY'); } } // координаты $longitude = false; $latitude = false; if(isset($_POST['longitude'])) { $longitude = (float)$_POST['longitude']; } if(isset($_POST['latitude'])) { $latitude = (float)$_POST['latitude']; } if(!$latitude || !$longitude && isset($_POST['coordinates'])) { list($latitude, $longitude) = explode(',', $_POST['coordinates']); $latitude = (float)$latitude; $longitude = (float)$longitude; } elseif(!$latitude || !$longitude && isset($_POST['coordinatesr'])) { list($longitude, $latitude) = explode(',', $_POST['coordinatesr']); $latitude = (float)$latitude; $longitude = (float)$longitude; } if($latitude) { $_fields['LATITUDE'] = $latitude; } if($longitude) { $_fields['LONGITUDE'] = $longitude; } // типы дефектов if(in_array($_POST['type'], C1234HoleApi::$_deprecated_types)) { echo C1234HoleApiXML::Error('DEPRECATED_TYPE'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if(!in_array($_POST['type'], C1234HoleApi::$_allowed_types)) { echo C1234HoleApiXML::Error('INCORRECT_TYPE'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_fields['TYPE'] = $_POST['type']; // разберёмся с файлами $files_count = 0; foreach($_FILES as $file) { if($file['error'] != 4) { if ( $file['type'] != 'image/png' && $file['type'] != 'image/x-png' && $file['type'] != 'image/jpeg' && $file['type'] != 'image/pjpeg' && $file['type'] != 'image/gif' && $file['type'] ) { echo C1234HoleApiXML::Error('UNKNOWN_MIME_TYPE'); break 2; } if($file['error'] == 1) { echo C1234HoleApiXML::Error('TOO_BIG_FILE'); break 2; } if($file['error'] == 3) { echo C1234HoleApiXML::Error('PARTIALLY_UPLOADED_FILE'); break 2; } if($file['error'] != 0) { echo C1234HoleApiXML::Error('CANNOT_UPLOAD_FILE'); break 2; } $files_count++; } } if($files_count > ini_get('max_file_uploads')) { echo C1234HoleApiXML::Error('TOO_MANY_FILES'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } // разберёмся с удаляемыми файлами if(!is_array($_POST['deletefiles'])) { $_fields['DELETEFILES'] = explode(',', $_POST['deletefiles']); } foreach($_fields['DELETEFILES'] as &$deletefile) { $deletefile = trim($deletefile); } if ( sizeof($hole['pictures']['original']['fresh']) + sizeof($hole['pictures']['original']['gibddre']) + sizeof($hole['pictures']['original']['fixed']) - sizeof($_fields['DELETEFILES']) + $files_count > 100 ) { echo C1234HoleApiXML::Warning('FILES_LIMIT_REACHED'); echo C1234HoleApiXML::Warning('FILES_DROPPED'); $slice = 100 - sizeof($hole['pictures']['original']['fresh']) - sizeof($hole['pictures']['original']['gibddre']) - sizeof($hole['pictures']['original']['fixed']) + sizeof($_fields['DELETEFILES']); if($slice > 0) { $_fields['FILES'] = array_slice($_FILES, max(10, $slice)); } } elseif($files_count > 10) { echo C1234HoleApiXML::Warning('FILES_DROPPED'); $_fields['FILES'] = array_slice($_FILES, 10); } else { $_fields['FILES'] = $_FILES; } // раздобудем настройки из компонента $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/personal/add/index.php'); foreach($arParams as $k => $v) { preg_match('/(\'|\")'.$k.'\1 => (\"|\')[\d]+\2/', $raw, $_match); if($_match[3]) { $_params[ToLower($k)] = (int)$_match[3]; } } // теперь можно и обновить $mode = 'update'; break; } case 'update-revoke': { // отозвать заявление из ГИБДД // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID() && !$USER->IsAdmin()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] != 'inprogress') { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_params = array(); $_fields = array ( 'DATE_STATUS' => time(), 'STATE' => 'fresh' ); $mode = 'update'; break; } case 'update-revokep': { // отозвать заявление из прокуратуры // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID() && !$USER->IsAdmin()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] != 'prosecutor') { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_params = array(); $_fields = array ( 'DATE_STATUS' => time(), 'DATE_SENT_PROSECUTOR' => 0, 'STATE' => 'achtung' ); $mode = 'update'; break; } case 'update-setfixed': { // пометка ямы как исправленной // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID() && !$USER->IsAdmin()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] == 'fixed') { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_fields = array ( 'STATE' => 'fixed', 'DATE_STATUS' => time(), 'COMMENT2' => trim($_POST['comment']) ); $_params = array ( 'big_sizex' => 1024, 'big_sizey' => 1024, 'medium_sizex' => 600, 'medium_sizey' => 450, 'small_sizex' => 240, 'small_sizey' => 160 ); // разберёмся с файлами $files_count = 0; foreach($_FILES as $file) { if($file['error'] != 4) { if ( $file['type'] != 'image/png' && $file['type'] != 'image/x-png' && $file['type'] != 'image/jpeg' && $file['type'] != 'image/pjpeg' && $file['type'] != 'image/gif' && $file['type'] ) { echo C1234HoleApiXML::Error('UNKNOWN_MIME_TYPE'); break 2; } if($file['error'] == 1) { echo C1234HoleApiXML::Error('TOO_BIG_FILE'); break 2; } if($file['error'] == 3) { echo C1234HoleApiXML::Error('PARTIALLY_UPLOADED_FILE'); break 2; } if($file['error'] != 0) { echo C1234HoleApiXML::Error('CANNOT_UPLOAD_FILE'); break 2; } $files_count++; } } if($files_count > ini_get('max_file_uploads')) { echo C1234HoleApiXML::Error('TOO_MANY_FILES'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($files_count > 10) { echo C1234HoleApiXML::Warning('FILES_DROPPED'); $_fields['FILES'] = array_slice($_FILES, 10); } else { $_fields['FILES'] = $_FILES; } // раздобудем настройки из компонента $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/personal/add/index.php'); foreach($arParams as $k => $v) { preg_match('/(\'|\")'.$k.'\1 => (\"|\')[\d]+\2/', $raw, $_match); if($_match[3]) { $_params[ToLower($k)] = (int)$_match[3]; } } // теперь можно и обновить $mode = 'update'; break; } case 'update-setinprogress': { // поставить яме статус "в процессе" // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID() && !$USER->IsAdmin()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] != 'fresh' && !($hole['STATE'] == 'fixed' && !sizeof($hole['pictures']['original']['fixed']))) { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_params = array(); $_fields = array ( 'DATE_STATUS' => time(), 'STATE' => 'inprogress' ); if($hole['STATE'] == 'fresh') { $_fields['DATE_SENT'] = time(); } else { if($hole['DATE_SENT'] < time() - 37 * 86400) { $_fields['STATE'] = 'achtung'; } if($hole['GIBDD_REPLY_RECEIVED']) { $_fields['STATE'] = 'gibddre'; } if($hole['DATE_SENT_PROSECUTOR']) { $_fields['STATE'] = 'prosecutor'; } if(!$hole['DATE_SENT']) { $_fields['STATE'] = 'fresh'; } } $mode = 'update'; break; } case 'update-setreplied': { // поставить яму в статус "получен ответ из гибдд" // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID() && !$USER->IsAdmin()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] != 'inprogress' && $hole['STATE'] != 'gibddre' && $hole['STATE'] != 'achtung') { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_fields = array ( 'STATE' => 'gibddre', 'DATE_STATUS' => time(), 'GIBDD_REPLY_RECEIVED' => 1, 'COMMENT_GIBDD_REPLY' => trim($_POST['comment']) ); $_params = array ( 'big_sizex' => 1024, 'big_sizey' => 1024, 'medium_sizex' => 600, 'medium_sizey' => 450, 'small_sizex' => 240, 'small_sizey' => 160 ); // если надо удалить файлы, удалим if(!is_array($_REQUEST['deletefiles'])) { $_fields['DELETEFILES'] = explode(',', $_REQUEST['deletefiles']); } foreach($_fields['DELETEFILES'] as &$f) { $f = trim($f); if(strlen($f) && substr($f, 0, 2) == 'gr') { unlink($_SERVER['DOCUMENT_ROOT'].'/upload/st1234/original/'.$hole_id.'/'.$f); unlink($_SERVER['DOCUMENT_ROOT'].'/upload/st1234/medium/'.$hole_id.'/'.$f); unlink($_SERVER['DOCUMENT_ROOT'].'/upload/st1234/small/'.$hole_id.'/'.$f); } } unset($_REQUEST['deletefiles']); unset($_fields['DELETEFILES']); // разберёмся с загружаемыми файлами $files_count = 0; foreach($_FILES as $file) { if($file['error'] != 4) { if ( $file['type'] != 'image/png' && $file['type'] != 'image/x-png' && $file['type'] != 'image/jpeg' && $file['type'] != 'image/pjpeg' && $file['type'] != 'image/gif' && $file['type'] ) { echo C1234HoleApiXML::Error('UNKNOWN_MIME_TYPE'); break 2; } if($file['error'] == 1) { echo C1234HoleApiXML::Error('TOO_BIG_FILE'); break 2; } if($file['error'] == 3) { echo C1234HoleApiXML::Error('PARTIALLY_UPLOADED_FILE'); break 2; } if($file['error'] != 0) { echo C1234HoleApiXML::Error('CANNOT_UPLOAD_FILE'); break 2; } $files_count++; } } if($files_count > ini_get('max_file_uploads')) { echo C1234HoleApiXML::Error('TOO_MANY_FILES'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($files_count > 10) { echo C1234HoleApiXML::Warning('FILES_DROPPED'); $_fields['FILES'] = array_slice($_FILES, 10); } else { $_fields['FILES'] = $_FILES; } // раздобудем настройки из компонента $raw = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/personal/add/index.php'); foreach($arParams as $k => $v) { preg_match('/(\'|\")'.$k.'\1 => (\"|\')[\d]+\2/', $raw, $_match); if($_match[3]) { $_params[ToLower($k)] = (int)$_match[3]; } } // теперь можно и обновить $mode = 'update'; break; } case 'update-toprosecutor': { // поменять статус на "жалоба в прокуратуру подана" // предварительная авторизация if(!$USER->GetID()) { if($_POST['passwordhash']) { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['passwordhash'], 'N', 'N'); } else { $auth_result = $auth_result = $USER->Login($_POST['login'], $_POST['password'], 'N', 'Y'); } if($auth_result !== true) { echo C1234HoleApiXML::Error('AUTHORIZATION_REQUIRED'); break; } } $hole = C1234Hole::GetById($hole_id); if(!$hole['ID']) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['USER_ID'] != $USER->GetID() && !$USER->IsAdmin()) { echo C1234HoleApiXML::Error('NOT_FOUND'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } if($hole['STATE'] != 'achtung') { echo C1234HoleApiXML::Error('UNAPPROPRIATE_METHOD'); echo "\t".'<callresult result="0">fail</callresult>'."\n"; break; } $_params = array(); $_fields = array ( 'DATE_STATUS' => time(), 'DATE_SENT_PROSECUTOR' => time(), 'STATE' => 'prosecutor' ); $mode = 'update'; break; } case 'uplparams': { // предельные параметры загружаемых файлов echo "\t".'<maxpostsize>'.ini_get('post_max_size').'</maxpostsize>'."\n"; echo "\t".'<maxfilesize>'.ini_get('upload_max_filesize').'</maxfilesize>'."\n"; echo "\t".'<maxfilescount>10</maxfilescount>'."\n"; break; } default: { echo C1234HoleApiXML::Error('NOT_IMPLEMENTED'); break; } } if($mode == 'update') { // единая для всех режимов измнения ямы процедура собственно изменения if(C1234Hole::Update($hole_id, $_fields, $_params, &$error)) { echo "\t".'<callresult result="1">ok</callresult>'."\n"; } else { echo "\t".'<error code="CANNOT_UPDATE_DEFECT">'.$error.'</error>'."\n" ."\t".'<callresult result="0">fail</callresult>'."\n"; } } // стандартный конец ответа echo "</st1234reply>"; return; }
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("Карта дефектов"); ?> <div id="addmess" style="display:none; color:#0C0"><p><b>Выберите место на карте и кликните по нему два раза, чтобы отметить расположение ямы.</b></p></div> <?php require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/fileman/properties.php'; ?> <?$APPLICATION->IncludeComponent("greensight:holes.yandex.view", ".default", array( "KEY" => CIBlockPropertyMapYandex::_GetMapKey("yandex",$_SERVER["SERVER_NAME"]), "INIT_MAP_TYPE" => "MAP", "MAP_DATA" => "a:3:{s:10:\"yandex_lat\";s:7:\"55.7383\";s:10:\"yandex_lon\";s:7:\"37.5946\";s:12:\"yandex_scale\";i:10;}", "MAP_WIDTH" => "100%", "MAP_HEIGHT" => "600", "CONTROLS" => array( 0 => "TOOLBAR", 1 => "ZOOM", 2 => "MINIMAP", 3 => "TYPECONTROL", 4 => "SCALELINE", ), "OPTIONS" => array( 0 => "ENABLE_SCROLL_ZOOM", 1 => "ENABLE_DBLCLICK_ZOOM", 2 => "ENABLE_DRAGGING", ), "MAP_ID" => "" ), false
foreach (C1234HoleApi::$_allowed_types as $type) { $arResult['FORM']['FIELDS']['TYPE']['ITEMS'][$type] = GetMessage('FORM_HOLE_TYPE_' . $type); } $arResult['FORM']['FIELDS']['ADDRESS'] = array('ID' => 'ADDRESS', 'NAME' => 'address', 'TYPE' => 'textarea', 'LABEL' => GetMessage('FORM_HOLE_ADDRESS'), 'VALUE' => htmlspecialcharsEx($hole_id ? $arElement['ADDRESS'] : $_POST['address'])); $arResult['FORM']['FIELDS']['COMMENT1'] = array('ID' => 'COMMENT1', 'NAME' => 'comment', 'TYPE' => 'textarea', 'LABEL' => GetMessage('FORM_HOLE_COMMENT'), 'VALUE' => htmlspecialcharsEx($hole_id ? $arElement['COMMENT1'] : $_POST['comment'])); } elseif ($arParams['FIX_ID']) { $arResult['FORM']['FIELDS']['FIX_ID'] = array('ID' => 'FIX_ID', 'NAME' => 'FIX_ID', 'TYPE' => 'hidden', 'VALUE' => $arParams['FIX_ID']); $arResult['FORM']['FIELDS']['COMMENT2'] = array('ID' => 'COMMENT2', 'NAME' => 'comment', 'TYPE' => 'textarea', 'LABEL' => GetMessage('FORM_HOLE_COMMENT'), 'VALUE' => htmlspecialcharsEx($_POST['comment'])); } elseif ($arParams['GIBDD_REPLY_ID']) { $arResult['FORM']['FIELDS']['GIBDD_REPLY_ID'] = array('ID' => 'GIBDD_REPLY_ID', 'NAME' => 'GIBDD_REPLY_ID', 'TYPE' => 'hidden', 'VALUE' => $arParams['GIBDD_REPLY_ID']); $arResult['FORM']['FIELDS']['PHOTOS'] = array('ID' => 'PHOTOS', 'NAME' => 'PHOTOS', 'TYPE' => 'multifile', 'LABEL' => GetMessage('FORM_HOLE_GIBDD_REPLY_PHOTOS'), 'REQUIRED' => true); $arResult['FORM']['FIELDS']['COMMENT2'] = array('ID' => 'COMMENT2', 'NAME' => 'comment', 'TYPE' => 'textarea', 'LABEL' => GetMessage('FORM_HOLE_COMMENT2'), 'VALUE' => htmlspecialcharsEx($_POST['comment'] ? $_POST['comment'] : $arElement['COMMENT_GIBDD_REPLY'])); } $arResult['FORM']['FIELDS']['SUBMIT'] = array('TYPE' => 'submit', 'VALUE' => $hole_id ? GetMessage('FORM_HOLE_SUBMIT_EDIT') : GetMessage('FORM_HOLE_SUBMIT_ADD')); $arResult['HOLE'] = $arElement; $arResult['YANDEX_MAP_KEY'] = CIBlockPropertyMapYandex::_GetMapKey('yandex', $_SERVER['SERVER_NAME']); // маленький штришок if ($arParams['FIX_ID']) { $APPLICATION->SetTitle(GetMessage('HOLE_SET_FIXED')); } $arResult['upload_max_filesize'] = ini_get('upload_max_filesize'); if (!$arResult['upload_max_filesize']) { $arResult['upload_max_filesize'] = '1 ' . GetMessage('MB'); } else { $arResult['upload_max_filesize'] = substr($arResult['upload_max_filesize'], 0, strlen($arResult['upload_max_filesize']) - 1) . ' ' . GetMessage(ToUpper(substr($arResult['upload_max_filesize'], strlen($arResult['upload_max_filesize']) - 1)) . 'B'); } $arResult['post_max_size'] = ini_get('post_max_size'); if (!$arResult['post_max_size']) { $arResult['post_max_size'] = '8 ' . GetMessage('MB'); } else { $arResult['post_max_size'] = substr($arResult['post_max_size'], 0, strlen($arResult['post_max_size']) - 1) . ' ' . GetMessage(ToUpper(substr($arResult['post_max_size'], strlen($arResult['post_max_size']) - 1)) . 'B');
?> :</td> <td> <? CIBlockPropertyMapYandex::GetPropertyFieldHtml ( array ( 'ID' => 'COORD', 'NAME' => 'COORD', 'ACTIVE' => 'Y', 'CODE' => 'COORD', 'MULTIPLE' => 'N', 'USER_TYPE' => 'map_yandex', 'USER_TYPE_SETTINGS' => '' ), array ( 'VALUE' => $arElement['LATITUDE'].','.$arElement['LONGITUDE'] ), array ( 'VALUE' => 'COORD', 'FORM_NAM' => 'hole_edit', 'MODE' => 'FORM_FILL' ) ); ?> </td> </tr> <tr valign="top">