lang ?? LanguageHelper::default_slug();
$menu_data = json_decode($menu_details_from_db->content);
$this->page_id = 1;
if (count((array)$menu_data) > 0){
foreach ($menu_data as $menu_item){
$this->page_id++;
$output .= $this->render_menu_item($menu_item,$this->page_id,$default_lang);
}
}
return $output;
}
private function get_attribute_string(array $li_attributes):string
{
if (empty($li_attributes)){return '';}
$attr_val = '';
foreach ($li_attributes as $attr => $value){
//fix class append issue
if (!empty($value) && $attr != 'class'){
$attr_val .= $attr.'="'.$value.'"';
}elseif($attr === 'class'){
if (!is_array($value)){
$attr_val .= $attr.'="'.$value.'"';
}else{
$class_attr = 'class="';
foreach ($value as $cl){
$class_attr .= ' '.$cl.' ';
}
$class_attr .= '"';
$attr_val = $class_attr;
}
}
}
return $attr_val;
}
private function render_li_start(string $title, array $attributes_string,$default_lang)
{
$output = "\n\t".'
get_attribute_string($attributes_string).'> '."\n";
return $output;
}
private function render_menu_item($menu_item, int $page_id, $default_lang)
{
$attributes_string = property_exists($menu_item,'children') ? ['class' => ['menu-item-has-children']] : [];
if (empty((array)$menu_item)){return;}
$menu_item = (object) $menu_item ;
$ptype = property_exists($menu_item,'ptype') ? $menu_item->ptype : '';
$pname = property_exists($menu_item,'pname') ? $menu_item->pname : '';
$output = '';
if ($ptype === 'custom'){
//check to activation class
if (request()->path() === $menu_item->purl){
if (isset($attributes_string['class'])){
$attributes_string[] = ['class' => ['current-menu-item']];
}else{
$attributes_string['class'][] = 'current-menu-item';
}
}
$output .= $this->render_li_start($pname,$attributes_string,$default_lang);
$title = $pname;
$output .= $this->get_anchor_markup($title,[
'href' => str_replace('@url',url('/'),$menu_item->purl),
'target' => $menu_item->antarget ?? '',
],$menu_item->icon ?? '');
}elseif ($ptype === 'static'){
$menu_slug = get_static_option(str_replace('-','_',$menu_item->pslug).'_page_slug');
if (request()->path() == $menu_slug){
if (isset($attributes_string['class'])){
$attributes_string['class'][] = 'current-menu-item';
}else{
$attributes_string['class'] = ['current-menu-item'];
}
}
$page_name = MenuBuilderSetup::multilang() ? '_page_'.$default_lang.'_name' : '_page_name';
$title = get_static_option(str_replace('-','_',$menu_item->pslug).$page_name) ?? '';
$output .= $this->render_li_start($pname,$attributes_string,$default_lang);
// get anchor data
$output .= $this->get_anchor_markup($title,[
'href' => url('/').'/'. $menu_slug ?? '' ,
'target' => $menu_item->antarget ?? '',
],$menu_item->icon ?? '');
}else{
//check is mega menu
preg_match('/MegaMenus/',$ptype,$matches);
if (!empty($matches[0])){
$li_attributes = ['class' => 'menu-item-has-mega-menu'];
$class_name = '\\'.$ptype;
$instance = new $class_name();
if ($instance->enable()){
$static_name = str_replace('[lang]',$default_lang,$instance->name());
$title = htmlspecialchars(strip_tags(get_static_option($static_name)));
$output .= $this->render_li_start($title,$li_attributes,$default_lang);
// get anchor data
$output .= $this->get_anchor_markup($title,[
'href' => url('/').'/'.get_static_option($instance->slug()) ?? '#' ,
'target' => $menu_item->antarget ?? '',
],$menu_item->icon ?? '');
$output .= $instance->render($menu_item->items_id ?? '',$default_lang,[
'sort' => $menu_item->mega_menu_order ?? '',
'sort_by' => $menu_item->mega_menu_orderby ?? '',
'category_status' => $menu_item->category_status ?? ''
]);
}
}else {
$menu_setup_instance = new MenuBuilderSetup();
$all_dynamic_menus = $menu_setup_instance->register_dynamic_menus();
$dynamic_menu_type = $all_dynamic_menus[$ptype] ?? null;
if ($dynamic_menu_type){
//load dynamic page item
$model_name = '\\'.$dynamic_menu_type['model'];
$model = new $model_name();
if ($dynamic_menu_type['query'] === 'old_lang'){
$item_details = $model->where(['lang' => $default_lang])->where(['id' => $menu_item->pid,'status' => 'publish'])->first();
}elseif($dynamic_menu_type['query'] === 'new_lang'){
$item_details = $model->with(['lang_query' => function($query) use ($default_lang){
$query->where('lang' , $default_lang);
}])->where(['id' => $menu_item->pid,'status' => 'publish'])->first();
}else{
$item_details = $model->where(['id' => $menu_item->pid,'status' => 'publish'])->first();
}
if (empty($item_details)){
return;
}
$title_param = $dynamic_menu_type['title_param'];
if ($dynamic_menu_type['query'] === 'old_lang'){
$title = $item_details->$title_param ?? '';
}elseif($dynamic_menu_type['query'] === 'new_lang'){
$title = $item_details->lang_query->$title_param ?? '';
}else{
$title = $item_details->$title_param ?? '';
}
if (request()->routeIs($dynamic_menu_type['route'])){
if (isset($attributes_string['class'])){
$attributes_string['class'][] = 'current-menu-item';
}else{
$attributes_string['class'] = ['current-menu-item'];
}
}
$output .= $this->render_li_start($title,$attributes_string,$default_lang);
// get anchor data
$route_params = [];
$route_params_list= $dynamic_menu_type['route_params'] ?? [];
foreach ($route_params_list as $param){
if ($dynamic_menu_type['query'] === 'old_lang'){
$dynamic_param = $item_details->$param ?? '';
}elseif($dynamic_menu_type['query'] === 'new_lang'){
$dynamic_param = $item_details->lang_query->$param ?? '';
}else{
$dynamic_param = $item_details->$param ?? '';
}
if (preg_match('/id/',$param)){
$route_params['id'] = $dynamic_param;
}else{
$route_params[$param] = $dynamic_param;
}
}
$output .= $this->get_anchor_markup($title,[
'href' => route($dynamic_menu_type['route'],$route_params),
'target' => $menu_item->antarget ?? '',
],$menu_item->icon ?? '');
}
}
}
//check it has children
if (property_exists($menu_item,'children')){
$output .= $this->render_children_item($menu_item->children,$default_lang);
}
$output .= '';
return $output;
}
protected function render_children_item($menu_item,$default_lang){
if (empty((array)$menu_item)){return;}
$output= '';
$output .= ''."\n";
return $output;
}
private function get_anchor_markup(string $title,array $args, $icon = null)
{
$icon_markup = $icon ? "" : '';
return "\t\t".'get_attribute_string($args).'>'.$icon_markup.htmlspecialchars(strip_tags($title)).''."\n";
}
}