Не получается сделать корректную сылку на элемент с БД в GridView

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

Не получается сделать переход в p1/p2?id=1 (p1/p2?id=2 ....)
Получается или так: p1/p2?id= или так: p1/1(p1/2...)

В Представлении делаю так:

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

 ( [ 'dataProvider' => $dataProvider,
           'columns' =>  [   ['class' => 'yii\grid\SerialColumn' ], 
            [ 'attribute' => 'p1', 
              'format' => 'raw',   'value' => function($model)
              {
               return Html::a ($model->p1, $model->getParentName() );
            }
  


В моделе так:

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

   public function getParentName()
    {
       $parent = Url::toRoute(['p1/p2','id'=>$data]);//id;
       //$parent = Url::toRoute(['id']);
   //    $parent = $this->id;
        return $parent ? $parent : '';
    } 
   
Подскажите чего не хватает?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение andku83 »

а ваш urlManager точно понимает такой роут? - 'p1/p2'
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение dmg »

Rabijko писал(а): 2018.04.19, 16:31

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

   public function getParentName()
    {
       $parent = Url::toRoute(['p1/p2','id'=>$data]);//id;
       //$parent = Url::toRoute(['id']);
   //    $parent = $this->id;
        return $parent ? $parent : '';
    } 
   
Подскажите чего не хватает?
и в $data что у вас?
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

andku83 писал(а): 2018.04.19, 17:52 а ваш urlManager точно понимает такой роут? - 'p1/p2'
Переход проходит на p1/p2, а надо сделать в p1/p2/?id=1 (2,3...) То есть понимает)
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

dmg писал(а): 2018.04.19, 19:47 и в $data что у вас?
Честно говоря, не знаю... даже не знаю как проверить, что там счас, похоже ничего, если делаю так:

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

 $parent = Url::toRoute(['p1/p2','id'=>'1']) 

То получается переход везде на p1/p2?id=1, помогите сделать чтоб переход был на соответствующие с таблицы id страницы везде.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение someweb »

У вас $data неопределенна, откуда она взялась?
Должно быть как то так
return $this->parent->id ? Url::toRoute(['p1/p2','id'=>$this->parent->id]) : '';

P. S.
Yii::debug($data) запишет в лог.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

someweb писал(а): 2018.04.20, 09:13 У вас $data неопределенна, откуда она взялась?
Должно быть как то так
return $this->parent->id ? Url::toRoute(['p1/p2','id'=>$this->parent->id]) : '';
На такую строку браузер
Unknown Property – yii\base\UnknownPropertyException
Getting unknown property: yii\web\View::parent
Я понимаю, что в моделе надо как-то совместить 2 недоработки:

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

 //$parent = Url::toRoute(['p1/p2','id'=>'1']); //даёт переходы на корень/p1/p2?id=1 
и

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

 //$parent = $this->id;//даёт переходы на корень/1, корень/2... 
но никак не выходит :(
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение someweb »

так опишите парент, и не будет Unknown Property

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

    public function getParent()
    {
        return $this->hasOne(self::class, ['id' => 'parent_id']);
    }
В таблице должно быть поле parent_id
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

someweb писал(а): 2018.04.20, 11:14 так опишите парент, и не будет Unknown Property
Подскажите где и как описать этот парент.

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

    public function getParent()
    {    return $this->hasOne(self::class, ['id' => 'parent_id']);  }
В таблице должно быть поле parent_id
В таблице такого поля нету и у меня нет возможности её менять (пользуюсь не только я и БД не моя). Есть поле id, то есть код будет такой:

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

  public function getParent()
    {    return $this->hasOne(self::class, ['id' => 'parent_id']);  } 
Но парент всё же где-то и как-то надо описать.

P.S. простите, я совсем новичёк :(
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение andku83 »

у вас хоть где-то (к примеру админке) дерево категорий строится?
посмотрите там как приложение определяет кто чей родитель
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Dominus »

Rabijko писал(а): 2018.04.20, 11:43
someweb писал(а): 2018.04.20, 11:14 так опишите парент, и не будет Unknown Property
Подскажите где и как описать этот парент.

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

    public function getParent()
    {    return $this->hasOne(self::class, ['id' => 'parent_id']);  }
В таблице должно быть поле parent_id
В таблице такого поля нету и у меня нет возможности её менять (пользуюсь не только я и БД не моя). Есть поле id, то есть код будет такой:

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

  public function getParent()
    {    return $this->hasOne(self::class, ['id' => 'parent_id']);  } 
Но парент всё же где-то и как-то надо описать.

P.S. простите, я совсем новичёк :(
А по какому полю у вас происходит наследование, если нет parent_id? Если такого поля нет, то возможно оно называется по другому. Конечно желательно бы код модели глянуть, а то информации мало.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

Dominus писал(а): А по какому полю у вас происходит наследование, если нет parent_id? Если такого поля нет, то возможно оно называется по другому. Конечно желательно бы код модели глянуть, а то информации мало.
Ну вот вся модель:

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

 <?php
namespace frontend\models;
use Yii;
use yii\helpers\Url;
class Occupation extends \yii\db\ActiveRecord
{      public static function tableName()
    {        return 'ra';    }
    public function rules()
    {   return [   [['raname'], 'string', 'max' => 100],
            [['racode'], 'string', 'max' => 10],
        ];  }
    public function attributeLabels()
    {     return [  'id' => 'ID', [['ra'],'required'],
            'raname' => 'Имя',   'racode' => 'Код',
       ];  }
    public function getParentName()
    {
        $parent = Url::toRoute(['p1/p2','id'=>'1']);
         return  $parent ? $parent : '';
    } } 
Вдруг чем-то поможет))
А по какому полю у вас происходит наследование, если нет parent_id?
Вопрос не понял и ответить не могу((
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение someweb »

Схему таблицы ra приведите.
Вопрос не понял и ответить не могу((
Как найти родительскую запись?

И что делает [['ra'],'required'], в attributeLabels?!
Последний раз редактировалось someweb 2018.04.20, 15:12, всего редактировалось 1 раз.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Dominus »

И уберите из attributeLabels()

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

[['ra'], 'required'],
Это должно быть в rules()

Если racode уникальный, то ищите по этому полю.
Или что у вас записывается в поле ra, возможно по этому полю, если оно выполняет роль parent_id.

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

public function getParentName()
    {
        $parent = Url::toRoute(['p1/p2', 'id' => $this->ra]);
        return $parent ? $parent : '';
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

Всем спасибо помогли мне объединить эти 2 строчки... в итоге в представлении осталось:

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

 return Html::a ($model->ra, $model->getParentName() );
А в моделе получилось вот так:

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

     public function getParentName()
    {   $parent = Url::toRoute(['p1/p2','id'=>$this->id]);
   	return  $parent ? $parent : '';
    } 
Работает, как запланировано! :)
Последний раз редактировалось Rabijko 2018.04.20, 15:58, всего редактировалось 1 раз.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение andku83 »

getParentName() - правильнее имя было бы getUrl() или getRoute()
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Dominus »

Да, parent сбивает с толку, он тут вообще не причем))
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: Не получается сделать корректную сылку на элемент с БД в GridView

Сообщение Rabijko »

andku83 писал(а): 2018.04.20, 15:55 getParentName() - правильнее имя было бы getUrl() или getRoute()
Вы правы, переименовал в getUrl() всё работает так же :)
Ответить