Tengo una función javascript a la que estoy llamando en una página php. También agregué un método json a esta función que extrae datos de la base de datos. Esto es lo que parece:
$this->registerJsFile('/js/restaurant-reserve.js', ['depends' => [JqueryAsset::class]]); $this->registerJs('restaurantReserve.init('. Json::encode($restaurant->workHours) .')');Como resultado, al final de la página, obtengo estos datos en el formulario:
restaurantReserve.init([{"id":86,"restaurant_id":1,"day":"Mon","open":"9.30","close":"14.30","created_at":"2022-02-22 10:56:15"}]) Pero quiero usar estos datos en el propio archivo javascript, donde se encuentra la función restaurantReserve .
Porque ahora tengo que hacerlo manualmente:
let json = [{"id":86,"restaurant_id":1,"day":"Mon","open":"9.30","close":"14.30","created_at":"2022-02-22 10:56:15"}]¿Cómo puedo hacer que los datos json lleguen a javascript para poder usarlos? Para no escribirlo a mano.
actualizar
Una de las respuestas se me ocurrió, fue agregar esta línea, que declarará globalmente esta variable:
$this->registerJs('let json = '. Json::encode($restaurant->workHours) .';'); Pero resulta que esta variable se declara después de la ejecución del script de este archivo restaurant-reserve.js donde se usa esta variable, y no entiendo un poco como hacerla más alta.
Aquí está mi código final en el archivo php:
$this->registerJs('let json = '. Json::encode($restaurant->workHours) .';'); $this->registerJsFile('/js/restaurant-reserve.js', ['depends' => [JqueryAsset::class]]); $this->registerJs('restaurantReserve.init()');Y lo que obtengo como resultado en la página, primero viene el archivo, luego esta variable:
<script src="/js/restaurant-detail.js"></script> <script src="/js/share.js"></script> <script>jQuery(function ($) { let json = [{"id"...}] </script>¿¿Qué se puede hacer??
Puede agregar la siguiente línea en el código
$this->registerJs('let json = '. Json::encode($restaurant->workHours) .';');Actualizando la respuesta después de leer sus comentarios y más consultas.
Puede pasar el segundo parámetro más a la función registerJs. View::POS_READY or View::POS_BEGIN
Me gusta :
$this->registerJs('let json = '. Json::encode($restaurant->workHours) .';', View::POS_READY);El segundo argumento en registerJs está relacionado con este problema.
Es decir, el segundo argumento determina en qué posición debe insertarse el script en la página. Los valores posibles son:
View::POS_HEAD for head section. View::POS_BEGIN for right after opening <body>. View::POS_END for right before closing </body>. View::POS_READY for executing code on the document ready event. This will automatically register jQuery and wrap the code into the appropriate jQuery code. This is the default position. View::POS_LOAD for executing code on the document load event. Same as the above, this will also register jQuery automatically.El primer argumento es el código JS real que queremos insertar en la página. Se envolverá en una etiqueta. El segundo argumento determina en qué posición debe insertarse el script en la página.
Para scriptFiles también puede especificar el lugar y la hora para cargarlo. Según las dependencias y….
Es mejor consultar este enlace .