在数组中的值需要作为字符串输出,将用作代码

时间:2015-01-06 10:22:08

标签: php arrays cakephp parameters

我不确定我是否在标题中写过了一些东西。

我会尝试用一些代码行来解释。首先是一些信息。 我正在使用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')
    );

在视图中我只是循环,如果"授权"如果设置为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>&nbsp;</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>

我想要实现的是用逗号分隔的值应该被读作不同的变量。

老实说,我从来没有遇到过像这样的情况,我也不知道在谷歌上寻找什么适合寻找合适的东西(非英语母语并不帮助)所以任何建议都是欢迎。

EDIT1

为了澄清,第二个框中列出的代码(以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()字符串。

所以我要求的是,是否有我失踪的功能,选项或做法。

EDIT2

正如用户user221931指出的那样,CakePhP函数应该以{{1​​}}的形式支持多个参数作为数组。

所以我尝试删除array('parameter1', 'parameter2', 'paramenterN')支票并简单地传递is_array()的值。视图部分现在看起来像这样:

$action['parameters']

但是我收到了如下警告:

  

rawurlencode()期望参数1为字符串,给定数组

打开警告的上下文,似乎CakePhP正在阅读提供的信息如下:

<?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']
                        )); ?>

老实说,我在这里迷了路。

我已经尝试将数组的第二个值更改为字符串并传递一个关联数组而不是数字只是为了尝试一些明显但错误仍然存​​在且链接在没有参数的情况下被截断。

1 个答案:

答案 0 :(得分:1)

使用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);

此外,您可以将您的参数数组作为网址内嵌,即:

$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
    ));