CakePHP: использование переменной в макете, когда пользователь переходит со страницы на страницу

Я установил переменную, чтобы ее можно было использовать из контроллера для передачи значения «текущее» туда, куда просматривает пользователь. Он работает нормально, но мне нужно условное программирование, чтобы компенсировать это другими страницами. Допустим, я просматриваю категорию страницы, контроллер категории передаст переменную $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, потому что на других страницах утверждается неопределенная переменная. Это немного сложно, может быть, кто-нибудь может сделать для этого рабочую логику программирования?

ОБНОВЛЕНИЕ: Привет, я пытаюсь заставить это работать:

<?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.


person George Leow    schedule 10.02.2011    source источник
comment
Вы делаете это, чтобы выделить текущее действие в списке? Если да, то это может помочь $this->set('current', $this->params['controller'].'/'.$this->params['action']);   -  person Ish    schedule 10.02.2011
comment
Привет всем, Да, я пытаюсь выделить текущую страницу. Я попробовал несколько предложений здесь, еще не успешно, я пытаюсь с помощником в данный момент. Спасибо за теплый ответ и извините за задержку с обновлением из-за другого часового пояса.   -  person George Leow    schedule 11.02.2011
comment
Привет, люди, это было решено, я все еще пытаюсь отметить, какой ответ больше всего способствует успеху. Дай мне немного времени.   -  person George Leow    schedule 11.02.2011


Ответы (4)


Если другие ответы верны, что вы пытаетесь выделить текущую страницу в навигации, проверьте следующий помощник: 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>";
?>
person Botman    schedule 11.02.2011
comment
Эй, я ответил. Дайте мне знать, если я не следил. - person Botman; 11.02.2011
comment
Привет, Ботман, он не отображает стиль содержимого, однако теперь он не дает мне никаких ошибок синтаксического анализа. Как будто ничего не изменилось. хороший шаг вперед я думаю. Как вы думаете, что мешает ему отображать id=content ? Благодарность.. - person George Leow; 11.02.2011
comment
Привет, Джон, я подозреваю, что проблема в том, что $current никогда не бывает нулевым, вместо этого, даже если вы ожидаете, что он будет нулевым, на самом деле это пустая строка. Попробуйте добавить var_dump($current); на ваш взгляд. Это покажет вам тип данных и значение $current. Я обновлю свой ответ решением... - person Botman; 11.02.2011
comment
Привет, Ботман, вау, я успешно это сделал. И спасибо за всю информацию. Я не могу вспомнить, где что-то пошло не так, когда я тестировал ваш. Я упустил правильный макет. Я не уверен, что постоянно менялся, и, насколько я знаю, ваш пост верен, поэтому я поставил галочку. Кроме того, советы от меня; мы можем использовать самый простой способ выделить вкладку, просто создав макет для контроллера. Единственная ситуация, когда состоит из областей участников, мы можем захотеть использовать условия, показанные выше, потому что создание нового макета для каждого представления довольно безумно. - person George Leow; 11.02.2011
comment
Привет Джон, да, вы действительно не хотите использовать макет для просмотра! Этот помощник, которого я связал ранее, позаботится об этом за вас. т.е. условная логика происходит внутри контроллера, поэтому вам не нужно ее писать/беспокоиться об этом. Сам помощник работает, если это активная ссылка. Если вы хотите написать условную логику в своем представлении, есть много переменных, которые могут вам помочь, например, $this-›here или $this-›action. Поместите это в представление, чтобы увидеть их все: ‹?php pr($this); ?› - person Botman; 12.02.2011

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

$current = 'category';  // in controller

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

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

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

person Ross    schedule 10.02.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>';
    }
?>
person Leo    schedule 10.02.2011
comment
Привет, Лео, спасибо, но я выбрал другой ответ, потому что первый; оба из вас и другие предложения одинаковы, за исключением того, что, возможно, вы испортили мое намерение, я бы хотел, чтобы дом не отображал текущий стиль, если существует переменная $current. В любом случае, спасибо за помощь, я поставил галочку на 1 голос, как вы этого заслужили. - person George Leow; 11.02.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 в каждом действии контроллера. Вся логика отображения находится в макете или представлениях, где они и должны быть. Мне нравится все, что позволяет мне меньше кодировать.

person zeroSkillz    schedule 10.02.2011
comment
вместо if($current == NULL) попробуйте if(isset($current) && !empty($current)) { это просто придирка. - person zeroSkillz; 12.02.2011