วิธีการตั้งโปรแกรมหน้าแรกโดยทางโปรแกรม


22

ฉันต้องการตั้งค่าหน้าแรก Drupal โดยทางโปรแกรมในเวลาทำงาน
ฉันจะทำสิ่งนี้ได้อย่างไร เป็นไปได้ไหม

คำตอบ:


22

คุณสามารถใช้variable_set()สำหรับการที่

variable_set('site_frontpage', $value);

18
สิ่งนี้ถูกต้อง แต่ไม่ใช่สิ่งที่ควรทำบ่อยเกินไปหรือขึ้นอยู่กับการใช้งาน การเรียก variable_set () จะให้ผลลัพธ์ใน "cache_clear_all ('ตัวแปร', 'cache_bootstrap') เสมอ" ดังนั้นการร้องขอครั้งต่อไปจะต้องดึงตัวแปรและข้อมูล bootstrap จากฐานข้อมูลอีกครั้ง
Berdir

1
@Berdir - สิ่งนี้มีผลกับประสิทธิภาพของเว็บไซต์หรือไม่
Ek Kosmos

7
ใช่มันจะส่งผลกระทบต่อประสิทธิภาพการทำงาน cache_bootstrap มีแคชจำนวนมากที่จะถูกสร้างขึ้นใหม่เมื่อเวลาผ่านไปตัวอย่างเช่นการใช้เบ็ด โซลูชันทางเลือกคือใช้ Views, Panels หรือโมดูลที่กำหนดเองเพื่อแสดงเนื้อหาแบบไดนามิกในหน้าแรก ตัวอย่างเช่นคุณสามารถสร้างมุมมองเพื่อแสดงโหนดล่าสุดของประเภทเนื้อหาแล้วชี้ไปที่ site_frontpage
Berdir

ใช้สิ่งนี้ในhook_installหรือhook_update_Nจากนั้นควรจะดี
leymannx

16

มีโมดูล ( Frontpageซึ่งเป็นโมดูลที่ฉันรักษาไว้) ที่อนุญาตให้ตั้งค่าหน้าแรกที่แตกต่างกันสำหรับผู้ใช้ที่ไม่ระบุชื่อและผู้ใช้ที่ได้รับการรับรองความถูกต้อง โมดูลอนุญาตให้โมดูลบุคคลที่สามเปลี่ยนหน้าเว็บที่ผู้ใช้เปลี่ยนเส้นทางแทนหรือเปลี่ยนอาร์เรย์โครงสร้างที่ใช้แสดงหน้าเว็บ โมดูลบุคคลที่สามได้รับอนุญาตให้เปลี่ยน URL การเปลี่ยนเส้นทางเฉพาะเมื่อไม่ได้ตั้งค่าหน้าแรกสำหรับแบบไม่ระบุชื่อหรือรับรองความถูกต้องภายในโมดูล Frontpage หรือเมื่อมีข้อผิดพลาดระหว่างการโหลดโหนด อาจมีการเปลี่ยนแปลงโมดูลในอนาคตเพื่ออนุญาตให้โมดูลบุคคลที่สามเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าที่เฉพาะเจาะจงที่พวกเขาเลือก

คุณสามารถสร้างโมดูลที่กำหนดเองได้โดยใช้รหัสที่คล้ายกับโมดูลที่ใช้โดย 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 "programatically"

จริงกฎที่จะสร้างขึ้นจะเป็นรูปแบบของคำตอบที่ได้เปลี่ยนเส้นทางเข้าสู่ระบบ (รับรองความถูกต้อง) ผู้ใช้ไปยัง FrontPage ที่แตกต่างกันโดยใช้กฎหรือโค้ด

และเลือกที่จะรวมกับธงโมดูลอาจอาจส่งเสริมประสบการณ์ของผู้ใช้ เช่นสำหรับผู้ใช้ที่ล็อกอินเพื่อระบุว่าหน้าไหนที่เป็นไปได้ที่พวกเขาคิดว่าเป็น "รายการโปรด"


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.