Подробно о renderPartial в Yii

Функция предназначена для отображения отдельных кусков контента:
  1. $this->renderPartial($view, $data, $return, $processOutput);
Её можно вызывать как в контроллере, так и в любом view-файле.

Параметры:
$view - string имя view-файла, который нужно отобразить.
$data- массив переменных, который будет передан во view-файл.
$return - boolean, если TRUE, тогда вместо вывода на экран результат(HTML-код) будет возвращён и его можно присвоить в переменную и отобразить позже.
$processOutput - boolean, если TRUE, тогда в результате будут присутствовать JavaScrip, CSS и meta -теги, которые были подключены в контроллере или view-файле с помощью конструкции Yii::app()->clientScript. Актуально только при AJAX-запросе, когда на странице нужно исполнить какой-либо JS-код.

Примеры использования:
Предположим, что мы находимся по адресу site/index, и наши view-файлы хранятся в директории /protected/views/site/*.
Так же есть соглашение о именах файлов, которые используются для renderPartial: имя такого файла должно начинаться с нижнего подчёркивания "_", но это не обязательно.

1) 10 раз вывести на экран содержимое файла "_view":
  1. for($i=1; $i<=10; $i++) {
  2. $this->renderPartial('_view', array('stage'=>$i));
  3. }
Сам файл "_view":
  1. <?php echo 'Шаг №'.$stage; ?><br />
В результате на выходе мы получаем:
Шаг №1
Шаг №2
...
Шаг №10

2) Возвратить результат в переменную для того, чтобы проставить теги <hr /> между всеми строками из предыдущего примера:
  1. $buffer = array();
  2. for($i=1; $i<=10; $i++) {
  3. $buffer[] = $this->renderPartial('_view', array('stage'=>$i), TRUE);
  4. }
  5. echo implode('<hr />', $buffer);


3) При нажатии на кнопку "Удалить из друзей" отправлять AJAX-запрос на удаление и обновление блока со списком друзей:

friends.php:
  1. <div id="friends">
  2. <?php
  3. foreach ($friends as $friend) {
  4. $this->renderPartial('_friend', array('model'=>$friend));
  5. } ?>
  6. </div>

_friend.php:
  1. <div>
  2. <?php echo CHtml::encode($friend->name); ?><br />
  3. <?php echo CHtml::ajaxLink('Удалить', array('removeFriend', 'id'=>$model->id),
  4. array('update'=>'#friends'),
  5. array('confirm'=>'Вы действительно хотите удалить друга?'));
  6. ?>
  7. </div>

Controller:
  1. public function actionRemoveFriend($id) {
  2. Friends::removeFriend($id);
  3. if (Yii::app()->request->isAjaxRequest) {
  4. $friends = Friends::getFriends();
  5. foreach ($friends as $friend) {
  6. $this->renderPartial('_friend', array('model'=>$friend), false, TRUE);
  7. }
  8. Yii::app()->end();
  9. } else {
  10. $this->redirect('index');
  11. }
  12. }

Если последний четвёртый параметр в renderPartial установлен в TRUE, тогда кроме содержимого view-файла будет содержаться и JS-код, который генерирует CHtml::ajaxLink

Comments (8)

  • Женя
    Женя Reply #

    Спасибо)

  • Роман
    Роман Reply #

    Здравствуйте, Иван!
    Вот Вы пишете:
    "...имя такого файла должно начинаться с нижнего подчёркивания..."
    А бывают ли верхние подчеркивания? Да, все так говорят, но надо ли быть как все?

    • Владимир
      Владимир Reply #

      Здравствуйте, Роман. Бывает просто подчеркивание, согласитесь?

      • Sergey
        Sergey Reply #

        Соглашусь с Романом. Подчеркивания бывают. Но они всегда внизу. Т.к. выше это не подчеркивание, по середине - зачеркивание. А вот внизу - подчеркивание. Не правильно говорить "верхнее подчеркивание" или "подчеркивание по середине". Так и неправильно говорить "нижнее подчеркивание".
        Зануда mode off

  • Александр
    Александр Reply #

    Здравствуйте!
    Подскажите, пожалуйста, почему, когда использую renderPartial внутри view пропадает шаблон?

  • ksenia
    ksenia Reply #

    Hi

    • manjar
      manjar Reply #

      hahaha

  • manjar
    manjar Reply #

    good work


Leave a comment