2012-07-30 22 views
9

में सक्रिय मेनू लिंक की पहचान कैसे करें मैं एक व्यवस्थापक साइडबार के लिए एक accordion लेआउट बना रहा हूँ। अब मुझे सक्रिय लिंक की पहचान करने और उस लिंक पर active कक्षा जोड़ने की आवश्यकता है। यहां मेरा कोड है:केकेपीएचपी

<div class="accordion-group"> 
<div class="accordion-heading"> 
    <a href="#collapseSeven" data-parent="#side_accordion" data-toggle="collapse" class="accordion-toggle"> 
     <i class="icon-th"></i> Gallery Manager 
    </a> 
</div> 
<div class="accordion-body collapse" id="collapseSeven"> 
    <div class="accordion-inner"> 
     <ul class="nav nav-list"> 
      <li> 
       <?php echo $this->Html->link('View All',array('controller' => 'gallaries', 'action' => 'index'));?> 
      </li> 
      <li> 
       <?php echo $this->Html->link('Add New',array('controller' => 'gallaries', 'action' => 'add'));?> 
      </li> 
     </ul> 
     </div> 
    </div> 
</div> 

ऐसा करने का सबसे अच्छा तरीका क्या है? अग्रिम में धन्यवाद!

उत्तर

5

मैं समाधान पाया है में पारित कर सकते हैं करने के लिए वर्ग को जोड़ने के लिए कुछ कर रहे हैं:

$url = $this->Html->url('INPUT_THE_URL') ; 
$active = $this->request->here == $url? true: false; 
+0

डाउनवोट, क्योंकि 'यहां()' में सभी नामित पैरामीटर और क्वेरी स्ट्रिंग शामिल हैं। – mrdaliri

+0

इस '$ this-> अनुरोध-> यहां' यूआरएल राउटर द्वारा उत्पन्न किए गए एक जैसा नहीं है, भले ही यह होना चाहिए। आपको उनकी तुलना करने से पहले अपने URL को ['राउटर :: सामान्यीकृत()] (http://api.cakephp.org/2.6/class-Router.html#_normalize) के साथ सामान्य बनाना चाहिए। – bfncs

2

तरीके का एक संख्या में हैं, यहाँ कंटेनर

<li <?php echo ($url == 'users/account')? 'class="current"' : ''?>> 
<li <?php echo (preg_match("/addresses/", $url))? 'class="current"' : ''?>> 
<li <?php echo ($this->params['controller'] == 'attributes')? 'class="current"' : ''?>> 

या आप यह $options

$options = array(); 
if($this->controller == 'mycontroller' && $this->action == 'myaction'){ 
    $options = array_merge($options, array('class'=>'active')); 
} 
echo $this->Html->link('Title', '/url', $options); 
+0

इस दृष्टिकोण मैं हर कड़ी से पहले/पर शर्त लगाने के लिए है, किसी भी सहायक या किसी अन्य दृष्टिकोण जिसके द्वारा मैं यह गतिशील – Krishna

+2

@Krishna क्या कर सकते हैं अगर यह सामान्य रूप से जिस तरह से आप है के द्वारा दुर्भाग्य से PHP में ऐसा करने के लिए, यदि आपके पास एक सतत लेआउट है तो आप अपना स्वयं का सहायक वर्ग बना सकते हैं। – Dunhamzzz

+0

मौजूदा हेल्पर आदि हैं जिनका आप उपयोग कर सकते हैं। उनके लिए Google की कोशिश करें या केकफ़्पी प्लगइन्स वेबसाइट खोजें। – mark

1

सक्रिय कक्षा जोड़ने के लिए यहां आसान तरीका:

<ul class="nav nav-list"> 
    <li class="<?php echo (($this->params['controller']==='gallaries')&&($this->params['action']=='index'))?'active' :'' ?>"> 
      <?php echo $this->Html->link('View All',array('controller' => 'gallaries', 'action' => 'index'));?> 
    </li> 
    <li class="<?php echo (($this->params['controller']==='gallaries')&& ($this->params['action']=='add'))?'active' :'' ?>"> 
      <?php echo $this->Html->link('Add New',array('controller' => 'gallaries', 'action' => 'add'));?> 
    </li> 
</ul> 

मुझे लगता है कि यह आपके लिए सहायक होगा।

+0

[प्रीफिक्स रूटिंग] (http://book.cakephp.org/2.0/en/development/routing.html#prefix-routing) का उपयोग करते समय यह दृष्टिकोण झूठी सकारात्मकताओं का कारण बन जाएगा, और [प्लगइन रूटिंग] (http: // book.cakephp.org/2.0/en/development/routing.html#plugin-routing) साथ ही झूठी नकारात्मक जब आप कैनोनिकल लोगों की तुलना में अन्य यूआरएल के साथ सामग्री का अनुरोध करते हैं। इसके अलावा यह बहुत verbose और un [DRY] है (http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself)। ['राउटर :: सामान्यीकृत() '] (http://api.cakephp.org/2.6/class-Router.html#_normalize) के साथ सामान्यीकरण के बाद मिलान करने वाले URL के लिए एक बेहतर दृष्टिकोण जांच रहा होगा। – bfncs

3

यह जांचने के लिए कि क्या दिया गया यूआरएल वर्तमान में केकफ़्पी 2.x में सक्रिय है या नहीं, आपको यह जांचना चाहिए कि यह सामान्य है (Router::normalize() के अर्थ में) फॉर्म वर्तमान में अनुरोध किए गए यूआरएल के सामान्यीकृत रूप के समान है (इसके अर्थ में $this->request->here)।

$currentUrl = Router::normalize($this->request->here); 
$checkedUrl = Router::normalize($myUrl); 
$isActive = $currentUrl === $checkedUrl; 

कभी-कभी यदि कोई बच्चा वर्तमान में दिखाया जाता है, तो मेनू में सक्रिय पृष्ठ को दिखाने के लिए एक ढीला मिलान करना चाह सकता है। लगता है कि /fruits/banana/ पर केले विवरण साइट सर्फ करते समय आप सक्रिय रूप से /fruits/ पर फल ओवरव्यू साइट पर अपना मेनू लिंक प्रदर्शित करना चाहते हैं। आप केवल आंशिक मिलान की तलाश करके इसे आसानी से प्राप्त कर सकते हैं।

$isActive = (0 === strpos($currentUrl, $checkedUrl)); 

सुनिश्चित करें कि आपके मिलान और अधिक जटिल हो सकती है, उदाहरण के लिए यदि आप भारी नामित पैरामीटर के उपयोग और की तरह कर रहे हैं और अपने मेनू में प्रतिबिंबित करने के लिए चाहते हैं, लेकिन आप यहां से अपना रास्ता खोजना चाहिए के लिए।

अपने विशेष समस्या के लिए एक समाधान इस प्रकार दिखाई देंगे:

$currentUrl = Router::normalize($this->request->here); 
$links = array(
    array(
     'label' => __('View All'), 
     'url' => array('controller' => 'galleries', 'action' => 'index'), 
    ), 
    array(
     'label' => __('Add New'), 
     'url' => array('controller' => 'galleries', 'action' => 'add'), 
    ), 
    /* ... */ 
); 

foreach ($links as $link) { 
    $linkLabel = $link['label']; 
    $linkUrl = Router::url($link['url']); 
    $linkHtml = $this->Html->link($linkLabel, $linkUrl); 

    $linkActive = $currentUrl === $linkUrl; 

    echo $this->Html->tag('li', $linkHtml, array(
     'class' => $linkActive ? 'active' : '', 
     'escape' => false, // to not escape anchor markup 
    )); 
} 

अपनी लाइव सिर्फ इतना है कि छोटा सा भी इस सवाल के बारे में सोच नहीं द्वारा आसान बनाने के लिए, आप भी मेनू निर्माण के लिए एक सहायक इस्तेमाल कर सकते हैं कि किसी को अन्यथा torifat/cake-menu_builder की तरह बनाया गया।

1

मुझे पता है कि यह बहुत पुराना है लेकिन मुझे एक अच्छा समाधान मिला।

फैसल के जवाब के आधार पर मैं अपने सरल हेल्पर ने लिखा है:

App::uses('AppHelper', 'View/AppHelper'); 

class PVHtmlHelper extends AppHelper { 

    public $helpers = array('Html'); 

    public function link($title = null, $url = null, $options) { 

     if ($title == null || $url == null) 
      return; 

     $class = (($this->params['controller']===$url['controller']) && ($this->params['action']==$url['action']))?'active' :''; 

     echo "<li class='" . $class . "'>" . $this->Html->link($title, $url, $options) . "</li>"; 
    } 

} 

हो सकता है कि आप अपनी आवश्यकताओं फिट करने के लिए समारोह के अंदर echo <li> को संशोधित करने की जरूरत है।

उदाहरण:

echo $this->PVHtml->link('Login', array('controller' => 'users', 'action' => 'login')); 
+0

धन्यवाद, इससे मुझे बहुत मदद मिली! =) मैं केकेपीएचपी 3.1.5 का उपयोग करता हूं। तो इसे पढ़ने के लिए, 3.x के लिए वाक्यविन्यास होना चाहिए: '$ this-> अनुरोध-> पैराम्स ['action']'। और फ़ाइल की शुरुआत में कुछ मतभेद। देखें: [केकेपीपी -3-क्रिएटिंग-हेल्पर्स] (http://book.cakephp.org/3.0/en/views/helpers.html#creating-helpers) – eve

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^