Прикрепление файлов

Прикрепление файла к модели

Вы можете прикреплять файлы к модели, используя полиморфные связи.

In the examples below the model has a single Avatar attachment model and many Photo attachment models.

Пример прикрепления одного файла (аватара):

public $attachOne = [
    'avatar' => 'System\Models\File'
];

Пример прикрепления нескольких файлов (фотографий):

public $attachMany = [
    'photos' => 'System\Models\File'
];

Вы можете запретить/разрешить прямой доступ к файлам, используя дополнительный параметр public:

public $attachOne = [
    'avatar' => ['System\Models\File', 'public' => false]
];

Все защищенные файлы лежат в папке uploads/protected.

Creating new attachments

Вы можете использовать метод Input::file, чтобы сразу прикрепить файл ($attachOne) к модели:

$model->avatar = Input::file('file_input');

Или указать абсолютный путь до файла:

$model->avatar = '/path/to/somefile.jpg';

Используйте метод create(), чтобы прикрепить сразу несколько файлов ($attachMany):

$model->avatar()->create(['data' => Input::file('file_input')]);

Или сначала создайте модель File:

$file = new System\Models\File;
$file->data = Input::file('file_input');
$file->is_public = true;
$file->save();

$model->avatar()->add($file);

Просмотр прикрепленных файлов

Метод getPath() возвращает полный путь до загруженного файла. Пример: http://mysite.com/uploads/public/path/to/avatar.jpg

// один файл
echo $model->avatar->getPath();

// несколько файлов
foreach ($model->photos as $photo) {
    echo $photo->getPath();
}

Метод getLocalPath() возвращает абсолютный путь до загруженного файла.

echo $model->avatar->getLocalPath();

Используйте метод output() для отображения содержимого файла:

echo $model->avatar->output();

Вы можете изменить размер изображения при помощи метода getThumb(). Он принимает 3 параметра - ширину изображения (число или auto), высоту (число или auto) и массив со следующими элементами:

Ключ Значение
mode auto, exact, portrait, landscape, crop. По умолчанию: auto
quality 0 - 100. По умолчанию: 95
extension auto, jpg, png, gif. По умолчанию: jpg

Пример:

echo $model->avatar->getThumb(100, 100, ['mode' => 'crop']);

Примеры

В этом разделе представлены все примеры использования моделей для прикрепления файлов - от определения связей, до отображения загруженного изображения на странице.

Связь с классом System\Models\File определяется внутри модели. Пример:

class Post extends Model
{
    public $attachOne = [
        'featured_image' => 'System\Models\File'
    ];
}

Создаем форму для загрузки файла:

<?= Form::open(['files' => true]) ?>

    <input name="example_file" type="file">

    <button type="submit">Upload File</button>

<?= Form::close() ?>

Процесс загрузки файла на сервер и его привязка к модели:

// Поиск модели
$post = Post::find(1);

// Сохранение изображения
if (Input::hasFile('example_file')) {
    $post->featured_image = Input::file('example_file');
}

В качестве альтернативы Вы можете использовать отложенное связывание:

// Поиск модели
$post = Post::find(1);

// Получаем файл из формы
$fileFromPost = Input::file('example_file');

// Сохранение изображения, если оно существует
if ($fileFromPost) {
    $post->featured_image()->create(['data' => $fileFromPost], $sessionKey);
}

Отображение файла на странице:

// Поиск модели
$post = Post::find(1);

// Используем изображение по умолчанию, если его нет в статье
if ($post->featured_image) {
    $featuredImage = $post->featured_image->getPath();
}
else {
    $featuredImage = 'http://placehold.it/220x300';
}

<img src="<?= $featuredImage ?>" alt="Featured Image">