Passa al contenuto principale

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.