CakePHP: использование переменной в макете, когда пользователь переключается со страницы на страницу - PullRequest
0 голосов
/ 10 февраля 2011

Я установил переменную, чтобы ее можно было использовать из контроллера для передачи значения «текущий» туда, куда пользователь просматривает. Это работает нормально, но мне нужно условное программирование, чтобы компенсировать это другими страницами. Допустим, я перехожу к категории страницы, контроллер категории передает переменную $ current в мой макет, но, черт возьми, все пошло не так, у нас будет две ссылки с этим специальным идентификатором, например

<li id="<?php echo "$current";?>"><?php echo $this->Html->link('Home', '/'); ?></li>    
<li id="<?php echo "$current";?>"><?php echo $this->Html->link('Category', '/categories'); ?></li> 

Я знаю условное обязательство, кто-нибудь может написать это? Я не уверен, смогу ли я использовать if else, потому что на других страницах указана неопределенная переменная. Это немного сложно, может быть, кто-то может сделать оле рабочую логику программирования для этого?

UPDATE: Привет, я пытаюсь сделать эту работу:

<?php if($current==NULL) {
                    <?php echo "<li id="current">";?>
                    <?php echo $this->Html->link('Home', '/'); ?>
                    <?php echo "</li>"; ?>
                    }
<?php else: ?>{
                    <?php echo "<li>";?>
                    <?php echo $this->Html->link('Home', '/'); ?>
                    <?php echo "</li>"; ?> 
              }
<?php endif ?>

Я получаю ошибку при разборе прямо на <li> tags. Кто-нибудь знает, как обернуть <li> tag в PHP?

P.S. Я перепробовал все предложенные возможные решения ниже, не смог заставить его работать на меня. Я думал, что этот в настоящее время я пытаюсь, кажется, самый простой? спасибо.

Я не уверен, что это будет работать, хотя даже после оборачивания тегов в PHP.

Ответы [ 4 ]

2 голосов
/ 11 февраля 2011

Если другие ответы верны, то, что вы пытаетесь выделить текущую страницу в навигации, обратитесь к следующему помощнику: http://www.richardathome.com/blog/cakephp-smarter-links

Расширяет встроенный помощник ссылки, чтобы добавить два битафункциональность:

-Ссылки должны автоматически добавлять к себе класс, когда они а) указывают на ресурс в том же контроллере и б) указывают на себя.

-Возможно показать/ скрыть себя.

Помощник работает нормально, я использовал его на нескольких проектах.

В ответ на обновление

Если это ваш настоящий PHP, есть пара ошибок форматирования.Эта строка недействительна:

<?php echo "<li id="current">";?>

Вам нужно экранировать внутренние кавычки, например:

<?php echo "<li id=\"current\">";?>

Но ваши скобки тоже немного не в порядке.Попробуйте следующее:

<?php 
if($current==NULL) {
    echo "<li id=\"current\">";
    echo $this->Html->link('Home', '/');
    echo "</li>";
}
else {
    echo "<li>";
    echo $this->Html->link('Home', '/');
    echo "</li>";
}
?>

Обновление 2

Как уже упоминалось в комментарии, я подозреваю, что $ current просто никогда не бывает NULL.В PHP пустая строка не NULL.Вместо проверки на NULL я предлагаю проверить на пустоту.

Функция empty () вернет true, если значение равно null, 0, false, "" или пустому массиву.Смотрите здесь: http://au.php.net/manual/en/function.empty.php

Таким образом, ваш код становится:

<?php 
if(empty($current)) {
    echo "<li id=\"current\">";
    echo $this->Html->link('Home', '/');
    echo "</li>";
}
else {
    echo "<li>";
    echo $this->Html->link('Home', '/');
    echo "</li>";
}
?>

Или даже лучше (просто меньше дублирования):

<?php 
if(empty($current)) {
    echo "<li id=\"current\">";
}
else {
    echo "<li>";
}
echo $this->Html->link('Home', '/');
echo "</li>";
?>
1 голос
/ 10 февраля 2011

Полагаю, вы пытаетесь создать меню, в котором текущая страница меню по-другому оформлена?Если это не так, тогда мой ответ нужно будет адаптировать к вашему конкретному случаю.

Если это так, то Росс совершенно прав, хотя я бы, вероятно, написал это немного иначе, чтобы соответствовать моей личной эстетике:

<li class="<?php ($current=='category') ? echo 'active' : echo 'inactive' ?>">

Обратите внимание, что я использовал class вместо id, так как это был бы лучший способ написать CSS.Если вы не распознаете синтаксис, это троичный оператор - своего рода сокращение для условного 'переключения'.

Редактировать: Есть некоторые проблемы слогика ($current==null ??), синтаксис, стиль и эффективность.Надеюсь, я исправил их ниже.

Если строка не содержит переменную или специальный символ (перевод строки и т. Д.), Вы должны использовать одинарные (') кавычки.PHP разбирает двойные (") кавычки медленнее. Использование двойных кавычек в первой строке <li> было синтаксически неправильным.

У вас были фигурные скобки за пределами <?php ... ?> блоков.кодовый блок может быть заключен в одну пару <?php .. ?>.

<?php
if($current) 
    {              
        echo '<li id="current">';
        echo $this->Html->link('Home', '/');
        echo '</li>';
    }
else
    {
        echo '<li>';
        echo $this->Html->link('Home', '/');
        echo '</li>';
    }
?>
1 голос
/ 10 февраля 2011

Я не уверен в специфике CakePHP, но вам нужно что-то с эффектом:

$current = 'category';  // in controller

if($current=='category') { echo 'current' } // in view

для каждой ссылки.

Если он еще не встроен.

0 голосов
/ 10 февраля 2011

Вы пытаетесь создать навигацию, которая может автоматически знать, на какой странице находится пользователь, и соответственно выделить навигацию (вкладку?)?

Если это так, то у меня есть некоторые мысли для вас.

Если вы хотите, чтобы переменная $ current была установлена ​​для всех контроллеров, то вы, вероятно, захотите поместить это в app_controller.Возможно, у вас его нет, по умолчанию его нет в развертывании торта.Вы должны добавить его в CAKE_HOME / app / app_controller.php

, это будет выглядеть примерно так:

<?php
class AppController extends Controller {
  function beforeFilter() {
    $this->set('current', $this->name . '.' . $this->action);
  }
}
?>

Альтернатива, которую я использую в своих приложениях, заключается в том, чтобы не использоватьпеременная $ current, но для использования встроенных переменных $ this-> name (имя контроллера) и $ this-> action (имя действия)

<?php $tmp = $this->here . '/'. $this->action; ?>
<li class="<?php ($tmp == '/') ? e('active-tab') : e('tab'); ?>">
    <?php echo $this->Html->link('Home', '/'); ?>
</li> 
<li class="<?php ($tmp == '/categories/index') ? e('active-tab') : e('tab'); ?>">
    <?php echo $this->Html->link('Category', '/categories'); ?>
</li> 

Преимущество заключается в том, что у вас нетявно установить переменную $ category в каждом действии контроллера.Вся логика отображения находится в макете или видах, где они должны быть.Мне нравится все, что позволяет мне меньше программировать.

...