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'];
}
}
но вместо того, что бы возвращать массив слов, что по идее должно происходить, приходит пустой массив.