Jump to content

Hanna Code: automatically create files for PHP tag code

Robin S

Recommended Posts

When I create a new Hanna Code tag I am always creating a PHP tag (I don't think I've ever had a need to create a text or Javascript tag). And I prefer to edit my tag code in my IDE rather than in the code field within the Hanna Code module. Because of this my Hanna codes always consist of...

include $config->paths->templates . "hannas/{$hanna->name}.php";

...which just includes a file named the same as the Hanna tag from a "hannas" folder in /site/templates/

Always on the lookout for efficiencies, I had a go at automating the process of setting up new Hanna tags and come up with the following. Maybe it's useful to someone.

In /site/ready.php:

// Pre-fill code for new Hanna tags and create file
$wire->addHookBefore('ProcessHannaCode::executeEdit', function(HookEvent $event) {
    $id = (int) $this->input->get('id');
    // Include code for later use
    $file_include_code = '<?php
include $config->paths->templates . "hannas/{$hanna->name}.php";';
    if(!$id) {
        // A new Hanna tag is being added
        // Set type to PHP
        $this->addHookBefore('InputfieldRadios(name=hc_type)::render', function(HookEvent $event) {
            $inputfield = $event->object;
            $inputfield->value = 2;
        // Set code to include file of same name as tag
        $this->addHookBefore('InputfieldTextarea(name=hc_code)::render', function(HookEvent $event) use ($file_include_code) {
            $inputfield = $event->object;
            $inputfield->value = $file_include_code;
    } else {
        // An existing Hanna tag is being edited (the new tag has been saved)
        // Get the data for this tag
        /* @var \PDOStatement $query */
        $query = $this->database->prepare("SELECT name, type, code FROM hanna_code WHERE id=:id");
        $query->bindValue(':id', $id);
        if(!$query->rowCount()) throw new WireException("Unknown ID");
        list($name, $type, $code) = $query->fetch(\PDO::FETCH_NUM);
        // If it's a PHP tag and the tag code matches the include code...
        if($type == 2 && $code === $file_include_code) {
            $filename = $this->config->paths->templates . "hannas/{$name}.php";
            // Check if there is an existing file and if not...
            if(!file_exists($filename)) {
                // Define the contents of the file
                // Just the namespace and API variables for IDE code-completion
                // Some of this is PhpStorm-specific so adjust as needed
                $contents = '<?php namespace ProcessWire;
//<editor-fold desc="API variables">
 * @var Config $config
 * @var Fieldgroups $fieldgroups
 * @var Fields $fields
 * @var Languages $languages
 * @var Modules $modules
 * @var Page $page
 * @var Pages $pages
 * @var Paths $urls
 * @var Permissions $permissions
 * @var ProcessWire $wire
 * @var Roles $roles
 * @var Sanitizer $sanitizer
 * @var Session $session
 * @var Templates $templates
 * @var User $user
 * @var Users $users
 * @var WireCache $cache
 * @var WireDatabasePDO $database
 * @var WireDateTime $datetime
 * @var WireFileTools $files
 * @var WireInput $input
 * @var WireLog $log
 * @var WireMail $mail
 * @var \ProCache $procache
 * @var \FormBuilder $forms

                // Create a file and insert the contents above
                file_put_contents($filename, $contents);


  • Like 9
Link to comment
Share on other sites

  • 5 years later...
18 hours ago, Boost said:

Is it possible to automatically create the PHP file inside /site/templates/hannas when you first save the code?

That's what the code in the first post is for, so I think I don't understand the question. If the PHP file is not being created make sure you have created a "hannas" directory inside /site/templates/

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...