Step 1 - Create a custom scope, for example "MyPage" that can be displayed as an option in the navigation menu.
custom/Espo/Custom/Resources/metadata/scopes/MyPage.json
Step 2 - Create a custom front-end controller that will be invoked when the "MyPage" menu option is clicked
client/custom/src/controllers/my-page.js
Step 3 - Create back-end controller to receive the Ajax call and serve the custom php content
custom/Espo/Custom/Controllers/MyPage.php
Step 4 - Create a back-end Service class that will execute the controller directed actions
custom/Espo/Custom/Services/MyPage.php
custom/Espo/Custom/Resources/metadata/scopes/MyPage.json
Code:
{
"entity": false,
"tab": true,
"acl": "true",
"aclPortal": true,
"aclPortalLevelList": [
"all",
"account",
"contact",
"own",
"no"
],
"disabled": false,
"module": "Custom",
"isCustom": true
}
client/custom/src/controllers/my-page.js
Code:
define('custom:controllers/my-page', 'controller', function (Dep) {
return Dep.extend({
// default action
actionIndex: function (options) {
// make Ajax call to retrieve the custom page content from the back end
let payload = {userId: this.getUser().get('id')}; // define here input values for the Ajax call - for example the User id
Espo.Ajax.getRequest('MyPage/action/fetchBackendContent', {
options: payload
}).then(
(response) => {
// display the back-end content in the main section of the screen
let myHtml = "<div>"+response+"</div>";
$('#main').html(myHtml);
}.bind(this)
);
}
});
});
Step 3 - Create back-end controller to receive the Ajax call and serve the custom php content
custom/Espo/Custom/Controllers/MyPage.php
Code:
namespace Espo\Custom\Controllers;
use Espo\Core\Api\Request;
use StdClass;
class MyPage extends \Espo\Core\Templates\Controllers\Base
{
public function getActionFetchBackendContent(Request $request): StdClass
{
// fetch parameters sent from the Ajax call as options (if any)
$userId = $request->getQueryParam('userId');
// invoke a Service class method to execute the desired action
$queryResult = $this->getRecordService()->fetchMyCustomContentForThisUser($userId);
return (object) [
'content' => $queryResult
];
}
}
custom/Espo/Custom/Services/MyPage.php
Code:
namespace Espo\Custom\Services;
class MyPage extends \Espo\Core\Templates\Services\Base
{
public function fetchMyCustomContentForThisUser($userId) {
// generate the custom php content ($queryResult) and return
return $queryResult;
}
}

Comment