Files and images

In MV there are 3 data types for storing files:

  1. "file" (single file)
  2. "image" (single image)
  3. "multi_images" (an array of images with comments)

Paths to files from a project root without front slash are stored in a database. "File" type files are stored in the "userfiles/models/name_of_model-files/" folders. All images of models are located in folders of "userfiles/models/name_of_model-images/". When uploading on the server each file is assigned to a unique number which becomes its name.

Thumbs images are created in subfolders, thus the name of the subfolder is defiend automatically, based on the sizes and the name of the current model, for example "media/userfiles/models/gallery-images/gallery_70x70/gallery_70x70_f64.jpg" is a small copy f64.jpg file.

Display download files and images

  • displayFileLink($field [, $link_text, $no_file_text]) - returns a link to download file

Additional parameters
$link_text - the name of the file to insert into the link (if doesn't exist, then the name of the file will be inserted instead)
$no_file_text - if the file doesn't exist and this parameter is specified, then this text will be displayed

  • displayImage($field [, $alt_text, $no_image_text]) - returns the img tag with this image

Additional parameters
$alt_text - an alternative text for the img tag
$no_image_text - if the image doesn't exist and this parameter is specified, then this text will be displayed.

Resize and crop images

  • cropImage($image, $width, $height [, $extra_params]) - resize image to the specified sizes with "cropping"
  • resizeImage($image, $width, $height [, $extra_params]) - proportional resize of the image without "cropping"

These methods return the "img" tag with this image, proportionally resized, and in case of the "cropImage()" method - to the specified sizes additionally.

The "cropImage()" and "resizeImage()" methods can be called from the object of model and from object of the class "Record", thus they create a folder for resized thumb copies, based on file belonging to a certain model. Additional parameters are similar to the previous methods.

Extra parameters can be passed as array $extra_params. Possible values (keys) of extra parameters are: "alt-text", "no-image-text", "title". The values will be added to final "img" tag automatically.

Attention! When calling the methods from the object of model as a parameter of "$image" you need to pass the path to the file, as it sits in a database (without a root path), and in case the methods are called from object of the class "Record", you need to pass this parameter as the name of a field of model, then the path to the file will be taken from record field, loaded in "Record" object. See examples below.

Operating with an array of images

  • extractImages($field [, $no-comments]) - conversion to an array of images. Returns an associative array, where keys - are paths to images, and values - are comments. If you pass the value of the second optional "no-comments" parameter, then normal indexed array of paths to images will be returned.
  • getFirstImage($field) - get the first image from an array. Returns a string value of the path to the image without comment.

Samples

Let's create a model and get the required data in templates

<? 
class Products extends Model 
{
    protected $name = "Products";
 
    protected $model_elements = array(
        array("Name", "char", "name", array("required" => true)),
        array("Main image", "image", "main_image"),
        array("Additional images", "multi_images", "extra_images"),
        array("Instruction", "file", "manual"),
        array("Description", "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)

Display the list of all products with images for main template ("products.model.php" file).

<? 
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></div>';

        $html .= '<div class="image">';
        $html .= $this -> cropImage($row["main_image"], 150, 150).'</div>';

        $html .= '<div class="desc">';
        $html .= Service :: cutText($row["text_description"], 200, "...").'</div>';
    }

    return $html;
}
?>

Display the list of c instructions if any ("products.model.php" file).

<?
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;
}
?>

On the product page we display all accessible data ("view-product.php" file).

<?
//Get the record, based on passed URL in router object
$product = $mv -> products -> defineProductPage($mv -> router);

$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">
        <?
            //Display an array of images for 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", "Download manual"); ?></p>
</div>

<?
include $mv -> views_path."main-footer.php";
?>