diff --git a/editor/api.php b/editor/api.php index 3cb41eddcc..72386014bf 100755 --- a/editor/api.php +++ b/editor/api.php @@ -30,6 +30,9 @@ class Brizy_Editor_API { const AJAX_FORM_INTEGRATION_STATUS = 'brizy_form_integration_status'; const AJAX_SUBMIT_FORM = 'brizy_submit_form'; + const AJAX_UPDATE_MENU_DATA = 'brizy_update_menu_data'; + const AJAX_UPDATE_MENU_ITEM_DATA = 'brizy_update_menu_item_data'; + const AJAX_DOWNLOAD_MEDIA = 'brizy_download_media'; const AJAX_MEDIA_METAKEY = 'brizy_get_media_key'; @@ -108,6 +111,9 @@ private function initialize() { 'update_form_integration_status' ) ); add_action( 'wp_ajax_' . self::AJAX_DELETE_FORM, array( $this, 'delete_form' ) ); + + add_action( 'wp_ajax_' . self::AJAX_UPDATE_MENU_ITEM_DATA, array( $this, 'update_menu_item_data' ) ); + add_action( 'wp_ajax_' . self::AJAX_UPDATE_MENU_DATA, array( $this, 'update_menu_data' ) ); add_action( 'wp_ajax_' . self::AJAX_SET_FEATURED_IMAGE, array( $this, 'set_featured_image' ) ); add_action( 'wp_ajax_' . self::AJAX_SET_FEATURED_IMAGE_FOCAL_POINT, array( $this, @@ -121,6 +127,73 @@ private function initialize() { add_action( 'wp_ajax_nopriv_' . self::AJAX_SUBMIT_FORM, array( $this, 'submit_form' ) ); } + public function update_menu_item_data() { + if ( ! isset( $_POST['menuItemId'] ) || get_post_type( $_POST['menuItemId'] ) != 'nav_menu_item' ) { + $this->error( 400, 'Unknown menu item' ); + } + + $json_decode = json_decode( stripslashes( $_POST['menuItemData'] ) ); + + if ( ! isset( $_POST['menuItemData'] ) || is_null( $json_decode ) ) { + $this->error( 400, 'Bad request' ); + } + + $menuItems = get_posts( array( + 'meta_key' => 'brizy_post_uid', + 'meta_value' => $_POST['menuItemId'], + 'post_type' => 'nav_menu_item', + ) ); + + if ( count( $menuItems ) == 0 ) { + $this->error( 400, 'Unknown menu item' );; + } + + $menu = $menuItems[0]; + + update_post_meta( (int) $menu->ID, 'brizy_data', $json_decode ); + + $this->success( array() ); + } + + public function update_menu_data() { + if ( ! isset( $_POST['menuId'] ) ) { + $this->error( 400, 'Unknown menu' ); + } + + $json_decode = json_decode( stripslashes( $_POST['menuData'] ) ); + + if ( ! isset( $_POST['menuData'] ) || is_null( $json_decode ) ) { + $this->error( 400, 'Bad request' ); + } + + + $menu = get_terms( array( + 'taxonomy' => 'nav_menu', + 'hide_empty' => false, + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => 'brizy_uid', + 'value' => $_POST['menuId'], + 'compare' => '=' + ) + ) + ) ); + + + if ( isset( $menu[0] ) ) { + $menu = $menu[0]; + } else { + $this->error( 400, 'Unknown menu item' ); + } + update_term_meta( (int) $menu->term_id, 'brizy_data', $json_decode ); + + $this->success( array() ); + } + + + + public function set_featured_image() { $this->authorize(); @@ -170,6 +243,7 @@ public function remove_featured_image() { } + public function default_form() { try { diff --git a/editor/editor/editor.php b/editor/editor/editor.php index e595ecbaa5..de061aadfa 100755 --- a/editor/editor/editor.php +++ b/editor/editor/editor.php @@ -166,6 +166,8 @@ public function config() { 'setFeaturedImage' => Brizy_Editor_API::AJAX_SET_FEATURED_IMAGE, 'setFeaturedImageFocalPoint' => Brizy_Editor_API::AJAX_SET_FEATURED_IMAGE_FOCAL_POINT, 'removeFeaturedImage' => Brizy_Editor_API::AJAX_REMOVE_FEATURED_IMAGE, + 'updateMenuData' => Brizy_Editor_API::AJAX_UPDATE_MENU_DATA, + 'updateMenuItemData' => Brizy_Editor_API::AJAX_UPDATE_MENU_ITEM_DATA, ), 'plugins' => array( 'dummy' => true, @@ -184,6 +186,7 @@ public function config() { 'submitUrl' => add_query_arg( 'action', 'brizy_submit_form', set_url_scheme( admin_url( 'admin-ajax.php' ) ) ) ) ), + 'menuData' => $this->get_menu_data() ); return self::$config = apply_filters( 'brizy_editor_config', $config ); @@ -396,4 +399,97 @@ function addQueryStringToUrl( $link, $query ) { } + private function get_menu_data() { + $menus = wp_get_nav_menus(); + $menu_data = array(); + + foreach ( $menus as $menu ) { + + $custom_menu_data = get_term_meta( $menu->term_id, 'brizy_data', true ); + + $menu_uid = get_term_meta( $menu->term_id, 'brizy_uid', true ); + if ( ! $menu_uid ) { + $menu_uid = md5( $menu->term_id . time() ); + update_term_meta( $menu->term_id, 'brizy_uid', $menu_uid ); + } + + $amenu = array( + 'id' => $menu_uid, + 'name' => $menu->name, + 'items' => array() + ); + + $amenu = (object) array_merge( $amenu, get_object_vars( is_object( $custom_menu_data ) ? $custom_menu_data : (object) array() ) ); + + $menu_items = wp_get_nav_menu_items( $menu->term_id ); + + $menu_items = $this->get_menu_tree( $menu_items ); + + if ( count( $menu_items ) > 0 ) { + $amenu->items = $menu_items; + } + + $menu_data[] = $amenu; + } + + return $menu_data; + } + + private function get_menu_tree( $items, $parent = 0 ) { + $result_items = array(); + + foreach ( $items as $item ) { + if ( $item->menu_item_parent != $parent ) { + continue; + } + + $menu_uid = get_post_meta( $item->ID, 'brizy_post_uid', true ); + if ( ! $menu_uid ) { + $menu_uid = md5( $item->ID . time() ); + update_post_meta( $item->ID, 'brizy_post_uid', $menu_uid ); + } + + $megaMenuItems = $this->getMegaMenuItems(); + + $menu_data = get_post_meta( $item->ID, 'brizy_data', true ); + + $item_value = array( + 'id' => $menu_uid, + 'title' => $item->title, + 'url' => $item->url, + 'megaMenuItems' => $megaMenuItems + ); + + $an_item = (object) array( + 'type' => 'MenuItem', + ); + + $an_item->value = (object) array_merge( $item_value, get_object_vars( is_object( $menu_data ) ? $menu_data : (object) array() ) ); + + $child_items = $this->get_menu_tree( $items, $item->ID ); + + $an_item->value->items = array(); + + if ( count( $child_items ) > 0 ) { + $an_item->value->items = $child_items; + } + + $result_items[] = $an_item; + } + + return $result_items; + } + + /** + * @return array + */ + private function getMegaMenuItems() { + + return array( + (object) ( array( + 'type' => "SectionMegaMenu", + 'value' => (object) array( 'items' => array() ) + ) ) + ); + } }