diff --git a/editor/api.php b/editor/api.php index 05b03cbd54..5d345ac44f 100755 --- a/editor/api.php +++ b/editor/api.php @@ -27,6 +27,8 @@ class Brizy_Editor_API { const AJAX_DELETE_FORM = 'brizy_delete_form'; 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'; @@ -100,6 +102,8 @@ private function initialize() { 'update_form_integrations_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' ) ); } @@ -107,6 +111,40 @@ 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' ); + } + + update_post_meta( (int) $_POST['menuItemId'], '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' ); + } + + update_term_meta( (int) $_POST['menuId'], 'brizy_data', $json_decode ); + + $this->success( array() ); + } + + + public function default_form() { try { diff --git a/editor/editor/editor.php b/editor/editor/editor.php index d29397a6c1..0367585688 100755 --- a/editor/editor/editor.php +++ b/editor/editor/editor.php @@ -115,29 +115,32 @@ public function config() { 'pageAttachments' => array( 'images' => $this->get_page_attachments() ), 'templates' => $templates, 'api' => array( - 'hash' => wp_create_nonce( Brizy_Editor_API::nonce ), - 'url' => set_url_scheme( admin_url( 'admin-ajax.php' ) ), - 'globals' => array( + 'hash' => wp_create_nonce( Brizy_Editor_API::nonce ), + 'url' => set_url_scheme( admin_url( 'admin-ajax.php' ) ), + 'globals' => array( 'set' => Brizy_Editor_API::AJAX_SET_GLOBALS, 'get' => Brizy_Editor_API::AJAX_GET_GLOBALS, ), - 'media' => Brizy_Editor_API::AJAX_MEDIA, - 'ping' => Brizy_Editor_API::AJAX_PING, - 'getPage' => Brizy_Editor_API::AJAX_GET, - 'updatePage' => Brizy_Editor_API::AJAX_UPDATE, - 'getSidebars' => Brizy_Editor_API::AJAX_SIDEBARS, - 'buildContent' => Brizy_Editor_API::AJAX_BUILD, - 'sidebarContent' => Brizy_Editor_API::AJAX_SIDEBAR_CONTENT, - 'shortcodeContent' => Brizy_Editor_API::AJAX_SHORTCODE_CONTENT, - 'shortcodeList' => Brizy_Editor_API::AJAX_SHORTCODE_LIST, - 'getTemplates' => Brizy_Editor_API::AJAX_GET_TEMPLATES, - 'getInternalLinks' => Brizy_Editor_API::AJAX_GET_INTERNAL_LINKS, - 'getMenus' => Brizy_Editor_API::AJAX_GET_MENU_LIST, - 'updatePost' => Brizy_Editor_API::AJAX_SAVE_TRIGGER, - 'savePage' => Brizy_Editor_API::AJAX_SAVE_TRIGGER, - 'getTerms' => Brizy_Editor_API::AJAX_GET_TERMS, - 'downloadMedia' => Brizy_Editor_API::AJAX_DOWNLOAD_MEDIA, - 'getMediaUid' => Brizy_Editor_API::AJAX_MEDIA_METAKEY, + 'media' => Brizy_Editor_API::AJAX_MEDIA, + 'ping' => Brizy_Editor_API::AJAX_PING, + 'getPage' => Brizy_Editor_API::AJAX_GET, + 'updatePage' => Brizy_Editor_API::AJAX_UPDATE, + 'getSidebars' => Brizy_Editor_API::AJAX_SIDEBARS, + 'buildContent' => Brizy_Editor_API::AJAX_BUILD, + 'sidebarContent' => Brizy_Editor_API::AJAX_SIDEBAR_CONTENT, + 'shortcodeContent' => Brizy_Editor_API::AJAX_SHORTCODE_CONTENT, + 'shortcodeList' => Brizy_Editor_API::AJAX_SHORTCODE_LIST, + 'getTemplates' => Brizy_Editor_API::AJAX_GET_TEMPLATES, + 'getInternalLinks' => Brizy_Editor_API::AJAX_GET_INTERNAL_LINKS, + 'getMenus' => Brizy_Editor_API::AJAX_GET_MENU_LIST, + 'updatePost' => Brizy_Editor_API::AJAX_SAVE_TRIGGER, + 'savePage' => Brizy_Editor_API::AJAX_SAVE_TRIGGER, + 'getTerms' => Brizy_Editor_API::AJAX_GET_TERMS, + 'downloadMedia' => Brizy_Editor_API::AJAX_DOWNLOAD_MEDIA, + 'getMediaUid' => Brizy_Editor_API::AJAX_MEDIA_METAKEY, + 'updateMenuData' => Brizy_Editor_API::AJAX_UPDATE_MENU_DATA, + 'updateMenuItemData' => Brizy_Editor_API::AJAX_UPDATE_MENU_ITEM_DATA, + ), 'plugins' => array( 'dummy' => true, @@ -154,7 +157,8 @@ public function config() { 'wpApiUrl' => set_url_scheme( admin_url( 'admin-ajax.php' ) ), 'submitUrl' => set_url_scheme( admin_url( 'admin-ajax.php' ) ) . "?action=brizy_submit_form" ) - ) + ), + 'menuData' => $this->get_menu_data() ); return apply_filters( 'brizy_editor_config', $config ); @@ -198,4 +202,83 @@ private function get_woocomerce_plugin_info() { return null; } + + 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 ); + + $amenu = array( + 'id' => $menu->term_id, + 'name' => $menu->name, + ); + + $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; + } + + $megaMenuItems = $this->getMegaMenuItems(); + + $menu_data = get_post_meta( $item->ID, 'brizy_data', true ); + + $item_value = array( + 'id' => $item->ID, + '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 ); + + if ( count( $child_items ) > 0 ) { + $an_item->value->items = $child_items; + } + + $result_items[] = $an_item; + } + + return $result_items; + } + + /** + * @return array + */ + private function getMegaMenuItems() { + + return [ + (object) ( array( + 'type' => "SectionMegaMenu", + 'value' => (object) array( 'items' => array() ) + ) ) + ]; + } }