Alternative Text with Kirby Images Type

I am using the new image type to store images for pages and I am wondering how I would accomplish adding an alt tag to these images. Below is my blueprint.

  Cars:
    label: Cars
    type: structure
    style: table
    entry: >
      {{name}}
      {{details}}
      {{picture}}
    fields:
      name:
        label: Name
        type: text
      details:
        label: Details
        type: textarea
      picture:
        label: Vehicle Image
        type: image

and here is how I am accessing the image in the template.

<?php echo $car->picture()->toFile() ?>

Where do I place the alt tag at?

The alt tag can be attached directly to your images.

See here for more information: https://getkirby.com/docs/panel/blueprints/file-settings#file-fields

1 Like

In this case you would have to modify your code a bit:

<img src="<?= $car->picture()->toFile()->url() ?>" alt="<?= $page->title() ?>">

Edit: Or use any other field for the alt tag, i.e. file meta data.

<?php
$image =  $car->picture()->toFile(); 
?>
<img src="<?= $image->url() ?>" alt="<?= $image->caption() ?>">

So the alt tag is working but I cannot get the image to show. Is toFile()->url() valid?

Have you turned on debugging? Do you get an error?

In my last example I had the $ sign missing in front of the variable … I corrected it above.

And yes, toFile()->url() is valid code.

This is the error.

PHP Fatal error: Call to a member function url() on a non-object

Does the image exist? In cases like this, it’s always safer to use an if statement before using a method on an object.

Does it work if you use

$page->image($car->picture())->url()

instead?

1 Like

That was it. I needed to check if the file existed since some items had images and some did not.

Yeah, that is a quite common problem … :wink:

1 Like

I didn’t think about that because just using the picture->toFile alone it didn’t care if there was an image or not. Add the url() and it has a fatal error.

It takes a while to make a habit of using if statements whenever something might break otherwise. Even if your code works for the moment, any user might e.g. delete a file at a later stage. So you are always on the safe side if you make sure an object exists.