โมดูลเป็นรายการเมนู


11

ฉันต้องการแทรกโมดูลการค้นหาเป็นรายการเมนู (โมดูลเมนูเริ่มต้น)

ฉันต้องการผลลัพธ์นี้:

<ul>
    <li>menu item</li>
    <li>menu item</li>
    <li>SEARCH MODULE</li>
    <li>menu item</li>
    ...
</ul>

ความคิดแรกของฉันคือการทำซ้ำโมดูลเมนูเริ่มต้นสองครั้ง:

  1. หนึ่งรายการเพื่อแสดงรายการเมนูก่อนโมดูลการค้นหาที่ไม่มี</ul>แท็กปิด
  2. อีกรายการหนึ่งเพื่อแสดงรายการเมนูหลังจากโมดูลการค้นหาที่ไม่มี<ul>แท็กเปิด

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

  • 3 ตำแหน่งโมดูลสำหรับเมนู
  • 2 เมนูที่แตกต่างกันในการจัดการเมนู

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

ฉันจะเพิ่มโมดูลเป็นรายการเมนูในเมนูเริ่มต้นได้อย่างไร


คุณสามารถใช้สองเมนูที่แตกต่างกัน + หนึ่งการค้นหาด้วยเทคนิค CSS บางอย่าง แต่ถ้าคุณต้องการโครงสร้างด้านบนแน่นอนคุณอาจพิจารณาjQueryฟังก์ชั่นที่ชอบappend()หรือใช้prepend()ไม่ได้กับเบราว์เซอร์ที่ปิดใช้งานจาวาสคริปต์
Farahmand

ฉันค่อนข้างจะไม่ใช้ jQuery เพื่อย้ายองค์ประกอบไปรอบ ๆ และใช้เทคนิคที่ฉันอธิบายไว้ในคำถามหากไม่มีวิธีที่ดีกว่า ...
web-tiki

1
ฉันสงสัยว่าคุณจะต้องใช้ส่วนขยายเมนู mega หรือระบบประเภทข้อมูลโค้ดที่จะโหลดโมดูลลงในรายการแบบหล่นลงโดยดึงมันด้วยรหัสตัวอย่าง ตัวอย่างที่ไม่ใช่หมายเลขรวมกับโมดูลที่ไม่ใช่หมายเลข ระบบเมนูหุ้นไม่ได้ถูกสร้างขึ้นสำหรับสิ่งนี้ ฉันหมายความว่าฉันคิดว่ามันเป็นไปได้ที่จะแทนที่เมนูเอาท์พุท แต่ข้อเสียเปรียบก็คือคุณมีเมนูที่กำหนดเองอย่างสมบูรณ์แทนที่จะใช้เพียงแค่ปลั๊กอินเสริมที่อัปเกรดได้
Brian Peat

ค่อนข้างแน่ใจว่าถูกต้องแล้ว คุณต้องการแทนที่เมนูและเขียนฟังก์ชันใหม่หรือคุณต้องใช้บุคคลที่สาม NoNumber จะเป็นตัวเลือกบุคคลที่สามที่มีป่องน้อยที่สุดของคุณ
Faye

ตอนนี้คุณสร้างลิงก์ไปยังโมดูลได้อย่างไร คุณมีลิงค์ที่ใช้งานได้ไปที่เมนูหรือไม่?
David Fritsch

คำตอบ:


4

นี่เป็นอีกทางเลือกหนึ่งในการโหลดโมดูลค้นหาในเมนูของคุณ ต้องใช้สองขั้นตอนง่ายๆ:

1. แทนที่mod_menuโมดูลของคุณ

  • \templates\YOURTEMPLATE\html\mod_menu\default_url.phpสร้างแทนที่ในโฟลเดอร์แม่แบบของคุณ
  • คัดลอกเนื้อหาต่อไปนี้ไปยังไฟล์:

default_url.php

 <?php
 /**
 * @package     Joomla.Site
 * @subpackage  mod_menu
 *
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights   reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Note. It is important to remove spaces between elements.
$class = $item->anchor_css ? 'class="' . $item->anchor_css . '" ' : '';
$title = $item->anchor_title ? 'title="' . $item->anchor_title . '" ' : '';

if ($item->menu_image)
    {
        $item->params->get('menu_text', 1) ?
        $linktype = '<img src="' . $item->menu_image . '" alt="' . $item->title . '"   /><span class="image-title">' . $item->title . '</span> ' :
        $linktype = '<img src="' . $item->menu_image . '" alt="' . $item->title . '"  />';
 }
 else
 {
    $linktype = $item->title;
 }

 $flink = $item->flink;
$flink = JFilterOutput::ampReplace(htmlspecialchars($flink));
if ($linktype == "CustomSearchBox"){
    $document   = &JFactory::getDocument();
    $renderer   = $document->loadRenderer('modules');
    $options    = array('style' => 'xhtml');
    $position   = 'CustomSearchBox';
    echo $renderer->render($position, $options, null);
}
else {

switch ($item->browserNav) :
    default:
    case 0:
?><a <?php echo $class; ?>href="<?php echo $flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
    case 1:
        // _blank
?><a <?php echo $class; ?>href="<?php echo $flink; ?>" target="_blank" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
    case 2:
        // window.open
        $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,'.$params->get('window_open');
            ?><a <?php echo $class; ?>href="<?php echo $flink; ?>" onclick="window.open(this.href,'targetWindow','<?php echo $options;?>');return false;" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
endswitch;
}

ฉันได้เพิ่มif-elseคำแถลงเริ่มต้นที่บรรทัดที่ 29 ซึ่งตรวจสอบว่าชื่อรายการเมนูเป็น "CustomSearchBox" หากเป็นเช่นนั้นโหลดโมดูลตำแหน่ง "CustomSearchBox" หากไม่ใช่รายการเมนูปกติจะถูกส่งคืน คุณสามารถเปลี่ยน "CustomSearchBox" เป็นอะไรก็ได้ที่คุณชอบ แต่ถ้าคุณจำไว้ว่าให้ใช้ค่าเดียวกันในขั้นตอนต่อไปนี้

2. สร้างโมดูลการค้นหาใหม่

สร้างโมดูลการค้นหาและตั้งค่าพารามิเตอร์ตามต้องการ (ฉันแนะนำให้ซ่อนชื่อโมดูล)

เผยแพร่โมดูลไปยังตำแหน่งที่กำหนดเอง "CustomSearchBox"

3. สร้างรายการเมนูใหม่

รายการเมนูสามารถเป็นประเภทใดก็ได้ฉันขอแนะนำ "URL ภายนอก" และชื่อต้องเป็น "CustomSearchBox"

บันทึกรายการเมนูของคุณและรายการเมนูทั้งหมดจะถูกแทนที่ด้วยช่องค้นหา!

แจ้งให้เราทราบหากมีบางสิ่งไม่ชัดเจน


ขอบคุณสำหรับคำตอบ ฉันลองใช้เทคนิคของคุณกับตำแหน่งโมดูลที่ฉันมีอยู่แล้วในเทมเพลต (โลโก้) แต่ดูเหมือนว่าจะไม่ทำงาน ฉันควรลองสร้างตำแหน่ง "CustomSearchBox" ในแม่แบบของฉันและใช้ตำแหน่งนั้นหรือไม่
web-tiki

ใช่คุณควรสร้างตำแหน่งที่กำหนดเอง "CustomSearchBox" และใช้งาน หรือคุณสามารถเปลี่ยนได้ในโค้ดข้างต้นที่นี่: $linktype == "CustomSearchBox"และนี่$position = 'CustomSearchBox';
มิทรี Rekun

คุณไม่จำเป็นต้องสร้างตำแหน่ง (ในไฟล์ index.php หรือ template.xml) เพียงเขียนCustomSearchBoxในฟิลด์ตำแหน่งโมดูลและกด Enter
johanpw

ตกลงฉันมีเวลาที่จะได้รับผ่านนี้ฉันต้องปรับแต่งรหัสของคุณเพื่อให้ทำงานได้ 1 / ด้วยเหตุผลบางอย่างมันไม่ได้หวือหวาเพราะฉันใช้และรูปภาพในรายการเมนู 2 / ผมเปลี่ยนสาย 30 $document = JFactory::getDocument();จากรหัสของคุณ ตอนนี้มันใช้งานได้ แต่ฉันจะต้องหาวิธีเพิ่มภาพของฉันอีกครั้ง
web-tiki

เพิ่มเติมอีกเล็กน้อย: ฉันใช้คำสั่ง if บนคลาสไอเท็มเมนูCSSแทนชื่อไอเท็มเมนูและเพิ่ม$linktypeในฟังก์ชัน echo รหัสที่มองเห็นได้ที่นี่: phpad.org/1645824385 ขอบคุณที่ชี้นำฉันไปในทิศทางที่ถูกต้องนี่คือสิ่งที่ฉันต้องการบรรลุบางเวลาตอนนี้มันยอดเยี่ยม! :)
web-tiki

1

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

มาโคร

 [searchfield][/searchfield]

HTML

<form action="index.php" method="post" class="form-inline" _lpchecked="1">
 <input name="searchword" id="mod-search-searchword" maxlength="20" class="inputbox search-query" type="text" size="20" value="Search..." onblur="if (this.value=='') this.value='Search...';" onfocus="if (this.value=='Search...') this.value='';">       
 <input type="hidden" name="task" value="search">
 <input type="hidden" name="option" value="com_search">
 <input type="hidden" name="Itemid" value="101">

บันทึกและปิด

ตอนนี้สร้างรายการเมนูสำหรับช่องค้นหา (ฉันแนะนำExternal URLเป็นประเภท แต่ประเภทรายการเมนูใด ๆ ที่จะทำ) และในฟิลด์ชื่อเพิ่ม[searchfield][/searchfield]:

ค้นหาในเมนู

RokCandy จะแทนที่ชื่อด้วยรหัสในมาโครและคุณจะได้รับช่องค้นหาในเมนู:

ผลลัพธ์

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