Ссылки входа/выхода в навигации по базе данных?

У меня есть навигация, управляемая базой данных, в основном состоящая из двух таблиц: menus и menu_items, это отлично работает для чисто «статических» ссылок, но теперь мне нужна динамическая ссылка (логин/выход).

Моя таблица menu_items состоит только из ссылок на страницы, добавленные вручную в админке. Итак, теперь мне нужно настроить таблицу и модель, возможно, так, чтобы она могла обрабатывать «динамические» ссылки.

Вот схема таблицы menu_items:

CREATE TABLE `menu_items` (
  `id` int(11) NOT NULL auto_increment,
  `menu_id` int(11) default NULL,
  `label` varchar(250) default NULL,
  `page_id` int(11) default NULL,
  `link` varchar(250) default NULL,
  `position` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

Идентификатор меню соответствует другой таблице, поэтому 1, например, является основной навигацией, 2 может быть служебной навигацией. Позиция относится к порядку относительно каждого меню, в котором отображается пункт меню. Ссылка — это просто поле, например, «/user/login».

Я просматриваю каждое из своих меню и создаю контейнеры навигации и использую для этого Zend Navigation.

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

<?php if($this->identity == null) { ?>
    <p><a href='/user/login'>Login</a></p>
<?php }else{ ?>
    <p>Welcome back <?php echo $this->identity->first_name;?></p>
    <p>To log out <a href='/user/logout'>click here</a></p>
<?php } ?>

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


person meder omuraliev    schedule 28.12.2009    source источник
comment
Зачем переносить? Это просто, чисто и лаконично, как есть.   -  person Gordon    schedule 28.12.2009
comment
Можете ли вы добавить ссылку для входа и выхода в таблицу, а затем динамически отображать ту или другую? (если я не понял вопроса)   -  person Mark Pope    schedule 28.12.2009
comment
@Gordon - потому что мне нужно, чтобы он был сгенерирован с остальными ссылками   -  person meder omuraliev    schedule 28.12.2009
comment
@Scobal - это в основном то, что я спрашивал, должен ли я делать, добавлять ссылку «Профиль» и «Войти», я просто не уверен, как мне реорганизовать схему моей таблицы, чтобы у меня были общие глобальные ссылки ( Home ), ссылки, которые отображаются глобально если вы не вошли в систему ( Login ), и ссылки, которые отображаются глобально, если вы вошли в систему ( Profile заменяет Login ).   -  person meder omuraliev    schedule 28.12.2009


Ответы (2)


ACL Гордона - это то, что нужно (и я проголосовал за него). Я просто хотел вставить и описать, что именно я делаю.

Я создал страницы sign in и sign out в своей конфигурации навигации:

    <user_signin>
      <label>Sign in</label>
      <other_stuff></other_stuff>
      <resource>mvc:user_signin</resource>
      <privilege>navigate</privilege>
    </user_signin>

    <user_signout>
      <label>Sign out</label>
      <other_stuff></other_stuff>
      <resource>mvc:user_signout</resource>
      <privilege>navigate</privilege>
    </user_signout>

Затем в моем ACL:

// 'mvc:home' is wide open, 'user' role inherits from 'guest'
$this->addResource(new Zend_Acl_Resource('mvc:user_signin'), 'mvc:home');
$this->deny('user', 'mvc:user_signin', 'navigate');

$this->addResource(new Zend_Acl_Resource('mvc:user_signout'), 'mvc:home');
$this->deny('guest', 'mvc:user_signout', 'navigate');
$this->allow('user', 'mvc:user_signout', 'navigate');

Таким образом, это просто еще одна часть навигации, которая ведет себя так же, как и остальные, только с небольшой логикой.

person Derek Illchuk    schedule 28.12.2009
comment
Значит, вы полагаетесь исключительно на xml для навигации? - person meder omuraliev; 28.12.2009
comment
да. Моя конфигурация навигации содержит каждую страницу, каждая из которых имеет уникальное значение resource. Затем каждый показывается или нет на основе моего ACL. - person Derek Illchuk; 28.12.2009

Думаю, вы могли бы добиться этого с помощью Zend_Acl. Все встроенные помощники навигации добавляют интеграцию с ACL и переводом.

Из http://framework.zend.com/manual/en/zend.view.helpers.html

{get|set}Acl(), {get|set}Role(), получает/устанавливает экземпляр ACL (Zend_Acl) и роль (String или Zend_Acl_Role_Interface), используемые для фильтрации страниц при рендеринге, а {get|set}UseAcl() определяет, следует ли включать ACL. Методы hasAcl() и hasRole() проверяют, есть ли у помощника зарегистрированный экземпляр ACL или роль.

Если вошедший в систему посетитель имеет другую роль, чем не вошедший в систему посетитель (пользователь или гость), это должно работать. У меня никогда не было необходимости делать это раньше, поэтому я не могу дать вам какие-либо фрагменты кода, но проверьте http://www.youtube.com/watch?v=n31mQGZxtbE, чтобы посмотреть видеоруководство о том, как совместить и то, и другое.

Я до сих пор не понимаю, почему вы хотите реорганизовать это, поскольку перемещение кажется хлопотным и добавляет ненужную сложность для чего-то, что могло бы счастливо жить в отдельном помощнике представления. Так почему бы не сделать это проще :)

person Gordon    schedule 28.12.2009
comment
Потому что это было бы более гибко. Если, скажем, я хотел, чтобы эта ссылка была в середине, скажем, 4 ссылок, то есть чтобы она отображалась третьей слева из 5 ссылок, а не в конце или в отдельном регионе. - person meder omuraliev; 28.12.2009
comment
Ну, это ваше приложение, так что делайте, как хотите. Я просто думаю, что это много рефакторинга для IF. Если yagni, то yagni :) В любом случае, дайте мне знать, работает ли это с Zend_Acl (если вы идете по этому пути) - person Gordon; 28.12.2009