आइटम को URL से कैसे प्राप्त करें और इसे JRoute में कैसे भेजें


14

मेरे पास कस्टम घटक में विशिष्ट दृश्य के लिए एक मेनू आइटम है। इस मेनू आइटम से जुड़ा हुआ मेरे पास एक और Template Styleचयनित है, न कि मानक टेम्पलेट। मेनू के माध्यम से दृश्य तक पहुंचना अच्छी तरह से काम करता है, क्योंकि यह यूआरएल के साथ संलग्न है Itemid

अब मैं लिंक करना चाहता हूं, JRoute का उपयोग करके, एक दूसरे के साथ एक दृश्य, हालांकि JRoute वांछित URL उत्पन्न नहीं कर रहा है।

echo JRoute::_('index.php?option=com_example&view=reporting');

/index.php?option=com_example&view=reporting

JRoute आइटम को URL पर नहीं भेजेंगे, जिससे मेनू आइटम के लिए चयनित टेम्पलेट शैली काम न करे।

क्या आइटमिड को "गणना" करने ( jos_menuस्तंभ पर तालिका में एक क्वेरी करने के अलावा link) और इसे जूटआउट में संलग्न करने का एक तरीका है?


यदि यू को आइटम की तुलना में पता है, तो रिपोर्टिंग और आइटम = 123। मैं इस प्रक्रिया को सलाह नहीं देता क्योंकि आपके कस्टम घटक को यह स्वचालित रूप से करना चाहिए अगर यह पहले से ही प्रकाशित है।
डैन

जवाबों:


20

यहां एक तकनीक है जिसका मैंने उपयोग किया (यह याद नहीं कर सकता कि मुझे यह कहां मिला)।

$app = JFactory::getApplication(); 
$menu = $app->getMenu();
$menuItem = $menu->getItems( 'link', 'index.php?option=com_example&view=reporting', true );
echo JRoute::_('index.php?Itemid='.$menuItem->id);

इसने मेरे लिए अद्भुत काम किया है।


4

JRoute से आउटपुट इस पर निर्भर करेगा कि आप इसे क्या खिलाते हैं।

JRoute::_("index.php?option=com_content&view=article&id=10"); 

के अलावा कुछ और वापस कर सकते हैं

JRoute::_("index.php?option=com_content&view=article&id=10&catid=5"); 

वास्तव में यदि आपके पास catid = 5 के लिए एक मेनू आइटम श्रेणी ब्लॉग सूची है, तो बाद वाला आपको मेनू-url दे सकता है (मैंने इस सटीक url का परीक्षण नहीं किया है)। अलग-अलग परिणाम प्राप्त करने के लिए अलग-अलग गेट-मापदंडों के साथ प्रयास करें (कभी-कभी बहुत गलत, जैसे @Fedik ने कहा)


3

यहां कुंजी आपके घटकों को स्थापित करने के लिए है। रूटर फ़ाइल (जो सामने के छोर पर आपके घटक के रूट फ़ोल्डर में पाया जाना चाहिए) तर्क के साथ खोज करेगा और उचित मेनू आइटम का चयन करेगा। मुझे यह स्वचालित रूप से होता हुआ देखना अच्छा लगेगा, लेकिन जहां तक ​​मुझे पता है कि ऐसा नहीं है।

संभवतः कोड के इस ब्लॉक को कुछ प्रकार के सहायक फ़ंक्शन में काम करना सबसे अच्छा होगा जो सामग्री के लिए स्वचालित रूप से सबसे अच्छा मेनू आइटम खोजने के लिए उपयोग किया जा सकता है।

यहाँ वह कोड है जिसे मैंने अपने कस्टम घटकों में से कई में उपयोग किया है ताकि मुझे सबसे अच्छा मेनू आइटम मिल सके:

// I use this first empty array to avoid having unset properties in my query
$base_array = array('Itemid'=>'', 'option'=>'', 'view'=>'', 'layout'=>'', 'id'=>'');

$app =& JFactory::getApplication();
$menu       = $app->getMenu();
$active = $menu->getActive();

// hack to protect the actual current item as well as the search module or other places that use JRoute::_('index.php');
if (count($query)==2 && isset($query['option']) && isset($query['Itemid']) && $query['option'] && $query['Itemid']) {
    return $segments;
}

// start with no match found
$match = false;
$match_level = 0;

$query += $base_array;

// we want to find a menu item for this if possible. If the active menu item is the current menu item then we should see if there is a better match.
if (empty($query['Itemid']) || ($query['Itemid'] == $active->id && empty($query['task']))) {
    // load all menu items
    $items = $menu->getMenu();

    // use the current item over others if it ties for the best match
    if ($active->query['option'] == $query['option']) {
        $match_level = 1;
        $match = $active;
        if ($active->query['view'] == $query['view']) {
            $match_level = 2;
            if ($active->query['layout'] == $query['layout'] || ($query['layout']=='default' && !$active->query['layout'])) {
                $match_level = 3;
                if ($active->query['id'] == $query['id']) {
                    $match_level = 4;
                }
            }
        }
    }

    // loop through each menu item in order
    foreach ($items as $item) {
        $item->query += $base_array;
        // base check is that it is for this component
        // then cycle through each possibility finding it's match level
        if ($item->query['option'] == $query['option']) {
            $item_match = 1;
            if ($item->query['view'] == $query['view']) {
                $item_match = 2;
                if (!$query['layout'] && $item->query['layout']) {
                    $query['layout'] = 'default';
                }
                if ($item->query['layout'] == $query['layout'] || ($query['layout']=='default' && !$item->query['layout'])) {
                    $item_match = 3;
                    if ($item->query['id'] == $query['id']) {
                        $item_match = 4;
                    }
                }
            }
        }

        // if this item is a better match than our current match, set it as the best match
        if ($item_match > $match_level) {
            $match = $item;
            $match_level = $item_match;
        }

    }

    // if there is a match update Itemid to match that menu item
    if ($match) {
        $query['Itemid'] = $match->id;
        $menuItem = $menu->getItem($match->id);
    } else {
        $menuItem = $menu->getActive();
    }
}

यह सब एक तरह की गड़बड़ है (और अगर किसी के पास है तो मैं सुधार करना पसंद करूंगा!), लेकिन यह काम पूरा करता है। यदि वर्तमान मेनू आइटम सबसे अच्छा मैच है, तो यह हमेशा उसी के साथ रहेगा।

अन्यथा यह घटक नाम -> दृश्य नाम -> लेआउट नाम -> आईडी मान के आधार पर सबसे अच्छा मैच ढूंढना चाहिए। आगे यह दाईं ओर से मेल खाता है, मैं मैच को बेहतर बनाता हूं!


2

यदि कोई प्रदान नहीं किया जाता है तो Afaik JRoute सक्रिय Itemid(और सक्रिय option) को भी ले जाएगा । यदि वह काम नहीं करता है, तो इसका मतलब है कि आपके कोड पर कॉल आइटम के बिना शुरू होने के साथ आता है। यदि हां, तो सबसे आसान बात यह होगी कि आइटम को इंटिअल कॉल में जोड़ा जाए।

यदि आपको मेनू आइटम देखने की आवश्यकता है, तो मैं एक सीधा प्रश्न नहीं करूंगा, बल्कि JMenu का उपयोग करूंगा।


मैंने देखा कि कुछ मामलों में JRouter कुछ क्रेज़ी URL वापस कर सकता है, यदि स्वयं JRoute::_('index.php?option=com_example&view=reporting&Itemid=10')आइटम प्रदान करने का प्रयास करें, तो JRouter के लिए उदाहरण वापस आ सकता है /current-path?view=reporting&Itemid=10... क्या कुछ विशिष्ट चीज़ें हैं?
फेडिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.