数组中的值需要输出为将用作代码的字符串
Having values in array that need to be output as string that will be used as code
我也不确定我是否在标题中写了一些可以理解的东西。
我会尝试用一些代码行来解释。首先是一些信息。
我正在使用 CakePhP,在为允许的操作创建数组时出现了这个问题。
长话短说,如果当前用户有权访问该页面上可用的操作,我将使用 ACL 检查每次加载页面时的情况。这是一个例子:
//Controller
$role = $this->User->Role;
$role->id = $this->Auth->user('Role.id');
$actionsMenu = array();
$actionsMenu['Files'] = array(
'label' => 'Manage Files',
'controller' => 'project_files',
'action' => 'index',
'parameters' => $id,
'authorized' => $this->Acl->check($role, 'ProjectFiles')
);
$actionsMenu['Groups'] = array(
'label' => 'Manage Groups',
'controller' => 'groups',
'action' => 'index',
'parameters' => $id,
'authorized' => $this->Acl->check($role, 'Groups')
);
在视图中我只是循环,如果 "authorized" 设置为 true,我将打印相关按钮。
现在,当我要传递一个以上的参数时,问题就出现了。这是上面那个之后的另一个片段:
//Controller [following]
$this->Project->id = $id;
if ($this->Project->field('archived')) {
$actionsMenu['Archiviation'] = array(
'label' => 'Restore',
'controller' => 'projects',
'action' => 'archiviation',
'parameters' => array($id, 0),
'authorized' => $this->Acl->check($role, 'controllers/Projects/archiviation')
);
} else {
$actionsMenu['Archiviation'] = array(
'label' => 'Archive',
'controller' => 'projects',
'action' => 'archiviation',
'parameters' => array($id, 1),
'authorized' => $this->Acl->check($role, 'controllers/Projects/archiviation')
);
}
这是您可以在视图中找到的内容:
//View
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>
<li><?php echo $this->Html->link(__('<- Projects Management'), array('action' => 'index')); ?></li>
<li> </li>
<?php foreach($actionsMenu as $action) : ?>
<?php if($action['authorized']) : ?>
<li><?php echo $this->Html->link(__($action['label']), array('controller' => $action['controller'], 'action' => $action['action'],
is_array($action['parameters']) ? implode(', ', $action['parameters']) : $action['parameters']
)); ?></li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
我认为数组格式是 CakePhP 最友好的传递值的方式,只是发现在有多个参数的情况下,cake 倾向于使用关联数组。
这里的问题是 CakePhP 将内爆读取为由字符串组成的整个参数。
这是一个例子:
<!--HTML-->
<a href="/projects/archiviation/14%2C%200">Restore</a>
我想实现的是逗号分隔的值应该被读取为不同的变量。
老实说,我从来没有 运行 遇到过这样的情况,而且我也不知道要在 google 上寻找什么才能找到合适的东西(non-native 说英语是'帮助)所以欢迎任何建议。
编辑1
澄清一下,第二个框中列出的代码(以 Controller [following]
开头)是导致问题的代码。
前一个框只是用一个参数构建数组,与 CakePhP for building link 的简单结构相匹配,但第二个框需要传递第二个参数。如果值是静态的,可以简单地键入如下内容:
//CakePhP HTML::Link
echo $this->Html->link(
'text of link',
array(
'controller' => 'controller_name',
'action' => 'action_name',
'parameter1', 'parameter2'
));
如果我将参数列表作为字符串发送,Cake 会将它们视为单个参数,读取方式类似于 (string)("'parameter1', 'parameter2'")
。
同样的情况也发生在我上面写的代码中,我用 implode()
.
将值数组转换为字符串
所以我要问的是,是否有我缺少的功能、选项或做法。
编辑2
正如用户user221931所指出的,CakePhP函数应该支持array('parameter1', 'parameter2', 'paramenterN')
.
形式的多个参数作为数组
所以我尝试只删除 is_array()
检查并简单地传递 $action['parameters']
的值。视图部分现在如下所示:
<?php echo $this->Html->link(__($action['label']), array(
'controller' => $action['controller'],
'action' => $action['action'],
//is_array($action['parameters']) ? implode(', ', $action['parameters']) : $action['parameters']
$action['parameters']
)); ?>
但是我收到如下警告:
rawurlencode() expects parameter 1 to be string, array given
要打开警告的上下文,好像 CakePhP 正在读取提供的信息如下:
$params = array(
'controller' => 'projects',
'action' => 'archiviation',
'plugin' => null,
'pass' => array(
(int) 0 => array(
(int) 0 => '1',
(int) 1 => (int) 1
)
),
'named' => array()
)
老实说,我在这里迷路了。
我也尝试将数组的第二个值更改为字符串并传递关联数组而不是数字只是为了尝试一些明显的事情但错误仍然存在并且 link 出来 t运行无参数分类。
使用的正确格式Html::link()
echo $this->Html->link(
'text of link',
array(
'controller' => 'users', //Or any controller name
'action' => 'view', //Or any action
1, //Several parameters
'test1', //go here
'test2'
)
);
如果你事先不知道参数个数,你只需要array_merge
你的固定数组和动态参数数组。
假设 $arrayOfParameters
成立 array('test1', 'test2', 'test3')
$urlArray = array_merge(
array('controller' => 'users', 'action' => 'view'),
$arrayOfParameters
);
echo $this->Html->link('text of link', $urlArray);
此外,您可以将参数数组内爆为 url,即:
$urlString = implode('/', $arrayOfParameters); //creates a string 'test1/test2/test3'
echo $this->Html->link('text of link', array(
'controller' => 'users',
'action' => 'view',
$urlString //One parameter that will be looking as many
));
我也不确定我是否在标题中写了一些可以理解的东西。
我会尝试用一些代码行来解释。首先是一些信息。 我正在使用 CakePhP,在为允许的操作创建数组时出现了这个问题。
长话短说,如果当前用户有权访问该页面上可用的操作,我将使用 ACL 检查每次加载页面时的情况。这是一个例子:
//Controller
$role = $this->User->Role;
$role->id = $this->Auth->user('Role.id');
$actionsMenu = array();
$actionsMenu['Files'] = array(
'label' => 'Manage Files',
'controller' => 'project_files',
'action' => 'index',
'parameters' => $id,
'authorized' => $this->Acl->check($role, 'ProjectFiles')
);
$actionsMenu['Groups'] = array(
'label' => 'Manage Groups',
'controller' => 'groups',
'action' => 'index',
'parameters' => $id,
'authorized' => $this->Acl->check($role, 'Groups')
);
在视图中我只是循环,如果 "authorized" 设置为 true,我将打印相关按钮。
现在,当我要传递一个以上的参数时,问题就出现了。这是上面那个之后的另一个片段:
//Controller [following]
$this->Project->id = $id;
if ($this->Project->field('archived')) {
$actionsMenu['Archiviation'] = array(
'label' => 'Restore',
'controller' => 'projects',
'action' => 'archiviation',
'parameters' => array($id, 0),
'authorized' => $this->Acl->check($role, 'controllers/Projects/archiviation')
);
} else {
$actionsMenu['Archiviation'] = array(
'label' => 'Archive',
'controller' => 'projects',
'action' => 'archiviation',
'parameters' => array($id, 1),
'authorized' => $this->Acl->check($role, 'controllers/Projects/archiviation')
);
}
这是您可以在视图中找到的内容:
//View
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>
<li><?php echo $this->Html->link(__('<- Projects Management'), array('action' => 'index')); ?></li>
<li> </li>
<?php foreach($actionsMenu as $action) : ?>
<?php if($action['authorized']) : ?>
<li><?php echo $this->Html->link(__($action['label']), array('controller' => $action['controller'], 'action' => $action['action'],
is_array($action['parameters']) ? implode(', ', $action['parameters']) : $action['parameters']
)); ?></li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
我认为数组格式是 CakePhP 最友好的传递值的方式,只是发现在有多个参数的情况下,cake 倾向于使用关联数组。 这里的问题是 CakePhP 将内爆读取为由字符串组成的整个参数。
这是一个例子:
<!--HTML-->
<a href="/projects/archiviation/14%2C%200">Restore</a>
我想实现的是逗号分隔的值应该被读取为不同的变量。
老实说,我从来没有 运行 遇到过这样的情况,而且我也不知道要在 google 上寻找什么才能找到合适的东西(non-native 说英语是'帮助)所以欢迎任何建议。
编辑1
澄清一下,第二个框中列出的代码(以 Controller [following]
开头)是导致问题的代码。
前一个框只是用一个参数构建数组,与 CakePhP for building link 的简单结构相匹配,但第二个框需要传递第二个参数。如果值是静态的,可以简单地键入如下内容:
//CakePhP HTML::Link
echo $this->Html->link(
'text of link',
array(
'controller' => 'controller_name',
'action' => 'action_name',
'parameter1', 'parameter2'
));
如果我将参数列表作为字符串发送,Cake 会将它们视为单个参数,读取方式类似于 (string)("'parameter1', 'parameter2'")
。
同样的情况也发生在我上面写的代码中,我用 implode()
.
所以我要问的是,是否有我缺少的功能、选项或做法。
编辑2
正如用户user221931所指出的,CakePhP函数应该支持array('parameter1', 'parameter2', 'paramenterN')
.
所以我尝试只删除 is_array()
检查并简单地传递 $action['parameters']
的值。视图部分现在如下所示:
<?php echo $this->Html->link(__($action['label']), array(
'controller' => $action['controller'],
'action' => $action['action'],
//is_array($action['parameters']) ? implode(', ', $action['parameters']) : $action['parameters']
$action['parameters']
)); ?>
但是我收到如下警告:
rawurlencode() expects parameter 1 to be string, array given
要打开警告的上下文,好像 CakePhP 正在读取提供的信息如下:
$params = array(
'controller' => 'projects',
'action' => 'archiviation',
'plugin' => null,
'pass' => array(
(int) 0 => array(
(int) 0 => '1',
(int) 1 => (int) 1
)
),
'named' => array()
)
老实说,我在这里迷路了。
我也尝试将数组的第二个值更改为字符串并传递关联数组而不是数字只是为了尝试一些明显的事情但错误仍然存在并且 link 出来 t运行无参数分类。
使用的正确格式Html::link()
echo $this->Html->link(
'text of link',
array(
'controller' => 'users', //Or any controller name
'action' => 'view', //Or any action
1, //Several parameters
'test1', //go here
'test2'
)
);
如果你事先不知道参数个数,你只需要array_merge
你的固定数组和动态参数数组。
假设 $arrayOfParameters
成立 array('test1', 'test2', 'test3')
$urlArray = array_merge(
array('controller' => 'users', 'action' => 'view'),
$arrayOfParameters
);
echo $this->Html->link('text of link', $urlArray);
此外,您可以将参数数组内爆为 url,即:
$urlString = implode('/', $arrayOfParameters); //creates a string 'test1/test2/test3'
echo $this->Html->link('text of link', array(
'controller' => 'users',
'action' => 'view',
$urlString //One parameter that will be looking as many
));