DEV Community

Cover image for Component Accredible Credential for Joomla 5 (Part 2)
Dollar Dev
Dollar Dev

Posted on

Component Accredible Credential for Joomla 5 (Part 2)

Hello! 👋
And finally, a continuation to the part 1
The component code can be downloaded from the repository

Image description

It probably looks a little horrible, but there's nothing difficult here.

On the administration side it looks like this:

Image description

And settings for Accredible Credential API:

Image description

Group settings are necessary because the certificate or badge design is implemented in the group. You can create a group through the API, but then you will need to additionally draw a design on the Accredible side.

I will describe the implementation of the component for Joomla in the following posts. Here I will only describe the points for working with the API.

The main file for working with the API Accredible Credential is found at:
src\Helper\AccrediblecertificateHelper.php

namespace Joomla\Component\Accrediblecertificate\Administrator\Helper;

use Joomla\CMS\Helper\ContentHelper;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects

/**
 * Accredible Certificate component helper.
 *
 * @since  1.6
 */
class AccrediblecertificateHelper extends ContentHelper
{
    private $api_key;

    private $api_endpoint = "https://api.accredible.com/v1/";

    /**
     * Set API Key
     * @param String $key
     * @return null
     */
    public function setAPIKey($key) {
        $this->api_key = $key;
    }

    /**
     * Get API Key
     * @return String
     */
    public function getAPIKey() {
        return $this->api_key;
    }

    /**
     * Contruct API instance
     * @param String $api_key
     * @param boolean|null $test
     * @return null
     */
    public function __construct($api_key, $test = null){
        $this->setAPIKey($api_key);

        if (null !== $test) {
            //$this->api_endpoint = "https://staging.accredible.com/v1/";
        }
    }

    /**
     * Creates a Credential given an existing Group
     * @param String $recipient_name
     * @param String $recipient_email
     * @param String $course_id
     * @param Date|null $issued_on
     * @param Date|null $expired_on
     * @param stdObject|null $custom_attributes
     * @return stdObject
     */
    public function create_credential($recipient_name, $recipient_email, $course_id, $issued_on = null, $expired_on = null, $custom_attributes = null){

        $data = array(
            "credential" => array(
                "group_id" => $course_id,
                "recipient" => array(
                    "name" => $recipient_name,
                    "email" => $recipient_email
                ),
                "issued_on" => $issued_on,
                "expired_on" => $expired_on,
                "custom_attributes" => $custom_attributes
            )
        );

        return json_decode($this->execAccredible($this->getAPIKey(), 'credentials', json_encode($data)), true);
    }

    public function execAccredible($key, $url, $params=array()){

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $this->api_endpoint.$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);

        if(!empty($params)){
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        }

        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          "Content-Type: application/json",
          "Authorization: Token token=".$key
        ));
        $response = curl_exec($ch);
        curl_close($ch);

        return $response;
    }
}
Enter fullscreen mode Exit fullscreen mode

To connect, I use a regular curl, so that there is no need to connect additional libraries.
The API Accredible feature set is very large, but the certificate creation function is enough for me at the moment.

I use this file (AccrediblecertificateHelper.php) in the plugin to create the Certificate:

<?php

namespace Joomla\Plugin\User\Accregistration\Extension;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Date\Date;
use Joomla\Database\DatabaseAwareTrait;
use Joomla\Component\Accrediblecertificate\Administrator\Helper\AccrediblecertificateHelper;
use Joomla\CMS\Component\ComponentHelper;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects


final class Accregistration extends CMSPlugin
{
    use DatabaseAwareTrait;

    public function onUserAfterSave($data, $isNew, $result, $error): void
    {
        if ($isNew && $result ) {
        $config   = ComponentHelper::getParams('com_accrediblecertificate');
        $default_group_id = $config->get('default_group_id', '546130');

        $api = new AccrediblecertificateHelper($config->get('api_key', 'ade377f959a7f522c67a948772f02bc6'), true);
        $new_credential = $api->create_credential($data['username'], $data['email1'], $default_group_id);

        $db = $this->getDatabase();
        $query = $db->getQuery(true)->insert($db->quoteName('#__accrediblecertificate'));

        $query->columns([
                $db->quoteName('user_id'), 
                $db->quoteName('group_id'), 
                $db->quoteName('url_image'),
                $db->quoteName('url_badge'),
                $db->quoteName('created'),
                $db->quoteName('published')
            ])
        ->values(
                $db->quote($data['id']) . ', ' . 
                $db->quote($default_group_id) . ', ' .                  $db->quote($new_credential['credential']['seo_image']) . ', ' . 
                $db->quote($new_credential['credential']['badge']['image']['preview']) . ', "' .                    date('Y-m-d H:i:s'). '", ' . 
                ( !empty($new_credential['credential']['seo_image']) ? 1 : 0 )
            );

            $db->setQuery($query);
            $db->execute();
        }
    }
}

Enter fullscreen mode Exit fullscreen mode

The code is very simple, in order to review it in detail.
This is just one example for adding a Certificate and this is not the final version of the plugin yet, I will be finalizing situations when the service is not available.
Also, I would like to create a script (for cron) that will automatically create badges for users for specified accomplishments on the site, similar to how it is implemented on this portal. 😉

I hope this material was useful...

Thanks in advance for the "💖 🦄 🤯 🙌 🔥" if you enjoyed it!

Top comments (0)