Cuando uso normal return this->render('create', ['model' => $model]) mi ventana emergente se vuelve loca. Cuando cambio para return $this->renderAjax('create', ['model' => $model]); todo está mágicamente en sus lugares correctos. He buscado bastante para leer sobre renderAjax() pero parece que no hay absolutamente nada por ahí. ¿Alguien puede decirme qué hace? Conozco ajax, pero por lo que sé, generalmente no tiene nada que ver con css o bootstrap.
Para conocer la diferencia entre render() y renderAjax() , primero debe comprender cómo funciona render() .
Básicamente, cuando se llama a render() , cada pieza de código JS y CSS y las referencias de archivo registradas con la vista se recopilan en varias matrices para representarlas más adelante en los lugares adecuados: estos lugares se almacenan en el diseño y su código se representa llamando a beginPage() , head() , beginBody() , endBody() y endPage() .
Puede señalar dónde se debe representar el código JS configurando el segundo parámetro en métodos relacionados, como por ejemplo:
$this->registerJs("alert()", \yii\web\View::POS_HEAD);rinde
<script type="text/javascript">alert()</script> en el diseño donde está el método $this->head() .
Todo funciona bien hasta que desea representar solo una parte principal de la vista sin el diseño. Sin él (y sus métodos como beginPage() ), las referencias JS y CSS no se pueden representar de la manera anterior y es por eso que este elegante código jQuery que gira el cuadrado no funciona: la biblioteca JS no se ha incluido allí.
Cuando llama a $this->render() desde dentro de la vista o simplemente llama a $this->renderPartial() desde el controlador, sucede exactamente esto: el diseño no se aplica.
renderAjax() viene ahora al rescate.
Este método no se preocupa por el diseño porque llama a beginPage() , head() , beginBody() , endBody() y endPage() por sí mismo. Gracias a esto, cada pieza de código JS se puede adjuntar a la vista renderizada y la biblioteca jQuery puede rotar este cuadrado una vez más, incluso cuando se debe hacer dentro de una ventana emergente AJAX.
método público render()
Representa una vista.
La vista a renderizar se puede especificar en uno de los siguientes formatos:
alias de ruta (por ejemplo, " @app/views/site/index "); ruta absoluta dentro de la aplicación (p. ej., " //site/index "): el nombre de la vista comienza con dos barras inclinadas. El archivo de vista real se buscará en la ruta de vista de la aplicación. ruta absoluta dentro del módulo actual (por ejemplo, "/sitio/índice"): el nombre de la vista comienza con una sola barra inclinada. El archivo de vista real se buscará en la ruta de vista del módulo actual. vista relativa (por ejemplo, "índice"): el nombre de la vista no comienza con @ o /. El archivo de vista correspondiente se buscará en la ruta de vista de view $context . Si no se proporciona $context , se buscará en el directorio que contiene la vista que se está representando actualmente (es decir, esto sucede cuando se representa una vista dentro de otra vista).
método público renderAjax()
Representa una vista en respuesta a una solicitud de AJAX.
Este método es similar a render() excepto que rodeará la vista que se está procesando con las llamadas de beginPage(), head(), beginBody(), endBody() y endPage() . Al hacerlo, el método puede inyectar en el resultado de la representación scripts JS/CSS y archivos que están registrados con la vista.