Contenus
Ci-dessous sont décrites les différentes configurations permettant de générer un panel d'administration.
Emplacement
/Projects/{project}/Config/pages/
Structure de base d'une interface
Une interface CMS de base se compose de:
- Titre (input) :
title - Texte (textarea):
text - Bloc Meta:
meta - Bloc config admin
En complément on peut disposer de:
- Sous-titre (input):
subtitle - Texte court (textarea):
intro - Images
- Contenu configurable
Déclaration des configurations
Note générale
Les noms des clés sont arbitraires : ils sont librement définis.
'fields' => [
'image' => [...,
'champ' => [...
]
Sur l'intégration front ils permettront d'accéder à l'information stockée via:
$data->fetchCustomValue('image');
$data->fetchMultiLangCustomValue('champ');
Niveaux
2 types principaux à distinguer :
- une partie des configurations est écrit sur un premier niveau.
- d'autres sont encapsulées sous la collection (clé)
custom_content
Dans custom_content chaque élement peut-être déclaré séparément ou groupé comme ceci :
Voir la configuration groupée:
'custom_content' => [
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Généralités',
'fields' => [
'etat' => [
'type' => 'radio',
'class' => 'form-check-inline',
'label' => 'État',
'grid' => 'col-sm-4',
'options' => [
1 => [
'label' => 'Neuf ',
],
2 => [
'label' => 'Occasion',
'default'
],
]
],
'year' => [
'type' => 'select',
'label' => 'Année',
'query' => [
'method' => 'categories',
'arguments' => ['type' => 'vehicle_year', 'parent' => '']
],
'create' => true,
'grid' => 'col-sm-12'
],
'general_type' => [
'type' => 'text',
'label' => 'Type',
'grid' => 'col-sm-12'
],
],
]
]
Modificateurs
La structure de base et la structure complémentaire peuvent être manipulées:
- pour cacher un élément de base
- pour afficher un élément complémentaire
Exclure des éléments
'exclude'=> [
'title',
'text',
'meta'
]
Modifier les intitulés
'title'=>'Lorem',
'subtitle'=> 'Ipusm'
'intro'=>'Dolor',
Statut de publications
Désactiver la gestion de statut de publication
'hide_status'
Exemple de configuration complète
Page en exploitation sur Chirurgie Orthopédique Aubagne
Voir la configuration
<?php
return [
'actions' => [
'save_and_go',
'save_and_add'
],
'is_listable' => [
'label' => 'Pages pathologies',
'order' => ['position','asc'],
'sortable',
'no_page',
'url_prefix'=>'pathologies',
'with_image',
],
'subtitle'=>'Titre en bleu entête',
'intro'=> 'Texte Entête',
'exclude'=>['text'],
'images' => [
'image_header' => [
'label' => 'Image Entête',
'size' => ['w' => 1920, 'h' => 720],
'jcrop',
'selection'
],
'image_bloc' => [
'label' => 'Image Bloc contenu',
'size' => ['w' => 800, 'h' => null]
],
],
'has' => [
'bloc_list' => [
'label' => 'Blocs Texte/Image'
],
'tag_list' => [
'label' => 'Mots-clés'
],
'gallery_list' => [
'label' => 'Galerie d\'images'
]
],
'custom_content' => [
[
'multi_lang' => true,
'label' => 'Bloc contenu',
'fields' => [
'line_bloc' => [
'type' => 'text',
'label' => 'Titre du bloc'
],
'text_bloc' => [
'type' => 'textarea',
'label' => 'Texte du bloc'
],
]
],
[
'multi_lang' => true,
'label' => 'Titres dans la page',
'fields' => [
'line_keywords' => [
'type' => 'text',
'label' => 'Titre du bloc Mots-clés'
],
'line_blocs' => [
'type' => 'text',
'label' => 'Titre avant les blocs texte+image'
],
'line_rdv' => [
'type' => 'text',
'label' => 'Titre du bloc Prendre rendez-vous'
],
'line_gal' => [
'type' => 'text',
'label' => 'Titre du bloc Galerie d\'images'
],
]
],
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Médecins',
'fields' => [
'medecin' => [
'type' => 'checkbox',
'query' => [
'method' => 'categories',
'arguments' => ['type' => 'medecin']
],
'grid' => 'col-sm-12'
],
],
],
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Pathologies',
'fields' => [
'groupe' => [
'type' => 'radio',
'query' => [
'method' => 'categories',
'arguments' => ['type' => 'specialite']
],
'grid' => 'col-sm-12'
],
]
],
],
];
Configurations disponibles
Médias
Permet l'ajout de :
- galerie d'images par drag&drop
- documents
- intégration de liens vidéos Youtube, Vimeo, DailyMotion, Vine ou Kickstarter
'media' => [
'label' => 'Médias',
'cols' => 'auto',
'fields' => [
'image' => [
'label' => 'Ajouter une image',
'size' => ['w' => 1920, 'h' => null],
'acceptable' => '/(\.|\/)(gif|jpe?g|png)$/i',
'type' => 'fileupload'
],
'video' => [
'label' => 'Vidéo',
'placeholder' => 'Lien de la vidéo',
'info' => "Copiez/collez simplement le lien d'une video disponible sur Youtube, Vimeo, DailyMotion, Vine ou Kickstarter.<br><strong>Exemple :</strong> <em>https://www.youtube.com/watch?v=cq9bBqjknAY</em> ou <em>https://youtu.be/cq9bBqjknAY</em>"
],
],
]
Téléchargeable
Télécharger un fichier de façon classique
[
'multi_lang' => false,
'fields' => [
'video_upload' => [
'type' => 'uploadable',
'label' => 'Vidéo (fichier à télécharger)'
]
],
]
Images
Télécharger des images de façon classique, en plusieurs formats, avec ou sans jcrop
[
'image_home' => [
'sizes' => [ // plusieurs formats
['w' => 770, 'h' => null, 'label' => 'medium'],
['w' => 385, 'h' => null, 'label' => 'grid'],
]
],
'image_sky' => [
'label' => 'Image panoramoque',
'size' => ['w' => 2560, 'h' => 540],
'jcrop', // disposer du jcrop
'selection' // pour récupérer une zone seulement
]
]
Catégories sur plusieurs niveaux
// doit se trouver dans : 'custom_content' => []
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Thèmes',
'fields' => [
'theme' => [
'type' => 'nested_categories',
'query' => [
'method' => 'nested_categories',
'arguments' => [
'type' => 'theme',
'taxonomy' => null
]
],
'grid' => 'col-sm-12'
],
]
]
Select
// doit se trouver dans : 'custom_content' => []
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Année',
'fields' => [
'region' => [
'type' => 'select',
'query' => [
'method' => 'categories',
'arguments' => [
'type' => 'year'
]
],
'grid' => 'col-sm-12'
],
]
]
Checkboxes
// doit se trouver dans : 'custom_content' => []
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Régions',
'fields' => [
'region' => [
'type' => 'checkbox',
'query' => [
'method' => 'categories',
'arguments' => [
'type' => 'region'
]
],
'grid' => 'col-sm-12'
],
]
]
Radio
// doit se trouver dans : 'custom_content' => []
[
'multi_lang' => false,
'label' => 'Activer',
'fields' => [
'activate_it' => [
'type' => 'radio',
---- SOIT PAR VALEURS DECLARÉES ----
'values' => [
null => 'Non',
1 => 'Oui'
],
---- SOIT PAR REQUÊTE ----
'query' => [
'method' => 'categories',
'arguments' => ['type' => 'specialite']
],
'default' => null
],
]
]
Textuel
// doit se trouver dans : 'custom_content' => []
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Coordonnées ',
'fields' => [
'phone' => [
'type' => 'text',
'label' => 'Numéro de téléphone',
'grid' => 'col-sm-12'
],
'addr_cabinet' => [
'type' => 'textarea',
'label' => 'Adresse',
'class' => 'simplified' // TinyMce
'grid' => 'col-sm-12'
],
]
]
Datepicker
Repose sur la librairie Flatipicker
// doit se trouver dans : 'custom_content' => []
[
'multi_lang' => false,
'grid' => 'custom',
'label' => 'Date ',
'fields' => [
'date' => [
'type' => 'datepicker',
'label' => 'Date', // optionnel
'grid' => 'col-sm-12' // optionnel
'config' => 'key1=value1,key2=>value2...' // optionnel, voir options Flatpickr,
'default' => 'created_at' // optionnel, le paramètre passé doit être un cast date,
'replace' => 'created_at' // optionnel, remplacement d'une date principale dans pages
],
]
]
Listes intégrales
Permet de créer des contenus qui vont s'afficher sous forme de listes intégrales.
La configuration du contenu individuel peut être spécifié en dessous.
[
'actions' => [ // Les boutons enegistrement complémentaires
'save_and_go',
'save_and_add'
],
'is_listable' => [
'label' => 'Interviews',
'order' => ['position','asc'], // mode de tri
'sortable', // positionnement sur mesure
'no_page', // pas de page mère
'no_links', // ne pas afficher des liens
'url_prefix'=>'interviews', // pour le panel
'with_image', // afficher des vignettes dans les listes,
'hide_status' // désactiver la gestion de statut de publication
],
]
Listes rattachées
Permet de créer des contenus qui seront rattachés sous forme de listes dans l'UI d'un autre contenu.
'has' => [
'slider_list' => [ // une liste
'label' => 'Diaporama',
],
'rating_list' => [ // une autre
'label' => 'Rating',
],
]
Cela demande à créer deux sous-fichiers de configuration :
- slider.php
- slider_list.php
slider.php
va contenir la configuration classique de contenu
slider_list.php
va contenir la configuration exacte indiquée dans Listes intégrales
Fonctionnalité sur mesure
Dans le cas où rien ne correspond aux données à traiter ou s'il faut regrouper cela dans une logique particulière
Le code sur mesure est représentée par une classe qui doit se trouver dans le répertoire :
/Projects/{project}/Models/ClassManagedCustomContent/
Le contenu de la classe est le suivant :
namespace Projects\Models\ClassManagedCustomContent;
use Modules\Publisher\Interfaces\ClassManagedContent;
use Modules\Publisher\Models\Pages;
class OpeningTime implements ClassManagedContent
{
public function get(Pages $page): string
{
// Interface qui sera rendue dans le panel
...
}
public function post(): void
{
// Traitement $_POST qui sera passé à l'enregistrement de la page
...
}
}
// doit se trouver dans : 'custom_content' => []
[
'multi_lang' => false,
'label'=>"Horaires d'ouverture",
'class_managed_content' =>
[
'get'=> "OpeningTime@get",
'post'=> "OpeningTime@post",
'css'=> 'opening_time',
'js'=> 'opening_time',
]
]