상대 메뉴 링크는 어떻게 만듭니 까?


10

Drupal과 분리 된 일부 컨텐츠에 링크해야하는 로컬 호스트 사이트에서 작업 중입니다.

현재 메뉴 경로가 다음과 같이 설정되어 http://mylocalsite/the_folder_for_the_other_content있습니다. 내가 시도하는 경우 <front>/the_folder_for_the_other_content/the_folder_for_the_other_content또는 the_folder_for_the_other_content, I 오류 얻을 "경로 'whatever_I_use'을 하나 잘못되었거나 당신은에 액세스 할 수 없습니다."

내가 생방송을 할 때 분명히 모든 메뉴 항목이 필요합니다 http://myrealsite/the_folder_for_the_other_content.

라이브로 이동할 때 모든 메뉴 경로를 편집 할 필요가 없도록 설정하려면 어떻게해야합니까?


@irishbuzz는 아래 Drupal 6에 대한 해결 방법이 있지만 Drupal 7 에서이 작업을 피할 수 있기를 바랐습니다.
Martin Duys

Drupal은 웹 서버의 루트 디렉토리에 설치되어 있습니까?
kiamlaluno

내 로컬 호스트 버전이 아니라 마지막으로 공개되면 public_html 폴더의 루트에 있습니다. 이것이 '웹 서버의 루트'로 간주됩니까?
Martin Duys

"웹 서버의 루트 디렉토리"란 Apache에서 "DocumentRoot"지시문으로 설정되고 기본적으로 public_html 디렉토리 인 디렉토리를 의미합니다. 와 같은 URL을 사용하는 경우 Apache 액세스 디렉토리 http://example.com/입니다.
kiamlaluno

그렇다면 : 궁극적으로 사이트는 루트 디렉토리에있을 것입니다
Martin Duys

답변:


4

kiamlaluno의 답변은 저에게 효과적이지 않았습니다. % menu_tail을 사용하면 menu_tail_load 함수에 인수 누락과 관련하여 오류가 발생했습니다.

Warning: Missing argument 2 for menu_tail_load(), called in  ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).
Warning: Missing argument 3 for menu_tail_load(), called in ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).

나를 위해 일한 것은

function allow_menu_links_menu() {
  $items = array();
  $items['sites/d8/files/%'] = array(
    'title' => 'Folder Content',
    'page callback' => 'allow_menu_links_cb', /* never called */
    'access callback' => TRUE,
  );
  return $items;
}

그런 다음과 같은 경로가있는 메뉴 항목을 사용하여 sites / d8 / files 폴더 (및 하위 폴더)에 파일을 제공 할 수 있습니다 sites/d8/files/Documents/MyFile.pdf

메뉴 시스템은 다음과 같은 링크를 생성합니다 href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

사용자 정의 메뉴 모듈을 사용하지 않으면 메뉴 시스템은 위와 같이 시작하는 경로를 거부합니다.

와 같은 경로를 사용하려고 하면 사이트 루트에있을 때 작동 http:sites/d8/files/Documents/MyFile.pdf하지만과 같은 링크를 생성 href="http:sites/d8/files/Documents/MyFile.pdf"하지만 콘텐츠 페이지에있을 때는 브라우저가 콘텐츠 페이지를 기준으로 URL을 해석합니다. 작동하지 않습니다.

와 같은 경로를 사용하는 경우 http:/sites/d8/files/Documents/MyFile.pdf메뉴 시스템은이 경로 를 허용하지만 메뉴 시스템은와 같은 링크를 생성합니다 href="http:/sites/d8/files/Documents/MyFile.pdf". 브라우저 (적어도 Safari)는로 해석하고 href="http://sites/d8/files/Documents/MyFile.pdf""sites"라는 서버를 찾지 못했습니다.

(추가 조사에서 menu_tail을 사용하는 코드가 실패하는 이유는 http://api.drupal.org/api/drupal/includes--menu.inc/function 과 같이 '로드 인수'를 추가해야하기 때문입니다. / menu_tail_load / 7 추가합니다. 'load arguments' => array('%map', '%index'),kiamlaluno의 코드에서 $ 항목의 정의, 그것은 작동합니다 menu_tail_load가 명시 적 부하 인수가 필요할지 여부의 문제는 여기에서 논의된다. http://drupal.org/node/298561 )

(새 모듈을 활성화하는 것을 잊지 마십시오. 그렇지 않으면 메뉴 시스템이 새 링크를 허용하지 않습니다)


5

새로운 링크를 추가하면 링크에서 검증 menu_edit_item_validate () 를 호출, drupal_valid_path ()를 경로가 유효한지 확인하거나이 사용자로부터 액세스 할 수 있습니다.
drupal_valid_path()반환 TRUE하는 경우

  • 경로는 <front>( <front>/directory또는 이와 유사한 경로는 제외됨)
  • 경로는 외부 경로입니다 ( url_is_external () 함수 는을 반환합니다 TRUE)
  • 경로는 메뉴 콜백과 연결됩니다

절대 URL을 사용하는 것 외에도 유일한 해결책은 사용하려는 경로와 연관된 메뉴 콜백을 정의하는 사용자 정의 모듈을 사용하는 것입니다.
파일 또는 디렉토리를 가리키는 URL을 사용할 때 웹 서버는 Drupal을 호출하지 않고 해당 파일 또는 디렉토리를 표시해야합니다. Drupal과 함께 제공되는 .htaccess 파일에 다음 지시문이 포함되어 있기 때문에 Apache에서 발생합니다.

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

귀하의 경우, 사용자 정의 모듈에는 다음과 유사한 코드가 포함되어야합니다.

function mymodule_menu() {
  $items = array();

  $items['the_folder_for_the_other_content/%menu_tail'] = array(
    'title' => 'Folder content', 
    'page callback' => 'mymodule_view', 
    'access callback' => TRUE,
    'load arguments' => array('%map', '%index'), 
  );

  return $items;
}

메뉴 콜백을 호출해서는 안되므로 titlepage callback 값을 사용할 수 있습니다 . 액세스 콜백 의 가치는 모든 사용자가 해당 메뉴 콜백에 액세스 할 수 있다고 Drupal에 알려줍니다.

대안으로, "alias_for_directory / % menu_tail"와 관련된 메뉴 콜백을 정의하여 원하는 디렉토리로 사용자를 리디렉션 할 수 있습니다 ( drupal_goto () 사용 ). 서버가 .htaccess의 내용을 사용하지 않을 때이 솔루션을 사용하고 URL이 기존 파일이나 디렉토리를 가리키는 경우에도 Drupal을 호출합니다.


3

나를 위해 다음은 트릭을 수행했습니다 (드루팔 6).

같은 도메인의 다른 URL로 연결하고 싶습니다. Drupal이 실행 중이고 http://www.example.com링크가 필요 하다고 가정 해 보겠습니다.http://www.example.com/frontend

메뉴 항목에서 경로로 입력하십시오 :

http:/frontend

드루팔 메뉴는 다음과 연결됩니다 : http://www.example.com/frontend

https를 사용할 때 메뉴 항목의 경로 필드에 https : / frontend를 입력해야합니다.


만약 이것이 7 /
Martin Duys

몰라, 그냥 시도해보십시오.
Paul

버전 7.22 부터이 방법이 작동하지 않는 것으로 나타났습니다.
Rick

1
이것은 Drupal 7.23에서 작동합니다. 내가 당신을 +
vovote


1

메뉴 구조에서 링크를 대체하기 위해 sql을 사용했습니다.

UPDATE menu_links SET link_path = replace(link_path, "livesite.com", "localhost.com");

이 작업이 필요한지 확실하지 않지만 메뉴 캐시를 플러시했습니다.


왜 쿼리를 변경하고 싶습니까? 권장하지 않습니다.
gerl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.