2015-12-23 3 views
0

Используя Yii2, я пытаюсь создать detailView. Я хочу скрыть пустые строки, и поэтому я использую kartik-v detailview. Однако я также хочу скрыть атрибуты, если они соответствуют определенному условию. Поэтому я наткнулся на вопрос this SO, который отражает намерение моего вопроса. Однако он не отвечает на это удовлетворительно. (This question спрашивает примерно одно и то же). ПримерУсловно вставить атрибуты в View array array

<?= DetailView::widget([ 
    'hideIfEmpty' => true, //available in kartik's detailview 
    'model' => $model, 
    'attributes' => [ 
     'id', 
     'name', //cant be null, always shown 
     'description:ntext', //can be null, so hidden thanks to kartiks detailview 
     isAdmin() ? "password" :"", //an example, of course 
     "hypotheticalOtherField", 
     isAdmin() ? [ 
      'attribute'=>'client', 
      'format'=>'raw', 
      'value'=>function($object) { 
       return Html::button("MyButton".$object->client); 
      } 
     ] : "" 
    ] 
]) ?> 

Как вы можете видеть, я хочу показать некоторые поля на основе (в этом примере), является ли пользователь администратором. К сожалению, вставляя в массив атрибутов, пустые массивы или нулевые значения, если условие не выполняется, возникает ошибка (IE The attribute must be specified in the format of "attribute", "attribute:format" or "attribute:format:label" при вставке пустых строк)

Я полагаю, что я мог бы создать массив атрибутов следующим образом:

$attrs = ['id','name','description:ntext']; 
if (isAdmin()) array_push($attrs, "password"); 
array_push($attrs, "hypotheticalOtherField"); 
if (isAdmin()) array_push($attrs, [ 
    'attribute'=>'client', 
    'format'=>'raw', 
    'value'=>function($object) { 
     return Html::button("MyButton".$object->client); 
    } 
]); 

echo DetailView::widget([ 
    'hideIfEmpty' => true, //available in kartik's detailview 
    'model' => $model, 
    'attributes' => $attrs 
]); 

, но тогда общий обзор с стандартным расположением кода Yii2 серьезно подорван.

Так есть какой-то способ условно вставить значения в массив, поэтому я могу сохранить кодировку Yii-стиля: эстетичный, организованный и незагроможденный? Или, может быть, значение из которого Yii2 знает, что это должно быть пропущена при создании View

+0

Почему, по вашему мнению, массив атрибутов не очень хорош? Вы, кажется, только проблема с дизайном кода .... я отправляю aswer с вами код, соответствующий стилю yii2 и хорошей практике. см., если вам нравится – scaisEdge

+0

«Я хочу скрыть пустые строки, и поэтому я использую kartik-v detailview» - вы можете сделать это с представлением по умолчанию, не нужно для сторонних аддонов – Coz

+0

@Coz Так как же это сделать? Я больше не могу использовать атрибут «hideIfEmpty», потому что это атрибут kartiks, но я использую подробный просмотр kartiks из-за этого атрибута – stealthjong

ответ

0

Если вы попытаетесь с массивом добавить стенографии и внешний вид кода более yii2 стильный

Атрибут на основе массива является правильным (хорошая практика.

$attrs[] = ['id','name','description:ntext']; 

if (isAdmin()) { 
    $attrs[] = ['password']; 
} 
$attrs[] = ['hypotheticalOtherField'] 

if (isAdmin()) { 
    $attrs[] = [ 
     'attribute'=>'client', 
     'format'=>'raw', 
     'value'=>function($object) { 
      return Html::button("MyButton".$object->client); 
    } 
} 

echo DetailView::widget([ 
    'hideIfEmpty' => true, //available in kartik's detailview 
    'model' => $model, 
    'attributes' => $attrs 
]); 
1

Вы можете использовать visible для DetailView

<?= DetailView::widget([ 
'hideIfEmpty' => true, //available in kartik's detailview 
'model' => $model, 
'attributes' => [ 
    'id', 
    'name', //cant be null, always shown 
    'description:ntext', //can be null, so hidden thanks to kartiks detailview 
     [ 
      'visible' => (isAdmin() ? true : false), 
      'value' => $model->password, 
      'label' => 'test' 
     ],  
]) ?> 

Добавить каком бы состоянии вы хотите добавить !!! в visible

+0

Это действительно работает, но не в подробном обзоре Картика. Он только позиционирует атрибут 'visible' => false в нижней части подробного представления. – stealthjong