Ya lo solucioné, dejo los códigos por si a alguien le sirven:
Formulario
<?php
/* @var $this CitaController */
/* @var $model Cita */
/* @var $form CActiveForm */
?>
<div class="form">
<?php
$form = $this->beginWidget('CActiveForm', array(
'id' => 'cita-form',
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation' => false,
));
?>
<p class="note" align="center">Campos con <span class="required">*</span> son obligatorios.</p>
<?php echo $form->errorSummary($model); ?>
<table>
<tr>
<td> <?php echo $form->labelEx($model, 'rut_paciente'); ?></td>
<td><?php echo $form->textField($model, 'rut_paciente', array('size' => 20, 'maxlength' => 20, 'id' => 'rut_paciente')); ?><?php echo $form->error($model, 'rut_paciente'); ?></td>
<td><?php echo CHtml::link("Buscar Paciente", '', array('onclick' => '$("#BuscarPaciente").dialog("open"); return false')); ?>
<?php //echo CHtml::link("Buscar Paciente",'', array('onclick'=> 'document.getElementById("pacientes").style.display = "block";')); ?>
</td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'paciente'); ?></td>
<td><?php echo $form->textField($model, 'paciente', array('size' => 20, 'maxlength' => 20, 'id' => 'paciente', 'value' => 'No se encuentra al paciente', 'readOnly' => true)); ?><?php echo $form->error($model, 'paciente'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'apellidos'); ?></td>
<td><?php echo $form->textField($model, 'apellidos', array('size' => 30, 'maxlength' => 30, 'id' => 'apellidos', 'readOnly' => true, 'value' => 'No se encuentra al paciente')); ?><?php echo $form->error($model, 'apellidos'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'direccion'); ?></td>
<td><?php echo $form->textField($model, 'direccion', array('size' => 30, 'maxlength' => 30, 'id' => 'direccion', 'readOnly' => true, 'value' => 'No se encuentra al paciente')); ?><?php echo $form->error($model, 'direccion'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'ciudad'); ?></td>
<td><?php echo $form->textField($model, 'ciudad', array('size' => 20, 'maxlength' => 20, 'id' => 'ciudad', 'readOnly' => true, 'value' => 'No se encuentra al paciente')); ?><?php echo $form->error($model, 'ciudad'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'telefono'); ?></td>
<td><?php echo $form->textField($model, 'telefono', array('size' => 20, 'maxlength' => 20, 'id' => 'telefono', 'readOnly' => true, 'value' => 'No se encuentra al paciente')); ?><?php echo $form->error($model, 'telefono'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'fecha'); ?></td>
<td><?php
$this->widget('zii.widgets.jui.CJuiDatePicker', array(
'attribute' => "fecha",
'model' => $model,
'language' => 'es',
'value' => $model->fecha,
'language' => 'es',
'options' => array(
'autoSize' => true,
'buttonImageOnly' => true,
'dateFormat' => 'yy-mm-dd',
'showButtonPanel' => true,
'changeMonth' => true,
'changeYear' => true,
'minDate' => '1',
'showOtherMonths' => true,
'changeMonth' => 'true',
'changeYear' => 'true',
'yearRange' => '-80',
),
))
?><?php echo $form->error($model, 'fecha'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'hora'); ?></td>
<td><?php echo $form->dropDownList($model, 'hora', $model->getMenuHoras()); ?><?php echo $form->error($model, 'hora'); ?></td>
</tr>
<tr>
<td></td>
<td><?php echo TbHtml::submitButton($model->isNewRecord ? 'Crear' : 'Guardar'); ?></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<script>
$('#rut_paciente').on('keyup', function() {
$.ajax({
url: <?php echo "'" . CController::createUrl('cita/ExistePaciente') . "'"; ?>,
data: {'rut_paciente': $('#rut_paciente').val()},
type: "post",
success: function(data) {
if (data == 0) {
paciente.value = "No se encuentra al paciente";
paciente.disabled = true;
apellidos.value = "No se encuentra al paciente";
apellidos.disabled = true;
ciudad.value = "No se encuentra al paciente";
ciudad.disabled = true;
direccion.value = "No se encuentra al paciente";
direccion.disabled = true;
telefono.value = "No se encuentra al paciente";
telefono.disabled = true;
} else {
var retrievedJSON = data;
var array = JSON.parse(retrievedJSON);
paciente.value = array[0].nombre_paciente;
paciente.disabled = true;
apellidos.value = array[0].apellidos_paciente;
apellidos.disabled = true;
ciudad.value = array[0].ciudad_paciente;
ciudad.disabled = true;
direccion.value = array[0].direccion_paciente;
direccion.disabled = true;
telefono.value = array[0].telefono_paciente;
telefono.disabled = true;
}
}
});
});
</script>
</table>
<?php $this->endWidget(); ?>
</div><!-- form -->
<?php
$this->beginWidget('zii.widgets.jui.CJuiDialog', array(
'id' => 'BuscarPaciente',
'options' => array(
'modal' => true,
'autoOpen' => false,
'show' => array(
'effect' => 'blind',
'duration' => 500,),
'resizable' => false,
'width' => 900,
),
));
//if($comprueba != "si"){
echo $this->renderPartial('pacientes', array(
'modelPaciente' => $modelP
));
//}
$this->endWidget('zii.widgets.jui.CJuiDialog');
?>
Pacientes, lo que se carga en la ventana modal
<?php
$this->widget('bootstrap.widgets.TbGridView', array(
'id' => 'paciente-grid',
'selectableRows' => 1,
'selectionChanged' => 'obtenerSeleccion',
'dataProvider' => $modelPaciente->search(),
'filter' => $modelPaciente,
'columns' => array(
'rut_paciente',
'nombre_paciente',
'apellidos_paciente',
'direccion_paciente',
'ciudad_paciente',
'telefono_paciente',
array(
'class' => 'CButtonColumn',
'template' => '{select}', // botones a mostrar
'buttons' => array(
'select' => array(
'label' => 'Seleccionar',
'click' => 'js:obtenerSeleccion',
),
),
),
),
));
?>
<script>
function obtenerSeleccion() {
var pacienteRut = $.fn.yiiGridView.getSelection('paciente-grid');
rut_paciente.value = pacienteRut;
$.ajax({
url: <?php echo "'" . CController::createUrl('cita/ExistePaciente') . "'"; ?>,
data: {'rut_paciente': $('#rut_paciente').val()},
type: "post",
success: function(data) {
if (data == 0) {
paciente.value = "No se encuentra al paciente";
paciente.disabled = true;
apellidos.value = "No se encuentra al paciente";
apellidos.disabled = true;
ciudad.value = "No se encuentra al paciente";
ciudad.disabled = true;
direccion.value = "No se encuentra al paciente";
direccion.disabled = true;
telefono.value = "No se encuentra al paciente";
telefono.disabled = true;
} else {
var retrievedJSON = data;
var array = JSON.parse(retrievedJSON);
paciente.value = array[0].nombre_paciente;
paciente.disabled = true;
apellidos.value = array[0].apellidos_paciente;
apellidos.disabled = true;
ciudad.value = array[0].ciudad_paciente;
ciudad.disabled = true;
direccion.value = array[0].direccion_paciente;
direccion.disabled = true;
telefono.value = array[0].telefono_paciente;
telefono.disabled = true;
}
}
});
}
</script>
El método create de la cita médica.
Solo la parte que se relaciona con la ventana modal, ya que e método completo es bastante largo
public function actionCreate() {
$model = new Cita;
$modelPaciente = new Paciente;
$comprueba = "no";
if (isset($_GET['Paciente'])) {
$comprueba = "si";
$modelPaciente->attributes = $_GET['Paciente'];
}
}
Saludos