2013-08-06 4 views
1

En essayant de nombreuses boucles imbriquées et des méthodes pour construire ce bloc JavaScript, j'ai besoin d'aide d'experts. Je parcoure tous les 'menuitems' et ceux avec menu_item_parent 0 sont les meilleurs parents, le reste je construis des niveaux inférieurs.caractères manquants construction d'un objet JavaScript Boucles PHP

Comment puis-je ajouter ces deux caractères manquants sur ces boucles?

Il manque une virgule

, 

après chaque

{'name' : '','url':'','subs':[ 
{'_id:':'1','title': '','img': ''} 
,{'_id:':'1','title': '','img': ''} 
]} 

Fonction

function make_menu_object(){ 
    $menu_name = 'sec_level'; 
    $menu = wp_get_nav_menu_object($menu_name); 
    $menuitems = wp_get_nav_menu_items($menu->term_id, array('order' => 'DESC')); 
    $objpart=null; 

    $menuitems_count = count($menuitems); 
    $master_counter = 0; 

    foreach($menuitems as $item){ 

     // get page id from using menu item object id 
     $id = get_post_meta($item->ID, '_menu_item_object_id', true); 
     // set up a page object to retrieve page data 
     $page = get_page($id); 
     $link = get_page_link($id); 
     // item does not have a parent so menu_item_parent equals 0 (false)  

     if ($item->menu_item_parent==0){ 
      if($master_counter<>0){$objpart.=']},';} 
      $objpart .= <<<EOT 

'$item->title' : { 
'url':'', 
'sections': [ 

EOT; 
     }else{ 

     $counter=1; 
     $the_star=1; 



     $objpart .= <<<EOT 
{'name' : '$item->title','url':'','subs': [ 

EOT; 
      $args = array('numberposts' => 4, 'offset'=> 0, 'post_type' => 'post', 'category' => $item->object_id); 
      $myposts = get_posts($args); 

      $the_count = count($myposts); 
      foreach($myposts as $post) {//subs output into js object 
       setup_postdata($post); 
       $the_empty_thumbnail = '/wp-content/uploads/2013/03/holder_img_menu.jpg'; 
       $the_thumbnail = get_the_post_thumbnail($post->ID, 'thumbnail'); 
       //$the_thumbnail_img = (!empty($the_thumbnail) ? the_post_thumbnail() : $the_empty_thumbnail); 
       $the_post_title = addslashes($post->post_title); 
       $objpart .= <<<EOT 
{'_id:':'1','title': '','img': ''} 

EOT; 
       if($counter<$the_count){$objpart .= ',';} 
        $counter++; 
       } 


      if($the_star==1||$the_star==$counter){$objpart .=']}';}else{$objpart .=',';} 
       $the_star++; 
     } 

     $master_counter++; 
    } 
$objpart .=']}'; 

return '<pre>'.$objpart.'</pre>'; 

} 

Courant de sortie

'Item 1' : {'url':'','sections': [ 
    {'name' : '','url':'','subs':[ 
     {'_id:':'1','title': '','img': ''} 
     ,{'_id:':'1','title': '','img': ''} 
     ]} 

    {'name' : '','url':'','subs': [ 
    {'_id:':'1','title': '','img': ''} 
    ,{'_id:':'1','title': '','img': ''} 
    ,{'_id:':'1','title': '','img': ''} 
    ,{'_id:':'1','title': '','img': ''} 
    ]} 

    ]}, 

    'Item 2' : { 
    'url':'', 
    'sections': [ 
    {'name' : '','url':'','subs': [ 
    {'_id:':'1','title': '','img': ''} 
    ]}]} 

désiré Sortie

'Item 1' : {'url':'','sections': [ 
    {'name' : '','url':'','subs':[ 
     {'_id:':'1','title': '','img': ''} 
     ,{'_id:':'1','title': '','img': ''} 
     ]} 
    , 
    {'name' : '','url':'','subs': [ 
    {'_id:':'1','title': '','img': ''} 
    ,{'_id:':'1','title': '','img': ''} 
    ,{'_id:':'1','title': '','img': ''} 
    ,{'_id:':'1','title': '','img': ''} 
    ]} 

    ]}, 

    'Item 2' : { 
    'url':'', 
    'sections': [ 
    {'name' : '','url':'','subs': [ 
    {'_id:':'1','title': '','img': ''} 
    ]}]} 
+2

La sortie souhaitée n'est pas un objet js. Vous devriez faire l'objet en php puis utiliser json_encode pour le convertir en objet js. – Musa

+2

Construire manuellement une chaîne JSON est une mauvaise idée. C'est lent, et il est sujet à l'erreur. Construisez votre objet en tant que tableau PHP, puis utilisez 'json_encode()' pour produire votre objet JSON. Votre code est trop complexe pour le recoder comme une réponse. Allez-y, et revenez avec une question si vous obtenez stuk. –

+0

@MikeW Je l'ai eu à travailler presque. Il me manque une virgule dans les sections du tableau. Mise à jour Question maintenant – Codex73

Répondre

1

Comme les commentaires à vos états de question, vous devez faire l'objet en PHP puis utilisez json_encode.

De même que mentionné dans les commentaires, c'est un code trop complexe pour le réécrire comme une réponse.

Mais pour vous diriger dans la bonne direction, un code de pseudo pour montrer comment construire l'objet PHP:

function make_menu_object() { 
    $itemsForJS = new array(); // Initialize an empty array to hold the menu items 

    // Code to retrieve the menu items 
    // ... 

    $currTopLevelNode = null; // Because output from WP is flat list, state is needed 

    foreach ($menuitems as $item) { 
     // Code to retrieve data about the menu item 
     // ... 

     if ($item->menu_item_parent==0) { 
      $currTopLevelNode = new stdClass; // Initialize an empty object 
      $currTopLevelNode->url = ''; // Or something more interesting... 
      $currTopLevelNode->sections = array(); // Empty holder for the sections to come 
      $itemsForJS[$item->title] = $currTopLevelNode; 
     } else { 
      $section = new stdClass; 
      $section->name = ''; // Or something more interesting 
      $section->url = ''; // Or maybe $item->url? 
      $section->subs = array(); // Empty array to hold data for the subs 

      // Code to retrieve post 
      // ... 

      foreach ($mypost as $post) { 
       $sub = new stdClass; // Empty object to hold data for the page 

       // Code to retrieve data about the post 
       // ... 

       $sub->id = '1'; // Or maybe $post->post_id? 
       $sub->title = ''; // Maybe $post->post_title? 
       $sub->url = ''; // Maybe $post->post_url? 

       $section->subs[] = $sub; // Adding the post to the section 
      } 

      $currTopLevelNode->sections[] = $section; // Adding the section to the item 
     } 
    } 
    return $itemsForJS; // This is an associative array, not string as in your code 
} 

Utilisez cette fonction similaire à:

$menuObject = make_menu_object(); 
echo '<pre>'.json_encode($menuObject).'</pre>'; 

Bien sûr, cela est pseudo code. Par exemple, il suppose que le premier $item reçu doit être de niveau supérieur - ou $currTopLevelNode sera nul et le code tombera en panne. Des vérifications d'erreurs sont nécessaires.

0
if ($item->menu_item_parent==0){ 
    $objpart .= "]}"; 
} 

ajouter ceci après la seconde si