Лучший способ выделить вкладки в соответствии со страницей, на которой вы находитесь с CakePHP? - PullRequest
1 голос
/ 18 сентября 2011

Поэтому, прежде чем я познакомился с CakePHP, я бы выделил соответствующую вкладку навигации в соответствии с URL с помощью следующего (довольно небрежного) кода, который я написал (fyi absolute_url - это функция, которую я написал для получения абсолютного пути):

$page = $_SERVER['PHP_SELF'];
// add all possible states for the navigation to an array
$checkNav = array(
    "index" => "index",
    "new" => "new",
    "random" => "random",
    "submit" => "submit"
);
$compareAgainst = strpos($page, $checkNav['index']);
if ($compareAgainst == 0) {
    echo "<li><a href=\"" . absolute_url("index") . "\"><span class=\"navBorder\">Popular</span></a></li>\n";
} else {
    echo "<li><a href=\"" . absolute_url("index") . "\" id=\"current\">Popular</a></li>\n";
}
$compareAgainst = strpos($page, $checkNav['new']);
if ($compareAgainst == 0) {
    echo "<li><a href=\"" . absolute_url("new") . "\"><span class=\"navBorder\">New</span></a></li>\n";
} else {
    echo "<li><a href=\"" . absolute_url("new") . "\" id=\"current\">New</a></li>\n";
}
$compareAgainst = strpos($page, $checkNav['random']);
if ($compareAgainst == 0) {
    echo "<li><a href=\"" . absolute_url("random") . "\"><span class=\"navBorder\">Random</span></a></li>\n";
} else {
    echo "<li><a href=\"" . absolute_url("random") . "\" id=\"current\">Random</a></li>\n";
}
$compareAgainst = strpos($page, $checkNav['submit']);
if ($compareAgainst == 0) {
    echo "<li><a href=\"" . absolute_url("submit") . "\"><span class=\"navBorder\">+ Submit a Link</span></a></li>\n";
} else {
    echo "<li><a href=\"" . absolute_url("submit") . "\" id=\"current\">+ Submit a Link</a></li>\n";
}

Теперь я заметил, что в Cake, чтобы определить относительный путь, я могу просто пойти:

<?= $this->here; ?>

Есть ли лучший способ сделать это, или долженЯ просто реализовать этот (новый) метод со старым кодом?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Вы можете сделать следующее

Добавьте это в app_helper.php, если вам это нужно на нескольких страницах. Вы передаете эту функцию контроллеру, и действие, которое вы хотите проверить, с которым вы хотите сравнить. Функция сравнивает ее с текущей страницей и возвращает true, если они совпадают.

  function isActive($controller, $actions = array())
    {
      foreach ($actions as $action) 
      {
        if ($controller == $this->params['controller'] && $action == $this->params['action']) 
        {
          return true;
        }
      }
      return false;
    }   

А затем сгенерируйте ваши ссылки так:

<ul class="left">
    <li <?php if($html->isActive('controller_name', array('index'))) { echo 'class="active"'; }  ?>><?php echo $html->link('Index', '/index'); ?></li>
    <li <?php if($html->isActive('controller_name', array('new'))) { echo 'class="active"'; }  ?>><?php echo $html->link('New', '/new'); ?></li>
    <li <?php if($html->isActive('controller_name', array('random'))) { echo 'class="active"'; }  ?>><?php echo $html->link('Random', '/random'); ?></li>
    <li <?php if($html->isActive('controller_name', array('submit'))) { echo 'class="active"'; }  ?>><?php echo $html->link('Submit', '/submit'); ?></li>
</ul>

Если функция возвращает true, ссылка будет иметь класс = "активный". Адаптируйте его под свои нужды.

2 голосов
/ 18 сентября 2011

Я всегда делал так, чтобы присвоить вашему телу тег id и использовать css для его назначения.Если все ваши взгляды разделены, вы можете жестко закодировать идентификатор тела.Если вы используете какой-то шаблон, который добавляет заголовок, содержимое, нижний колонтитул и т. Д., То просто передайте идентификатор в качестве переменной в представление заголовка или там, где находится тег body (на самом деле любой внешний контейнер / div, который будет на каждомпросматривать и содержать ваши вкладки навигации).Также вам нужно будет указать идентификаторы вкладок навигации для каждого из них.

Затем просто несколько CSS, как это:

#homepage a#hometab, 
#aboutpage a#abouttab,
#productpage a#productstab,
#contactpage a#contacttab   
                       {    
                         special active styling here
                        }
...