Applicazioni PHP
E' possibile utilizzare Discovery CMS anche nella costruzione di pagine PHP. Su github è possibile scaricare un semplice connettore:
git clone https://github.com/discoveryreply-com/discovery-cms-php-client
cd discovery-cms-php-client
composer install
Una volta fatto, occorre modificare la chiamata al costruttore della classe DiscoveryConnector
modifcando il file di esempio public/index.php
per inserire la propria API root e token:
$discoveryConnector = new DiscoveryConnector([
'api_root' => 'https://HOSTNAME',
'api_token' => 'YOUR_API_TOKEN',
'property_title' => 'YOUR_PROPERTY',
'components_namespace' => 'DiscoveryCms\\PhpClient\\SampleApp\\Components',
]);
Una volta fatto, e' possibile lanciare il web server con:
php -S localhost:8080 -t public
Se la porta 8080 è già in uso, sostituire con un'altra porta.
L'applicazione di esempio definisce dei componenti PHP che sono semplicemente classi nel path src/SampleApp/Components/
.
Queste classi seguono una naming convention, ovvero devono avere nomi identici a componenti definiti lato CMS e implementare
un metodo public static function render(object $data)
che riceve il payload dall'API e lo renderizza in HTML.
L'altra convenzione è che questi componenti devono stare nel namespace corrispondente all'opzione components_namespace
passata
al costruttore di DiscoveryConnector
.
Ad esempio, se si crea un componente sul CMS con ID = EditorChoice
, nel frontend PHP che si collega al CMS e' necessario
definire una classe con esattamente lo stesso nome nel namespace indicato in configurazione:
DiscoveryCms\PhpClient\SampleApp\Components\EditorChoice
A questo punto, immaginando che la pagina con slug home
restituisca un payload come questo:
{
"components": [
{
"_type": "MyProperty/CTA",
"_id": "17f2e0b7-6219-4119-b226-409aebd6dd97",
"body": "body example",
"headline": "headline example"
},
{
"_type": "MyProperty/EditorChoice",
"_id": "a7e48093-294b-4b4c-886b-f0c6983ffced",
"headline": "Headline of Editor Choice"
},
{
"_type": "MyProperty/Trending",
"headline": "trending products",
"_id": "742f838d-4e0c-44ac-8255-e5a35aa11f38"
}
],
...
}
verrà chiamato CTA::render($data)
, EditorChoice::render($data)
e Trending::render($data)
, passando ogni volta il corrispettivo frammento di pagina al componente, in modo che possa accedere,
ad esempio, all'headline, body, etc.
Ad esempio, l'headline di EditorChoice
inserita lato CMS corrisponde alla property $data->headline
.
Qualora il componente abbia bisogno di accedere alla pagina ospitante, è possibile recuperarne il relativo
data model utilizzando $data->_page
.