Файлы и изображения
В MV существуют 3 типа данных для хранение файлов:
- file - одиночный файл
- image - одиночное изображение
- multi_images - массив изображений с комментариями
В базе данных хранятся пути к файлам от корня проекта без начального слэша. Файлы типа file хранятся в папках userfiles/models/название_модели-files/. Все изображения моделей находятся в папках вида userfiles/models/название_модели-images/. При загрузке на сервер, в случае дублировании названий, каждому файлу присваивается уникальный номер.
Уменьшенные копии изображений создаются в подпапках, при этом название подпапки задается автоматически, основываясь на размерах и названии текущей модели, например userfiles/models/gallery-images/gallery_70x70/name-of-image.jpg.
Вывод файлов для скачивания и изображений
displayFileLink($field [, $link_text, $no_file_text]) - возвращает ссылку на файл для скачивания
$link_text - название файла для вставки в ссылку (если отсутствует, то будет поставлено название самого файла)
$no_file_text - если файл отсутствует и задан данный параметр то будет выведен этот текст- displayImage($field, [, $extra_params]) - возвращает тег img с данным изображением
Уменьшение и обрезка изображений
- cropImage($image, $width, $height [, $extra_params]) - уменьшение изображения до заданных размеров с обрезкой
- resizeImage($image, $width, $height [, $extra_params]) - пропорциональное уменьшения изображения без обрезки
Методы cropImage() и resizeImage() могут вызываться из объекта модели или из объекта класса Record, при этом они создают папку для уменьшенных копий, основываясь на принадлежности файла к определенной модели.
Дополнительные параметры могут быть переданы в виде ассоциированного массива $extra_params. Возможные варианты параметров (ключи): 'alt-text', 'no-image-text', 'title', 'css-class'. Ни один из параметров не является обязательным. При передаче параметра он будет добавлен к тэгу img.
Работа с массивом изображений
- extractImages($field) или asArrays($field) - преобразование в массив изображений
- getFirstImage($field) - извлечение первого изображения из массива
Создадим модель и извлечем в шаблонах нужные данные.
class Products extends Model
{
protected $name = 'Товары';
protected $model_elements = [
['Название', 'char', 'name', ['required' => true]],
['Главное изображение', 'image', 'main_image'],
['Дополнительные изображения', 'multi_images', 'extra_images'],
['Инструкция', 'file', 'manual'],
['Описание', 'text', 'text_description']
];
}
Выводим список всех товаров с изображениями для общего шаблона, файл models/products.model.php.
<?
public function display()
{
$rows = $this -> select();
$html = '';
foreach($rows as $row)
{
$url = $this -> root_path.'product/'.$row['id'];
$html .= '<div>';
$html .= '<div class="name"><a href="'.$url.'">'.$row["name"].'</a></div>';
$html .= '<div class="image">';
$html .= $this -> cropImage($row["main_image"], 150, 150, ['alt-text' => $row['name']]).'</div>';
$html .= '<div class="description">';
$html .= Service::cutText($row["text_description"], 200, "...").'</div>';
$html .= '</div>';
}
return $html;
}
Выводим список инструкций товаров, у которых они есть, файл models/products.model.php.
<?
public function displayManuals()
{
$rows = $this -> select(['manual!=' => '']);
$html = '';
foreach($rows as $row)
{
$html .= '<div class="dowload-file">';
$html .= '<a href="'.Service::addFileRoot($row['manual']).'">'.$row['name'].'</a>';
$html .= '</div>';
}
return $html;
}
На странице товара выводим все доступные данные, файл views/view-product.php.
<?
$product = $mv -> products -> defineProductPage($mv -> router);
$mv -> display404($product);
include $mv -> views_path.'main-header.php';
?>
<div id="content">
<h1><? echo $product -> name; ?></h1>
<div id="main-picture">
<a class="lightbox" href="<? echo $mv -> root_path.$product -> main_image; ?>">
<? echo $mv -> products -> resizeImage($product -> main_image, 300, 250); ?>
</a>
</div>
<div id="extra-pictures">
<?
foreach($product -> extractImages('extra_images') as $image)
{
echo '<a class="lightbox" href="'.$mv -> root_path.$image['image'].'">';
echo $mv -> products -> cropImage($image, 100, 100).'</a>';
}
?>
</div>
<p><? echo $product -> text_description; ?></p>
<p><? echo $product -> displayFileLink('manual', 'Скачать инструкцию'); ?></p>
</div>
<?
include $mv -> views_path.'main-footer.php';
?>
Предыдущий раздел
Объект класса Record