<?php

/***********************************************************************************************************
*  	ADDONS PATTERNS BACK OFFICE
*   	Menu Compositions en back office
*   	INSERTION AUTOMATIQUE DE BLOC RÉUTILISABLE AVANT ET/OU APRÉS ARTICLES,PAGES,CPT
*   	AFFICHER PAR SHORTCODE UN BLOC RÉUTILISABLE SELON SON ID
*   	FONCTION POUR AFFICHER DANS LE THEME UN BLOC RÉUTILISABLE SELON SON ID
*   	Ajout de la colonne Intégration dans la page d'administration des blocs réutilisables
*   	Afficher les shortcodes dans la colonne Intégration pour la page d'adminitration des blocs réutilisables

*   FENÊTRE MODALE POUR AFFICHER LE BLOC RÉUTILISABLE(expérimental)
*************************************************************************************************************/



/*----------------------------------------------------------------------------------------
		                         ADDONS PATTERNS BACK OFFICE
/*---------------------------------------------------------------------------------------*/


/* --------------------------- Menu Compositions en back office ----------------------------------------------*/

function reusable_blocks_menu() {
	
    add_menu_page(
		__( 'Patterns', 'editor-custom-color-palette' ),// Page title , Text Domain(pour la traduction)
		__( 'Patterns', 'editor-custom-color-palette' ), // Menu title, Text Domain(pour la traduction)
		'edit_posts', // Capabilities (Capacités)
		'edit.php?post_type=wp_block',// URL relative
		'', // Display callback (fonction permettant l'affichage du contenu de la page de réglages)
		'dashicons-table-col-after', // Icon
		22 // Priority/position. Just after 'Page'
	);
}

/* Si on à activé le menu des compositions
if( $reusable_blocks_settings['eccp_activate_reusable_blocks_menu_checkbox_field'] == true ) {
	add_action('admin_menu', 'reusable_blocks_menu');
}*/

$value_menu = isset( $reusable_blocks_settings['eccp_activate_reusable_blocks_menu_checkbox_field'] ) ?  $reusable_blocks_settings['eccp_activate_reusable_blocks_menu_checkbox_field'] : false;
// Si on à activé le menu des compositions
if( $value_menu == true ) {
	add_action('admin_menu', 'reusable_blocks_menu');
}


/* INSERTION AUTOMATIQUE DE BLOC RÉUTILISABLE AVANT ET/OU APRÉS ARTICLES,PAGES,CPT */

/*

hook template_include:
Ce hook de filtre est exécuté immédiatement avant que WordPress n'inclue le fichier de modèle 
prédéterminé (single.php singular.php etc..)

hook the_content:
Ce filtre est utilisé pour filtrer le contenu d'un article après qu'il ait été extrait 
de la base de données et avant qu'il ne soit affiché à l'écran.
avec ce hook on doit aussi vérifier si on filtre le contenu de la requête principale 
avec les conditions is_main_query() et in_the_loop().
La requête de publication principale peut être considérée comme la boucle de publication principale 
qui affiche le contenu principal d'une publication, d'une page ou d'une archive. 
sans ces conditions, on pourrait involontairement filtrer le contenu des boucles personnalisées 
dans les barres latérales, les pieds de page ou ailleurs.

*/


function eccp_insert_content_into_posts( $template ) {

	// On récupère les paramètres de réglages de l'extension
	$reusable_blocks_settings = get_option( 'eccp_settings_reusable_blocks' );
	
	// On récupère le nom de la publication en cours
	// post: article , page, slug du CPT
	$current_post_type = get_post_type();
	
	
	/* Pour Debug 
	 echo 'Publication: '.$current_post_type;
	*/ 
	
	/*
	  Un panneau: Contenu avant/aprés publication a été crée en React JS
	  dans la barre latérale Document de l'éditeur.
      Ce panneau contient deux options pour inhiber l'insertion de blocs avant et/ou aprés
      le contenu. la valeur boolèenne des options est attribuée respectivement 
	  aux métas de publication: remove_blocks_before_content & remove_blocks_after_content
	  déclaré par la fontion PHP eccp_register_post_meta()
	  on récupère ces métas de publications avec la fonction get_post_meta
      get_post_meta( int  $post_id , string  $meta  =  '' , bool  $single  =  false  )	
      dernier argument $single = true pour indiquer qu'il faut renvoyer une valeur unique
	*/
	$remove_blocks_before_content = get_post_meta( get_the_ID(), 'remove_blocks_before_content', true );
	$remove_blocks_after_content = get_post_meta( get_the_ID(), 'remove_blocks_after_content', true );	
	
	/* Pour Debug
	echo 'Type de publication: '. $current_post_type . '<br>';
	echo 'Supprimer bloc avant contenu: '. $remove_blocks_before_content . '<br>';
	echo 'Supprimer bloc aprés contenu: '. $remove_blocks_after_content . '<br>';
	*/
	
	$existing_before_reusable_block_id = 0;
	$existing_after_reusable_block_id = 0;
	
	// On récupère l'ID des blocs réutilisables sélectionnés pour les articles dans l'onglet
	// Blocs réutilisable de la page d'option du plugin
	if ( $current_post_type == 'post'){
		$existing_before_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_before_post_select_field'] );
		$existing_after_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_after_post_select_field'] );
	
	// ID blocs réutilisable pour les pages
	}else if ( $current_post_type == 'page'){
		$existing_before_reusable_block_id  = intval( $reusable_blocks_settings['eccp_settings_insert_block_before_page_select_field'] );
		$existing_after_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_after_page_select_field'] );
	
	// ID blocs réutilisable pour les CPT
	}else{
		$existing_before_reusable_block_id  = intval( $reusable_blocks_settings['eccp_settings_insert_block_before_cpt_select_field'] );
		$existing_after_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_after_cpt_select_field'] );
	}
	
	// is_singular: Détermine si la requête concerne une publication unique existante 
	// de n'importe quel type de publication (publication, pièce jointe, page, types de publication personnalisés).
	if ( is_single() || is_singular() ) {
		
		
		// Si on a sélectionné un bloc réutilisable pour l'insérer avant le contenu 
		// et qu'on a pas supprimé cette action pour la publication en cours
		if ( ! empty( $existing_before_reusable_block_id ) && 0 !== ( $existing_before_reusable_block_id ) && !$remove_blocks_before_content ) {
			
			// on récupère un objet de publication correspondant a notre bloc réutilisable
			$before_content = get_post($existing_before_reusable_block_id);
			// on récupère le contenu de notre bloc réutilisable
			$before_content = apply_filters('the_content', $before_content->post_content ) ;

			// On filtre le contenu de la publication pour insérer au début notre bloc réutilisable
			add_filter( 'the_content', function( $content ) use ( $before_content ){ 
					
				if ( ( is_single() && in_the_loop() && is_main_query() ) || ( is_singular() && in_the_loop() && is_main_query() ) ) {

					$content = $before_content . $content;
					
				}
				
				return $content ;
				
			});
			
		}
		
		
		
		// Si on a sélectionné un bloc réutilisable pour l'insérer aprés le contenu 
		// et qu'on a pas supprimé cette action pour la publication en cours
		if ( ! empty( $existing_after_reusable_block_id ) && 0 !== ( $existing_after_reusable_block_id ) && !$remove_blocks_after_content ) {
			
			$after_content = get_post($existing_after_reusable_block_id);
			$after_content = apply_filters('the_content', $after_content->post_content ) ;
		
			// On filtre le contenu de la publication pour insérer a la fin notre bloc réutilisable
			add_filter( 'the_content', function( $content ) use ( $after_content ){ 

				if ( ( is_single() && in_the_loop() && is_main_query() ) || ( is_singular() && in_the_loop() && is_main_query() ) ) {

					$content = $content . $after_content ;
				}
				 return $content ;
			});
		
		}

	}
	
	return $template;
}

add_filter( 'template_include', 'eccp_insert_content_into_posts' );



/* -------------- AFFICHER PAR SHORTCODE UN BLOC RÉUTILISABLE SELON SON ID -------------------*/

/* Les blocs réutilisables sont des types de publication appropriés
   qui ont pour nom: wp_block
   On a juste juste besoin de connaître l'ID du bloc réutilisable
   Pour les afficher en dehors du contexte d'une publication/page.
   l'ID se trouve dans l'URL de l'écran d'édition du bloc réutilisable
*/

// exemple d'utilisation du shortcode: [reusable_block id="8370"]

// la fonction shortcode_atts() permet de combiner l'attribut 'id'
// avec l'ID fourni par l'utilisateur dans la balise shortcode[]  
// l'ID utilisateur étant retourné par $atts 
// les noms d'attribut doivent être en minuscule
// extract permet de créer une variable a partir d'un tableau
// extract retourne $id


$reusable_blocks_shortcode = isset( $reusable_blocks_settings['eccp_activate_reusable_blocks_shortcode_checkbox_field'] ) ?  $reusable_blocks_settings['eccp_activate_reusable_blocks_shortcode_checkbox_field'] : false;


function eccp_reusable_blocks_shortcode( $atts ) {
	
	extract( shortcode_atts( array(
		'id' => '',
	), $atts ) );
	// fonction eccp_reusable_block définit ci_dessous
    // FONCTION POUR AFFICHER DANS LE THEME UN BLOC RÉUTILISABLE SELON SON ID	
	$content = eccp_reusable_block( $id );
	return $content;
	
}

// si on a activé les shortcodes pour les blocs réutilisables
if( $reusable_blocks_shortcode == true ) {
	add_shortcode( 'reusable_block', 'eccp_reusable_blocks_shortcode' );
}

/*-------- FONCTION POUR AFFICHER DANS LE THEME UN BLOC RÉUTILISABLE SELON SON ID -------*/

/* Nous pouvons appeler cette fonction n'importe où dans notre thème, 
  pour afficher nos blocs réutilisables simplement en fournissant leur ID
  ex: echo eccp_reusable_block(8370);
  On utilise le filtre the_content pour formater correctement le contenu avant 
  d'afficher le bloc réutilisable.
*/
function eccp_reusable_block( $id ) {
	
	$content_post = get_post( $id );
	
	if(isset($content_post->post_content)){
		$content = apply_filters('the_content',$content_post->post_content);
		return $content;
    }else{
		
		return '';
	}
	
}


/*------ Ajout de la colonne Intégration dans la page d'administration des blocs réutilisables ---------*/

/* Fonction Ajout de la colonne Intégration et Réorganisation des colonnes */ 
function eccp_reusable_screen_add_columns($columns){
	
    $custom_col_order = array(
        'cb' => $columns['cb'],
        'title' => $columns['title'],
        'reusable-block-display' => esc_html__ ( 'Integration' , 'editor-custom-color-palette' ),
        'date' => $columns['date']
    );
	
    return $custom_col_order;
}

// si on a activé les shortcodes pour les blocs réutilisables
// on utilise le hook: manage_post_type_posts_columns  
// post-type est a remplacer par le slug du type de publication personnalisé
// dans note cas wp_block
if( $reusable_blocks_shortcode == true ) {
 add_filter('manage_wp_block_posts_columns', 'eccp_reusable_screen_add_columns');
}


/*--- Afficher les shortcodes dans la colonne Intégration pour la page d'adminitration des blocs réutilisables ---*/

// Pour afficher les shortcodes et fonction PHP dans la colonne Intégration
// on utilise les balises <p> et <code> dont le style
// est déja géré en admin par WordPress

function eccp_reusable_screen_column_value( $column_name, $id ) {
   

   switch ( $column_name ) {
		
		// On récupère l''id d'un bloc réutilisable
		case 'reusable-block-display':
			echo '<p>'.esc_html__ ( 'Shortcode' , 'editor-custom-color-palette' ). ':<code>[reusable_block id=\''.$id.'\']</code></p>';
			echo '<p>'.esc_html__ ( 'PHP Function' , 'editor-custom-color-palette' ). ':<code>eccp_reusable_block('.$id.')</code></p>';
			//eccp_display_modal($id);
			
			break;
			
		default :
			break;
			
    }
}

// si on a activé les shortcodes pour les blocs réutilisables
if( $reusable_blocks_shortcode == true ) {
	
	// pour personnaliser la page d'administration des blocs réutilisables 
	// on utilise le  hook : manage_wp_block_posts_custom_column   
	add_action('manage_wp_block_posts_custom_column', 'eccp_reusable_screen_column_value',1000, 2);

}


/*-------------- FENÊTRE MODALE POUR AFFICHER LE BLOC RÉUTILISABLE(expérimental) ----------------*/

/*

1er) Utiliser la fonction de WP add_thickbox() pour charger
le script js et le style css intégrés au core pour la librairie
modifié thickbox de Jquery.
ceci est fait dans la rubrique: chargement scripts du plugin

2ème) Ajout d'un bouton avec la classe="thickbox" 
l'url associé a href est une ancre: #TB_inline
avec passage des paramètres suivant:
width, height, pour la résolution de la fenêtre en pixel
le paramètre inlineId permet de lier le bouton 
au container <div> de la fenêtre modale dont l'id a la même valeur.
title permet de donner un titre a la fenêtre modale

3ème)Le contenu qui va dans notre fenêtre modale sera mis 
dans une balise div avec un id de même valeur que le paramètre inlineId 
et la régle style="display:none ;" 
c'est le click sur le bouton qui fera apparaitre le contenu

Remarque: le bloc réutilisable est bien affiché mais sans le style
a part pour certains blocs de Kadence Block dont le style est enregistré
dans le HTML du block
En définitive il faut pouvoir charger les styles appliqués aux blocs Gutenberg,
aux plugins ainsi que le style du thème courant dans la fenêtre modale.
donc l'API Tickbox ne convient pas, il faut utiliser Jquery UI dialog 
avec une iframe dont le contenu est chargé par Java Script, avec une structure
HTML équivalente a une page:
<iframe>
	<html>
		<head>
			<style>
			</style>
		</head>
		<body>
		....Contenu
		</body>
	</html>
</iframe>

Le contenu de l'iframe sera chargé par ces lignes JS

var doc = document.getElementById( current_iframe_id ).contentWindow.document;
doc.open();
doc.write( iframe_content );
doc.close();		

*/


function eccp_display_modal($id) {
	 
?>

	<div id="content-modal-<?php echo $id; ?>" style="display:none;" >
		
			<?php //echo do_shortcode('[reusable_block id=.\''.$id.'\']'); ?>
			<?php  echo eccp_reusable_block($id); ?>
		
	</div>

	<a  class=" thickbox button button-secondary button-small eccp-button-preview"  href="#TB_inline?&width=800&height=550&inlineId=content-modal-<?php echo $id; ?>" 
	    title="<?php echo esc_html__ ( 'Reusable Block preview: ', 'editor-custom-color-palette' ) . esc_html__ ( get_the_title( $id ) ); ?>">
		
		<?php esc_html_e( 'Preview', 'editor-custom-color-palette' ); ?>
	
	</a>	

<?php

}

