Example #1
0
 /**
  * Проверяет значения формы
  * @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;
 }
Example #2
0
 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;
     }
 }