Add Block Type to Package

The best way we can install this block type is to add it to the CIF XML that we used earlier to install the Dreamrs page theme. Then, we can increment the version number on the package, update the package, and the block type will automatically be installed (and mapped to the Dreamrs package.)

Create a blocks.xml File

Since this is a block type (and we know we’ll eventually need to make more of them, let’s create a new CIF XML file within our Dreamrs package for block types. Within packages/dreamrs/install/, copy the `theme.xml’ file to ‘block_types.xml’:

cp themes.xml block_types.xml

Next, edit the file. Remove the <themes> node and replace it with one that installs a block type and attaches it to the dreamrs package. This should be the final contents of this file when we’re done:

<?xml version="1.0"?>
<concrete5-cif version="1.0">
  <blocktypes>
    <blocktype handle="page_header" package="dreamrs"/>
  </blocktypes>
</concrete5-cif>

Modify the install() and upgrade() methods

The install() and upgrade() methods in our package currently install the theme.xml content file, but we’ve added a new file for block types. Let’s add that to the method. Open up packages/dreamrs/controller.php and make these changes:

public function install()
{
    parent::install();
    $this->installContentFile('install/theme.xml');
    $this->installContentFile('install/block_types.xml');
}

public function upgrade()
{
    parent::upgrade();
    $this->installContentFile('install/theme.xml');
    $this->installContentFile('install/block_types.xml');
}  

Upgrade the Package

Finally, let’s upgrade the package. Increment the $pkgVersion property in the controller.php file to 0.6.1. Then, upgrade the package. You can upgrade it from the Dashboard, or the command line. I prefer the command line -- it’s quicker. From within the public/ directory the dreamrs package, type:

concrete/bin/concrete5 c5:package:update dreamrs

That’s it! Let’s check out blocks list. In the Dashboard, browse to Dashboard > Stacks & Blocks > Block Types. There’s our block:

It’s also ready to be placed from the Add Block panel:

If we check the database we can also verify that our custom database table is present:

Now let’s make it work.