Skip to main content
Penyaskito Blog

Main navigation

  • Home
Language switcher
  • English
  • Español
User account menu
  • Log in

Last articles

By penyaskito , 18 July, 2026

Canvas Tips&Tricks: Declaring images in SDCs

I've read recently about making SDCs dependent on Drupal Canvas because of needing to reference Canvas in the definition of your prop, so the right media widget is used inside Canvas:

image:
  $ref: json-schema-definitions://canvas.module/image
  type: object
  title: Image
  description: >
    Image of the singer
  examples:
    - src: 'micro.webp'
      alt: 'Nice picture of the singer'
      width: 200
      height: 300

That was the case during the alphas. But was fixed long ago, even before the 1.0.0 release. See canvas#3515074.

image:
  type: object
  title: Image
  required: [src]
  properties:
    src:
      type: string
      format: uri-reference
      contentMediaType: "image/*"
      x-allowed-schemes: [http, https]   # this is image-uri, itself a nested $ref
    alt:    { type: string }
    width:  { type: integer }
    height: { type: integer }
  description: >
    Image of the singer
  examples:
    - src: 'micro.webp'
      alt: 'Nice picture of the singer'
      width: 200
      height: 300

That's more verbose, but would make your SDC Canvas-independent and re-usable, and it's 100% equivalent. 

If we missed updating some docs, please create an issue on the Canvas issue queue.

Tags

  • Drupal
  • Drupal Canvas
  • Drupal Canvas Tips&Tricks
  • Single-Directory Components
  • Drupal planet
By penyaskito , 4 July, 2026
Image
The same JSON, stored and read back from different database engines

Canvas Internals - JSON data types in different databases: It works on my machine!

Drupal has been working to add a JSON data type since 2023, but that has not landed yet. Drupal Canvas jumps ahead of that in its inputs for a component tree item with

'inputs' => [
  'description' => 'The input for this component instance in the component tree.',
  'type' => 'json',
  'pgsql_type' => 'jsonb',
  'mysql_type' => 'json',
  'sqlite_type' => 'json',
  'not null' => FALSE,
],

Recently some of our tests started failing for MySQL and Postgres on CI, but passed in SQLite and MariaDB, which is what most of us use locally. 

The problem was that the sorting of the keys of that field was not deterministic, and we used assertSame in our tests to see if operations added/removed the inputs as expected when components evolved. 

How does that translate to different engines?

For MySQL, there's a native data type. Quoting their docs:

To make lookups more efficient, MySQL also sorts the keys of a JSON object. You should be aware that the result of this ordering is subject to change and not guaranteed to be consistent across releases.

For PostgreSQL, the engine offers two different data types: json and jsonb, with the second being the option we (and core) opted for because of its efficiency. But that's key, as the docs explain:

In general, most applications should prefer to store JSON data as jsonb, unless there are quite specialized needs, such as legacy assumptions about ordering of object keys.

That's exactly what our problem was.

For MariaDB, the JSON type is just an alias. See their docs:

JSON is an alias for LONGTEXT COLLATE utf8mb4_bin introduced for compatibility reasons with MySQL's JSON data type. MariaDB implements this as a LONGTEXT rather, as the JSON data type contradicts the SQL:2016 standard, and MariaDB's benchmarks indicate that performance is at least equivalent.

And the last one, SQLite, has support for a jsonb format since 3.45, but the work in progress for introducing this in Core uses json, which, like MariaDB, is ordinary text and sorting of the keys is respected.

How did we fix this?

The actual sorting of the inputs in the database is, as of today, irrelevant to us. So we ended up with:

  • Our own assertSameInputs, which sorts the keys before comparison. assertEqualsCanonicalizing is not an option, as that sorts by value.
  • Our own PHPStan rule, which is not 100% accurate but detects most usages of assertSame with these inputs, and suggests using assertSameInputs instead. 

Translating Drupal Canvas

This is just one of the many show-stoppers that we faced while working on the much-anticipated symmetric translation support for Drupal Canvas. If you want to test this experimental feature, check the release notes in Canvas 1.7.0, but please only on test sites for now!

Tags

  • contributing
  • Drupal
  • Drupal Core
  • Drupal Canvas
  • multilingual
  • databases
  • PHPStan
  • JSON
  • Drupal planet
  • testing
By penyaskito , 3 July, 2026

Quarterly Contributions summary for 2026 Q2

Last April I started blogging about my quarterly contributions as a way to look back and see what I've been working on, even if I've been tracking for 6 quarters already.

On Drupal.org, last quarter I had credits at 1376. Now it's 1495. So 119 new credits, which is above 1.3 credits/day. Just by numbers, this is the biggest quarter since I have been tracking it.

Breaking those down, all of them have been on my 4 focus projects:

Canvas: 247 (+104)
Core: 162 (+12)
CMS*: 44 (+2)
Dashboard: 62 (+1)

Of course the majority of them concentrate in Drupal Canvas. Thanks Acquia for sponsoring lots of my open-source work.

This doesn't measure at all complexity, but I feel like these on Canvas have been more complex on average: bugs and features are definitely harder to implement. I guess I ate the AI Red Pill 🤷🏽. But it's not just 2x quantity-wise than previous quarter, it has a bigger impact quality-wise. 

And these numbers don't track the work on security fixes and/or releases which I've been doing for Canvas. 

I'd highlight that, outside of Drupal, I also got my first contributions to jsonrainbow/json-schema, the PHP library that Drupal core and Canvas use for JSON Schema validation. 

Happy coding! 🎉

Tags

  • contributing
  • quarterly-report
  • Drupal
  • Drupal Core
  • Drupal Canvas

Pagination

  • Page 1
  • Page 2
  • Page 3
  • Page 4
  • Page 5
  • Page 6
  • Page 7
  • Page 8
  • Page 9
  • Next page
  • Last page

Monthly archive

  • July 2026 (3)
  • April 2026 (4)
  • August 2025 (1)
  • April 2025 (1)
  • July 2023 (1)
  • December 2021 (1)
  • May 2021 (2)
  • April 2021 (1)
  • September 2014 (1)
  • November 2012 (1)
  • September 2012 (2)
  • August 2012 (3)
  • June 2012 (6)

Recent content

Canvas Tips&Tricks: Declaring images in SDCs
4 hours ago
Canvas Internals - JSON data types in different databases: It works on my machine!
2 weeks ago
Quarterly Contributions summary for 2026 Q2
2 weeks 1 day ago

Recent comments

That's a great idea! I would…
3 months ago
D.org integration
3 months ago
Can't blame you 😜For me…
3 months ago

Blogs I follow

  • Mateu Aguiló "e0ipso"
  • Gábor Hojtsy
  • Pedro Cambra
  • The Russian Lullaby, davidjguru
  • Can It Be All So Simple
  • Maria Arias de Reyna "Délawen"
  • Matt Glaman
  • Daniel Wehner
  • Jacob Rockowitz
  • Wim Leers
  • Dries Buytaert
  • arcturus
  • Drupal Core AI digest
  • Drupal CMS AI digest
  • Drupal Canvas AI digest
  • Drupal AI AI digest
  • Drupal Patterns AI digest
  • Trisha Gee
  • Très Bien Tech, by _nod
  • Moshe Weitzman
  • Drupal core change records
  • Ed Zitron's Where's Your Ed At
  • Sebastian Bergmann (phpunit.expert)
  • PHP Reads
  • mandclu
  • Marissa Epstein
  • WordPress Core
  • David Bushell
Syndicate

Footer

  • Drupal.org
  • LinkedIn
  • GitHub
  • Mastodon
  • Twitter
Powered by Drupal

Free 🇵🇸