プログラムでフロントページを設定する方法は?


22

実行時にプログラムでDrupalフロントページを設定したい。
これどうやってするの?これは可能ですか?

回答:


22

variable_set()そのために使用できます。

variable_set('site_frontpage', $value);

18
これは正しいことですが、あまり頻繁に実行したり、使用アクションに基づいて実行したりする必要はありません。variable_set()呼び出しは、常に「cache_clear_all( 'variables'、 'cache_bootstrap');」になります。そのため、次のリクエストでは、データベースから変数とブートストラップ情報を再取得する必要があります。
ベルディール

1
@Berdir-これはサイトのパフォーマンスに何らかの形で影響しますか?
Ekコスモス

7
はい、パフォーマンスに影響します。cache_bootstrapには、フック実装など、時間の経過とともに再構築される複数のキャッシュが含まれます。別の解決策は、ビュー、パネル、またはカスタムモジュールを使用して、フロントページにコンテンツを動的に表示することです。たとえば、コンテンツタイプの最新のノードを表示するビューを構築し、それをsite_frontpageにポイントできます。
ベルディール

hook_installまたはでこれを使用hook_update_Nすることは問題ありません。
レイマンクス

16

匿名ユーザーと認証済みユーザーに異なるフロントページを設定できるモジュール(Frontpage、私が保守しているもの)があります。このモジュールにより、サードパーティのモジュールは、ユーザーがリダイレクトされるページを変更したり、ページのレンダリングに使用される構造体配列を変更したりできます。サードパーティモジュールは、匿名または認証のフロントページが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

非常に柔軟なソリューションは、Panelsを使用することです。さまざまな表示を任意の基準に基づいて表示でき、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
こんにちは。コードを共有してくれてありがとう。あなたのコードがどのようにそれを修正するかを私たちに教えてくれればもっといいでしょう。コピーペーストされたコードが何らかの理由で機能しない場合、他の人が従うことができます。
モウォ14年

@molot -カスタムモジュール、実装に追加する必要があり、この方法hook_page_alter、および使用drupal_is_front_page使用して、リダイレクトのユーザーにdrupal_goto(このケースでする$ user-> uidが0であってはならない)、いくつかの条件に基づいて、
commonpike

@commonpikeそれは私がそれを理解していないということではありません。私のコメントは、全体として回答の品質に関するものであり、特に、経験の浅い新規ユーザーの使いやすさに関するものでした。
モウォ

1

ルールモジュールは、「プログラム的」フロントページを設定するためにも使用することができます。

実際に作成されるルールは、ルールまたはphpコードを使用して、ログイン(認証済み)ユーザーを別のフロントページにリダイレクトする際の回答のバリエーションです

また、オプションでFlagモジュールと組み合わせると、ユーザーエクスペリエンスがさらに向上する可能性があります。たとえば、ログインしているユーザーが、どのフロントページを「お気に入り」と見なすかを示します。



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.