에러 메시지 대응책 - warning: Invalid argument supplied for foreach() in *****/includes/menu.inc on line 258

타이틀이 좀 긴 편이다. 본문도 길다(마음이 급한 분은 마지막의 -결론-을 볼 것).

warning: Invalid argument supplied for foreach() in *****/includes/menu.inc on line 258
에러가 드루팔 사이트에 나타난다면 긴장하는 것이 좋다.

위 에러는 대체로 버전업이나 특정 모듈을 활성화했을 때 나타날 수 있는데,
기술적으로 말하면 원인은 배열로 리턴해야 하는 값을 그렇지 않게 한 경우이다.

일부 소스의 버그라고도 할 수 있고, 디비에 정보가 없는 경우에도
나타날 수 있으므로 소스의 버그라고 부르기 어려울 수도 있다.
하지만 되도록이면 (드루팔 모듈 개발자라면) 아래의 내용을 숙지하자.

'access arguments'가 들어가는 코딩을 한다면 반드시 배열화하는 것을 잊지 말자.

looks like hook_menu --> 'access arguments' is expecting an array...

replace this
'access arguments' => 'edit your mom',

with this:
'access arguments' => array('edit your mom')

* 참고 : http://drupal.org/node/272821#comment-2069112

-------------

각설하고 개발자가 아닌 운영자의 입장에서는 소스 고치기는 번거롭다.
(사실 소스의 어디에 저런 문제되는 부분이 있는가도 찾기 어렵다.
이런 경우에는 http://drupal.org/node/239476#comment-1088723
를 참고하여 소스 검색을 원할하게 할 수 있지만, 기술자 레벨의 일이다.)

소스를 수정하지 않고 해결하려면 디비의 값을 정비하는 것이다.
그런게 이게 만만찮다. 그래서 긴장하라고 한 것인데...

드루팔 본부? 사이트의 검색에는 너무 많은 사례가 있어 선택하기 어렵다.
특효약은 아주 강공책인데, 운영자가 하기에는 다소 어렵거나 위험할 수도 있다.
가능하면 아래 해결책은 기술자와 함께 처리하기를 바란다.
* 최소한 디비 수정권한(특히 블럭)이 관리화면 이외에도 가능하다면 편하다.

------------- 결론 -------------

http://aprium.co/content/error-menuinc-line-258
위 주소에서 특효약인 해결책을 얻었다. 아래는 다소 변형된 방법이다.
블럭에 menu_rebuild()라는 드루팔 함수를 일시적으로 삽입,
디비를 재정비하는 것이다. 물론 단지 1회만 실행하는 것이 정석이다.

1. 블럭을 수정할 수 있는 상황을 관리화면 이외에도 준비하면 좋겠다.
    (이는 옵션이다. 나중에 관리화면 권한이 없어질 경우를 대비함이다.)
    기술적으로 말하자면 드루팔 디비를 콘솔이나 툴 베이스로 건드릴 수 있는 상황이다.

2. 블럭 모듈과 PHP 모듈을 활성화 한다.
    PHP 모듈은 보안상 활성화하지 않는 것이 좋으므로, 이번 해결을 위해 일시적으로 활성화하자. 문제를 해결하면 다시 모듈을 비활성화 시키자.

3. 하나의 블럭을 골라 편집에 들어가자.
    입력 형식을 Full HTML나 Filted HTML로 하지말고 PHP 형태로 설정하자.

4. 블럭의 본문에 아래 구문을 넣어라.
    <?php
    menu_rebuild
();
   
?>

5. 블럭을 저장하고,  다른 브라우저나 탭을 띄워! 해당 사이트를 다시 로딩한다.

6. 에러가 사라졌는지 확인이 됐으면 3번 과정을 다시 한다.
    입력형식을 원래대로 돌리고, 4번 과정에서 넣었던 PHP 구문도 제거한다. 

Your rating: None 평균 : 5 (1 vote)