Using Route_Action server event (v2021)

In pre-v2021 versions, the generated application was file based, if you wanted to add a custom page, you added a Custom File so you can access, e.g. /mypage.php. In v2021, routing is used, if you want a page with header and footer, you can still use Custom File with Include common files enabled so that PHPMaker will generate a route, e.g. /mypage. However, if you just want to do an action on the server side and return the result (as text or JSON) without the layout (and other HTML), now there is an alternative way (and simpler way, depending on your usage), you can use the new Route_Action and/or Api_Action server event to add routes and/or API actions with or without parameters, e.g. in Route_Actions server event

$app->get('/books/{id}', function ($request, $response, $args) {
    $name = ExecuteScalar("SELECT name FROM books WHERE id = " . AdjustSql($args['id'])); // Get book info by $args['id'], here assume id is integer
    $response->getBody()->write($name); // Write to response body
    return $response; // Return the response
});

If you want to return JSON, read Returning JSON.Also See How to create routes.

Thank you for pointing me in right direction!Did some testing and that works great!

But when I need to generate a Word doc with PHPOffice and uses the keyword USE inside the function I get problems (Should be in the beginning of file). How, with PHPmaker and routes, do I handle that?

You may use fully qualified name, see Using namespaces: Basics.

Thanks again for teaching me the basics!If anybody else with my lack of knowledge in namespaces; this is what I did:Instead of using the following:

use PhpOffice\PhpWord\Style\Paper;
use PhpOffice\PhpWord\Style\Language;
use PhpOffice\PhpWord\Writer\Word2007\Style\Font;

I have to write the full qualified name when using the functions in PhpOffice like this:

$phpWord = new \PhpOffice\PhpWord\PhpWord()
$paper = new \PhpOffice\PhpWord\Style\Paper();

Also the constants f.ex language needs the full qualified name:

\PhpOffice\PhpWord\Style\Language::SV_SE

So moving from separate php-file into routes when creating phpword documents I did this:Server Events->Global->All pages → Route_Actions

$app->get('/createdoc/{id}', function ($request, $response, array $args) {
        $phpWord = new \PhpOffice\PhpWord\PhpWord();
        $paper = new \PhpOffice\PhpWord\Style\Paper();
        $phpWord->getSettings()->setThemeFontLang(new \PhpOffice\PhpWord\Style\Language(\PhpOffice\PhpWord\Style\Language::SV_SE));
	// ...
	// Do all stuff about the same and end with this:
        $response->getBody()->write(''); // Write an empty response body so you don't interfere with the creation of the Word document.
        return $response; // Return the response 
    });

At least this worked for me, perhaps it can be made more neat but it works!

1 Like