Ajax запрос возвращает неожиданный результат

есть сайт https://play-name.com который генерирует текст через алгоритмы, отправляя ajax запросы. вот пример кода, который должен это выполнять. если я правильно понимаю.


      $('.btn--generate').on('click', function (event) {
            event.preventDefault();
            var obj = $(this);
            //TEST
            console.log("obj = ", obj);
            console.log("START");
            //ENDTEST

            if (obj.hasClass('btn--gray')) {
                return false;
            }

            var algorithm = obj.data('algorithm'),
                $generations = $('.generate__list'),
                $loading = $('.loading'),
                $action = obj.closest('.action'),
                data = 'request=algorithms&action=getWords&do=generate&last=1&algorithm=' + algorithm + '&w=' + $(document).width();
                //TEST
                console.log("$generations = ",$generations, "data = ", data);
                console.log("dataUrl = ", 'request=algorithms&action=getWords&do=generate&last=1&algorithm=' + algorithm + '&w=' + $(document));
                //ENDTEST
            if ($('.generate__lang a.active').length) {
                data = data + '&lang=' + $('.generate__lang a.active').data('code');
            }

            $('.dictionary input:checked').each(function () {
                data = data + '&dict[]=' + $(this).val();
                //TEST
                console.log("tempData = ", data);
                //ENDTEST
            });

            if ($('.form-foryur').length) {
                data = data + '&pravform=' + $('#pravform').data('val') + '&exword=' + $('#exword').val() + '&position=' + $('#position').data('val');
                console.log("exword = ", '&exword=' + $('#exword').val());
            }
            $action.fadeOut(300, function () {
                $loading.fadeIn(300, function () {
                    $.ajax({
                        type: 'POST',
                        url: settings.url + 'ajax?' + data,
                        success: function (res) {
                            $loading.fadeOut(300, function () {
                                $generations.append(res);
                                //TEST
                                console.log("generations = ", $generations, "res = ", res);
                                $action.fadeIn(300, function () { });
                                $(window).scrollTop($(document).height());


                                $.ajax({
                                    type: 'POST',
                                    url: settings.url + 'ajax?request=algorithms&action=getWords&subaction=check&algorithm=' + algorithm,
                                    async: false,
                                    success: function (res) {
                                        let cnt = res * 1;
                                        check = cnt > 0;
                                        if (cnt == 0) {
                                            obj.after('<a href="tarifyi" class="btn btn--alt btn--minw">Купить PRO</a><p>Бесплатные генерации закончились</p>');
                                            $('.btn--generate, #freespin').remove();
                                        } else {
                                            if (cnt > 0 && cnt < 9999) {
                                                $('#freespin').remove();
                                                obj.after(`<p id="freespin">Осталось ${cnt} бесплатные генерации</p>`);
                                            }
                                        }
                                    }
                                });
                            });
                        }
                    });
                });
            });

        });

        $(document).on('click', '.generate__add', function (event) {
            event.preventDefault();

            //TEST
            console.log("generate_add START");

            var obj = $(this),
                data = '',
                objParent = obj.closest('.generate__word'),
                algorithm = objParent.data('algoritm'),
                project = objParent.data('project'),
                word = $.trim(objParent.find('.generate__text').text()),
                selectedName = parseInt($('.selectedName').eq(0).text());
                //TEST
                console.log("GW = ", objParent, "word = ", word);
                //ENDTEST
            desc = $.trim(objParent.find('.generate__desc').text());


            if (obj.hasClass('active')) {
                data = 'request=algorithms&action=removePrototype&algorithm=' + algorithm + '&oldWord=' + word + '&project_id=' + project;
                if (obj.hasClass('remove')) {
                    objParent.remove();
                    if (!$('.generate__word').length) {
                        $('.generate__list').append('<p class="empty">lang.emptyhere</p>');
                    }
                } else {
                    obj.removeClass('active');
                }
                selectedName--;
                if (selectedName < 1) {
                    selectedName = 0;
                }
                $('.selectedName').text(selectedName);
            } else {
                data = 'request=algorithms&action=addPrototype&algorithm=' + algorithm + '&newWord=' + word + '&desc=' + desc + '&project_id=' + project;
                obj.addClass('active');
                selectedName++;
                $('.selectedName').text(selectedName);
            }
            $.get(settings.url + 'ajax?' + data);
        }); 

в директории сайта лежит скрипт, который очень походит на алгоритм, который выполняется, когда отсылается ajax запрос:

namespace PlayName\Algorithms;
use PlayName\Helpers\Rand;
use PlayName\Helpers\YandexDictionary;

class Translator extends AbstractAlgorithm
{
    /**
     * @var string  Algorithm name - assigned in any child class
     */
    protected $name = 'translator';

    /**
     * @var string  Project language (TODO: should be global var)
     */
    protected $projectLang = 'ru';

    /**
     * @var array   Массив доп языков проекта БЕЗ главного
     */
    protected $langs = [];

    /**
     * @var array   Массив ассоциаций проекта
     */
    protected $assocs = [];
    protected $assocvd = [];
    protected $mix = [];


    /**
     * @var array   Массив синонимов проекта
     */
    protected $synonyms = [];

    /**
     * @var int     Кол-во языков
     */
//  protected $langCnt;

    /**
     * @var int     Кол-во ассоциаций
     */
//  protected $assCnt;

    /**
     * @var int     Кол-во синонимов
     */
//  protected $synCnt;

    /**
     * @var int     Процент ассоциаций в случайной выборке слов среди ассоциаций и синонимов
     */
    protected $assRatio = 50;   // %

    /**
     * Запустить алгоритм
     * Случайно выбирает заданное кол-во слов из ассоциаций
     * и переводит их на случайные языки проекта
     * Чтобы не было повторов, случано выбирает из произведения слов и языков
     * Результат пишет в генератор алга
     * 
     * @param   int     $pid    Ид проекта
     * @param   int     $count  Кол-во генерируемых слов
     * @param   string|array    $lang   Язык перевода или массив языков
     * 
     * @return  array   Массив сгенерированных слов
     */
    public function run($pid, $count = 20, $lang = '', $simple = false)
    {

        $sess = time();

        $_20 = floor($count*.20);
        $_50 = round($count*.5);
        $_30 = $count - $_20 - $_50;
        $lang = $_COOKIE['lang_alg']??'trans';

        // Подготовка массивов языков, ассоц и синон
        if (! $this->prepareData($pid,$lang)) {
            return [];
            throw new \Exception("Проблемы с рабочим массивом проекта - языки, ассоциации, синонимы.");
        }

        // Переводим ассоциации
        $assocs = $this->translateRandWordDefs($this->assocs, $this->langs, $_20, 'ass');
        $assocvd = $this->translateRandWordDefs($this->assocvd, $this->langs, $_50, 'assvd');

        $cnt = count($assocs)+count($assocvd);  // рельно переведено - может не совпадать

        // Переводим синонимы
        $synonyms = [];
        $i = 0;
        $curr_cnt = $count - $cnt;

        do {
            $_synonyms = $this->translateRandWordDefs($this->mix, $this->langs, $curr_cnt, 'synvd');
            $synonyms = array_merge($synonyms, $_synonyms);
            $i++;
            $curr_cnt = $count-$cnt-count($synonyms);
        } while ($curr_cnt>0 && $i<15);

        $translations = array_merge($assocs, $assocvd, $synonyms);

        $count_tr = count($translations);
        $i = 0;

        while ($count_tr<$count && $i<15) {
            $i++;
            $_synonyms = $this->translateRandWordDefs($this->synonyms, $this->langs, $count-$count_tr, 'syn');
            $translations = array_merge($translations, $_synonyms);
            $count_tr = count($translations);
        }

        if (!$simple) {
            //--- уникальность
            $was_generated = $this->getModel('UniqTranslator')->getPhras($pid);

            $stop = 0;
            do {
                $translations = $this->checkCount($translations,$count);
                $translations = $this->setUnique($was_generated,$translations);
                $stop++;
            }while (count($translations)<$count&&$stop<10);

            $this->getModel('UniqTranslator')->save($pid,$count,array_keys($translations));

            // Записать слова в Генератор алгоритма для этого проекта
            $result = $this->getModel('generator')->push($pid, $this->name, $translations);
        }

        return $translations;
    }

    public function runAspirin($pid, $count = 18)
    {
        // Подготовка массивов языков, ассоц и синон
        // Взять все нужные источники из модели Lexicon
        $lexicon = $this->getModel('lexicon');
        $origins = $lexicon->fetchProjectOrigins($pid, ['languages', 'assocs', 'synonyms']);

        $assoc_user = $assoc_vd = [];

        foreach($origins['assocs'] as $word=>$info) {
            if($info['alg']=='assocvd') {
                $assoc_vd[$word] = $info;
            } else {
                $assoc_user[$word] = $info;
            }
        }
        $this->langs = $origins['languages'];
        $this->assocs = $assoc_user;
        $this->synonyms = $origins['synonyms'];
        $this->assocvd = $assoc_vd;

        // Переводим ассоциации
        $assocs = [];
        if (count($assoc_user)) {
            $assocs = $this->translateRandWordDefs($assoc_user, $this->langs, 1, 'assoc_user');
        } else {
            $assocs = $this->translateRandWordDefs($origins['synonyms'], $this->langs, 1, 'synonyms');
        }

        $synonyms = $this->translateRandWordDefs($origins['synonyms'], $this->langs, 1, 'synonyms');

        $cnt = count($assocs)+count($synonyms); // рельно переведено - может не совпадать

        // Переводим синонимы
        $assocvd = [];
        $i = 0;
        $curr_cnt = $count - $cnt;

        do {
            $_assocvd = $this->translateRandWordDefs($assoc_vd, $this->langs, $curr_cnt, 'assoc_vd');
            $assocvd = array_merge($assocvd, $_assocvd);
            $i++;
            $curr_cnt = $count-$cnt-count($assocvd);
        } while ($curr_cnt>0 && $i<15);

        $translations = array_merge($assocs, $synonyms, $assocvd);

        $count_tr = count($translations);
        $i = 0;
        while ($count_tr<$count && $i<15) {
            $i++;
            $_assocvd = $this->translateRandWordDefs($assoc_vd, $this->langs, $count-$count_tr, 'assoc_vd');
            $translations = array_merge($translations, $_assocvd);
            $count_tr = count($translations);
        }

        //--- уникальность
        $was_generated = $this->getModel('UniqTranslator')->getPhras($pid);

        $stop = 0;
        do {
            $translations = $this->checkCount($translations,$count);
            $translations = $this->setUnique($was_generated,$translations);
            $stop++;
        }while (count($translations)<$count&&$stop<10);

        $this->getModel('UniqTranslator')->save($pid,$count,array_keys($translations));

        return $translations;
    }

    private function setUnique($was_generated,$phrases) {
        $repack_phrases = [];

        foreach($phrases as $phras=>$info) {
            if (!in_array($phras,$was_generated)) {
                $repack_phrases[$phras] = $info;
            }
        }
        return $repack_phrases;
    }

    private function checkCount($phrases,$count) {
        if (count($phrases) < $count) {

            $count_tr = count($phrases);
            $i = 0;
            while ($count_tr<$count && $i<15) {
                $i++;
                $_synonyms = $this->translateRandWordDefs($this->assocvd, $this->langs, $count-$count_tr, 'assoc_vd');
                $phrases = array_merge($phrases, $_synonyms);
                $count_tr = count($phrases);
            }
        }
        return $phrases;
    }

    /**
     * Подготовка раб массива
     * 
//   * @param   array   $origins    Массив источников (квиз)
     * @param   array   $pid        Project ID
     * 
     * @return  array   Массив языков проекта БЕЗ главного
     */
    public function prepareData($pid,$lang)
    {
        // Взять все нужные источники из модели Lexicon
        $lexicon = $this->getModel('lexicon');
        $origins = $lexicon->fetchProjectOrigins($pid, ['assocs', 'assocvd', 'synonyms']);

        $origins['languages'] = [$lang];

        // Подготовка языков
        if (! isset($origins['languages'])) {
            return FALSE;
            throw new \Exception("В проекте нет языков.");
        }
        if (count($this->langs = $origins['languages']) < 1) {
            return FALSE;
            throw new \Exception("В проекте нет дополнительных языков.");
        }

        $this->assocvd = $origins['assocvd'];



        // Подготовка массивов ассоциаций и синонимов
        if (! isset($origins['assocs']) or ! count($this->assocs = $origins['assocs'])) {
            $this->assocs = $this->assocvd;
        }
        if (! isset($origins['synonyms']) or ! count($this->synonyms = $origins['synonyms'])) {
            $this->synonyms = $this->assocvd;
        }

        $this->mix = array_merge($origins['synonyms'],$origins['assocvd']);

        return TRUE;
    }

    /**
     * Выбрать заданное кол-во случ слов из заданного массива на языке проекта
     * и перевести каждое на случ языки из заданного массива доп языков
     * 
     * @param   array   $words  Ассоц массив слов для перевода: ['word' => <wordDef>]
     * @param   array   $langs  Индексный массив языков перевода
     * 
     * @return  array   Ассоц массив переводов выбранных слов: ['word' => <wordDef>]
     */
    public function translateRandWordDefs($words, $langs, $count, $origin = NULL)
    {

        if (($wordsCnt = count($words)) < 1) return [];
        if (($langsCnt = count($langs)) < 1) return [];
        $result = [];               // массив переведенных определений слов

        while ($count) {

            $tr = $this->translateRandWord($words, $langs, $wordsCnt, $langsCnt);

            if (is_array($tr)) {
                // У этого слова есть перевод - кинуть его в массив результатов
                $text = mb_strtolower($tr['text'],'utf-8');

                // Такой перевод может уже быть в массиве от другого исходного слова
                if (! isset($result[$text])) {
                    $tr['origin'] = $origin ?: '?';
                    $result[$text] = $tr;
                    $count--;
                }
            }
            else {
                // Перевода нет - возвращается выбранное слово
                $text = mb_strtolower($tr,'utf-8');
            }

            // убрать это слово из исходного набора
            unset($words[$text]);
            if ($wordsCnt-- == 1) {
                break;
            }
        }

        return $result;
    }

    /**
     * Выбрать случ слово из заданного массива на языке проекта
     * и перевести его на случ язык из заданного массива доп языков
     * 
     * !!! Контроль корректности аргументов НЕ ПРОИЗВОДИТСЯ !!!
     * 
     * @param   array   $words  Индексный массив слов для перевода
     * @param   array   $langs  Индексный массив языков перевода, первый - язык слова
     * 
     * @return  array|  Массив определения перевода
     *          string  Строка - текст выбранного НЕПЕРЕВОДИМОГО слова
     */
    public function translateRandWord($words, $langs, $wordsCnt = 0, $langsCnt = 0)
    {
        // Берем случайное слово...
        $i = Rand::rand(0, ($wordsCnt ?: count($words)) - 1);
        foreach ($words as $def) {
            if (! $i--) break;
        }

        // Берем случайный язык...
        //$from = array_shift($langs);
        //$lang = $langs[Rand::rand(0, ($langsCnt ?: count($langs)) - 2)];
        $from = 'ru';
        $lang = $langs[0];

        // Переводим случайное слово на случайный язык
        $result = YandexDictionary::translate($def['text'], $from, $lang, FALSE, $this->getTranslateModel($from,$lang) );

        // Далее остались только переводы - берем самый первый
        $tr = array_shift($result);

        return $tr ?: $def['text'];
    }
}

но вместо того, что бы возвращать массив слов, что по идее должно происходить, приходит пустой массив.


Ответы (0 шт):