<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://aloiacms.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://aloiacms.com/" rel="alternate" type="text/html" /><updated>2025-06-26T10:44:41+00:00</updated><id>https://aloiacms.com/feed.xml</id><title type="html">Aloia CMS</title><subtitle>Aloia CMS is a content management system for Laravel developers who want to choose between &quot;I want full control over my content&quot; and &quot;Please, let the CMS do the work for me&quot;. Everything works automatically out-of-the-box, but you can change every single aspect of the CMS if you so choose.
</subtitle><entry><title type="html">Aloia CMS 4.2.0: Cleaner &amp;amp; more convenient models</title><link href="https://aloiacms.com/articles/cleaner-convenient-models" rel="alternate" type="text/html" title="Aloia CMS 4.2.0: Cleaner &amp;amp; more convenient models" /><published>2022-10-22T18:20:00+00:00</published><updated>2022-10-22T18:20:00+00:00</updated><id>https://aloiacms.com/articles/cleaner-models</id><content type="html" xml:base="https://aloiacms.com/articles/cleaner-convenient-models"><![CDATA[<p>Clean and readable code is the most important part of write software that’s maintainable and a joy to work with. Aloia CMS is all about getting out of your way, but we still had some quirks that could be better. It just got better!</p>

<p>In Aloia CMS 4.2.0, we’ve introduced 2 improvements to make models nice to work with.</p>

<h2 id="dynamic-folder-guessing">Dynamic folder guessing</h2>
<p>The first is a contribution by <a href="https://github.com/juliomotol">@juliomotol</a> who added a dynamic folder name guesser. This change has no impact on any of your existing models, but does make new models cleaner. Example time!</p>

<p>Before:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">use</span> <span class="nc">AloiaCms\Models\Model</span><span class="p">;</span>

<span class="kd">class</span> <span class="nc">Tutorial</span> <span class="kd">extends</span> <span class="nc">Model</span> <span class="p">{</span>
    
    <span class="k">protected</span> <span class="nv">$folder</span> <span class="o">=</span> <span class="s1">'tutorials'</span><span class="p">;</span>
    
<span class="p">}</span>
</code></pre></div></div>

<p>After:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">use</span> <span class="nc">AloiaCms\Models\Model</span><span class="p">;</span>

<span class="kd">class</span> <span class="nc">Tutorial</span> <span class="kd">extends</span> <span class="nc">Model</span> <span class="p">{</span>
    
<span class="p">}</span>
</code></pre></div></div>

<p>The folder name will still be <code class="language-plaintext highlighter-rouge">tutorials</code>, but you won’t have to specify it anymore. Of course, if you want to place it in a different folder, you can still define your own folder name.</p>

<h2 id="magic-setter">Magic setter</h2>

<p>The second improvement is the use of the magic setter method for models. This makes your code less verbose and easier to read.</p>

<p>Before:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$tutorial</span> <span class="o">=</span> <span class="nc">Tutorial</span><span class="o">::</span><span class="nf">find</span><span class="p">(</span><span class="s1">'episode-1'</span><span class="p">);</span>

<span class="nv">$tutorial</span><span class="o">-&gt;</span><span class="nf">set</span><span class="p">(</span><span class="s1">'title'</span><span class="p">,</span> <span class="s1">'Episode 1'</span><span class="p">);</span>
</code></pre></div></div>

<p>After:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$tutorial</span> <span class="o">=</span> <span class="nc">Tutorial</span><span class="o">::</span><span class="nf">find</span><span class="p">(</span><span class="s1">'episode-1'</span><span class="p">);</span>

<span class="nv">$tutorial</span><span class="o">-&gt;</span><span class="n">title</span> <span class="o">=</span> <span class="s1">'Episode 1'</span><span class="p">;</span>
</code></pre></div></div>

<p>This change makes your code easier to read. One nice benefit of using the magic setter is that you can also set the body content using this method:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$tutorial</span> <span class="o">=</span> <span class="nc">Tutorial</span><span class="o">::</span><span class="nf">find</span><span class="p">(</span><span class="s1">'episode-1'</span><span class="p">);</span>

<span class="nv">$tutorial</span><span class="o">-&gt;</span><span class="n">body</span> <span class="o">=</span> <span class="s1">'# Episode 1'</span><span class="p">;</span>
</code></pre></div></div>

<p>This will be assigned to the body, rather than the front-matter of your file. This makes the API of the model a little more consistent and overall easier to read.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[Clean and readable code is the most important part of write software that’s maintainable and a joy to work with. Aloia CMS is all about getting out of your way, but we still had some quirks that could be better. It just got better!]]></summary></entry><entry><title type="html">Aloia CMS 4.1.0: An SEO Module</title><link href="https://aloiacms.com/articles/seo-module" rel="alternate" type="text/html" title="Aloia CMS 4.1.0: An SEO Module" /><published>2022-05-06T15:00:00+00:00</published><updated>2022-05-06T15:00:00+00:00</updated><id>https://aloiacms.com/articles/seo-module</id><content type="html" xml:base="https://aloiacms.com/articles/seo-module"><![CDATA[<p>SEO is vital for your website to be found on the internet.
Aloia CMS prides itself on getting out of your way and just getting the job done.
It lets you focus on writing your content and takes care of the technical parts.</p>

<p>With that in mind, it only makes sense that we’re giving your content the attention it deserves.
You put a lot of effort in your content, so naturally, you want others to find it and read it.
In comes SEO.</p>

<p>With the 4.1.0 release, Aloia CMS will now generate a sitemap of your content types for you, with minimal effort.
You can specify the path of your sitemap, the content types you’d like to include, and then all you have to do is run a command:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">php</span> <span class="n">artisan</span> <span class="n">aloiacms</span><span class="o">:</span><span class="n">sitemap</span>
</code></pre></div></div>

<p>Have a look at the new documentation for the sitemap at: <a href="/seo">SEO</a>.</p>

<h2 id="but-what-if-i-already-have-a-sitemap">But what if I already have a sitemap?</h2>

<p>By default, this command will create a sitemap at <code class="language-plaintext highlighter-rouge">public/sitemap.xml</code>, but if you’ve got multiple sitemaps, you can generate it in a different file and include it in a “main” sitemap.</p>

<p>For example: setting <code class="language-plaintext highlighter-rouge">aloiacms.seo.sitemap_path</code> to <code class="language-plaintext highlighter-rouge">public_path('aloiacms.xml')</code>, will now generate your sitemap at <code class="language-plaintext highlighter-rouge">public/aloiacms.xml</code>.
You can combine multiple sitemaps in a single <code class="language-plaintext highlighter-rouge">sitemap.xml</code> like so:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;sitemapindex</span> <span class="na">xmlns=</span><span class="s">"http://www.sitemaps.org/schemas/sitemap/0.9"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;sitemap&gt;</span>
        <span class="nt">&lt;loc&gt;</span>https://your-website.com/aloiacms.xml<span class="nt">&lt;/loc&gt;</span>
        <span class="nt">&lt;lastmod&gt;</span>2022-01-11T12:00:05+01:00<span class="nt">&lt;/lastmod&gt;</span>
    <span class="nt">&lt;/sitemap&gt;</span>
    <span class="nt">&lt;sitemap&gt;</span>
        <span class="nt">&lt;loc&gt;</span>https://your-website.com/another-sitemap.xml<span class="nt">&lt;/loc&gt;</span>
        <span class="nt">&lt;lastmod&gt;</span>2022-01-11T12:00:05+01:00<span class="nt">&lt;/lastmod&gt;</span>
    <span class="nt">&lt;/sitemap&gt;</span>
<span class="nt">&lt;/sitemapindex&gt;</span>
</code></pre></div></div>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[SEO is vital for your website to be found on the internet. Aloia CMS prides itself on getting out of your way and just getting the job done. It lets you focus on writing your content and takes care of the technical parts.]]></summary></entry><entry><title type="html">Aloia CMS 4.0.0: Laravel 9, PHP 8, Authentication, and more!</title><link href="https://aloiacms.com/articles/laravel-9-authentication-4-0-0" rel="alternate" type="text/html" title="Aloia CMS 4.0.0: Laravel 9, PHP 8, Authentication, and more!" /><published>2022-04-30T10:00:00+00:00</published><updated>2022-04-30T10:00:00+00:00</updated><id>https://aloiacms.com/articles/laravel-9-authentication-4-0-0</id><content type="html" xml:base="https://aloiacms.com/articles/laravel-9-authentication-4-0-0"><![CDATA[<p>The 4.0.0 release has a very specific theme: Do what we do well and remove everything else!
In earlier versions, we’ve had support for uploading files, managing images, and code that was very specific for use in my personal projects.
Uploading files and managing images are outside the scope of this headless flat file CMS, so I’ve removed them.
Remove the bloat and do what we do best!</p>

<p>Version 4.0.0 brings a lot of changes that could be considered as breaking changes, which is why I’ve tagged this as a major version.
These are the biggest changes:</p>

<h2 id="additions">Additions</h2>
<ul>
  <li>Added Laravel 9 support</li>
  <li>Added UserProvider for flawless integration of User Authentication with Aloia CMS and Laravel</li>
  <li>Added an authentication block in the config file</li>
  <li>Added Unique validation rule to test for unique models in Laravel validation</li>
</ul>

<h3 id="using-the-aloia-cms-to-authenticate-your-users">Using the Aloia CMS to authenticate your users</h3>

<p>If you’ve built systems with Laravel before, you know how nice the authentication layer is.
I didn’t want to reinvent the wheel, so I’ve added a UserProvider for Aloia CMS.</p>

<p>You can include this by following the steps in: <a href="/authentication">Authentication</a></p>

<h3 id="validation-rules">Validation rules</h3>

<p>As part of the Laravel Authentication integration, I’ve added a new form validation rule: Unique.
If you’ve used Laravel before, you’ll recognize the “unique:tablename” validation rule. 
This rule validates if the field is unique in the specified table name.
Example: <code class="language-plaintext highlighter-rouge">["email" =&gt; "unique:users"]</code> validates whether the email field is unique in the users table.
This validation is used during registration and will fail if you use the Aloia CMS authentication integration, because there is no database.</p>

<p>That’s why you can replace that rule like so:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="s2">"email"</span> <span class="o">=&gt;</span> <span class="k">new</span> <span class="err">\</span><span class="nf">AloiaCms\Validation\Rules\Unique</span><span class="p">(</span><span class="err">\</span><span class="nc">AloiaCms\Auth\User</span><span class="o">::</span><span class="n">class</span><span class="p">)]</span>
</code></pre></div></div>
<p>This will check that the User model is unique for the email key.</p>

<h2 id="updates">Updates</h2>
<p>Migrated testing from Travis to Github Actions</p>

<h2 id="removals">Removals</h2>
<ul>
  <li>Removed unused config options: aloiacms.pages, aloiacms.articles, aloiacms.permissions, aloiacms.uploaded_files</li>
  <li>Removed PHP 7.x support</li>
  <li>Removed Laravel 6, 7 support</li>
  <li>Removed composer git hooks</li>
  <li>Removed the FileFinder class as this only worked on Linux *</li>
  <li>Removed the Media class, as this is something outside of the scope of managing content *</li>
  <li>Removed the Permissions Command *</li>
  <li>Removed error-prone code from the Article model **</li>
</ul>

<h2 id="conclusion">Conclusion</h2>
<p>Overall, this release removes a lot of infrequently used code and adds nice features that make using Aloia CMS for your projects even easier.
The addition of the user authentication in this release is very much a “scratch your own itch” feature, but it can help your development experience better as well.
There is no more need for a database.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[The 4.0.0 release has a very specific theme: Do what we do well and remove everything else! In earlier versions, we’ve had support for uploading files, managing images, and code that was very specific for use in my personal projects. Uploading files and managing images are outside the scope of this headless flat file CMS, so I’ve removed them. Remove the bloat and do what we do best!]]></summary></entry><entry><title type="html">Aloia CMS 3.4.0: Renaming model events</title><link href="https://aloiacms.com/articles/3-4-0-renaming-model-events" rel="alternate" type="text/html" title="Aloia CMS 3.4.0: Renaming model events" /><published>2021-06-25T10:00:00+00:00</published><updated>2021-06-25T10:00:00+00:00</updated><id>https://aloiacms.com/articles/rename-model-events</id><content type="html" xml:base="https://aloiacms.com/articles/3-4-0-renaming-model-events"><![CDATA[<p>Aloia CMS 3.4.0 introduces new model events: model events when you’re renaming models.
These model events will allow you to bridge the gap between 2 “different” models.
These renaming events contain the old and new filename, which makes it much easier to perform cleanups or other tasks.</p>

<h2 id="why-is-this-important">Why is this important?</h2>
<p>You can already rename models (filename change), but this causes consistency issues. 
For example, when you rename a model, a PreModelSaved event gets dispatched for the old filename and the PostModelSaved events gets dispatched for the new filename. 
This could cause cleanup issues that you might need to run.</p>

<p>With the PreModelRenamed and PostModelRenamed events, you can do any cleanup and transforming you need to do to be ready for the new filename.</p>

<p>With the ModelRenameFailed event, you can reverse any changes you might have already done.</p>

<h2 id="the-new-events">The new events</h2>
<p>These are the events you can subscribe to in your own applications:</p>

<ul>
  <li>AloiaCms\Events\PreModelRenamed</li>
  <li>AloiaCms\Events\PostModelRenamed</li>
  <li>AloiaCms\Events\ModelRenameFailed</li>
</ul>

<h2 id="usage">Usage</h2>
<p>You can listen to these events in your <code class="language-plaintext highlighter-rouge">EventServiceProvider</code> as described in the <a href="https://laravel.com/docs/master/events">Laravel documentation</a>.
Each of these events contain a public class property <code class="language-plaintext highlighter-rouge">$model</code>, which is a <code class="language-plaintext highlighter-rouge">ModelInterface</code>.
These events get dispatched on any model that extends the base model: <code class="language-plaintext highlighter-rouge">AloiaCms\Models\Model</code>.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[Aloia CMS 3.4.0 introduces new model events: model events when you’re renaming models. These model events will allow you to bridge the gap between 2 “different” models. These renaming events contain the old and new filename, which makes it much easier to perform cleanups or other tasks.]]></summary></entry><entry><title type="html">Aloia CMS 3.3.0: Model events</title><link href="https://aloiacms.com/articles/3-3-model-events" rel="alternate" type="text/html" title="Aloia CMS 3.3.0: Model events" /><published>2020-12-24T12:00:00+00:00</published><updated>2020-12-24T12:00:00+00:00</updated><id>https://aloiacms.com/articles/model-events</id><content type="html" xml:base="https://aloiacms.com/articles/3-3-model-events"><![CDATA[<p>Aloia CMS 3.3.0 has been released with model events on the base model.
These model events help you to perform tasks in your Laravel application when models get persisted or deleted.
These are the events you can subscribe to in your own applications:</p>

<ul>
  <li>AloiaCms\Events\PreModelSaved</li>
  <li>AloiaCms\Events\PostModelSaved</li>
  <li>AloiaCms\Events\PreModelDeleted</li>
  <li>AloiaCms\Events\PostModelDeleted</li>
</ul>

<p>You can bring even more fine-grained control to your applications using the same simple CMS classes by subscribing to these events.</p>

<p>These changes don’t break any backward compatibility and are simply additions.
If you’re not planning on using these events in your application, you don’t need to upgrade to this version.</p>

<h2 id="usage">Usage</h2>
<p>You can listen to these events in your <code class="language-plaintext highlighter-rouge">EventServiceProvider</code> as described in the <a href="https://laravel.com/docs/master/events">Laravel documentation</a>.
Each of these events contain a public class property <code class="language-plaintext highlighter-rouge">$model</code>, which is a <code class="language-plaintext highlighter-rouge">ModelInterface</code>.
These events get dispatched on any model that extends the base model: <code class="language-plaintext highlighter-rouge">AloiaCms\Models\Model</code>.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[Aloia CMS 3.3.0 has been released with model events on the base model. These model events help you to perform tasks in your Laravel application when models get persisted or deleted. These are the events you can subscribe to in your own applications:]]></summary></entry><entry><title type="html">Laravel 8 support + improved data manipulation methods</title><link href="https://aloiacms.com/articles/laravel-8-support-and-more" rel="alternate" type="text/html" title="Laravel 8 support + improved data manipulation methods" /><published>2020-10-20T17:00:00+00:00</published><updated>2020-10-20T17:00:00+00:00</updated><id>https://aloiacms.com/articles/laravel-8-support-and-more</id><content type="html" xml:base="https://aloiacms.com/articles/laravel-8-support-and-more"><![CDATA[<p>Aloia CMS 3.2.0 has been released with Laravel 8 support and improved getter and setter methods.</p>

<p>Here are the improvements as they’ve been implemented:</p>

<p>This change introduces a backward compatible change in getting and setting data on models:</p>

<h2 id="changes">Changes</h2>
<ul>
  <li>addMatter(string $key, $value) is deprecated and now calls set(string $key, $value) under the hood</li>
  <li>setMatter(array $matter) now won’t overwrite data that wasn’t provided in the input array. (example below)</li>
  <li>__get(string $key) now calls get(string $key) under the hood, instead of directly accessing the matter array</li>
</ul>

<h2 id="additions">Additions</h2>
<ul>
  <li>Added has(string $key) method to check if data is present in the model.</li>
  <li>Added get(string $key) method as a cleaner way to get a single value from the model.</li>
  <li>Added set(string $key, $value) method as a better named alternative to addMatter().</li>
  <li>Added remove(string $key) method to remove a data key from the model.</li>
</ul>

<h2 id="example">Example</h2>
<p>When you set initial values on a model:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$article</span> <span class="o">=</span> <span class="err">\</span><span class="nc">AloiaCms\Models\Article</span><span class="o">::</span><span class="nf">find</span><span class="p">(</span><span class="s1">'testing'</span><span class="p">)</span>
    <span class="o">-&gt;</span><span class="nf">setMatter</span><span class="p">([</span>
        <span class="s1">'title'</span> <span class="o">=&gt;</span> <span class="s1">'Article title'</span><span class="p">,</span>
        <span class="s1">'description'</span> <span class="o">=&gt;</span> <span class="s1">'description'</span>
    <span class="p">]);</span>
</code></pre></div></div>
<p>And then set more data but with different keys:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$article</span> <span class="o">=</span> <span class="err">\</span><span class="nc">AloiaCms\Models\Article</span><span class="o">::</span><span class="nf">find</span><span class="p">(</span><span class="s1">'testing'</span><span class="p">)</span>
    <span class="o">-&gt;</span><span class="nf">setMatter</span><span class="p">([</span>
        <span class="s1">'summary'</span> <span class="o">=&gt;</span> <span class="s1">'Article summary'</span><span class="p">,</span>
        <span class="s1">'description'</span> <span class="o">=&gt;</span> <span class="s1">'Article description'</span>
    <span class="p">]);</span>
</code></pre></div></div>
<p>will now result in data that looks like this:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span>
    <span class="s1">'title'</span> <span class="o">=&gt;</span> <span class="s1">'Article title'</span><span class="p">,</span>
    <span class="s1">'description'</span> <span class="o">=&gt;</span> <span class="s1">'Article description'</span><span class="p">,</span>
    <span class="s1">'summary'</span> <span class="o">=&gt;</span> <span class="s1">'Article summary'</span>
<span class="p">];</span>
</code></pre></div></div>
<p>instead of what it resulted in before this change:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span>
    <span class="s1">'description'</span> <span class="o">=&gt;</span> <span class="s1">'Article description'</span><span class="p">,</span>
    <span class="s1">'summary'</span> <span class="o">=&gt;</span> <span class="s1">'Article summary'</span>
<span class="p">];</span>
</code></pre></div></div>
<p>Only the provided keys are overwritten. So using setMatter() is no longer necessarily a destructive action.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[Aloia CMS 3.2.0 has been released with Laravel 8 support and improved getter and setter methods.]]></summary></entry><entry><title type="html">New logo, new branding</title><link href="https://aloiacms.com/articles/new-logo-new-branding" rel="alternate" type="text/html" title="New logo, new branding" /><published>2020-07-19T10:00:00+00:00</published><updated>2020-07-19T10:00:00+00:00</updated><id>https://aloiacms.com/articles/new-logo-new-branding</id><content type="html" xml:base="https://aloiacms.com/articles/new-logo-new-branding"><![CDATA[<p>As you might have seen, the website has a different look! 
We’ve added a new logo to the website and adjusted the colors to go with that logo.</p>

<h2 id="branding-colors-in-tailwindcss">Branding colors in TailwindCSS</h2>
<p>Most of the styling of this website is done through Tailwindcss, 
so the new color palette has been added in the configuration. These are the new colors:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="err">theme:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="err">extend:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="err">colors:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="err">primary:</span><span class="w"> </span><span class="err">'#</span><span class="mi">333</span><span class="err">'</span><span class="p">,</span><span class="w">
              </span><span class="err">cold:</span><span class="w"> </span><span class="p">{</span><span class="w">
                  </span><span class="err">lightest:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">200</span><span class="p">,</span><span class="mi">100</span><span class="err">%</span><span class="p">,</span><span class="mi">95</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">lighter:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">200</span><span class="p">,</span><span class="mi">100</span><span class="err">%</span><span class="p">,</span><span class="mi">85</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">light:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">200</span><span class="p">,</span><span class="mi">100</span><span class="err">%</span><span class="p">,</span><span class="mi">75</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">default:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">200</span><span class="p">,</span><span class="mi">100</span><span class="err">%</span><span class="p">,</span><span class="mi">45</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">dark:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">213</span><span class="p">,</span><span class="mi">90</span><span class="err">%</span><span class="p">,</span><span class="mi">35</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">darker:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">213</span><span class="p">,</span><span class="mi">90</span><span class="err">%</span><span class="p">,</span><span class="mi">25</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">darkest:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">213</span><span class="p">,</span><span class="mi">90</span><span class="err">%</span><span class="p">,</span><span class="mi">15</span><span class="err">%)'</span><span class="w">
              </span><span class="p">},</span><span class="w">
              </span><span class="err">warm:</span><span class="w"> </span><span class="p">{</span><span class="w">
                  </span><span class="err">lightest:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">350</span><span class="p">,</span><span class="mi">100</span><span class="err">%</span><span class="p">,</span><span class="mi">95</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">lighter:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">350</span><span class="p">,</span><span class="mi">100</span><span class="err">%</span><span class="p">,</span><span class="mi">80</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">light:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">350</span><span class="p">,</span><span class="mi">100</span><span class="err">%</span><span class="p">,</span><span class="mi">70</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">default:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">350</span><span class="p">,</span><span class="mi">85</span><span class="err">%</span><span class="p">,</span><span class="mi">60</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">dark:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">325</span><span class="p">,</span><span class="mi">85</span><span class="err">%</span><span class="p">,</span><span class="mi">50</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">darker:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">325</span><span class="p">,</span><span class="mi">85</span><span class="err">%</span><span class="p">,</span><span class="mi">30</span><span class="err">%)'</span><span class="p">,</span><span class="w">
                  </span><span class="err">darkest:</span><span class="w"> </span><span class="err">'hsl(</span><span class="mi">325</span><span class="p">,</span><span class="mi">85</span><span class="err">%</span><span class="p">,</span><span class="mi">20</span><span class="err">%)'</span><span class="w">
              </span><span class="p">}</span><span class="w">
          </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>The cold colors are the blues, the warm colors are the pinks/reds. 
These can be used for any design element or accent color on this website.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[As you might have seen, the website has a different look! We’ve added a new logo to the website and adjusted the colors to go with that logo.]]></summary></entry><entry><title type="html">Aloia CMS GUI 3.3.0: Extendible articles</title><link href="https://aloiacms.com/articles/extendible-articles-version-3-3-0" rel="alternate" type="text/html" title="Aloia CMS GUI 3.3.0: Extendible articles" /><published>2020-07-12T10:00:00+00:00</published><updated>2020-07-12T10:00:00+00:00</updated><id>https://aloiacms.com/articles/extendible-articles-version-3-3-0</id><content type="html" xml:base="https://aloiacms.com/articles/extendible-articles-version-3-3-0"><![CDATA[<p>Articles, one of the built-in content types of Aloia CMS, were already extendible through code 
editors and IDE’s, but now they’re also extendible through the GUI package. 
You can extend the article objects to contain any properties you might need for your websites.</p>

<h2 id="how-it-works">How it works</h2>

<p>Extending the default fields in the GUI package is as easy as defining new fields in a blade file:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>resources/views/vendor/aloiacmsgui/articles/custom_content.blade.php
</code></pre></div></div>

<p>The FormRequest will save any non-standard fields on your articles and will even parse a JSON string 
and save that as a nested array on the front matter in your article file.</p>

<p>This is how these non-standard fields will be saved onto your articles:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># AloiaCms\GUI\Requests\CreateArticleRequest</span>

<span class="k">private</span> <span class="k">function</span> <span class="n">storeCustomData</span><span class="p">(</span><span class="o">&amp;</span><span class="nv">$article</span><span class="p">)</span><span class="o">:</span> <span class="n">void</span>
<span class="p">{</span>
    <span class="nv">$storable_data</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">except</span><span class="p">([</span>
        <span class="s1">'_method'</span><span class="p">,</span>
        <span class="s1">'_token'</span><span class="p">,</span>
        <span class="s1">'description'</span><span class="p">,</span>
        <span class="s1">'post_date'</span><span class="p">,</span>
        <span class="s1">'is_published'</span><span class="p">,</span>
        <span class="s1">'is_scheduled'</span><span class="p">,</span>
        <span class="s1">'content'</span><span class="p">,</span>
        <span class="s1">'faq'</span><span class="p">,</span>
        <span class="s1">'file_type'</span><span class="p">,</span>
        <span class="s1">'slug'</span>
    <span class="p">]);</span>

    <span class="k">foreach</span> <span class="p">(</span><span class="nv">$storable_data</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=&gt;</span> <span class="nv">$value</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nc">Json</span><span class="o">::</span><span class="nf">isValid</span><span class="p">(</span><span class="nv">$value</span><span class="p">))</span> <span class="p">{</span>
            <span class="nv">$value</span> <span class="o">=</span> <span class="nb">json_decode</span><span class="p">(</span><span class="nv">$value</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nv">$article</span><span class="o">-&gt;</span><span class="nf">addMatter</span><span class="p">(</span><span class="nv">$key</span><span class="p">,</span> <span class="nv">$value</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You can provide values as flat values (integers, strings, booleans), arrays, or JSON strings. 
JSON strings will be converted to arrays before saving. 
Accepting JSON strings makes it easier to use a front-end library or framework to 
manipulate the DOM and send this data to the server.</p>

<h3 id="editing-articles">Editing articles</h3>
<p>When you’re editing an article, the same blade file is injected into that form. 
This means that you might have to add behaviour to account for existing or empty values.</p>

<h3 id="optional">Optional</h3>
<p>Using this method of extending the management forms for articles is completely optional.
You can choose to not use it and it won’t break backward-compatibility.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[Articles, one of the built-in content types of Aloia CMS, were already extendible through code editors and IDE’s, but now they’re also extendible through the GUI package. You can extend the article objects to contain any properties you might need for your websites.]]></summary></entry><entry><title type="html">Aloia CMS GUI 3.2.0: Manage FAQ items in the GUI</title><link href="https://aloiacms.com/articles/manage-faq-items-in-gui-package" rel="alternate" type="text/html" title="Aloia CMS GUI 3.2.0: Manage FAQ items in the GUI" /><published>2020-05-28T10:00:00+00:00</published><updated>2020-05-28T10:00:00+00:00</updated><id>https://aloiacms.com/articles/manage-faq-items-in-gui-package</id><content type="html" xml:base="https://aloiacms.com/articles/manage-faq-items-in-gui-package"><![CDATA[<p>SEO is the most important way to make your website discoverable in the search engines. To make this a little easier, 
you can now manage FAQ items right in the GUI package of Aloia CMS. This allows more people to build content that’s 
search engine friendly.</p>

<p>FAQ items for articles and blog posts are a great way to make your content more discoverable. When your FAQ items 
get chosen as the most helpful by Google, you could get a lot more search traffic from this. To increase the chances 
you can benefit from this, we’ve baked it right into the CMS GUI. You can choose to not use this as well of course.</p>

<p>If you’re using the core CMS only, you won’t notice this change at all, as this is something you could have implemented 
yourself since version 1.0.0.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><summary type="html"><![CDATA[SEO is the most important way to make your website discoverable in the search engines. To make this a little easier, you can now manage FAQ items right in the GUI package of Aloia CMS. This allows more people to build content that’s search engine friendly.]]></summary></entry><entry><title type="html">Laravel 6.x can now be used in Aloia CMS ^3.1</title><link href="https://aloiacms.com/articles/laravel-6-can-be-used-with-aloia-cms-3-1" rel="alternate" type="text/html" title="Laravel 6.x can now be used in Aloia CMS ^3.1" /><published>2020-04-08T10:00:00+00:00</published><updated>2020-04-08T10:00:00+00:00</updated><id>https://aloiacms.com/articles/laravel-6-can-be-used-with-aloia-cms-3-1</id><content type="html" xml:base="https://aloiacms.com/articles/laravel-6-can-be-used-with-aloia-cms-3-1"><![CDATA[<p>The dependency of Laravel 6 and 7 in Aloia CMS was updated in version 2.0.0 and 3.0.0 respectively. After deliberating, 
it has been decided that Laravel 6 and 7 don’t really make a difference for Aloia CMS. So effectively, this means that 
Aloia CMS version 3.1 and up now supports the use of both Laravel 6 and 7, not one or the other.</p>

<h2 id="what-does-this-mean-for-aloia-cms-200">What does this mean for Aloia CMS 2.0.0?</h2>
<p>Aloia CMS 2.0.0 will not change. It’s still a stable release and won’t be made compatible with Laravel 7, 
but will only work with Laravel 6. Version 2.0 and up will not receive any new features, but any issues will still be resolved.
We recommend upgrading to Aloia CMS ^3.1, as Laravel 6 is also supported in this new version. 
With this new version, you will be able to take advantage of any new features that are introduced in the future.</p>]]></content><author><name>Roelof Jan Elsinga</name></author><category term="product" /><summary type="html"><![CDATA[The dependency of Laravel 6 and 7 in Aloia CMS was updated in version 2.0.0 and 3.0.0 respectively. After deliberating, it has been decided that Laravel 6 and 7 don’t really make a difference for Aloia CMS. So effectively, this means that Aloia CMS version 3.1 and up now supports the use of both Laravel 6 and 7, not one or the other.]]></summary></entry></feed>