CakePHP: Използване на променлива в оформлението, когато потребителят преминава от страница на страница

Зададох променлива, така че да може да се използва от контролера за предаване на стойността "current" до мястото, където потребителят преглежда. Работи добре, но имам нужда от условно програмиране, за да компенсирам с други страници. Да кажем, че разглеждам категорията на страницата, контролерът на категория ще предаде променливата $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