Yii2 ajax : одновременное обновление нескольких блоков на странице - Gorgona66/elena.spiktarenko-gmail.com GitHub Wiki

Релизация: 1) во view(главный вид страницы) размещаю блоки со своими идентификаторами

 и кнопки для старта обработки 
 <div id="pr_all_header_2" class="pr_all_header2 pr_border">
                <?php
                $f=ActiveForm::begin(['options' => ['class' => 'form-horizontal']]); ?>
                <div  style = "margin-top:80px; text-transform: uppercase;">
                    <?= $f->field($model,'number') ?>
                    <?= Html::submitButton('Поиск', ['class' => 'btn btn-primary', 'on_click' => 'click_found()']) ?>
                </div>
                <?php ActiveForm::end();
                ?>
            </div>
 <div id = "pr_left" class = "pr_left pr_border"> Ищем номер
        <?php
        Pjax::begin(['id' => 'articul_show','enablePushState' => 'false']);
        Pjax::end();
        ?>
        Бренд
        <?php
        Pjax::begin(['id' => 'brend_show','enablePushState' => 'false']);
        Pjax::end();
        ?>
        <div id="pr_left_1" class="pr_border">
            <div id = "block-for-choise">
            <?php
                Pjax::begin(['id' => 'manufacturer_left','enablePushState' => 'false']);
                Pjax::end();
            ?>
                </div>
        </div>
             <div id="pr_left_2" class="pr_border" >
                 <?php
                 Pjax::begin(['id' => 'brend_spisok','enablePushState' => 'false']);
                 Pjax::end();
                 ?>
           </div>
    </div>
 <div id = pr_right class = "pr_right pr_border" style = " margin-top : 100px;" >
         <h4 id ="group1_h4" style="font-weight: bold;">Предложения на нашем складе </h4>
        <?php
        Pjax::begin(['id' => 'group1','enablePushState' => 'false']);
        Pjax::end();
        ?>
        <h4 id ="group5_h4" style="font-weight: bold;">Максиматор</h4>
        <?php
        Pjax::begin(['id' => 'maximator_data','enablePushState' => 'false']);
        Pjax::end();
        ?>
        <h4 id ="group2_h4" style="font-weight: bold;"> Аналоги на нашем складе</h4>
        <?php
        Pjax::begin(['id' => 'group2','enablePushState' => 'false']);
        Pjax::end();
        ?>
        <h4 id ="group3_h4" style="font-weight: bold;">Предложения на складах партнеров</h4>
        <?php
        Pjax::begin(['id' => 'group3','enablePushState' => 'false']);
        Pjax::end();
        ?>
        <h4 id ="group4_h4" style="font-weight: bold;"> Аналоги на складах партнеров</h4>
        <?php
        Pjax::begin(['id' => 'group4','enablePushState' => 'false']);
        Pjax::end();
        ?>
    </div>
  
2) В js файле
function showArticul(){
    // показываем производителей на странице в левом углу
    var url_here = document.location.href;
    var url_brend =url_here.substring(0,url_here.indexOf("/catalog/"))+'/catalog/show-articul';
    var number = document.getElementById('foundnumberform-number').value;

    if (!number == '' ){

        $.ajax({
            url: url_brend,
            data: {
                articul: number
            },
            cache: false,
            success: function (result) {
                // data is ur summary
                $('#articul_show').html(result);
            }
        });
    }

}


function showBrend(){

// Выбираю бренды на странице  и показываю их в левом углу
    var url_here = document.location.href;
    var url_brend =url_here.substring(0,url_here.indexOf("/catalog/"))+'/catalog/show-brend-left';
    var number = document.getElementById('foundnumberform-number').value;
    var manufacturers = [];

//  dimElem_tr = document.getElementsByTagName('tr');
    dimElem_tr = document.getElementsByClassName('price_position');

    // включаю и отключаю
    for (i = 1; i < dimElem_tr.length ; i++) {
        if ( dimElem_tr[i].getElementsByClassName('manufacturer')[0] != undefined ){
            //&& dimElem_tr[i].getElementsByClassName('manufacturer')[0].innerText !== '' ) {
            brend = dimElem_tr[i].getElementsByClassName('manufacturer')[0].innerText;
            if (brend.length > 0 && manufacturers.indexOf(brend) == -1) {
                manufacturers.push(brend);
            }
        }
    }
    data_brend = JSON.stringify(manufacturers);

    $.ajax({
        url: url_brend,
        data: {
            data_brend: data_brend
        },
        cache: false,
        success: function (result) {
            // data is ur summary
            $('#manufacturer_left').html(result);
        }
    });


}

function insert_in_page(positions) {
    var dimElement = document.getElementsByClassName('price_position');

    for (var i = 0; i < dimElement.length; i++) {
        dimElement[i].getElementsByClassName('articul')[0].innerHTML = positions[i].articul;
        dimElement[i].getElementsByClassName('manufacturer')[0].innerHTML = positions[i].manufacturer;
        dimElement[i].getElementsByClassName('name')[0].innerHTML = positions[i].name;
        dimElement[i].getElementsByClassName('exist')[0].innerHTML = positions[i].exist;
        dimElement[i].getElementsByClassName('time_to_exe')[0].innerHTML = positions[i].time_to_exe;
        dimElement[i].getElementsByClassName('price')[0].innerHTML = positions[i].price;
        dimElement[i].getElementsByClassName('storage')[0].innerHTML = positions[i].storage;
        dimElement[i].getElementsByClassName('group')[0].innerHTML = positions[i].group;
        dimElement[i].getElementsByClassName('visible')[0].innerHTML = positions[i].visible;
        dimElement[i].getElementsByClassName('artgroup')[0].innerHTML = positions[i].artgroup;
        dimElement[i].getElementsByClassName('countgroup')[0].innerHTML = positions[i].countgroup;
        dimElement[i].getElementsByClassName('minpricegroup')[0].innerHTML = positions[i].minpricegroup;
        dimElement[i].getElementsByClassName('deliverymin')[0].innerHTML = positions[i].deliverymin;
        if (dimElement[i].getElementsByClassName('visible')[0].innerHTML == 'visible') {
            dimElement[i].hidden = false;
        }
        else {
            dimElement[i].hidden = true;
        }
    }
}

function getMaximator()
{
    // получить блок проценка

    var url_here = document.location.href;
    var url_maximator =url_here.substring(0,url_here.indexOf("/catalog/"))+'/maximator/found-maximator';
   // var url_maximator =url_here.substring(0,url_here.indexOf("/catalog/"))+'/maximator/drow-maximator-count';
    var number = document.getElementById('foundnumberform-number').value;


    if (!number == '' ){

        $.ajax({
            url: url_maximator,
            data: {
                    articul: number
                  },
            cache: false,
            success: function (result) {
                // data is ur summary
                $('#maximator_data').html(result);
                showBrend();
            }
        });
    }
}

function getMaximatorCount()
{
    // получить блок проценка
    var url_here = document.location.href;
    // var url_maximator =url_here.substring(0,url_here.indexOf("/maximator/")+10)+'found';
    var url_maximator_count =url_here.substring(0,url_here.indexOf("/catalog/"))+'/maximator/drow-maximator-count';
    var number = document.getElementById('foundnumberform-number').value;

    if (!number == '' ) {
      //  var url_procenka ="/procenka/found-number";
        $.ajax({
            url: url_maximator_count,
            cache: false,
            data: {
                articul: number
            },
            success: function (result) {
                // data is ur summary
                $('#pjax_max_count').html(result);
            }
        });
    }
}

function showManufacturersSpisok()
{
    // получить блок проценка
    var url_here = document.location.href;
    // var url_maximator =url_here.substring(0,url_here.indexOf("/maximator/")+10)+'found';
    var url_brends_spisok =url_here.substring(0,url_here.indexOf("/catalog/"))+'/inteo/get-brends-spisok';
    var number = document.getElementById('foundnumberform-number').value;

    if (!number == '' ) {

       $.ajax({
            url: url_brends_spisok,
            cache: false,
            data: {
                articul: number
            },
            success: function (result) {
                // data is ur summary
                $('#brend_spisok').html(result);
            }
        });
    }
}

function getInteoArticulBrend()
{
    // получить блок проценка
    var url_here = document.location.href;
    var url_inteo_articul_brend =url_here.substring(0,url_here.indexOf("/catalog/"))+'/inteo/get-brends-spisok';
    var number = document.getElementById('foundnumberform-number').value;

    if (!number == '' ) {

        $.ajax({
            url: url_brends_spisok,
            cache: false,
            data: {
                articul: number
            },
            success: function (result) {
                // data is ur summary
                $('#brend_spisok').html(result);
            }
        });
    }
}

function click_found()
{
   // Максиматор
    showArticul();
    getMaximator();
    getMaximatorCount();
  //  showManufacturers();

   // Интео
    showManufacturersSpisok(); // список возможных брендов из данного источника
}

function choise_brend()
{
    var manufacturers;
    var delivery;
    var isShowBestPrice;
    var condition;
    var dimElem_tr;
    var dimElem_tr_class;
    // Показывать лучшую цену

    var table = document.getElementById("block-for-choise");
    var brends = table.getElementsByClassName("elemActive");

    // var brends = table[j].getElementsByClassName("elemActive");
    // Получаю массив строк
    dimElem_tr = document.getElementsByTagName('tr');
}

function found_choise_brend()
{

    var block_brend = document.getElementById('pr_left_2');
    var dimElement = block_brend.getElementsByClassName("elemActive");
    var  dim_found_choise_brend = [];

    if ( dimElement.length = 0) {
        alert("Ничего не выбрано");
    }
    else {
        for (var i = 0; i < dimElement.length; i++) {
            console.log('dimElement '+dimElement);
            console.log(' i ='+i);
            console.log(dimElement[i]);
            articul = dimElement[i].getElementsByClassName('articul')[0].innerText;
            brend = dimElement[i].getElementsByClassName('manufacturer')[0].innerText ;

            dim_found_choise_brend.push({});
            dim_found_choise_brend[i]["articul"] = articul;
            dim_found_choise_brend[i]["brend"] = brend;
        }


        // получить блок проценка
        var url_here = document.location.href;
        var url_inteo_articul_brend_data = url_here.substring(0, url_here.indexOf("/catalog/")) + '/catalog/found-articul-brend';


        $.ajax({
            url: url_inteo_articul_brend_data,
            cache: false,
            data: {
                dim_found: JSON.stringify(dim_found_choise_brend),
            },
            success: function (data) {
                // data is ur summary
                data_parse = JSON.parse(data);
                $('#group1').html(data_parse['group1']);
                $('#group2').html(data_parse['group2']);
                $('#group3').html(data_parse['group3']);
                $('#group4').html(data_parse['group4']);
                $('#count_group1').html(data_parse['count_group1']);
                $('#count_group2').html(data_parse['count_group2']);
                $('#count_group3').html(data_parse['count_group3']);
                $('#count_group4').html(data_parse['count_group4']);
                showBrend();
             }
        });
    }

//    ready_document();
}


function click_brends_choise(target)
{
    if ((target.className == 'elem')||(target.className == 'elemActive'))
    {
        highlight(target); // подсветить
    }
  //  choise_brend();
  //  scroolUp();
}



$(document).ready(function() {

    var dimElement = document.getElementsByClassName('price_position');
    var positions = [];
    var articul = "";
    var manufacturer = "";
    var storage = "";
    var group_articul = 0;
    var i;

    click_found();

    for ( i=0; i<dimElement.length; i++ ) {
        positions.push([]);
        positions[i].articul = dimElement[i].getElementsByClassName('articul')[0].innerHTML;
        positions[i].manufacturer = dimElement[i].getElementsByClassName('manufacturer')[0].innerHTML;
        positions[i].name = dimElement[i].getElementsByClassName('name')[0].innerHTML;
        positions[i].exist = dimElement[i].getElementsByClassName('exist')[0].innerHTML;
        positions[i].time_to_exe = dimElement[i].getElementsByClassName('time_to_exe')[0].innerHTML;
        positions[i].price = dimElement[i].getElementsByClassName('price')[0].innerHTML;
        positions[i].storage = dimElement[i].getElementsByClassName('storage')[0].innerHTML;
        positions[i].group = dimElement[i].getElementsByClassName('group')[0].innerHTML;
        positions[i].visible = dimElement[i].getElementsByClassName('visible')[0].innerHTML;
        positions[i].artgroup = dimElement[i].getElementsByClassName('artgroup')[0].innerHTML;
        positions[i].countgroup = dimElement[i].getElementsByClassName('countgroup')[0].innerHTML;
        positions[i].deliverymin = dimElement[i].getElementsByClassName('deliverymin')[0].innerHTML;
        positions[i].minpricegroup = dimElement[i].getElementsByClassName('minpricegroup')[0].innerHTML;
    }

    // сортируем positions по : group, storage, time_to_exe, price,

  pos_sort = makeResultForView(positions);
  insert_in_page(pos_sort);
  polosatik();

    $('a[href^="#"]').click(function () {

        elementClick = $(this).attr("href");
        window.location.href = elementClick;
// определяем верхние координаты

        tableFixed = document.getElementById('table-fixed');
        add_destination = tableFixed.offsetTop+tableFixed.offsetHeight;
        destination = $(elementClick).offset().top - 110;
      //  destination = $(elementClick).offset().top - add_destination;
        if (navigator.appName == 'safari') {
            $('body').animate({scrollTop: destination}, 1100);
        }
        else{
            window.scrollBy(0,(-(top)));
            $('html,body').stop().animate({scrollTop: destination}, 500);

            return false;
        }
    });

    filterForShow();

})

Разберем подробно одну из функций

function found_choise_brend()
{

    var block_brend = document.getElementById('pr_left_2');
    var dimElement = block_brend.getElementsByClassName("elemActive");
    var  dim_found_choise_brend = [];

   // Выбираем на странице данные и помещаем их в массив  dim_found_choise_brend
    if ( dimElement.length = 0) {
        alert("Ничего не выбрано");
    }
    else {
        for (var i = 0; i < dimElement.length; i++) {
            console.log('dimElement '+dimElement);
            console.log(' i ='+i);
            console.log(dimElement[i]);
            articul = dimElement[i].getElementsByClassName('articul')[0].innerText;
            brend = dimElement[i].getElementsByClassName('manufacturer')[0].innerText ;

            dim_found_choise_brend.push({});
            dim_found_choise_brend[i]["articul"] = articul;
            dim_found_choise_brend[i]["brend"] = brend;
        }


        // определяем адрес экшена
        var url_here = document.location.href;
        var url_inteo_articul_brend_data = url_here.substring(0, url_here.indexOf("/catalog/")) + '/catalog/found-articul-brend';
	
	// отправляем запрос на сервер
	// массив преобразуем в JSON-строку		
	// ответ от сервера получаем в виде json, расшифровываем и размещаем каждый элемент массива в своем блоке на главной странице соответственно id
	// после этого отрабатывает функция showBrend(), которая должна ждать заполнения страницы

        $.ajax({
            url: url_inteo_articul_brend_data,
            cache: false,
            data: {
                dim_found: JSON.stringify(dim_found_choise_brend),
            },
            success: function (data) {
                // data is ur summary
                data_parse = JSON.parse(data);
                $('#group1').html(data_parse['group1']);
                $('#group2').html(data_parse['group2']);
                $('#group3').html(data_parse['group3']);
                $('#group4').html(data_parse['group4']);
                $('#count_group1').html(data_parse['count_group1']);
                $('#count_group2').html(data_parse['count_group2']);
                $('#count_group3').html(data_parse['count_group3']);
                $('#count_group4').html(data_parse['count_group4']);
                showBrend();
             }
        });
    }

//    ready_document();
}

3) В контроллере:

Здесь декодируются из json наши данные. Выбираются Данные, которые должны отражаться во вью. Формируется массив render, где каждый элемент массива - отдельный рендер вида с данными. После этого render опять шифруется json и возвращается назад для дальнейшей обработки javascript-ом

 public function actionFoundArticulBrend() // поиск по артикулу и бренду
    {

        $data = json_decode(Yii::$app->request->get('dim_found'));
        $result = [];
        //Поделить на группы

        $group1 = []; // оригиналы на нашем складе
        $i1 = 0;
        $group2 = []; // аналоги на нашем складе
        $i2 = 0;
        $group3 = []; // оригиналы на чужих складах
        $i3 = 0;
        $group4 = []; // аналоги на чужих складах
        $i4 = 0;


        foreach ($data as $data_one)
        {
            $articul = $data_one->articul;
            $brend = $data_one->brend;


            $result_one = InteoController::getDataArticulBrend($articul, $brend);

            if (is_null($result_one) == false)
            {
                foreach ($result_one->products as $one)
                {
                    $one->visible = "start";
                    $one->artgroup = "artgroup";
                    $one->countgroup = 0;
                    $one->deliverymin = 0;
                    $one->deliveryminprice = 0;
                    $one->minpricegroup = 0;
                    $one->dover = false;

                    if ($one->article == $articul && $one->manufacturer == $brend)
                    {
                        if (strripos($one->storage, "AUTOMAFIA") == true)
                        {
                            $group1[$i1] = $one;
                            $group1[$i1]->group = 1;
                            $i1 = $i1 + 1;
                        } else
                        {
                            $group3[$i3] = $one;
                            $group3[$i3]->group = 3;
                            $i3 = $i3 + 1;
                        }
                    } else
                    {

                        if (strripos($one->storage, "AUTOMAFIA") == true)
                        {
                            $group2[$i2] = $one;
                            $group2[$i2]->group = 2;
                            $i2 = $i2 + 1;
                        } else
                        {
                            $group4[$i4] = $one;
                            $group4[$i4]->group = 4;
                            $i4 = $i4 + 1;
                        }
                    }
                }
            }
        }

            $group_render['group1'] = $this->renderAjax('show_group',
                [
                    'group'   => $group1,
                ]);

            $group_render['group2'] = $this->renderAjax('show_group',
                [
                    'group'   => $group2,
                ]);
            $group_render['group3'] = $this->renderAjax('show_group',
                [
                    'group'   => $group3,
                ]);
            $group_render['group4'] = $this->renderAjax('show_group',
                [
                    'group'   => $group4,
                ]);
            $group_render['count_group1'] = $this->renderAjax('show_group_count',
                [
                    'group_count'   => $i1,
                ]);
            $group_render['count_group2'] = $this->renderAjax('show_group_count',
                [
                    'group_count'   => $i2,
                ]);
            $group_render['count_group3'] = $this->renderAjax('show_group_count',
                [
                    'group_count'   => $i3,
                ]);
            $group_render['count_group4'] = $this->renderAjax('show_group_count',
                [
                    'group_count'   => $i4,
                ]);

            return json_encode($group_render);

    
           
    }

или экшен попроще

 public function actionShowBrendLeft()
    {
        // находим бренды для страницы (когда будет несколько источников - объединять и сортировать массив)
        $request = Yii::$app->request;
        $brend =json_decode($request->get('data_brend')) ;
       // $maximator_brend = MaximatorController::getBrendFromMaximator($articul);

        return $this->renderAjax('brend_left',
            [
                'manufacturers'   => $brend,
            ]);
    }

    public function actionShowArticul()
    {
        // находим бренды для страницы (когда будет несколько источников - объединять и сортировать массив)
        $request = Yii::$app->request;
        $articul =$request->get('articul') ;

        return $this->renderAjax('show_articul',
            [
                'articul'   => $articul,
            ]);
    }
⚠️ **GitHub.com Fallback** ⚠️