/** * Проверяет значения формы * @param int $form_id ID формы * @return array */ public static function getFieldsInputValues($form_id) { // Получаем данные без mysqli_real_escape_string $form_array = cmsCore::request('field', 'array'); if (!$form_array) { return array(); } $formObj = new self($form_id, $form_array); if (!$formObj->form || !$formObj->form_fields) { return array(); } global $_LANG; $inUser = cmsUser::getInstance(); $output = array(); // Заполняем выходной массив значений // $output['values'] массив значений полей // $output['errors'] массив ошибок полей foreach ($formObj->form_fields as $field) { // Значение поля $field_value = array_key_exists($field['id'], $formObj->values) ? $formObj->values[$field['id']] : ''; $error = ''; // проверяем заполненность текстового поля если нужно if ($field['mustbe'] && !$field_value && $field['kind'] != 'file') { $error = $_LANG['FIELD'] . ' "' . $field['title'] . '" ' . $_LANG['MUST_BE_FILLED']; } else { cmsUser::sessionPut('form_last_' . $formObj->form_id . '_' . $field['id'], htmlspecialchars($field_value)); } // Загружаем файл если он есть в форме if ($field['kind'] == 'file') { // старые значения если есть $old_url = $field_value['url']; $old_name = $field_value['name']; $output['values'][$field['id']] = array(); if (!$_FILES['field']['name'][$field['id']]) { // Поле обязательно для заполнения? if ($field['mustbe'] && !$old_url) { $error = $_LANG['FIELD'] . ' "' . $field['title'] . '" ' . $_LANG['MUST_BE_FILLED']; } else { // если пришел флаг на удаление if (isset($field_value['delete'])) { $formObj->deleteFile($old_url); $old_url = ''; $old_name = ''; } $output['values'][$field['id']] = array('name' => $old_name, 'url' => $old_url); } } else { // директория загрузки $upload_dir = PATH . '/upload/forms/' . $form_id . '/' . $inUser->id; @mkdir($upload_dir, 0777, true); @chmod($upload_dir, 0777); // проверяем расширение файла $maytypes = explode(',', $field['config']['ext']); $ext = mb_strtolower(pathinfo($_FILES['field']['name'][$field['id']], PATHINFO_EXTENSION)); if (!in_array($ext, $maytypes)) { $error = $_LANG['ERROR_TYPE_FILE'] . $field['config']['ext']; } // имя файла $file_name = cmsCore::strToURL(pathinfo($_FILES['field']['name'][$field['id']], PATHINFO_FILENAME)); $dest = $upload_dir . '/' . $file_name . uniqid() . '.' . $ext; if (!$error) { if (!cmsCore::moveUploadedFile($_FILES['field']['tmp_name'][$field['id']], $dest, $_FILES['field']['error'][$field['id']])) { $error = cmsCore::uploadError(); } else { $formObj->deleteFile($old_url); $output['values'][$field['id']] = array('name' => $file_name, 'url' => str_replace(PATH, '', $dest)); } } } } else { // Заполняем массив значений полей, ключи массива id поля $output['values'][$field['id']] = $field['config']['max'] ? mb_substr(strip_tags($field_value), 0, $field['config']['max']) : strip_tags($field_value); } // Заполняем массив ошибок $output['errors'][$field['id']] = $error; } // если были ошибки, удаляем загруженный файл, если он есть if (!empty($dest)) { foreach ($output['errors'] as $field_error) { if ($field_error) { @unlink($dest); break; } } } return $output; }
public static function upload($file, $name = null, $dir = self::F_FILES, $slug = null, $data = null, $delete = true) { if (is_null($dir)) { $dir = self::F_FILES; } $dir = trim($dir); $filePath = ''; if (strpos($file, 'http') === 0) { $tmp = Yii::getAlias('@runtime') . DIRECTORY_SEPARATOR . uniqid("fu"); file_put_contents($tmp, file_get_contents($file)); $filePath = $tmp; $name = $name ? $name : basename($file); } elseif (is_string($file)) { $filePath = Yii::getAlias($file); } elseif ($file instanceof UploadedFile) { $filePath = $file->tempName; $name = $name ? $name : $file->name; } $name = $name ? $name : basename($filePath); $sec = new Security(); while (FileUpload::find()->where(["path" => $uniquePath = md5($sec->generateRandomString())])->one()) { } $dirSlug = $dir; if (!is_dir($dir) && !($dir = self::getFolder($dirSlug))) { if (!$dir) { throw new \Exception("Folder for param '{$dirSlug}' is not set"); } else { throw new \Exception("Folder '{$dir}' not found"); } } $fullPath = self::formPath($uniquePath, $dir); if (!FileHelper::createDirectory(dirname($fullPath))) { throw new \Exception("Can't create folder '{" . dirname($fullPath) . "}'"); } if (!file_exists($filePath)) { throw new \Exception('File not loaded or not exist'); } if (is_uploaded_file($filePath)) { if (!move_uploaded_file($filePath, $fullPath)) { throw new \Exception('Unknown upload error'); } } elseif ($delete ? !rename($filePath, $fullPath) : !copy($filePath, $fullPath)) { throw new \Exception('Failed to write file to disk'); } $info = pathinfo($name); $fileUpload = new self(); //Фиск для сессии, при аяксовом запросе if (isset(Yii::$app->session)) { Yii::$app->session->open(); $fileUpload->session = Yii::$app->session->getIsActive() ? Yii::$app->session->getId() : null; Yii::$app->session->close(); } $fileUpload->user_id = CurrentUser::getId(1); $fileUpload->data = !is_null($data) ? json_encode($data) : null; $fileUpload->mime_type = FileHelper::getMimeType($fullPath); $fileUpload->md5 = md5_file($fullPath); $fileUpload->folder = $dirSlug; $fileUpload->path = $uniquePath; $fileUpload->slug = $slug; $fileUpload->size = filesize($fullPath); if (!($extension = strtolower(ArrayHelper::getValue($info, "extension")))) { $extension = ArrayHelper::getValue(FileHelper::getExtensionsByMimeType($fileUpload->mime_type), 0); } $fileUpload->name = basename($name, '.' . $extension); $fileUpload->extension = $extension; if ($fileUpload->save()) { return $fileUpload; } else { $fileUpload->deleteFile(); return null; } }