7.x 버전대

에러 메시지 대응책 - 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

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

각설하고 개발자가 아닌 운영자의 입장에서는 소스 고치기는 번거롭다.
(사실 소스의 어디에 저런 문제되는 부분이 있는가도 찾기 어렵다. 자세히 보기 »

구글 애드센스 블럭이 공백으로 보일 경우

Google의 AdSense를 드루팔 사이트에 적용하는 방법은 여럿 있지만,
드루지기가 가장 선호하는 방법은 블럭을 이용하는 것이다.
(유명한 모듈인 AdSense Injection은 기능초과에 복잡하다는 느낌)

그런데 어느 날 새로운 드루팔 사이트를 만들고
평소와 다름 없이 블럭에 애드센스 광고 태그를 삽입했는데...
보이지 않았다. 한참을 있어도 공백 상태로 안보였다. 간혹 에러 메시지도 나타났다.

며칠 동안 끙끙대다 찾은 해결책은 아주 간단한 것이었다.
[본문 입력 필터를 Full HTML이 아닌 PHP Filter로 설정]해 주었더니 괜찮아졌다.
보안상 좋지는 않지만... 예전에 종종 겪었을 문제인듯 한데 까먹었던 모양이다.

팁이라고 부르기도 쑥스럽지만,
행여 드루지기처럼 이런 간단한 망각으로 인해 며칠 간 고생하는 분을 위해 메모한다.

드루팔 cron.php을 익명(Anonymous) 아닌 특정 권한으로 실행하는 방법

드루팔 cron.php을 익명(Anonymous) 아닌 특정 권한으로 실행하는 방법을 소개한다.
참고 : http://drupal.org/node/479948#comment-1673488

아래 쉘스크립트로 실행하면 된다.
*** 부분들만 적절하게 상황에 맞추어 수정할 것.

#!/bin/sh

site=http://***yoursite***/
name=***someusername***
pass=***someverysecurepassword***

cookies=/tmp/cron-cookies.txt

wget -O /dev/null --save-cookies /tmp/site-cookies.txt --keep-session-cookies --load-cookies $cookies "${site}user"
wget --keep-session-cookies --save-cookies $cookies --load-cookies $cookies -O /dev/null --post-data="name=$name&pass=$pass&op=Log%20in&form_id=user_login" "${site}user"
wget --keep-session-cookies --save-cookies $cookies --load-cookies $cookies "${site}cron.php"

드루지기는 문제없이 잘 적용됐는데, 위 참고출처에서는 "Invalid Null Command"이라는 에러를 만난 경우도 있는 것 같다.

View를 이용해서 로그인 유저의 컨텐츠만 보여주는 방법들, 1대1 게시물 기능

View를 이용해서 로그인 유저의 컨텐츠만 보여주는 방법들은,
여러가지가 있으나 제일 보편적인 방법은 view arguments 이용하는 것이다.

예를 들어 uid가 99인 사용자가 로그인했을 때 그 사용자가 지금껏
작성한 컨텐츠 목록만을 특정 뷰로 보여줄 경우, (아래는 중요한 팁이다)

해당 view의 편집 > Arguments > Action to take if argument is not present:
항목의 Provide default argument > User ID from logged in user
항목을 선택해 주고 Path를 abcd라고 지정해 주자.

다음부터 /abcd라는 URL에 접근하면 해당 사이트의 로그인 유저가 작성한
목록만을 담은 뷰가 보인다.
예를 들어 uid 99 인 사용자가 로그인하면 본인이 작성한 글만 뷰에 나타난다.

중요한 것은 이 경우 브라우저의 URL에는 유저의 ID가 노출이 안된다는 점이다.
예를 들어 /abcd/99라고 하지 않고 /abcd만 해도 UID 99 유저가 작성한 글만 뷰에 나타난다.

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

이 외에도 private모듈이나 view_own모듈을 이용해서 본인의 글만 보이도록 하는
기능이 있으나 특정 모듈에 종속되니 뷰 보다는 자유도가 다소 떨어진다.

위 팁은 아래 주소에서 참고했다.
http://views-help.doc.logrus.com/help/views/example-author-block
http://drupal.org/node/54455 자세히 보기 »

SQL 쿼리를 이용한 드루팔 컨텐츠의 갯수를 확인할 때

참고 - http://api.drupal.org/api/function/db_result/6

Count rows in a table using db_result:

$countrows = db_result(db_query("SELECT count(*) FROM {my_table}"));

드루팔 API인 db_result 함수를 이용하면 count(1) 등이 손쉽게 얻어진다.

사용법이 너무나도 당연한 팁이지만,
간혹 다른 함수를 사용해서 갯수를 세려고 하면 애를 먹을 수도 있기에 메모한다.

Computed Fields를 이용해서 프로그래밍이 가능한 동적 CCK 구현하기

Computed Fields를 이용해서 프로그래밍이 가능한 동적 CCK 구현하기

이 모듈은 쓸모가 많고 중요하다. http://drupal.org/project/computed_field

- PHP와 드루팔의 컨텐츠 필드개념을 잘 모른다면 사용하기 까다로울 수 있다.
- 드루팔 6.x 뿐만 아니라 7.x대로 지원하는 모듈이다. 각각의 사용법이 조금씩 다르다.

------ 7.x 기준의 설명 ------

예를 들어, 한 컨텐츠 타입의 attch2nd라는 필드가 있는데 aliasofattach라는 필드에서는 이를 변형해서 출력하는 예제를 준비해 보았다. (주의 : attach2nd였는데 미스 스펠로 인해 a가 빠짐)

컨텐츠 타입의 aliasofattach 필드 설정에서,
Computed Code (PHP)에는

// debuggging // $entity_field[0]['value'] = $entity->field_attch2nd;
$arrfield_for_another = array_pop( array_pop( $entity->field_attch2nd ) );
$entity_field[0]['value'] = $arrfield_for_another['origname'];

Display Code (PHP)에는

// 랜덤 확인용 // $display_output = 'dis'.rand(100000, 999999);
 자세히 보기 »

CCK 필드를 이용하면 컨텐츠 내 블록을 표시하기 편하다 - 중요 팁

CCK 필드를 이용하면 컨텐츠 내 블록을 표시하기 편하다 - 중요 팁 ***

아, 왜 지금까지 이걸 깨닫지 못했는지 참으로 멍청했다.
이 팁은 다음과 같은 경우에 유용하다. 자세히 보기 »

드루팔 사이트 내 검색 관련 중요 모듈들

드루팔 사이트 검색도 구글 등을 이용하면 충분히 좋지만,
로그인 등 인증이 필요한 곳은 드루팔 자체의 검색을 이용하기 마련이다.

사이트내 검색 관련해서 중요 모듈들 몇 가지를 소개한다.

1. http://drupal.org/project/search_type
Adds a type selector to search blocks to limit searches by content type or to search users. The selector appears only for users with the "use advanced search" permission.

2. http://drupal.org/project/search_block
Restricted Search is a module which lets administrators exclude individual nodes or entire content types from the search system.

3. http://drupal.org/project/search_config
This module started out as a simple means of configuring the display of the advance search form. A few features have been added since thanks to the contributions of others.

그 외 다수 있으나 나중에 추가하겠다. 자세히 보기 »

드루팔에서의 리다이렉트 Redirect 구현 방법들

리다이렉트를 구현하려면, 모듈들을 이용하는 방법과 기타 방법들이 있다.

1. Redirect 관련 모듈들

버전 7용 추가) http://drupal.org/project/redirect
- 설치/활성화 후 admin/config/search/redirect/ 에 설정화면이 있다.

버전 6,7용 둘 다 존재하는 모듈)
http://drupal.org/project/globalredirect

http://drupal.org/project/path_redirect
- 단점 : Locale 모듈과 동시 사용시 /ko /ja /en ... 등이 자동으로 붙어 비실용적.

http://drupal.org/project/taxonomy_redirect

http://drupal.org/project/pathologic

위 모듈들은 인터페이스를 찾기와 사용하기 다소 어려운 편이다.

2. 심볼릭 링크를 이용해서 (404 에러 등을 방지하면서) 유도하는 방법이 있다.

하지만 이 방법을 이용하면, 외부의 틀린 링크를 수정할 기회를 놓친다.

3. 제일 확실한 방법은 드루팔 최상단에 있는 .htaccess를 수정하는 방법일 게다.

.htacess 기존 :
# Rewrite current-style URLs of the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f 자세히 보기 »

Drupal을 이용한 분산 DB간 PDB 개발 패턴 (JOIN 관련)

Drupal을 이용한 분산 DB간 PDB 개발 패턴

아래 주소를 참고해서 공부해야 합니다!
http://drupal.org/node/235062#comment-1222751

아주 중요하고 특이한 기술인데요.

물리적으로 분산된 Table을 어떻게든 연결, 조인해야 하는 경우에...
의외로 관련 기술 안내가 부족합니다. 참고해 보시길.

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

추가) 이와 관련된 기사들을 링크 메모합니다.

bs0048님 기록해 주신 링크
http://drupal.org/node/310075

위 Database abstraction layer와 관련된 다른 링크
https://api.drupal.org/api/drupal/developer%21topics%21forms_api_referen...

Tables part 1: Joins
http://drupal.org/node/99564

hook_views_data(): Can I create a view with the results of an INNER JOIN?
http://drupal.org/node/414086

nodereference
http://groups.drupal.org/taxonomy/term/1956

내용묶음