If you’re using Blesta to manage hosting services with DirectAdmin, you might want to provide your clients with a seamless way to access their DirectAdmin control panel directly from the Blesta client area. In this tutorial, we’ll walk through the steps to add a “Login” tab and a login link to the service information page in Blesta’s DirectAdmin module.
• Blesta installed and configured.
• DirectAdmin module activated in Blesta.
• Basic understanding of PHP and Blesta’s module structure.
We’ll be making changes to the following files:
• api/direct_admin_api.php
• language/en_us/direct_admin.php
• direct_admin.php
• views/default/tab_login.pdt
• views/default/client_service_info.pdt
Let’s get started!
First, we’ll add two new functions to the DirectAdmin API Functions to handle SSO requests and to get the Single Sign-On (SSO) URL.
File: api/direct_admin_api.php
Add the following functions inside the class:
private function jsonRequest($url, $method, $data)
{
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => trim($this->apiUrl, '/') . '/' . $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_USERPWD => $this->user . ':' . $this->pass,
CURLOPT_HTTPAUTH => CURLAUTH_BASIC
]);
$response = curl_exec($curl);
curl_close($curl);
return json_decode($response);
}
public function getSSOUrl($username, $password)
{
return $this->jsonRequest('api/login', 'POST', ['username' => $username, 'password' => $password]);
}
These functions will allow us to make requests to DirectAdmin and retrieve the SSO URL for client login.
Next, we’ll add a new language definition for our “Login” tab.
File: language/en_us/direct_admin.php
Add the following line:
$lang['DirectAdmin.tab_login'] = "Login";
This defines the label for the new tab we’ll be adding.
We’ll add a new function in the main module file to handle the content of the “Login” tab.
File: direct_admin.php
Add the following function:
/**
* Client Login
*
* @param stdClass $package A stdClass object representing the current package
* @param stdClass $service A stdClass object representing the current service
* @param array $get Any GET parameters
* @param array $post Any POST parameters
* @param array $files Any FILES parameters
* @return string The string representing the contents of this tab
*/
public function tabLogin($package, $service, array $get = null, array $post = null, array $files = null)
{
$this->view = new View('tab_login', 'default');
$this->view->base_uri = $this->base_uri;
// Load the helpers required for this view
Loader::loadHelpers($this, ['Form', 'Html']);
$row = $this->getModuleRow();
$api = $this->getApi(
$row->meta->host_name,
$row->meta->user_name,
$row->meta->password,
($row->meta->use_ssl == 'true'),
$row->meta->port
);
$service_fields = $this->serviceFieldsToObject($service->fields);
$this->view->set('login_url', $api->getSSOUrl($service_fields->direct_admin_username, $service_fields->direct_admin_password)->loginURL ?? '');
$this->view->set('service_fields', $service_fields);
$this->view->set('service_id', $service->id);
$this->view->set('vars', (isset($vars) ? $vars : new stdClass()));
$this->view->setDefaultView('components' . DS . 'modules' . DS . 'direct_admin' . DS);
return $this->view->fetch();
}
This function sets up the view for the “Login” tab and fetches the SSO URL from DirectAdmin.
We need to register our new tab so it appears in the client interface.
File: direct_admin.php
Find the getClientTabs function and modify it as follows:
/**
* Returns all tabs to display to a client when managing a service whose
* package uses this module
*
* @param stdClass $package A stdClass object representing the selected package
* @return array An array of tabs in the format of method => title.
* Example: ['methodName' => 'Title', 'methodName2' => 'Title2']
*/
public function getClientTabs($package)
{
return [
'tabClientActions' => Language::_('DirectAdmin.tab_client_actions', true),
'tabLogin' => Language::_('DirectAdmin.tab_login', true)
];
}
By adding 'tabLogin' => Language::_('DirectAdmin.tab_login', true), we’re telling Blesta to include our new tab.
Now, we’ll create the view file that contains the HTML for the “Login” tab.
File: views/default/tab_login.pdt
Create a new file with the following content:
<div id="login">
<h4><?php $this->_('DirectAdmin.tab_login');?></h4>
<a class="btn btn-light float-right" href="<?= $login_url ?>" target="_blank">
<i class="fas fa-user"></i> <?php $this->_('DirectAdmin.tab_login');?>
</a>
</div>
This view displays a button that links to the DirectAdmin control panel using the SSO URL.
We also want to add a login link directly on the service information page.
File: direct_admin.php
Modify the getClientServiceInfo function to include the login URL:
/**
* Fetches the HTML content to display when viewing the service info in the
* client interface.
*
* @param stdClass $service A stdClass object representing the service
* @param stdClass $package A stdClass object representing the service's package
* @return string HTML content containing information to display when viewing the service info
*/
public function getClientServiceInfo($service, $package)
{
$row = $this->getModuleRow();
// Load the view into this object, so helpers can be automatically added to the view
$this->view = new View('client_service_info', 'default');
$this->view->base_uri = $this->base_uri;
$this->view->setDefaultView('components' . DS . 'modules' . DS . 'direct_admin' . DS);
// Load the helpers required for this view
Loader::loadHelpers($this, ['Form', 'Html']);
$row = $this->getModuleRow();
$api = $this->getApi(
$row->meta->host_name,
$row->meta->user_name,
$row->meta->password,
($row->meta->use_ssl == 'true'),
$row->meta->port
);
$service_fields = $this->serviceFieldsToObject($service->fields);
$this->view->set('login_url', $api->getSSOUrl($service_fields->direct_admin_username, $service_fields->direct_admin_password)->loginURL ?? '');
$this->view->set('module_row', $row);
$this->view->set('package', $package);
$this->view->set('service', $service);
$this->view->set('service_fields', $service_fields);
return $this->view->fetch();
}
This adds the login_url variable to the view.
Finally, we’ll modify the service information view to include the login link.
File: views/default/client_service_info.pdt
Locate the last <td> element and modify it as follows:
<td><a href="<?= $login_url ?>" target="_blank"><?php $this->_('DirectAdmin.service_info.option_login');?></a></td>
The updated file should look like this:
<div class="table-responsive">
<table class="table table-curved table-striped">
<thead>
<tr>
<th><i class="fas fa-share fa-flip-vertical"></i></th>
<th><?php $this->_('DirectAdmin.service_info.username');?></th>
<th><?php $this->_('DirectAdmin.service_info.password');?></th>
<th><?php $this->_('DirectAdmin.service_info.server');?></th>
<th><?php $this->_('DirectAdmin.service_info.options');?></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td><?php echo (isset($service_fields->direct_admin_username) ? $this->Html->safe($service_fields->direct_admin_username) : null);?></td>
<td><?php echo (isset($service_fields->direct_admin_password) ? $this->Html->safe($service_fields->direct_admin_password) : null);?></td>
<td><?php echo (isset($module_row->meta->host_name) ? $this->Html->safe($module_row->meta->host_name) : null);?></td>
<td><a href="<?= $login_url ?>" target="_blank"><?php $this->_('DirectAdmin.service_info.option_login');?></a></td>
</tr>
</tbody>
</table>
</div>
This adds a login link in the options column, allowing clients to access DirectAdmin directly from their service information page.
By following these steps, you’ve successfully added a “Login” tab and a login link to the service information page in Blesta’s DirectAdmin module. This enhancement provides a more seamless experience for your clients, allowing them to access their DirectAdmin control panel with a single click.
Feel free to customize the views and styles to match your branding and improve the user experience further.
Note: Always make sure to backup your files before making any changes, and test the modifications in a development environment if possible.
If you need further assistance, We are available to hire to make these changes for you at a reasonable price!
Part owner of Blesta Club Ltd, Owner of TekLan Hosting and a few other companies.