কীভাবে ইউআরএল দ্বারা আইটেমিড পাবেন এবং এটি জেআরউটে পাস করবেন


14

আমার কাছে একটি কাস্টম উপাদানটিতে একটি নির্দিষ্ট দৃশ্যের জন্য একটি মেনু আইটেম রয়েছে। এই মেনু আইটেমটির সাথে সংযুক্ত হয়ে আমার অন্য একটি Template Styleনির্বাচিত হয়েছে, মানক টেম্পলেট নয়। দৃশ্য মেনু মাধ্যমে ভাল কাজ করে যেমন URL এ সংযোজনের এর অ্যাক্সেস করা Itemid

এখন আমি JRoute ব্যবহার করে অন্যটির সাথে একটি ভিউ ব্যবহার করতে চাই, তবে জে রুট পছন্দসই ইউআরএল তৈরি করছে না।

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

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

JRoute মেনু আইটেমটির জন্য নির্বাচিত টেম্পলেট শৈলীটি কাজ না করার ফলে আইআরএলটিতে আইটেমিড যুক্ত হবে না।

আইটেমিডকে "গণনা" করার ( 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"); 

আসলে আপনার কাছে ক্যাটিড = 5 এর জন্য মেনু আইটেম বিভাগের ব্লগ তালিকা থাকলে, পরবর্তীটি আপনাকে মেনু-ইউআরএল দিতে পারে (আমি এই সঠিক url পরীক্ষা করিনি) tested বিভিন্ন ফলাফল পেতে বিভিন্ন গেট-প্যারামিটার দিয়ে চেষ্টা করুন (কখনও কখনও খুব ভুল, যেমন @ ফেডিক বলেছেন)


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

আফাইক জেআরউতে যদি কোনও সরবরাহ না করা হয় তবে সক্রিয় Itemid(এবং সক্রিয় option) ও নেবে । যদি এটি কাজ না করে, তার অর্থ আপনার কোডে কল আইটেমিড ছাড়াই আসে with যদি তাই হয় তবে সবচেয়ে সহজ জিনিসটি অন্তর্নিযুক্ত কলটিতে আইটেমিড যুক্ত করা হবে।

আপনার যদি মেনু আইটেমটি সন্ধান করতে হয় তবে আমি সরাসরি জিজ্ঞাসা করব না তবে এর পরিবর্তে জেএমেনু ব্যবহার করব।


আমি লক্ষ্য করেছি যে কিছু ক্ষেত্রে জেউউটার কিছু ক্রেজি ইউআরএল ফিরিয়ে দিতে পারে, যদি নিজের JRoute::_('index.php?option=com_example&view=reporting&Itemid=10')আইটেমিড সরবরাহ করার চেষ্টা করে থাকে, জেআরটার উদাহরণস্বরূপ ফিরে আসতে পারে /current-path?view=reporting&Itemid=10... কিছু নির্দিষ্ট জিনিস আছে কি?
ফেডিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.