yiisoft / yii2-debug

Debug Extension for Yii 2
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
202 stars 150 forks source link

Tab User warning #200

Closed Blacknife closed 7 years ago

Blacknife commented 7 years ago

If the field data in the role contains serialized array, the tab User in debug i get this warning:

PHP Warning – yii\base\ErrorException htmlspecialchars() expects parameter 1 to be string, array given

Additional info

Q A
Yii version 2.0.11.2
yii-debug version 2.0.8
PHP version 7.0.8
Operating system Ubuntu 16.04 or Windows 7
samdark commented 7 years ago

@Blacknife would you please provide a clean way to reproduce the issue and a full stacktrace?

Blacknife commented 7 years ago

The documentation stated, that in column data object yii\rbac\Role can be stored mixed data: https://github.com/yiisoft/yii2/blob/master/framework/rbac/Item.php#L40

In my case necessary store an array specific data for role.

For example:

nametypedescriptionrule_namedatacreated_atupdated_at
buhgalter1БухгалтерNULLa:2:{s:7:"default";b:1;s:16:"conductUndoTimes";a:2:{s:11:"realization";s:5:"25200";s:6:"return";s:6:"705600";}}14874527091487452709

GridView in tab User expects a string: https://github.com/yiisoft/yii2-debug/blob/master/views/default/panels/user/detail.php#L30

Full StackTrace:

0 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\web\ErrorHandler.php(199): ReflectionMethod->__construct('yii\widgets\Bas...', 'yii\widgets\{cl...')

1 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\views\errorHandler\callStackItem.php(26): yii\web\ErrorHandler->addTypeLinks('yii\widgets\Bas...')

2 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\web\ErrorHandler.php(249): require('F:\OpenServer.5...')

3 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\web\ErrorHandler.php(307): yii\web\ErrorHandler->renderFile('@yii/views/erro...', Array)

4 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\views\errorHandler\exception.php(385): yii\web\ErrorHandler->renderCallStackItem(NULL, NULL, 'yii\widgets\Bas...', 'yii\widgets\{cl...', Array, 15)

5 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\web\ErrorHandler.php(249): require('F:\OpenServer.5...')

6 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\web\ErrorHandler.php(113): yii\web\ErrorHandler->renderFile('@yii/views/erro...', Array)

7 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\base\ErrorException))

8 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\base\ErrorException))

9 {main}

Previous exception: yii\base\ErrorException: htmlspecialchars() expects parameter 1 to be string, array given in F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\helpers\BaseHtml.php:104 Stack trace:

0 [internal function]: yii\base\ErrorHandler->handleError(2, 'htmlspecialchar...', 'F:\OpenServer.5...', 104, Array)

1 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\helpers\BaseHtml.php(104): htmlspecialchars(Array, 11, 'UTF-8', true)

2 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\i18n\Formatter.php(351): yii\helpers\BaseHtml::encode(Array)

3 [internal function]: yii\i18n\Formatter->asText(Array)

4 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\i18n\Formatter.php(316): call_user_func_array(Array, Array)

5 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\grid\DataColumn.php(227): yii\i18n\Formatter->format(Array, 'text')

6 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\grid\Column.php(110): yii\grid\DataColumn->renderDataCellContent(Object(yii\rbac\Role), 'root', 0)

7 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\grid\GridView.php(507): yii\grid\Column->renderDataCell(Object(yii\rbac\Role), 'root', 0)

8 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\grid\GridView.php(476): yii\grid\GridView->renderTableRow(Object(yii\rbac\Role), 'root', 0)

9 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\grid\GridView.php(347): yii\grid\GridView->renderTableBody()

10 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\widgets\BaseListView.php(155): yii\grid\GridView->renderItems()

11 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\grid\GridView.php(316): yii\widgets\BaseListView->renderSection('{items}')

12 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\widgets\BaseListView.php(130): yii\grid\GridView->renderSection('{items}')

13 [internal function]: yii\widgets\BaseListView->yii\widgets{closure}(Array)

14 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\widgets\BaseListView.php(133): preg_replace_callback('/{\w+}/', Object(Closure), '{summary}\n{item...')

15 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\grid\GridView.php(291): yii\widgets\BaseListView->run()

16 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\Widget.php(139): yii\grid\GridView->run()

17 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2-debug\views\default\panels\user\detail.php(25): yii\base\Widget::widget(Array)

18 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\View.php(328): require('F:\OpenServer.5...')

19 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\View.php(250): yii\base\View->renderPhpFile('F:\OpenServer.5...', Array)

20 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\View.php(152): yii\base\View->renderFile('F:\OpenServer.5...', Array, NULL)

21 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2-debug\panels\UserPanel.php(44): yii\base\View->render('panels/user/det...', Array)

22 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2-debug\views\default\view.php(93): yii\debug\panels\UserPanel->getDetail()

23 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\View.php(328): require('F:\OpenServer.5...')

24 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\View.php(250): yii\base\View->renderPhpFile('F:\OpenServer.5...', Array)

25 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\View.php(152): yii\base\View->renderFile('F:\OpenServer.5...', Array, Object(yii\debug\controllers\DefaultController))

26 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\Controller.php(381): yii\base\View->render('view', Array, Object(yii\debug\controllers\DefaultController))

27 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2-debug\controllers\DefaultController.php(93): yii\base\Controller->render('view', Array)

28 [internal function]: yii\debug\controllers\DefaultController->actionView('58ab80f609263', 'user')

29 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)

30 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)

31 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('view', Array)

32 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('debug/default/v...', Array)

33 F:\OpenServer.5.2.5\domains\mkrep.loc\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))

34 F:\OpenServer.5.2.5\domains\mkrep.loc\backend\web\index.php(18): yii\base\Application->run()

35 {main}

samdark commented 7 years ago

@Blacknife can you check if my fix works in your case?

Blacknife commented 7 years ago

@samdark It worked, when added before the foreach convert an object to an array:

$roles = ArrayHelper::toArray($roles);
foreach ($roles as &$role) {
    $role['data'] = $this->dataToString($role['data']);
}

$permissions = ArrayHelper::toArray($permissions);
foreach ($permissions as &$permission) {
    $permission['data'] = $this->dataToString($permission['data']);
}