ユーザログイン


DrupalのYUIMENUモジュールのWarning

error.JPG
error.JPG

夫です。
このサイトはDrupal(http://drupal.org/)を使用して作成しています。
DrupalオープンソースPHPで作成されたCMSフレームワークです。
DBにはMySQL,postgresqlのいずれでも動作可能です。
母体には基本的な機能のみがあり、モジュールというソフトウェアを追加することで、機能を拡充していくことができます。
そのモジュールの中に管理メニューを使いやすくする、YUIMENUモジュールというものがあります。
このYUIMENUモジュール(yuimenu-6.x-1.1-beta2.tar.gz)を追加したところ、イメージにあるような警告

warning: Invalid argument supplied for foreach() in /var/www/html/modules/yuimenu/yuimenu.module on line 355. 
warning: Invalid argument supplied for foreach() in /var/www/html/modules/yuimenu/yuimenu.module on line 232. 

が出てしまいました。
モジュールPHPで配布されているため、ある程度問題の原因を調査することが可能です。(その気になれば)

このエラーが出ている箇所を確認すると、

function script_menu($menu_id) {
  $menu = load_menu($menu_id);
  $i=0;
  foreach ($menu as $menu_item) {
    $mlid = $menu_item['link']['mlid'];
    if ($menu_item['link']['hidden'] == 0) {
      if ($menu_item['link']['has_children'] != 0)
      {
        $output .= 'this.getItem('. $i .').cfg.setProperty("submenu", oSubmenuData['.$i.']);'."\n";
      }
      $i++;
    }
  }
  return $output;
}

というところででていました。
もう1つのエラーもほぼ同じ内容です。この原因は$menuがNULLにもかかわらず、foreach処理で評価しようとしているために、実行時にWarningが出ています。
ですので、以下のように、あらかじめNULL評価をしてあげれば解消できます。

function script_menu($menu_id) {
  $menu = load_menu($menu_id);
  $i=0;
  if(isset($menu)==TRUE){
     foreach ($menu as $menu_item) {
        $mlid = $menu_item['link']['mlid'];
        if ($menu_item['link']['hidden'] == 0) {
          if ($menu_item['link']['has_children'] != 0){
             $output .= 'this.getItem('. $i .').cfg.setProperty("submenu", oSubmenuData['.$i.']);'."\n";
          }
          $i++;
        }
     }
  }
  return $output;
}

これで、Wariningが表示されなくなります。
その他の部分の修正まで含めたパッチを添付しておきます。

diff -urpN yuimenu/yuimenu.module yuimenu-new/yuimenu.module
--- yuimenu/yuimenu.module	2008-07-19 00:37:52.000000000 +0900
+++ yuimenu-new/yuimenu.module	2008-07-23 13:13:32.000000000 +0900
@@ -229,17 +229,17 @@ function script_menu($menu_id) {
   $menu = load_menu($menu_id);
   
   $i=0;
-  foreach ($menu as $menu_item) {
-    $mlid = $menu_item['link']['mlid'];
-    if ($menu_item['link']['hidden'] == 0) {
-      if ($menu_item['link']['has_children'] != 0)
-      {
-        $output .= 'this.getItem('. $i .').cfg.setProperty("submenu", oSubmenuData['.$i.']);'."\n";
-      }
-      $i++;
-    }
+  if(isset($menu)==TRUE){
+     foreach ($menu as $menu_item) {
+    	$mlid = $menu_item['link']['mlid'];
+    	if ($menu_item['link']['hidden'] == 0) {
+      	  if ($menu_item['link']['has_children'] != 0){
+             $output .= 'this.getItem('. $i .').cfg.setProperty("submenu", oSubmenuData['.$i.']);'."\n";
+          }
+      	  $i++;
+    	}
+     }
   }
-
   return $output;
 }
 
@@ -352,17 +352,18 @@ function create_menu($menu_id) {
 
   $menu = load_menu($menu_id);
   $j=1;
-  foreach ($menu as $menu_item) {
-    if ($menu_item['link']['hidden'] == 0)
-    {
-      $mlid = $menu_item['link']['mlid'];
-      $output .=	"\n{\n".'id: "' . rep_char($menu_item['link']['title']) . '",'."\nitemdata: [\n";
-      if ($menu_item['link']['has_children'] > 0) {
-        $output .= create_inner_menu($menu_item['link']['menu_name'].':'.$mlid); 
-      }
-      $output .=  ']}'.($j++ 0) {
+          $output .= create_inner_menu($menu_item['link']['menu_name'].':'.$mlid); 
+        }
+        $output .=  ']}'.($j++

すぐに直ると思いますが、念のためこのパッチを本家のモジュール管理サイトのほうにも投稿しておきました。
人気ブログランキングへ

この記事をはてなブックマーク: