Como recuperar datos ajax sobre yii2?

Hola amigos espero se encuentren bien, solicitando de su apoyo tengo un formulario que tiene dos dropDown, el cuál uno es dependiente del otro, tengo mi tabla municipios y localidades, en localidades tiene el id del municipio y su descripcion, entonces pude obtener la información usando el siguiente código en la vista y en el modelo:

Vista:

Yii::$app->view->registerJs(<<<JS

        $("#proveedores-id_municipio").change(function(){
            let id = $(this).val();

            if(id != ""){
                var options = $.ajax({
                  method: "GET",
                  url: "localidades?id="+id,
                  data: "json",
                }).done(function(data) {
                    console.log("dentro de done");
                    console.log(data);
                    console.log("despues de done");
                });   

                jQuery.ajax(options);
            }

        });

JS);


//$arrMun ya traigo el arreglo de objetos y es como pinto el indice y el value del dropDown, cuando seleccione uno deseo llenar el dropDown de abajo pero eso lo pienso traer con ajax para no tener que refrescar la página
<?= $form->field($model, "id_municipio")->dropDownList($arrMun, ['prompt' => '-- Seleccione Uno --']); ?>
            
                <?= $form->field($model, "id_localidad")->dropDownList([], ['prompt' => '-- Seleccione Uno --']); ?>

Modelo:

public function getLocalidades($id){
        $sql = Localidades::find()->where("id_municipio=:id_municipio", [":id_municipio" => $id])->all();
        
        $array = [];
        foreach ($sql as $ind){
            $array[$ind->id_localidad] = $ind->nombre;
        }
        
        return $array;
        
    }

El problema es como regresar los valores a la vista, en yii1 solia realizarlo de esta manera en el controller:

 public function actionLocalidades($id){
        $model = new Localidades();
        $array = $model->getLocalidades($id);
        
        //en este punto si imprimo $array con un var_dump si me muestra la información

// en yii1 solia usar la siguiente manera:
        $options = CJavaScript::encode($array);
        echo "var options = $.extend({},{$options})";
        Yii::app()->end();
}

en el controller tengo lo siguiente:
use yii\helpers\Json;
use yii\web\JsExpression;
use yii\widgets\ActiveForm;
use yii\web\Response;

Pero en yii2 no encuentro como volver a pintar los datos via ajax, espero me puedan ayudar con esto, les agradezco de ante mano

encontre la solución en el controller donde mando llamar via ajax debo de poner esto:

    public function actionLocalidades($id){
        $model = new Localidades();
        
        if (!empty($id))
        {
            $options = Json::encode($model->getLocalidades($id));
            echo "var options = $.extend({},{$options})";
            Yii::$app->end();
        }
    }

Lo raro es que al quinto drop que seleccione se traba y deja de enviarle la info, en el modelo lo cambie a arreglo de arreglos:

    public function getLocalidades($id){
        $sql = Localidades::find()->where("id_municipio=:id_municipio", [":id_municipio" => $id])->all();
        
        $array = [];
        foreach ($sql as $ind => $value){
            $array[$ind] = array('id_localidad'=>$value->id_localidad,'nombre'=>$value->nombre);
        }
        
        return $array;
    }

y en la vista quedo de esta manera:

Yii::$app->view->registerJs(<<<JS
        $("#proveedores-id_municipio").change(function(){
            let id = $(this).val();
            
            if(id != ""){
                $("#proveedores-id_localidad").empty();
                var options = $.ajax({
                  method: "GET",
                  url: "localidades?id="+id,
                  data: "json",
                }).done(function(data) {
                    eval(data);
                    for (var i in options){
                        $("#proveedores-id_localidad").append("<option value="+options[i].id_localidad+">"+options[i].nombre+"</option>");
                    }
                });   
                jQuery.ajax(options);
            }

        });

JS);

solo como comento ya cuando hago una quinta busqueda se traba y ya no puedo ni cerrar el inspeccionador de elemento, pareciera como si se llenara la memorira

cuando me aparece ese error es el sigueinte:

var options = $.extend({},[{"............"}])<pre>An Error occurred while handling another error:
yii\web\HeadersAlreadySentException: Headers already sent in 

he leido que yii2 no acepte echos en los archivos controller, ojalá alguien me pueda ayudar a modificar mi código para no usar echo en esta parte:

    public function actionLocalidades($id){
        $model = new Localidades();
        
        if (!empty($id))
        {
            $options = Json::encode($model->getLocalidades($id));
            echo "var options = $.extend({},{$options})";
            Yii::$app->end();
        }
    }

wohoo hahaha no imagine que un simple return me ayudaria en vez del echo, hice mi pregunta, me conteste solo, juge la tenia, era mia y fue gol, ojalá le sirva a alguien esto que encontre

2 Likes