URL

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
spirit
Сообщения: 207
Зарегистрирован: 2013.10.14, 17:44

URL

Сообщение spirit »

Здравствуйте, создал контроллер, модель, вьювер USER, есть код вьювера _view.php там есть такой код
при нажатии на id получается ссылка пример user/2

Код: Выделить всё

    <b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b>
    <?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id)); ?>
    <br />
КОД UserConroller

Код: Выделить всё

    public function actionView($id)
    {
        $this->render('view',array(
            'model'=>$this->loadModel($id),
        ));
    }


       public function loadModel($id)
    {
        $model=User::model()->findByPk($id);
        if($model===null)
            throw new CHttpException(404,'The requested page does not exist.');
        return $model;
    }
 


********************************************************
Я убрал ссылку с id и сделал ее для username получается user/view?username=arman как сделать чтобы было как у id
user/arman

Код: Выделить всё

    <b><?php echo CHtml::encode($data->getAttributeLabel('username')); ?>:</b>
    <?php echo CHtml::link(CHtml::encode($data->username), array('view', 'username'=>$data->username)); ?>
    <br />

Код: Выделить всё

    public function actionView($username)
    {
        $this->render('view',array(
            'model'=>$this->loadModel($username),
        ));
    }


    public function loadModel($username)
    {
             $model=User::model()->find('username=:username', array(':username'=>$username));
        if($model===null)
            throw new CHttpException(404,'The requested page does not exist.');
        return $model;
    }
 
knowill
Сообщения: 74
Зарегистрирован: 2012.12.11, 16:27
Контактная информация:

Re: URL

Сообщение knowill »

в urlManager нужно прописать правила
spirit
Сообщения: 207
Зарегистрирован: 2013.10.14, 17:44

Re: URL

Сообщение spirit »

Для данного урла сделал такое правило user/view/username/arman как сделать чтобы было user/arman

Код: Выделить всё

 '<controller:\w+>/<username:\d+>'=>'<controller>/view',
Получилась ссылка user/arman, но при нажатии выдает ошибку, но если я в ручную наберу user/view/username/arman, то открывается. Что не так в правиле написал?
Добавил вот такое правило вместо выше описанного

Код: Выделить всё

'<controller:\w+>/<action:\w+>/<username:\w+>'=>'<controller>/<action>'
 

user/view/arman
Ни как не могу привести к рабочему ввиду user/arman
knowill
Сообщения: 74
Зарегистрирован: 2012.12.11, 16:27
Контактная информация:

Re: URL

Сообщение knowill »

Код: Выделить всё

'<_c:(urlpath)>/<_a:(app|ssss|cccc)>' => '<_c>/<_a>',
я как то так делал
только нужно быть осторожным, там есть баг
spirit
Сообщения: 207
Зарегистрирован: 2013.10.14, 17:44

Re: URL

Сообщение spirit »

Привет прописал нет изменений помогите народ не пойму почему даное правило действует с id имея ввид user/id , user/username не получается использовав по аналогии id

Код: Выделить всё

'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
Т.е. ссылка получается правильной ее отображение , но при переходе по ней происходит ошибка

Код: Выделить всё

'<controller:\w+>/<username:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<username:\d+>'=>'<controller>/<action>',
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: URL

Сообщение Bloom »

Очень странно, что ссылка получается правильной. Такого быть не должно.

Код: Выделить всё

'<controller:\w+>/<username:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<username:\d+>'=>'<controller>/<action>', 
Это не будет работать, т.к. правило \d+ означает - только цифры, а имя ты передаешь буквами.
Правильное решение:

Код: Выделить всё

'user/<username:\w+>'=>'user/view' 
Но учти, что оно перебьет все правила controller/action для данного контроллера. Ведь любой стандартный action у нас попадет под это правило.
Соответственно тебе нужно прописать правила для каждого экшена данного контроллера и поместить эти правила в нужном порядке перед стандартными.
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: URL

Сообщение Bloom »

Наверно один из простейших для тебя решений будет таким - отказаться от user/username и перейти на неиспользуемое view_user/username
Можно и view_username, можно и user_username.
spirit
Сообщения: 207
Зарегистрирован: 2013.10.14, 17:44

Re: URL

Сообщение spirit »

2:BloomДа сделал также как ты написал дошло

Код: Выделить всё

                'user/<username:\w+>'=>'user/view',
 
только при переходе на вьюшку там есть хлебные крошки при нажатии на них выходила ошибка 404 так как получалось так user/index, а без index если убрать все норм открывалось

Код: Выделить всё

$this->breadcrumbs=array(
    'Users'=>array('index'),
    $model->id,
);
 
Исправил это данным правилом перед выше описанным правилом, теперь при нажатии на ссылку мы попадаем в вьюшку, а далее чтобы вернуться назад на полный список нажимаем на хлебные крошки и получаем ссылку users :D

Код: Выделить всё

   'users'=>'user/index',
  'user/<username:\w+>'=>'user/view',
 
spirit
Сообщения: 207
Зарегистрирован: 2013.10.14, 17:44

Re: URL

Сообщение spirit »

Поторопился я, на странице users стали открываться представления при нажатии на логин, а не на id и ссылка имеет ввид пример user/arman, но при нажатии create user 404 ошибка
Мои правила

Код: Выделить всё


'<controller:\w+>/<id:\d+>'=>'<controller>/view',
 '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

                              
 'users'=>'user/index',
 'user'=>'<controller>/<action>',
 'user/<username:\w+>'=>'user/view',
Подскажите народ кто знает как привести ссылку типа: user/view?username=arman к ввиду user/arman
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: URL

Сообщение Bloom »

Код: Выделить всё

'user_<username:\w+>'=>'user/view',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
 
Сделай вот так. Потом отчисти кеш и пройди по ссылкам заново. Это самый простой, для тебя, способ. Ты ничего не понял из моего предложения выше.
Обязательно сделай именно так и попытайся разобраться что и как передается.

Конкретно в твоем случае 404 в методе create идет вот из-за этого правила: 'user'=>'<controller>/<action>'
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: URL

Сообщение Bloom »

Постараюсь по подробнее, почему 404 выпало.
Применительно для твоего набора правил:

Код: Выделить всё

1 -'<controller:\w+>/<id:\d+>'=>'<controller>/view',
2 -'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
3 -'users'=>'user/index',
4 -'user'=>'<controller>/<action>',
5 -'user/<username:\w+>'=>'user/view',
 
$this->createUrl('/user/create') вернет нам href="r=user/create", т.к. сработало правило 2 обратного преобразования.
Если мы переходим по ссылке href="r=user/create" у нас идет опять сравнение сверху вниз и срабатывает правило 5. В username он передает create. Модель, естественно, такая не находится и вываливается ошибка 404.
Ответить