[Back] <?php
class OsBlockHelper {
public static function register_blocks() {
self::register_latepoint_category();
self::register_block_book_button();
self::register_block_book_form();
self::register_block_list_of_resources();
self::register_block_calendar();
self::register_block_customer_dashboard();
self::register_block_customer_login();
}
public static function localized_vars_for_blocks() : array {
$has_to_pick = [ 'label' => __('Customer will pick', 'latepoint'), 'value' => '' ];
$localized_block_vars = [];
// AGENTS
$localized_block_vars['agents'] = [];
$localized_block_vars['selected_agents_options'][] = $has_to_pick;
$localized_block_vars['selected_agents_options'][] = [ 'label' => __('Any Available', 'latepoint'), 'value' => LATEPOINT_ANY_AGENT ];
$agents = new OsAgentModel();
$agents = $agents->get_results_as_models();
if($agents){
foreach($agents as $agent){
$localized_block_vars['selected_agents_options'][] = ['label' => $agent->full_name, 'value' => $agent->id];
$localized_block_vars['agents'][] = [
'name' => $agent->full_name,
'id' => $agent->id,
'title' => $agent->title,
'short_description' => $agent->short_description,
'avatar_url' => empty($agent->avatar_image_id) ? '' : $agent->get_avatar_url()];
}
}
// SERVICES
$localized_block_vars['services'] = [];
$localized_block_vars['selected_services_options'][] = $has_to_pick;
$services = new OsServiceModel();
$services = $services->get_results_as_models();
if($services){
foreach($services as $service){
$localized_block_vars['selected_services_options'][] = ['label' => $service->name, 'value' => $service->id];
$localized_block_vars['services'][] = [
'name' => $service->name,
'id' => $service->id,
'image_url' => empty($service->description_image_id) ? '' : $service->get_description_image_url(),
'description' => $service->short_description,
'category_id' => $service->category_id,
'price_formatted' => ($service->price_min > 0) ? (($service->price_min != $service->price_max) ? __('Starts at', 'latepoint') . ' ' . $service->price_min_formatted : $service->price_min_formatted) : ''
];
}
}
// SERVICE CATEGORIES
$localized_block_vars['service_categories'] = [];
$localized_block_vars['selected_service_categories_options'][] = [ 'label' => __('Show All', 'latepoint'), 'value' => '' ];
$service_categories = new OsServiceCategoryModel();
$service_categories = $service_categories->get_results_as_models();
if($service_categories){
foreach($service_categories as $service_category){
$localized_block_vars['service_categories'][] = [
'name' => $service_category->name,
'id' => $service_category->id
];
$localized_block_vars['selected_service_categories_options'][] = ['label' => $service_category->name, 'value' => $service_category->id];
}
}
// LOCATIONS
$localized_block_vars['locations'] = [];
$localized_block_vars['selected_locations_options'][] = $has_to_pick;
$localized_block_vars['selected_locations_options'][] = [ 'label' => __('Any Available', 'latepoint'), 'value' => LATEPOINT_ANY_LOCATION ];
$locations = new OsLocationModel();
$locations = $locations->get_results_as_models();
if($locations){
foreach($locations as $location){
$localized_block_vars['selected_locations_options'][] = ['label' => $location->name, 'value' => $location->id];
$localized_block_vars['locations'][] = [
'name' => $location->name,
'id' => $location->id,
'category_id' => $location->category_id];
}
}
$localized_block_vars['bundles'] = [];
$localized_block_vars['selected_bundles_options'][] = $has_to_pick;
$bundles = (new OsBundleModel())->should_be_active()->get_results_as_models();
if ($bundles) {
foreach ( $bundles as $bundle ) {
$localized_block_vars['selected_bundles_options'][] = ['label' => $bundle->name, 'value' => $bundle->id];
$localized_block_vars['bundles'][] = [
'name' => $bundle->name,
'id' => $bundle->id,
'price_formatted' => $bundle->get_formatted_charge_amount(),
'description' => $bundle->short_description
];
}
}
return $localized_block_vars;
}
public static function register_latepoint_category() {
add_filter('block_categories_all', function ($categories) {
// Adding a new category.
$categories[] = [
'slug' => 'latepoint',
'title' => 'LatePoint',
];
return $categories;
});
}
public static function register_block_book_button() {
register_block_type(LATEPOINT_ABSPATH . 'blocks/build/book-button/block.json',
[
'render_callback' => 'OsBlockHelper::render_book_button',
'editor_script_handles' => ['latepoint-block-book-button']
]);
}
public static function register_block_book_form() {
register_block_type(LATEPOINT_ABSPATH . 'blocks/build/book-form/block.json',
[
'render_callback' => 'OsBlockHelper::render_book_form',
'editor_script_handles' => ['latepoint-block-book-form']
]);
}
public static function register_block_list_of_resources() {
register_block_type(LATEPOINT_ABSPATH . 'blocks/build/list-of-resources/block.json',
[
'render_callback' => 'OsBlockHelper::render_list_of_resources',
'editor_script_handles' => ['latepoint-block-list-of-resources']
]);
}
public static function register_block_calendar(): void {
register_block_type( LATEPOINT_ABSPATH . 'blocks/build/calendar/block.json',
[
'render_callback' => 'OsBlockHelper::render_calendar',
'editor_script_handles' => [ 'latepoint-block-calendar' ]
] );
}
public static function register_block_customer_dashboard(): void {
register_block_type( LATEPOINT_ABSPATH . 'blocks/build/customer-dashboard/block.json',
[
'render_callback' => 'OsBlockHelper::render_customer_dashboard',
'editor_script_handles' => [ 'latepoint-block-customer-dashboard' ]
] );
}
public static function register_block_customer_login(): void {
register_block_type( LATEPOINT_ABSPATH . 'blocks/build/customer-login/block.json',
[
'render_callback' => 'OsBlockHelper::render_customer_login',
'editor_script_handles' => [ 'latepoint-block-customer-login' ]
] );
}
public static function render_book_button($attributes, $content) {
return do_shortcode('[latepoint_book_button ' . self::attributes_to_data_params($attributes) . ']');
}
public static function render_book_form($attributes, $content) {
return do_shortcode('[latepoint_book_form ' . self::attributes_to_data_params($attributes) . ']');
}
public static function add_block_styles_to_page() {
if (is_page() && $styles = get_option('latepoint_blocks_styles_' . get_the_ID())) {
wp_add_inline_style('latepoint-main-front', $styles);
}
}
public static function render_list_of_resources($attributes, $content) {
return do_shortcode('[latepoint_resources ' . self::attributes_to_data_params($attributes) . ']');
}
public static function render_calendar($attributes, $content) {
return do_shortcode('[latepoint_calendar ' . self::attributes_to_data_params($attributes) . ']');
}
public static function render_customer_dashboard($attributes, $content) {
return do_shortcode('[latepoint_customer_dashboard ' . self::attributes_to_data_params($attributes) . ']');
}
public static function render_customer_login($attributes, $content) {
return do_shortcode('[latepoint_customer_login ' . self::attributes_to_data_params($attributes) . ']');
}
/**
* Prepare data for shortcode
* @param array $settings
* @param array $allowed_params
*
* @return string
*/
public static function attributes_to_data_params( array $settings, array $allowed_params = [] ): string {
$data_html = '';
foreach ( $settings as $key => $value ) {
if(empty($value)) continue;
if ( !empty($allowed_params) && ! in_array( $key, $allowed_params ) ) {
continue;
}
if ( is_array( $value ) ) {
$value = implode( ',', $value );
}
if (is_bool($value)) {
$value = $value ? 'yes' : 'no';
}
$data_html .= $key . '="' . esc_attr( $value ) . '" ';
}
return $data_html;
}
/**
* When save page - save gutenberg blocks styles to options
* @param $page_id
* @return void
*/
public static function save_blocks_styles($page_id): void {
if (wp_is_post_revision($page_id)) return;
$styles = '';
if (has_block('latepoint/list-of-resources', $page_id) ||
has_block('latepoint/book-button', $page_id)
) {
$post_content = get_post_field('post_content', $page_id);
$blocks = parse_blocks($post_content);
$styles = self::generate_styles_for_blocks($blocks);
}
self::save_blocks_styles_in_options($page_id, $styles);
}
private static function generate_styles_for_blocks( $blocks ): string {
$styles = '';
foreach ( $blocks as $block ) {
switch ( $block['blockName'] ) {
case 'latepoint/list-of-resources':
$styles .= self::generate_styles_for_list_of_resources( $block['attrs'] );
break;
case 'latepoint/book-button':
$styles .= self::generate_styles_for_book_button( $block['attrs'] );
break;
}
if ( ! empty( $block['innerBlocks'] ) ) {
$styles .= self::generate_styles_for_blocks( $block['innerBlocks'] );
}
}
return $styles;
}
/**
* Save gutenberg blocks styles in wp options. if styles is empty - delete option
* @param int $page_id
* @param string $styles
*
* @return void
*/
private static function save_blocks_styles_in_options(int $page_id, string $styles = "" ):void {
$option_name = 'latepoint_blocks_styles_' . $page_id;
if (trim($styles) == '') {
if(get_option($option_name)) delete_option($option_name);
} else {
update_option($option_name, $styles);
}
}
/**
* Styles for gutenberg block "Book Button"
* @param $attrs
*
* @return string
*/
public static function generate_styles_for_book_button($attrs): string {
$styles = [];
if (!empty($attrs['is_inherit'])) return "";
$prefix = ".latepoint-book-button.latepoint-book-button-". $attrs['id'];
$styles[$prefix . "," . $prefix . ":focus"] = [
'font-weight' => $attrs['font_weight'] ?? '',
'text-transform' => $attrs['text_transform'] ?? '',
'font-family' => $attrs['font_family'] ?? '',
'line-height' => $attrs['line_height'] ?? '',
'letter-spacing' => $attrs['letter_spacing'] ?? '',
'border-color' => $attrs['border_color'] ?? '',
'border-width' => $attrs['border_width'] ?? '',
'border-style' => $attrs['border_style'] ?? '',
];
if ($styles[ $prefix]['border-style'] == 'default') {
unset($styles[ $prefix]['border-style']);
}
$styles[$prefix . ":hover"] = [
'background-color' => $attrs['bg_color_hover'] . " !important" ?? "",
'color' => $attrs['text_color_hover'] . " !important" ?? '',
'border-color' => $attrs['border_color_hover'] . " !important" ?? '',
];
return self::generate_css($styles);
}
/**
* Styles for gutenberg block "List of Resources"
*
* @param array $attrs
* @return string
*/
public static function generate_styles_for_list_of_resources(array $attrs): string {
$styles = [];
if (!empty($attrs['is_inherit'])) return "";
$card_prefix = ".latepoint-resources-items-w .resource-item.resource-item-". $attrs['id'];
$styles[ $card_prefix . ' .latepoint-book-button' ] = [
'background-color' => $attrs['button_bg_color'] ?? "",
'color' => $attrs['button_text_color'] ?? "",
'font-size' => $attrs['button_font_size'] ?? "",
'font-weight' => $attrs['font_weight'] ?? "",
'text-transform' => $attrs['text_transform'] ?? "",
'font-family' => $attrs['font_family'] ?? "",
'line-height' => $attrs['line_height'] ?? "",
'letter-spacing' => $attrs['letter_spacing'] ?? "",
'border-radius' => $attrs['button_border_radius'] ?? "",
'border-color' => $attrs['border_color'] ?? "",
'border-style' => $attrs['border_style'] ?? "",
'border-width' => $attrs['border_width'] ?? "",
'padding' => $attrs['padding'] ?? ""
];
if ($styles[ $card_prefix . ' .latepoint-book-button' ]['border-style'] == 'default') {
unset($styles[ $card_prefix . ' .latepoint-book-button' ]['border-style']);
}
$styles[ $card_prefix . ' .latepoint-book-button:hover' ] = [
'background-color' => $attrs['bg_color_hover'] ?? "",
'border-color' => $attrs['border_color_hover'] ?? "",
'color' => $attrs['text_color_hover'] ?? "",
];
$styles[ $card_prefix ] = [
'padding' => $attrs['card_padding'] ?? "",
'box-shadow' => $attrs['card_box_shadow'] ?? "",
'border-style' => $attrs['card_border_style'] ?? "",
'border-radius' => $attrs['card_border_radius'] ?? "",
'border-width' => $attrs['card_border_width'] ?? "",
'border-color' => $attrs['card_border_color'] ?? "",
'background-color' => $attrs['card_bg_color'] ?? "",
];
$styles[ $card_prefix . " .ri-name > *" ] = [
'font-size' => $attrs['title_font_size'] ?? "",
'color' => $attrs['card_text_color'] ?? ""
];
$styles[ $card_prefix . ":hover .ri-name > *" ] = [
'color' => $attrs['card_text_color_hover'] ?? ""
];
$styles[ $card_prefix . " .ri-price" ] = [
'font-size' => $attrs['price_font_size'] ?? "",
'color' => $attrs['card_price_color'] ?? ""
];
$styles[ $card_prefix . ":hover .ri-price" ] = [
'color' => $attrs['card_price_color_hover'] ?? ""
];
$styles[ $card_prefix . " .ri-description" ] = [
'font-size' => $attrs['descr_font_size'] ?? "",
'color' => $attrs['card_descr_color'] ?? ""
];
$styles[ $card_prefix . ":hover .ri-description" ] = [
'color' => $attrs['card_descr_color_hover'] ?? ""
];
if ($styles[$card_prefix]['card_border_style'] == 'default') {
unset($styles[$card_prefix]['border-style']);
}
$styles[ $card_prefix . ":hover" ] = [
'border-color' => $attrs['card_border_color_hover'] ?? "",
'background-color' => $attrs['card_bg_color_hover'] ?? "",
'color' => $attrs['card_text_color_hover'] ?? "",
];
$styles[ $card_prefix . ":hover .ri-name h3" ] = [
'color' => $attrs['card_text_color_hover'] ?? ""
];
$styles[ $card_prefix . " .ri-name h3" ] = [
'color' => $attrs['card_text_color'] ?? ""
];
return self::generate_css($styles);
}
/**
* Convert array with styles to string
*
* @param array $selectors
* @return string
*/
public static function generate_css(array $selectors): string {
$styling_css = '';
foreach ( $selectors as $selector => $options ) {
$css = '';
foreach ( $options as $option_name => $option_val ) {
if ( empty( $option_val ) ) {
continue;
}
$css .= $option_name . ': ' . $option_val . ';';
}
if ( ! empty( $css ) ) {
$styling_css .= $selector . '{';
$styling_css .= $css . '}';
}
}
return $styling_css;
}
/**
* Retrieve Ids by resources
* @param string $resource
* @param array $settings
*
* @return string
*/
public static function get_ids_from_resources(string $resource, array $settings): array
{
$resourceMap = [
'services' => 'item_ids_services',
'locations' => 'item_ids_locations',
'agents' => 'item_ids_agents',
'bundles' => 'item_ids_bundles',
];
if (!array_key_exists($resource, $resourceMap)) {
return [];
}
$idsKey = $resourceMap[$resource];
return !empty($settings[$idsKey]) ? $settings[$idsKey] : [];
}
}