Closed Blacknife closed 7 years ago
@Blacknife would you please provide a clean way to reproduce the issue and a full stacktrace?
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:
name | type | description | rule_name | data | created_at | updated_at |
---|---|---|---|---|---|---|
buhgalter | 1 | Бухгалтер | NULL | a:2:{s:7:"default";b:1;s:16:"conductUndoTimes";a:2:{s:11:"realization";s:5:"25200";s:6:"return";s:6:"705600";}} | 1487452709 | 1487452709 |
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}
@Blacknife can you check if my fix works in your case?
@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']);
}
If the field
data
in the role contains serializedarray
, the tabUser
in debug i get this warning:PHP Warning – yii\base\ErrorException htmlspecialchars() expects parameter 1 to be string, array given
Additional info