コンクリートファイブジャパン 菱川です。

Ajaxなどの処理のためにconcrete5に独自のルーティングを追加することができます。application/bootstrap/app.php を使って簡易に追加することもできますが(このファイルにコメントで作例があります)、パッケージから追加することも可能です。

まず、パッケージの controller.php の on_start() メソッドでルーティングを追加します。

<?php
// packages/ajax_example/controller.php

namespace Concrete\Package\AjaxExample;

use Concrete\Core\Package\Package;
use Route;

class Controller extends Package
{
    protected $pkgHandle = 'ajax_example';
    protected $appVersionRequired = '5.7.5';
    protected $pkgVersion = '0.1';

    public function getPackageDescription()
    {
        return t('Example Package');
    }

    public function getPackageName()
    {
        return t('Ajax Example');
    }
    
    public function on_start()
    {
        Route::register('/ccm/foo',     '\Concrete\Package\AjaxExample\Controller\Foo::view');
        Route::register('/ccm/foo/bar', '\Concrete\Package\AjaxExample\Controller\Foo::barAction');
    }
}

対応するコントローラーの作例です。Ajaxヘルパーを使って、jsonを出力しています。

<?php
// packages/ajax_example/controllers/foo.php

namespace Concrete\Package\AjaxExample\Controller;

use Controller;
use Core;

class Foo extends Controller
{
    // View ファイルをパスで指定
    protected $viewPath = '/foo';
    
    public function view()
    {
        // View ファイルに値を渡す
        $this->set('foo', 'bar');
    }
    
    public function barAction()
    {
        // View を使わず JSON レスポンスを直接出力する
        $r = new \stdClass();
        $r->foo = 'bar';
        Core::make('helper/ajax')->sendResult($r);
    }
}

$viewParh で View ファイルを指定することができます。

<?php
// packages/ajax_example/views/foo.php
// Concrete\Package\AjaxExample\Controller\Foo#view から呼ばれる

defined('C5_EXECUTE') or die("Access Denied.");
?>
<h1><?=h($foo)?></h1>