cakephp requestAction метод Просмотреть файл - PullRequest
1 голос
/ 07 апреля 2011

Как я могу вызвать requestAction метод из моего view, к конкретному controller, который returns me дает результаты на основании условий, которые я упомянул?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 07 апреля 2011

Вообще говоря, использование requestAction не очень производительно, потому что оно начинает совершенно новый процесс отправки - по сути, ваше приложение обрабатывает два запроса на каждый запрос, сделанный пользователем.По этой причине вы хотите избегать его использования в максимально возможной степени.При этом, requestAction имеет свое применение, и вы можете уменьшить падение производительности, используя кэширование представлений.

Трудно точно определить, что вы хотите делать с requestAction, но фундаментальная концепция - это вы "просит CakePHP обработать другой запрос, чтобы вы могли просто передать requestAction любой URL, который обрабатывалось бы вашим приложением, если бы он был введен в адресную строку браузера (исключая протокол и имя хоста).Если вы хотите получить коллекцию блогов, управляемых вашим приложением:

  $blogs = $this->requestAction('/blogs/index');

Вы также можете вызвать requestAction, передав ему массив компонентов маршрута, так же, как вы можете передать их в HtmlHelper::link.Таким образом, вы можете извлечь коллекцию блогов следующим образом:

  $blogs = $this->requestAction('controller'=>'blogs', 'action'=>'index');

Поскольку фильтрация набора результатов, возвращаемого requestAction, выполняется снова, передавая условия как часть URL-адреса или компонентов маршрута:

  $blogs = $this->requestAction('/blogs/index/author_id:1234');
  // or
  $blogs = $this->requestAction('controller'=>'blogs', 'action'=>'index', 'author_id' => 1234);

Обратите внимание, что если вы хотите, чтобы запрошенное действие возвращало значения, вам нужно, чтобы действие обрабатывало запросы иначе, чем запросы стандартного действия.Для действия BlogsController::index, о котором я говорил выше, оно может выглядеть примерно так:

class BlogsController extends AppController{
  function index(){
    $conditions = array();
    if ( isset($this->params['author_id'])){
      $conditions['Blog.author_id'] = $this->params['author_id'];
    }

    $blogs = $this->Blog->find('all', array('conditions'=>$conditions);

    if ( isset($this->params['requested']) && $this->params['requested'] == 1){
      return $blogs;
    }
    else{
      $this->set(compact('blogs'));
    }
  }
}

Оператор if, проверяющий наличие и значение $this->params['requested'], является ключевой частью.Он проверяет, было ли действие вызвано requestAction или нет.Если это так, возвращает коллекцию блогов, возвращенную Blog::find;в противном случае он делает коллекцию доступной для представления и позволяет контроллеру продолжать рендеринг представления.

Существует множество нюансов использования requestAction для получения нужных вам конкретных результатов, но приведенное выше должнопредоставить вам основы.Посмотрите ссылки, опубликованные dogmatic69 для получения дополнительной документации, и, конечно, существует множество стековых вопросов по этому вопросу.

Не стесняйтесь комментировать любые последующие действия!Надеюсь, это помогло.

0 голосов
/ 07 апреля 2011
$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
    echo $comment['Comment']['title'];
}

поместите этот код в ваш файл ctp

...