프로그래밍 방식으로 프론트 페이지를 설정하는 방법은 무엇입니까?


22

Drupal 첫 페이지를 프로그래밍 방식으로 런타임에 설정하고 싶습니다.
어떻게해야합니까? 이것이 가능한가?

답변:


22

사용할 수 있습니다 variable_set().

variable_set('site_frontpage', $value);

18
이것은 정확하지만 너무 자주 또는 사용 조치를 기반으로 수행해야하는 것은 아닙니다. variable_set () 호출은 항상 "cache_clear_all ( 'variables', 'cache_bootstrap');" 따라서 다음 요청은 데이터베이스에서 변수와 부트 스트랩 정보를 다시 가져와야합니다.
Berdir

1
@ Berdir-이것은 어떻게 사이트 성능에 영향을 줍니까?
Ek Kosmos

7
예, 성능에 영향을 미치며, cache_bootstrap에는 후크 구현과 같이 시간이 지남에 따라 다시 빌드되는 여러 캐시가 포함됩니다. 대안 솔루션은보기, 패널 또는 사용자 정의 모듈을 사용하여 프론트 페이지에 컨텐츠를 동적으로 표시하는 것입니다. 예를 들어, 컨텐츠 유형의 최신 노드를 표시하는보기를 빌드 한 다음 site_frontpage를 가리킬 수 있습니다.
Berdir

hook_install또는 hook_update_N다음에 이것을 사용하는 것이 좋습니다.
leymannx

16

익명 사용자와 인증 된 사용자에 대해 다른 프론트 페이지를 설정할 수 있는 모듈 ( Frontpage , 내가 유지 관리 하는 모듈 )이 있습니다. 이 모듈을 사용하면 타사 모듈이 사용자가 대신 리디렉션되는 페이지를 변경하거나 페이지를 렌더링하는 데 사용되는 구조 배열을 변경할 수 있습니다. 타사 모듈은 익명 또는 인증 된 프론트 페이지가 프론트 페이지 모듈 내에 설정되지 않았거나 노드로드 중 오류가있는 경우에만 경로 재 지정 URL을 변경할 수 있습니다. 나중에 타사 모듈이 사용자를 선택한 특정 페이지로 리디렉션 할 수 있도록 모듈이 변경 될 수 있습니다.

또는 Frontpage에서 사용하는 것과 유사한 코드를 사용하여 특정 기준에 따라 사용자를 특정 페이지로 리디렉션하는 사용자 지정 모듈을 만들 수 있습니다.

모듈은 hook_menu ()를 구현 하고 메뉴 콜백을 http://example.com/frontpage ; 해당 메뉴 항목의 페이지 콜백은 단순히 조건이 확인되었는지 확인한 다음 사용자를 특정 URL로 리디렉션해야합니다.

코드 스켈레톤은 다음과 유사 할 수 있습니다.

/**
 * Implements hook_menu().
 */
function mymodule_menu() {
  $items = array();

  $items['frontpage'] = array(
    'page callback' => 'mymodule_frontpage_view',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function mymodule_frontpage_view() {
  // These variables can be useful to redirect the users
  // to specific pages, basing on the language currently set for
  // the content, or on the fact the user is logged in.
  $langcode = $GLOBALS['language_content']->language;
  $logged_in = user_is_logged_in();

  if ($condition) {
    drupal_goto($redirect);
  }
}

9

매우 유연한 솔루션은 패널 을 사용하는 것 입니다. 기준에 따라 다른 디스플레이를 제공 할 수 있으며 UI를 통해 제어됩니다.


4

나는 이렇게 고쳤다.

/**
 * Implements hook_page_alter.
 * @param type $page
 */
function my_module_page_alter(&$page){
  global $user;

  $is_fron_page = drupal_is_front_page();
  if($is_fron_page && $user->uid){
    $redirect = 'users/'.$user->name.'/my-argument';
    drupal_goto($redirect);
  }
}

1
안녕하세요. 코드를 공유하게되어 기쁩니다. 코드가 정확히 어떻게 수정되는지 알려 주면 더 좋을 것입니다. 어떤 이유로 복사 붙여 넣은 코드가 작동하지 않으면 다른 사람들이 따를 수있는 추론이 있습니다.
Mołot

@molot-이 메소드는 사용자 정의 모듈에 추가되어야하고 hook_page_alter, 어떤 조건에 따라를 drupal_is_front_page사용하여 사용자를 리디렉션 하고 사용 하는 사용자를 리디렉션하는 데 사용 됩니다 drupal_goto(이 경우 $ user-> uid는 0이 아니어야 함)
commonpike

@commonpike 이해하지 못하는 것이 아닙니다. 내 의견은 전체적으로 답변의 품질에 관한 것이 었으며 특히 경험이없는 신규 사용자의 유용성에 관한 것입니다.
Mołot

1

규칙 모듈은 "프로그래밍 방식"에서 FrontPage를 설정하는 데 사용할 수 있습니다.

실제로 생성 되는 규칙은 rules 또는 php code를 사용하여 로그인 한 (인증 된) 사용자를 다른 첫 페이지리디렉션 하는 답변의 변형입니다 .

선택적으로이를 플래그 모듈 과 결합 하면 사용자 경험을 더욱 향상시킬 수 있습니다. 예를 들어, 로그인 한 사용자가 "선호"로 간주하는 가능한 첫 페이지를 표시합니다.


1

프로그래밍 방식으로 전역 적으로 설정하려는 경우 settings.php에서 변수를 설정할 수 있습니다.

$conf['site_frontpage'] = 'some/custom/path';

0

hook_url_outbound_alter () 에서 변수를 설정하여 하위 도메인의 홈페이지 노드를 변경했습니다.

variable_set('site_frontpage', $value);

그리고 리디렉션 :

$_GET['q'] = 'node/' . $domain_homepage_node_id;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.