CakePHP - административная маршрутизация для / admin /, но не для всех остальных (способ установить admin по умолчанию false?) - PullRequest
3 голосов
/ 05 апреля 2011

Я прочитал учебник и обнаружил, что для использования префикса "admin" вы можете просто раскомментировать файл:

Configure::write('Routing.prefixes', array('admin'));

config / core.php.

Я сделал этои моя маршрутизация администратора работает отлично - / admin / users / add запускает функцию admin_add () в моем users_controller.

Проблема в том, что она также меняет мои обычные ссылки - т.е.моя кнопка «ВЫХОД» теперь пытается перейти в / admin / users / logout вместо просто / users / logout.Я понимаю, что могу добавить 'admin' => false, но я бы предпочел не делать этого для каждой ссылки на моем сайте.

Есть ли способ сделать так, чтобы URL-адреса были ТОЛЬКО с любым из них: "admin"=> true или / admin / ... чтобы перейти к админу, а НЕ ко всем остальным ссылкам?

Ответы [ 5 ]

4 голосов
/ 08 апреля 2011

Продолжая редактирование пользователя Abba Bryant, посмотрите, как создать помощника в кулинарной книге: http://book.cakephp.org/view/1097/Creating-Helpers

Если необходимость отключить маршрутизацию вручную для всех ваших ссылок раздражает (это было бы мне!), Вы можете создать нового помощника MyCustomUrlHelper (имя, конечно, не должно быть таким длинным), и иметь он использует ядро ​​UrlHelper для генерации URL-адресов для вас.

class MyCustomUrlHelper extends AppHelper {
    public $helpers = array('Html'); 

    function url($controller, $action, $params ,$routing = false, $plugin = false) {
       //Example only, the params you send could be anything
       $opts = array(
          'controller' => $controller,
          'action'     => $action
          //....
       );

    }

   //another option

   function url($params) {
       //Example only, the params you send could be anything
       $opts = array(
          'controller' => $params['controller'],
          'action'     => $params['action']
          //....
       )
    }

   //just fill up $opts array with the parameters that core URL helper
   //expects. This allows you to specify your own app specific defaults

   return $this->Html->url($opts); //finally just use the normal url helper
}

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

EDIT

Вы также можете проверить, является ли переданный массив $ opts строкой. Таким образом, вы можете получить лучшее из обоих миров.

3 голосов
/ 05 апреля 2011

Убедитесь, что вы используете префиксную маршрутизацию, которую вы обрабатываете в вызовах HtmlHelper :: link, вот так

<?php
    ...
    echo $html->link( array(
        'controller' => 'users',
        'action' => 'logout',
        'plugin' => false,
        'admin' => false,
    ));
    ...
?>

** РЕДАКТИРОВАТЬ ** Вы можете расширить функцию url в вашем AppHelper для проверкипередайте массив и установите для ключей Routing.prefixes значение false, если они еще не установлены в вызове url.

Затем вам потребуется каждый раз указывать префикс в ссылках администратора.

1 голос
/ 06 апреля 2011

HtmlHelper допускает два способа задания URL: это может быть относящийся к Cake URL или массив параметров URL.

Если вы используете параметры URL-адреса, по умолчанию, если вы не укажете параметр «admin» => false, HtmlHelper автоматически префиксирует действие «admin», если вы находитесь на действии администратора.

ИМХО, самый простой способ избавиться от этого параметра - использовать URL-адрес, относящийся к Cake, в качестве строки.

<?php
//instead of using
//echo $this->Html->link(__('logout', true), array('controller' => 'users', 'action' => 'logout'));

//use
echo $this->Html->link(__('logout', true), '/users/logout');

С уважением,

1010 * NICO *

0 голосов
/ 26 марта 2012

Я опаздываю на вечеринку, но у меня очень хороший ответ:

Вы можете переопределить поведение по умолчанию, создав класс AppHelper.Создайте app / app_helper.php и вставьте следующее:

<?php
class AppHelper extends Helper{

    function url($url = null, $full = false) {
        if(is_array($url) && !isset($url['admin'])){
            $url['admin'] = false;
        }
        return parent::url($url, $full);
    }
}
?>

Если это не указано при вызове link () или url (), для admin будет задано значение false.

0 голосов
/ 06 апреля 2011

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

$this->Auth->autoRedirect = false;
$this->Auth->loginAction = array(Configure::read('Routing.admin') => false, 'controller' => 'users', 'action' => 'login');
$this->Auth->logoutRedirect = array(Configure::read('Routing.admin') => false, 'controller' => 'users', 'action' => 'logout');     
$this->Auth->loginRedirect = array(Configure::read('Routing.admin') => false, 'controller' => 'users', 'action' => 'welcome');

Это было действительно неприятно, поэтому я рад помочь.

...