Файлы и изображения
В MV существуют 3 типа данных для хранение файлов:
- "file" (одиночный файл),
- "image" (одиночное изображение),
- "multi_images" (массив изображений с комментариями).
В базе данных хранятся пути к файлам от корня проекта без начального слэша. Файлы типа "file" хранятся в папках "userfiles/models/название_модели-files/". Все изображения моделей находятся в папках вида "userfiles/models/название_модели-images/". При загрузке на сервер каждому файлу присваивается уникальный номер, который становится его названием.
Уменьшенные копии изображений создаются в подпапках, при этом название подпапки задается автоматически, основываясь на размерах и названии текущей модели, например "media/userfiles/models/gallery-images/gallery_70x70/gallery_70x70_f64.jpg".
Вывод файлов для скачивания и изображений
- displayFileLink($field [, $link_text, $no_file_text]) - возвращает ссылку на файл для скачивания
Дополнительные параметры:
$link_text - название файла для вставки в ссылку (если отсутствует, то будет поставлено название самого файла)
$no_file_text - если файл отсутствует и задан данный параметр то будет выведен этот текст
- displayImage($field [, $alt_text, $no_image_text]) - возвращает тег "img" с данным изображением
Дополнительные параметры:
$alt_text - альтернативный текст для тега "img"
$no_image_text - если изображение отсутствует и задан данный параметр то будет выведен этот текст
Уменьшение и обрезка изображений
- cropImage($image, $width, $height [, $extra_params]) - уменьшение изображения до заданных размеров с "обрезкой".
- resizeImage($image, $width, $height [, $extra_params]) - пропорциональное уменьшения изображения без "обрезки".
Данные методы возвращают тег "img" с данным изображением, пропорционально уменьшенным, а в случае метода "cropImage" дополнительно "обрезанным" до заданных размеров.
Методы "cropImage()" и "resizeImage()" могут вызываться из объекта модели и из объекта класса "Record", при этом они создают папку для уменьшенных копий, основываясь на принадлежности файла к определенной модели.
Дополнительные параметры могут быть переданы в виде ассоциированного массива $extra_params. Возможные варианты параметров (ключи): "alt-text", "no-image-text", "title", "css-class". Ни один из параметров не является обязательным. При передаче параметра он будет добавлен к тэгу "img".
Внимание! При вызове методов из объекта модели в качестве параметра "$image" необходимо передавать путь до файла, в том виде как он лежит в базе данных (без корневого пути), а если методы вызываются из объекта класса "Record", то необходимо передать этот параметр как название поля модели, тогда путь до файла будет браться из поля записи, загруженной в объект "Record". Смотрите примеры ниже.
Работа с массивом изображений
- extractImages($field [, $no-comments]) - преобразование в массив изображений. Возвращает ассоциированный массив, где ключи - пути к изображениям, а значения - комментарии. Если передать значение второго необязательного параметра "no-comments", то будет возвращен обычный нумерованный массив путей к изображениям.
- getFirstImage($field) - извлечение первого изображения из массива. Возвращает строковое значение пути к изображению без комментария.
Примеры
Создадим модель и извлечем в шаблонах нужные данные
<? class Products extends Model { protected $name = "Товары"; protected $model_elements = array( array("Название", "char", "name", array("required" => true)), array("Главное изображение", "image", "main_image"), array("Дополнительные изображения", "multi_images", "extra_images"), array("Инструкция", "file", "manual"), array("Описание", "text", "text_description") ); } ?>
CREATE TABLE "news" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" VARCHAR, "main_image" VARCHAR, "extra_images" TEXT, "manual" VARCHAR, "text_description" TEXT)
Выводим список всех товаров с изображениями для общего шаблона (файл "products.model.php")
<? public function display() { $rows = $this -> select(); $html = ""; foreach($rows as $row) { $url = $this -> root_path."product/".$row["id"]."/"; $html .= '<div class="name">'; $html .= '<a href="'.$url.'">'.$row["name"].'</a>'; $html .= "</div>" $html .= '<div class="image">'; $html .= $this -> cropImage($row["main_image"], 150, 150, array("alt-text" => $row["name"])).'</div>'; $html .= '<div class="desc">'; $html .= Service :: cutText($row["text_description"], 200, "...").'</div>'; } return $html; } ?>
Выводим список инструкций товаров, у которых они есть (файл "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; } ?>
На странице товара выводим все доступные данные (файл "view-product.php")
<? $product = $mv -> products -> defineProductPage($mv -> router); //Выбор записи на основе URL $mv -> display404($product); include $mv -> views_path."main-header.php"; ?> <div id="content"> <h2><? echo $product -> name; ?></h2> <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"> <? //Вывод массива изображений для lightbox foreach($product -> extractImages("extra_images", "no-comments") as $image) { echo '<a class="lightbox" href="'.$mv -> root_path.$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