在CakePHP中的方法中从模型发送单个对象

时间:2012-02-26 02:58:39

标签: php cakephp cakephp-2.0 cakephp-appmodel

我基本上是在将对象发送到视图之前进行格式化(在foreach()上使用$submissions。我遇到的问题是parse_url()只接受一个索引不是整个数组对象。

我的SubmissionsController中有这个方法:

public function newest() {        
    $submissions = $this->Submission->find('all', array(
        'conditions' => array('Submission.approved' => '1'),
        'order' => 'Submission.created DESC'
            ));

    $this->set('submissions', $submissions);
    $this->set('sourceShortUrl', AppController::shortSource($submissions));
}

在我的AppController中,我有这个方法返回格式化的URL:

protected function shortSource($source) {
    return $sourceShortUrl = str_ireplace('www.', '', parse_url($source, PHP_URL_HOST));
}

这适用于单个条目,但是parse_url不能接受数组,所以在控制器中有一种方法可以发送对象的索引吗?例如。在我在视图中循环它之前,$ submissions ['Submission'] ['source']?

我的替代方法是在我的shortSource($source)方法中执行类似的操作:

if (is_array($source)) {
    for ($i = 0; $i < count($source); $i++) {
        return $sourceShortUrl = str_ireplace('www.', '', parse_url($source[$i]['Submission']['source'], PHP_URL_HOST));
    }
}

但那只是回归第一个(显然)。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。检查一个数组。如果它是一个数组,则为数组中的每个项递归调用它。

/**
* shortSource
*
* Returns an array of URLs with the www. removed from the front of the domain name.
* 
* @param mixed $source Either a string or array
* @return mixed $sourceShortUrl An array of URLs or a single string
*/
protected function shortSource($source) {
    if (is_array($source)) {
        foreach ($source as $url) {
            $sourceShortUrl[] = $this->shortSource($url);
        }
    } else {
        $sourceShortUrl = str_ireplace('www.', '', parse_url($source, PHP_URL_HOST));
    }
    return $sourceShortUrl;
}

在这个递归函数中,它将解析单个字符串或字符串数​​组。

// in the view
if (is_array($sourceShortUrl)) {
    foreach ($sourceShortUrl as $url) {
        // view specific code for URL here
    }
}