Отправить один объект из модели в методе внутри CakePHP - PullRequest
1 голос
/ 26 февраля 2012

Я в основном форматирую URL перед отправкой моего объекта в представление для циклического просмотра (с 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 Ответ

1 голос
/ 26 февраля 2012

Вы на правильном пути.Проверьте массив.Если это массив, вызывайте его рекурсивно для каждого элемента в массиве.

/**
* 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
    }
}
...