ฉันจะเรียกฟังก์ชัน menu_rebuild ใน Drupal 7 ได้อย่างไร


13

ฉันต้องการเรียกใช้ฟังก์ชัน menu_rebuild ()แต่ฉันไม่แน่ใจว่าวางโค้ดไว้ตรงไหน

ฉันไม่พบไฟล์update.phpที่ใดก็ได้ในอินสแตนซ์ในพื้นที่ของฉัน

เหตุผลที่ฉันต้องการลองทำเช่นนี้คือฉันลบโหนดทั้งหมด แต่พวกเขายังคงปรากฏภายใต้โครงสร้างเมนู


คุณต้องการสร้างเมนู Drupal ใหม่หลังจากอัพเดตหรืออะไร
Aboodred1

update.php จะอยู่ในโฟลเดอร์รากของ drupal เช่น/var/www/htdocs/drupalและการแก้ไขมันเป็นความคิดที่ไม่ดี คุณช่วยเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับสาเหตุที่คุณต้องการโทรหาเมนู
GoodSp33d

Aboodred1 ใช่ฉันต้องการสร้างเมนู drupal ใหม่หลังจากลบโหนดทั้งหมด 2-Stroker, drupal.stackexchange.com/questions/58606/…
12804

@ user12804, คุณแน่ใจหรือว่าเป็นเมนูที่เกี่ยวข้องกับโหนด ถ้าเป็นเช่นนั้นฉันตอบแล้วในคำถามอื่น
Sithu

คำตอบ:


5

สร้างไฟล์ที่มีเนื้อหาต่อไปนี้และเพียงแค่วางในไดเรกทอรีรูทของ Drupal menu-rebuild.phpสมมติว่า เรียกใช้งานhttp://example.com/menu-rebuild.php

<?php
error_reporting(E_ALL);
define('DRUPAL_ROOT', getcwd());
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

menu_rebuild();

การเรียกใช้สิ่งนี้ง่ายขึ้นโดยใช้ Devel
mbomb007

15

Drupal 7

หากคุณกำลังใช้ drush คุณสามารถเรียกใช้:

drush eval 'menu_rebuild();'

หากไม่สามารถใช้งานได้โปรดดู: วิธีสร้างเมนูใหม่เมื่อมีข้อผิดพลาดร้ายแรงของ PHP

Drupal 6

drush php-eval 'drupal_rebuild_theme_registry()'

memcached

หากคุณกำลังใช้ memcached คุณจะต้องเริ่มต้นใหม่

บน Linux: /etc/init.d/memcached restart

บน OS X (หากใช้ Homebrew): brew services restart memcached


ออกเสียงลงคะแนนขึ้นสำหรับคำสั่ง drush ที่ถูกต้องที่จะทำ easely แต่คุณแน่นอนควรเพิ่มว่าในบางกรณีที่คุณต้องการที่จะว่างตารางฐานข้อมูลที่สอดคล้องกันก่อนเช่นที่กล่าวถึงข้างต้นโดย @Valk
nilsun

11

เปิดสคีมาฐานข้อมูลจากนั้นลบเนื้อหาทั้งหมดของตาราง menu_links และ menu_router ด้วยแบบสอบถาม SQL ต่อไปนี้:

DELETE FROM menu_links;
DELETE FROM menu_router;

จากนั้นเรียกhttp://example.com/update.php มันจะเรียก menu_rebuild () ซึ่งจะเติมข้อมูลในตารางเหล่านี้ด้วยข้อมูล 'สด' มันใช้งานได้สำหรับฉันหลังจาก "ข้อผิดพลาดร้ายแรงของ PHP: หน่วยความจำไม่พอ" เปลี่ยนเมนูของฉันให้เป็นระเบียบ

แต่ระวังว่ามันจะล้างเมนูที่คุณกำหนดเองทั้งหมดซึ่งคุณจะต้องสร้างใหม่ด้วยตนเอง เพื่อหลีกเลี่ยงมันคุณอาจเล่นนิดหน่อยด้วยการลบบางรายการที่เลือกไว้จาก menu_router และ menu_links แต่สำหรับฉันแล้วมันไม่ได้ผล

และอย่าลืมสำรองฐานข้อมูลและไดเรกทอรีไซต์ของคุณก่อนที่จะลบเนื้อหาออกจากตาราง


2
ลงทะเบียนเพื่อรับข้อมูลเพิ่มเติมที่จำเป็นซึ่งบางครั้งคุณจำเป็นต้องล้างข้อมูลในตารางฐานข้อมูลที่เกี่ยวข้องก่อนเมนู สิ่งนี้ได้รับการยืนยันจากประสบการณ์ระยะยาวที่นี่ ...
nilsun

3

สองวิธีที่แตกต่าง:

  1. โทรmenu_rebuild()จากhook_update_N
  2. แก้ไขและบันทึกฟอร์มการตั้งค่าเมนูจากผู้ดูแลระบบ Drupal
  3. จากบรรทัดคำสั่งด้วย drush: drush cc menu

ขอขอบคุณ. ฉันสามารถทำสิ่งนี้โดยไม่ดื่มได้หรือไม่?
user12804

ใช่วิธีการ 3 ข้อใด ๆ ข้างต้นจะทำงานได้ด้วยตัวเอง
David Thomas

เรื่องแก้ไขและบันทึกลิงก์เมนูจากผู้ดูแลระบบ Drupal ใช้งานไม่ได้ลองไปแล้วสองสามครั้ง ...
user12804

ใช่นั่นมีไว้สำหรับหน้าการตั้งค่าเมนู นอกจากนี้คุณยังสามารถโทรmenu_cache_clear_all()เพื่อสร้างแคชเมนูใหม่ได้
David Thomas

2

การไปadmin/config/development/performanceและคลิกที่ปุ่ม "ล้างแคชทั้งหมด" จะทำให้เมนูถูกสร้างขึ้นมาใหม่รวมถึงล้างเทมเพลตบล็อกหน้า ฯลฯ แคช


ขอบคุณ Penten ฉันลองมาหลายครั้งแล้ว แต่ก็ไม่มีโชค โหนดที่ถูกลบยังคงปรากฏในโครงสร้างเมนูการนำทาง :(
user12804

2

ทางเลือกคือการตั้งค่าตัวแปร:

variable_set('menu_rebuild_needed', TRUE);

สิ่งนี้จะทริกเกอร์ menu_rebuild();


0

ในการแก้ไขเมนูผู้ดูแลระบบให้ใช้ใน SQL และสังเกตว่าตามที่ Valk ระบุไว้ข้างต้นมันจะลบการปรับแต่งทั้งหมดออกจากเมนูการจัดการการบริหารของคุณ หลังจากที่คุณเรียกใช้แล้วล้างแคชของคุณและเมนูการจัดการจะถูกสร้างขึ้นใหม่เพื่อการตั้งค่าเริ่มต้น

นี่คือแบบสอบถาม SQL:

DELETE FROM menu_links WHERE menu_name='management' 

เมื่อต้องการสร้างเมนูใหม่ส่วนใหญ่จะต้องใช้เมื่อมีบางสิ่งผิดปกติและ Drupal ไม่สามารถแก้ไขได้ตรงกลาง นั่นเป็นเหตุผลที่ฉันอยากจะแนะนำวิธี Valks เพราะการรีเซ็ตที่สมบูรณ์นั้นเป็นคำตอบที่ดีกว่าสำหรับคำถามดังกล่าวหากไม่มีการให้รายละเอียดเพิ่มเติมสิ่งที่เสีย
nilsun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.