2011-03-14 1 views
1

본문 내용 영역 내 페이지에서 PHP 코드를 사용하는 데 문제가 있습니다. 이 사이트, Drupal 사이트 및 기타 사이트 전반에 걸쳐 끊임없이 수색을 해본 결과, 답변이이 사이트의 어딘가에 있다면 사과드립니다. 그러나 찾을 수 없으며 도움이 필요합니다.본문 내용 영역 내에서 PHP 변수 사용

우리는 PHP 파일에 변수로 저장하려는 많은 정보를 사이트에서 재사용하고 있습니다. 우리 사이트에서이 작업을 수행하지만 Drupal을 사용하기 위해 전체 사이트를 다시 작성합니다. 예를 들어 소프트웨어를 판매하고 사이트의 다양한 '장바구니에 추가'버튼에 ​​대한 각 제품 URL에 대한 변수를 원합니다. 각 링크에 제품 URL을 하드 코딩하지 않고 모든 Drupal 페이지에서 호출 할 수있는 PHP 변수를 설정해야합니다.

아무 것도 작동하지 않습니다. 몇 가지 제안을 읽었지만 아무 것도 작동하지 않았습니다. 변수를 자체 블록으로 설정 한 다음 새 페이지를 만들 때 페이지 내에서 변수를 호출 해 보았습니다. 페이지의 변수를 반향시킬 수는 있지만 내부에있는 블록 내에서만 변수를 호출 할 수는 있지만 다른 블록이나 컨텐츠 영역에서 반향을 일으킬 수는 없습니다. global 키워드를 사용해 보았습니다 (하나의 추천에 따라). 그러나 그것은 저에게 효과적이지 않았습니다.

나는 이것이 의미가 있기를 바랍니다. 다른 정보? Drupal 6.x를 사용하고 있습니다. 페이지를 만들 때 PHP 코드가 활성화되어 있습니다. PHP 필터 모듈이 활성화되어 있습니다. PHP 코드를 렌더링하여 작동하는지 알 수 있으므로, 필요한 곳에서 작동하지 않습니다. 있다.

내가 말해야 할 것은 (이 글을 읽는 것만으로는 분명하지 않다!) 나는 Drupal 초보자 다. 그래서 누군가가 나를 도울 수 있고 그들의 제안을 가능한 한 분명하게 설명하려고한다면 정말 고맙다.

미리 감사드립니다.

편집 3/15/11

것은 내가 몇 가지 예제 코드를 게시 할 수 있습니다, 더 설명하려고합니다. 나는 아직 보여줄 것이별로 없기 때문에 나는 이것을하지 않았다. 그리고 나는 그것이 더 많은 것을 혼란스럽게 할 수도 있다고 생각했다.

그래서 저는 소프트웨어 체험판 다운로드를위한 Drupal '페이지'를 만들었습니다. 설정하려는 PHP 변수는 다운로드 링크를위한 것입니다. 미래에 다운로드 링크를 변경해야하는 경우 한 곳에서 설정해야하므로 한 곳에서 설정할 수 있습니다. 여러 사이트 페이지에 다운로드 링크가 있습니다. 우리의 '지금 구매'링크에 대해서도 마찬가지입니다. 다음은 페이지 코드입니다 :

<p>Try [product] free for 30 days.</p> 

<!--<p>[token_custom_ewintry]</p>--> 

<p><?php global $ewintry; ?><a href="<?php print $ewintry; ?>">Download for Windows PC</a></p> 

<p><?php global $emactry; ?><a href="<?php print $emactry; ?>">Download for Mac OS X</a></p> 

<p><?php global $ebbtry; ?><a href="<?php print $ebbtry; ?>">Download for BlackBerry</a></p> 


<?php 
$ebbtryprint = variable_get("ebbtry", "default"); 
print $ebbtryprint; 
?> 

<p><a href="<?php print $ewmtry; ?>">Download for Windows Mobile</a></p> 

<p><?php global $ipewlstorelink; ?>iPhone, iPad, iPod touch owners: <a href="<?php print $ipewlstorelink; ?>">Download [product] on the iTunes App Store</a>. You'll be able to create 10 cards for free to try [product] before you buy!</p> 

나는이 모든 것을 시험해 보았습니다. 절대로 작동하지 않는 글로벌 변수에 대한 호출이 표시됩니다. 나는 내가 만든 'content top'영역에 배치 된 커스텀 블록에 정의 된 전역 변수를 가지고있다. 나는 분명히 그 지역의 어떤 것도 내 페이지의 몸 내용에 실제로 접근 할 수 없다는 것을 알았다. 왜냐하면 그 전화는 결코 작동하지 않았기 때문이다.

토큰 모듈을 사용하여 어제 만든 사용자 지정 토큰이 있습니다. 그것은 작동하지 않지만 기본적으로 토큰이 본문 내용 영역에서 사용할 수있는 다른 게시물을 읽고 특별한 필터가 필요합니다. 아직 필터를 찾지 못해서이 솔루션이 제대로 작동하는지 확신 할 수 없습니다.

나는 variable_get을 호출했습니다. 자, 이것이 효과가있었습니다. 내 template.php 페이지 내에서 variable_set을 정의했습니다. 내 값은 내 코드 샘플에서 위의 인쇄 호출을 사용하여 인쇄합니다. 그러나 나는 오늘 아침이 페이지를 보았고 그것이 내가 필요한 대답이라고 생각하지 않는다. 이제는 아무 것도 인쇄하기 전에 모든 내 페이지에서 variable_get을 호출해야하기 때문입니다. 그리고 그것은 어디서나 전화를 걸기 위해 한 곳에서 모든 것을 설정해야하는 문제를 해결하지 못합니다. 내 custom 블록에 variable_get 호출을 넣으려고했지만 다시는 내 본문 내용 영역의 'content top'에 아무것도 액세스 할 수 없습니다.variable_get 호출은 'content top'에 값을 인쇄하지만 내용 영역에서는 그 값 아래에 다시 인쇄되지 않습니다.

어쩌면 그 코드가 도움이 될 것입니다. CCK에서 자세히 살펴 보겠습니다. 시도하지 않은 유일한 제안입니다. 누구든지 도울 수 있다면 미리 감사드립니다.

<?php 

// For some reason, this sometimes gives me problems 
$foo = 'test'; 

// So I do this instead, they are equivalent 
$GLOBALS['bar'] = 'test'; 

echo "<p>Global <br/> foo: $foo <br/> bar: $bar</p>"; 

function globalTest() { 
    global $foo; 

    echo "<p>globalTest() <br/> foo: $foo <br/> bar: $bar</p>"; 
} 

globalTest(); 

function globalBarTest() { 
    global $foo, $bar; 

    echo "<p>globalBarTest() <br/> foo: $foo <br/> bar: $bar</p>"; 
} 

globalBarTest(); 

?> 

행동 : http://jfcoder.com/test/globals.php

당신이 global variable을 설정 한 다음 함수/메소드 블록 내에서 사용하려는 경우

+1

코드 또는 적어도 일부 샘플을 게시해야합니다. –

+2

어쩌면 앱이 어떻게 결합되어 있는지 다시 생각해야 할 때가 있습니다. 리팩토링이라 불리우며 심하게해야합니다. PHP의 전역 변수는 http://blog.case.edu/gps10/2006/07/22/why_global_variables_in_php_is_bad_programming_practice의 나쁜 관행과 일치합니다. 어떤 경우에는 상수를 사용할 수 있습니다. 아마도 정적 클래스 변수가 더 나은 선택 일 수 있습니까? 진짜로 shure 아닙니다 그러나 당신이 Drupal가 그런 것을 취급하고 표준을 보존하기 위하여 "다만"교류에 "가는지 어떻게에 당신이 자기 자신다는 것을 심하게 필요로하는 것처럼 보인다. –

+0

Poelinca의 답변 외에도 PHP를 몸에 두는 것 (즉, 데이터베이스)은 실제로 나쁜 습관으로 간주됩니다. 드루팔 (Drupal)에서 매우 불행한 "특징"입니다. – berkes

답변

1

, 당신은 수입에 글로벌 키워드를 사용해야합니다 인쇄 : 난 항상 $ GLOBALS를 사용하여 전역 변수를 설정하는 습관을 찍었을

Global 
foo: test 
bar: test 

globalTest() 
foo: test 
bar: 

globalBarTest() 
foo: test 
bar: test 

, 나는 이런 식으로 일을 어떤 문제가되지 않습니다.

전역 범위 변수 설정은 실수로 코드의 다른 부분 (실수로 다른 사람이 겹쳐 쓸 수 있음)에 쉽게 적용될 수 있으므로 유해한 것으로 간주됩니다 (또는 적어도 불필요 함).

설명에 명시된 방법은 상당히 엉망으로 보입니다. 당신은 데이터베이스를 사용해야하고 파일을 편집하고 일부 링크와 데이터를 PHP 파일로 하드 코딩하는 대신 데이터 스토어에서 데이터를 구성, 설정 및 가져 오는 방법을 Drupal에 추상화시켜야합니다. 이것은 내가 공정한 것이 아닌 당신의 설명을 읽는 것을 생각하고 있습니다. 그러나 나는 그것을 언급 할 필요가 있다고 생각했습니다.

편집

드루팔, 당신은 이름으로 변수를 얻을 수 variable_get()를 사용하여 다음 variable_set()을 사용하여 기본/settings.php 페이지에서 전역 변수를 설정할 수 있습니다.

http://api.drupal.org/api/drupal/sites--default--default.settings.php/6

variable_set('foo','bar'); 

http://api.drupal.org/api/drupal/includes--theme.inc/function/template_preprocess/6

function yourtemplate_preprocess (&$variables) { 
    $vars['foo'] = variable_get('foo'); 
} 

EDIT 2

참고 variable_set() 함수의 source :

<?php 

function variable_set($name, $value) { 
    global $conf; 

    $serialized_value = serialize($value); 
    db_query("UPDATE {variable} SET value = '%s' WHERE name = '%s'", $serialized_value, $name); 
    if (!db_affected_rows()) { 
     @db_query("INSERT INTO {variable} (name, value) VALUES ('%s', '%s')", $name, $serialized_value); 
    } 

    cache_clear_all('variables', 'cache'); 

    $conf[$name] = $value; 
} 

?> 

편집

좋아, 여기에 당신이 할 수있는 것입니다 :

/drupal-root/htdocs/sites/settings.php

열고 settings.php 파일과에서를 다음

$GLOBALS['test1_variable'] = 'test 1 variable'; 

그리고 당신의 TEMPL에 : 바닥, 그래서 같이 $ GLOBALS 전역 변수를 사용하여 PHP 변수를 설정 (PHP 입력 형식을 선택한 상태에서) 입력 :

<?php 

echo "<p>This is my {$GLOBALS['test1_variable']}.</p>"; 

?> 

또는 ...

<p>This is my short tag <?=$GLOBALS['test1_variable'];?>.</p> 

그리고 템플릿 코드에서 페이지에 변수가 인쇄되어 있어야합니다. $ GLOBALS 변수를 둘러싼 중괄호에 주목하십시오.

+0

나는 '데이터베이스 사용하기'란 말에 대해 더 많은 정보를 얻고 싶습니다. 나는 우리의 새로운 사이트를 좀 더 '드루팔 (Drupal) 호환'방식으로 설정하여 기꺼이 말할 것입니다. 지금 당장은 PHP의 기본 PHP 사이트입니다. PHP 포함 파일을 사용하여 모든 사이트 페이지에서 전역 적으로 사용해야하는 변수를 저장하는 것입니다. DB에 이것을 저장하는 방법이 있고 Drupal에서 그 방법을 사용하면 나에게 링크 또는 자세한 정보를 제공 할 수 있습니까? – Julie

+0

찾고있는 컨셉은 컨텐트 유형입니다. 드루팔 (Drupal)에서는 열/행이있는 테이블을 만드는 것과 다소 비슷하지만 완전히 유사하지는 않습니다. 자세한 내용은 DrColossos의 답변을 참조하십시오. http://drupal.org/node/306792 –

+0

또한 글로벌, 함수, 메소드 등의 모든 범위에서 $ GLOBALS 변수를 설정할 수 있으며 해당 범위에서 사용할 수 있습니다. –

0

일부 노드와 관련된 추가 정보를 제공하려면 CCK을 사용하여 모든 추가 정보가있는 콘텐츠 형식을 만들어야합니다. 템플릿 안에 스타일을 지정하면 거의 모든 것을 보관할 수 있습니다.

CCK를 사용할 수없는 경우 (대부분의 경우 정확히 원하는 것입니다) _preprocess_ 함수를 구현해야합니다. 모양은 다음과 같습니다

이제 사용 가능한 페이지 템플릿 파일에 $my_custom_var이 있습니다.

Drupal의 template system에 익숙해 져야합니다 (아직 준비하지 않은 경우).

+0

답장을 보내 주셔서 감사합니다. preprocess_page 함수를 사용해 보았지만, page.tpl.php에서만 내 변수를 사용할 수있었습니다. 필요한 것은 사이트 자체의 본문 내용 영역 내에서 변수를 사용할 수있게하는 것입니다. 마찬가지로 새 페이지를 만들 때 클릭하고 본문 영역이 PHP 코드를 허용하도록 설정되었으므로 여기에 변수를 호출하고 싶습니다. 거기 preprocess_page 함수에서 그들을 설정 한 후 거기에 액세스 할 수있는 방법이 있습니까? 아마도 나는 그것을 잘못했다. 그 동안 CCK가 나를 위해이 문제를 해결할 수 있는지 살펴볼 것입니다. 지금까지 다른 권장 사항을 사용했습니다. – Julie

0

token_filter 모듈을 찾는 것처럼 들립니다. 내 문제는 아직 D7에 대한 준비가되어 있지 않다는 것입니다 (토큰 모듈에서).