• Как дождаться завершение $.each()?

    @Viktor091 Автор вопроса
    Вот фрагмент кода:

    function loading() {
    
                let typeKMU = function() {
                    console.log("Запуск функции");
                    let div = $(display).find('div.typeKMU');
                    let result = null;
    
                    $.each(div, function(i, block) {
                        console.log("Запускаю " + i + " интерацию цикла each");
    
                        if ($(block).find('p').find('span').css('background-image') !== "none") {
                            result = $(block).find('p').text();
    
                            console.log("Получен тип: " + result);
    
                            return false;
                        }
                    })
    
                    console.log("Результат вычисления typeKMU перед выводом: " + result);
    
                    return result;
                }
    
                function sendAjax(data) {
                    $.ajax('../php/quiz.php',{
                        type: "POST",
                        data: data,
                        beforeSend: function() {
                            display.append('<div class="loading"></div>');
                            $(display).find('div.loading').fadeIn(300);
    
                            $('div.quiz').find('div.next').unbind().addClass('notActive');
                        },
                        success: function(response) {
                            console.log("Получен ответ: "+response, data);
                        }
                    })
                }
    
                let data = {
                    notification: "choiceTypeKMU",
                    typeKMU: typeKMU(),
                    idUser: user.id
                };
    
                sendAjax(data);
            }


    Может я что-то упустил?
  • Как дождаться завершение $.each()?

    @Viktor091 Автор вопроса
    От части согласен.
    Смотрите что получается:

    let typeKMU = function() {
                    console.log("Запуск функции");
                    let div = $(display).find('div.typeKMU');
                    let result = null;
    
                    $.each(div, function(i, block) {
                        console.log("Запускаю " + i + " интерацию цикла each");
    
                        if ($(block).find('p').find('span').css('background-image') !== "none") {
                            result = $(block).find('p').text();
    
                            console.log("Получен тип: " + result);
    
                            return false;
                        }
                    })
    
                    console.log("Результат вычисления typeKMU перед выводом: " + result);
    
                    return result;
                }


    Результат выполнения:
    1 из примерно 10 раз:

    Запуск функции
    Результат вычисления typeKMU перед выводом: null

    В основном все отрабатывает:

    Запуск функции
    Запускаю 0 интерацию цикла each
    Запускаю 1 интерацию цикла each
    Получен тип: Гидравлический
    Результат вычисления typeKMU перед выводом: Гидравлический

    То есть в итоге цикл each вообще не запускается, такое возможно?
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    TheElePHPant, уже разобрались, применение класса осуществлено до его объявления.
    А где объявлен класс MY_CLASS?

    class MY_CLASS_2 extends MY_CLASS_1{

    должно быть так

    Нет, тут логика правильная, MY_CLASS - это еще один класс, от которого наследуется MY_CLASS_2, в этой проблеме этот класс не участвует.
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos,
    Говнокод - не страшно, страшно считать его успехом ;)
    Согласен!
    Кстати, есть ощущение, что процитированное вы поняли с точностью до наоборот.

    Возможно, спорить не буду. Я понял так:
    Я писал кучу кода в одном файле, там были и функции и переменные и т.д. и т.п. Причем чуть ли не в каждой функции был один и тот же код (дубли), при этом классы я не использовал - не умел. Далее до меня начало допирать что это капец как неудобно, особенно это проявилось когда надо было слегка изменить код))) Тут до меня начало допирать, что дублировать код нельзя - начал изучать классы, а оказывается, что их еще можно наследовать, расширять функционал и т.д. - это нереально проще и правильнее! И так далее. Это мое понимание, поправьте, если ошибаюсь.
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos,
    Впрочем, опыт ошибок при этом изучении идет в плюс - иначе изучающий просто не понимает, зачем делать так сложно, если можно сделать проще.

    Вот тут абсолютно согласен! На личном опыте уже натыкался, можно делать проще и в дальнейшем при правильном подходе намного проще пользоваться своими же функциями и классами. Но в моем случае для этого пришлось сначала дойти до того, когда сам уже путаешься в своем же коде. Но правильнее конечно изучить сначала стандарты и элементарные правила - солидарен! Из этой переписки я думаю достаточно рекомендаций к изучению. Может еще что добавите? Пусть даже для совсем чайников, я бы например с удовольствием почитал)
    Не всегда удается найти правильную литературу за исключением мануала.
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos, бери пример с index0h, вот так надо учить новичков, если хочешь помочь конечно!
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    index0h, огромное Вам спасибо.
    Все Ваши рекомендации взял на вооружение! Буду зубрить, чтоб от зубов отскакивало)))
    Еще раз спасибо за разъяснение, все четко и понятно, направление ясно - двигаемся дальше!
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos, учитывая все вышесказанное, каждый класс нужно держать в отдельном файле и подгружать их по средствам автозагрузки? А как быть с трейтами в итоге?
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos, поверь, далеко не всем нужна такая мотивация! Например я и без этого горю, и потихоньку разбираюсь. Я согласен что большинство пишут именно так, как ты говоришь. Но не я)))
    Раз уж такая песня, будь добр поясни:
    Глобальные переменные

    Это плохо для кода?
    Отсутствие валидаций

    Поясните пожалуйста, если не сложно.
    А за phptherightway спасибо. Почитаю на досуге.
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos, да кто спорит??? Я только за, чтобы учиться писать правильно, но вы подскажите, как правильно, а не стройте из себя великого кодермена. Такое ощущение, что если бы ты стоял вживую передо мной, то пришлось бы тебе в ножки кланиться и землю целовать в засос, чтобы ваше величайшее благосеяние снизашло до простых смертных и ты бы объяснил что я делаю не так!!!
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    index0h,
    Глобальные переменные

    Это плохо для кода?
    Отсутствие валидаций

    Поясните пожалуйста, если не сложно.
    Дублирование кода

    Тут абсолютно согласен - борюсь с этим.
    Вывод и обработка в перемешку

    Тоже самое. Сам иногда путаюсь)
    Незнание конструкций } else if { и switch

    else if - знаю, просто привык уже.
    switch - только недавно изучил, потихоньку внедряю.
    Непонимание процесса работы интерпретатора, а именно вызовы до объявления

    Вот тут запарка, так же где-то прочитал на форумах, ввели в заблуждение.
    Прошу прощения за кучу вопросов, просто хочется разобраться. Я не учился на программиста, я самоучка - но мне нравиться. По этому естественно стандартных вещей могу не знать.
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Большое спасибо, заработало.
    Тогда еще вопрос, если можно:
    $res = new MY_CLASS;
    echo $res -> value;
    
    class MY_CLASS {
    	public $value = 'OK!!!';
    }

    почему тогда этот код работает?
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos, полезно людям, которые считают себя богами - голову в бетон закатывать. Вот это действительно полезно!!!
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos,
    ну, и на первое же использование класса ДО его объявления в этом говнокодище вы получаете ошибку. Все логично.

    Сразу не заметил)))
    Да за что же вы тут все так жизнью-то обижены?)))
    Тяжело вам ребята!
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos,
    Но вот класс VK_GROUP перед ней явно не объявлен.

    Вопрос, на сколько я знаю, классы, функции и т.п. пишутся в любом месте кода (я имею ввиду выше, ниже, не в блоках if-else и т.п.), не в зависимости от того, где собственно класс или функция вызвана. Это так?
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos, вот вторая часть файла (которая не поместилась в предыдущий комментарий)
    <?php
    set_time_limit(3600);
    require_once __DIR__ .'/../vk/script.php';
    require_once __DIR__ .'/../connection/connection.php';
    require_once __DIR__ .'/../ok/script.php';
    const LOCK = __DIR__ .'/lock.txt';
    const TASKS = __DIR__ .'/tasks.txt';
    const ERRORE = __DIR__ .'/log.txt';
    //--------------------
    error_reporting(E_ALL);
    //ini_set('display_errors', 1);//------------------------не забудь убрать!!!
    //--------------------
    if (!file_exists(LOCK)) {
    	touch(LOCK);
    	if (file_exists(TASKS)) {
    		$tasks = json_decode(file_get_contents(TASKS), true);
    		if (!empty($tasks)) {
    			foreach($tasks as $key => $value) {
    				if ($value['status'] == 'В очереди' or $value['status'] == 'Выполняется' or $value['status'] == 'Ошибка') {
    					if ($value['status'] == 'Ошибка') {
    						if ($value['count_error'] >=3) {
    							continue;
    						}else {
    							if (time() < ($value['time_done'] + 600)) {
    								continue;
    							}
    						}
    					}
    					$index = $key;
    					break;
    				}else {
    					$index = NULL;
    				}
    			}
    		}else {
    			$index = NULL;
    		}
    		if ($index !== NULL) {
    			$tasks[$index]['status'] = 'Выполняется';
    			$tasks[$index]['time_acc'] = time();
    			$inter_result = file_put_contents(TASKS, json_encode($tasks));
    			register_shutdown_function('errore');
    			if ($tasks[$index]['index'] == 'update_kmu_vk') {
    				$kmu = new VK_GROUP($index);
    				//$res = $kmu -> update_kmu();
    				echo 'update_kmu';
    			}else {
    				if ($tasks[$index]['index'] == 'add_new_kmu_vk') {
    					$kmu = new VK_GROUP($index);
    					//$res = $kmu -> add_kmu();
    					echo 'add_kmu';
    				}else {
    					if ($tasks[$index]['index'] == 'add_repost_new_kmu_vk') {
    						$kmu = new VK_GROUP($index);
    						//$res = $kmu -> add_post_kmu();
    						echo 'add_post_kmu';
    					}else {
    						if ($tasks[$index]['index'] == 'repost_arrived_container_vk') {
    							$kmu = new VK_GROUP($index);
    							//$res = $kmu -> add_array_card_wall();
    							echo 'add_array_card_wall';
    						}else {
    							if ($tasks[$index]['index'] == 'delite_kmu_vk') {
    								$kmu = new VK_GROUP($index);
    								//$res = $kmu -> delite_kmu();
    								echo 'delite_kmu';
    							}else {
    								if ($tasks[$index]['index'] == 'repost_arrived_kmu_vk') {
    									$kmu = new VK_GROUP($index);
    									//$res = $kmu -> add_post_kmu();
    									echo 'add_post_kmu';
    								}else {
    									if ($tasks[$index]['index'] == 'update_kmu_ok') {
    										$id = new VK_GROUP($index);
    										$kmu = new OK;
    										//$res = $kmu -> add_card_kmu($id -> kmu);
    										echo 'add_card_kmu';
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}else {
    			$res = delite_tasks();
    		}
    	}else {
    		$errore = file_put_contents(ERRORE, 'Отсутствует файл задач! '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    	}
    	unlink(LOCK);
    	//exit();
    }else {
    	$info = stat(LOCK);
    	$kill_script = $info['mtime'] + 3600;
    	if (time() > $kill_script) {
    		unlink(LOCK);
    	}
    	file_put_contents(__DIR__ .'/result.txt', 'Предотвращение повторного вызова скрипта!'.date('H:i:s d.m.Y')."\n", FILE_APPEND);
    	//exit();
    }
    /*=======================| ФУНКЦИИ |=======================*/
    function errore() {
    	global $index;
    	global $tasks;
    	$error = error_get_last();
    	if (is_array($error) && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR])) {
            while (ob_get_level()) {
                ob_end_clean();
            }
            $errore = file_put_contents(ERRORE, 'Фатальная ошибка при выполнении скрипта! '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    		$tasks[$index]['status'] = 'Ошибка';
    		$tasks[$index]['time_done'] = time();
    		$result = file_put_contents(TASKS, json_encode($tasks));
    		unlink(LOCK);
        }
    }
    function delite_tasks() {
    	global $tasks;
    	$arr_done = array();
    	foreach($tasks as $i => $val) {
    		if ($val['status'] == 'Выполнено' and date('d.m.Y', $val['time_done']) == date('d.m.Y', (time() - (60 * 60 * 24 * 7)))) {
    			unset($tasks[$i]);
    		}else {
    			continue;
    		}
    	}
    	$result = file_put_contents(TASKS, json_encode($tasks));
    }
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    index0h,
    Конструктор в трейте - это, не нахожу подходящего цензурного слова, пусть будет табу.

    Поясните пожалуйста, раз уж написали.
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    index0h, не совсем понимаю по каким критериям Вы сформировали свое мнение! Я не просил охарактеризовать МОЙ код, я попросил помочь разобраться с проблемой. Если Вы не можете дать внятного совета, не обязательно писать абы что.
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    @Viktor091 Автор вопроса
    Adamos,
    Полный код файла не помещается, фрагмент, начиная от трейта и до конца файла:
    /*=======================| ТРЕЙТЫ |=======================*/
    trait kmu_trait {
    	public $index;
    	public $kmu;
    	public function __construct(int $num) {
    		$this -> index = $num;
    		$this -> kmu = $this -> search_kmu();
    	}
    	private function search_kmu() {
    		global $mysqli;
    		global $tasks;
    		if ($tasks[$this -> index]['index'] == 'repost_arrived_container_vk') {
    			return false;
    		}else {
    			$sql = $mysqli -> query("SELECT * FROM price WHERE namber_p_p=".$tasks[$this -> index]['id_kmu']);
    			if ($sql == true) {
    				$kmu = mysqli_fetch_assoc($sql);
    			}else {
    				$kmu = NULL;
    				$errore = file_put_contents(ERRORE, 'Ошибка подключения к базе данных! '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    				$tasks[$this -> index]['status'] = 'Ошибка';
    				if (!empty($tasks[$this -> index]['count_error'])) {
    					$count_error = $tasks[$this -> index]['count_error'];
    				}else {
    					$count_error = 0;
    				}
    				$tasks[$this -> index]['count_error'] = ++$count_error;
    				$tasks[$this -> index]['time_done'] = time();
    				$result = file_put_contents(TASKS, json_encode($tasks));
    			}
    			return $kmu;
    		}
    	}
    }
    /*=======================| КЛАССЫ |=======================*/
    class VK_GROUP {
    
    	use kmu_trait;
    	
    	public function update_kmu() {
    		global $tasks;
    		$res = add_kmu_for_group_vk($this -> kmu);
    		if ($res == true) {
    			$tasks[$this -> index]['status'] = 'Выполнено';
    			$tasks[$this -> index]['time_done'] = time();
    			$result = file_put_contents(TASKS, json_encode($tasks));
    		}else {
    			$errore = file_put_contents(ERRORE, 'Ошибка при запросе к API ВК при обновлении КМУ! '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    			$tasks[$this -> index]['status'] = 'Ошибка';
    			if (!empty($tasks[$this -> index]['count_error'])) {
    				$count_error = $tasks[$this -> index]['count_error'];
    			}else {
    				$count_error = 0;
    			}
    			$tasks[$this -> index]['count_error'] = ++$count_error;
    			$tasks[$this -> index]['time_done'] = time();
    			$result = file_put_contents(TASKS, json_encode($tasks));
    		}
    	}
    	
    	public function add_kmu() {
    		global $tasks;
    		$res = add_kmu_for_group_vk($this -> kmu);
    		if (gettype($res) == 'integer') {
    			$tasks[$this -> index]['status'] = 'Выполнено';
    			$tasks[$this -> index]['time_done'] = time();
    			$result = file_put_contents(TASKS, json_encode($tasks));
    		}else {
    			$text_error = serialize($res);
    			$errore = file_put_contents(ERRORE, 'Ошибка при запросе к API ВК при обновлении КМУ! '.date('H:i:s d.m.Yг.')."\n".$text_error."\n", FILE_APPEND);
    			$tasks[$this -> index]['status'] = 'Ошибка';
    			if (!empty($tasks[$this -> index]['count_error'])) {
    				$count_error = $tasks[$this -> index]['count_error'];
    			}else {
    				$count_error = 0;
    			}
    			$tasks[$this -> index]['count_error'] = ++$count_error;
    			$tasks[$this -> index]['time_done'] = time();
    			$result = file_put_contents(TASKS, json_encode($tasks));
    		}
    	}
    	
    	public function add_post_kmu() {
    		global $tasks;
    		if (!empty($this -> kmu['vk_id'])) {
    			$res = add_card_wall($this -> kmu['vk_id'], $tasks[$this -> index]['text_repost']);
    			if (!empty($res['post_id'])) {
    				$tasks[$this -> index]['status'] = 'Выполнено';
    				$tasks[$this -> index]['time_done'] = time();
    				$result = file_put_contents(TASKS, json_encode($tasks));
    			}else {
    				$text_error = serialize($res);
    				$errore = file_put_contents(ERRORE, 'Ошибка при запросе к API ВК при обновлении КМУ! '.date('H:i:s d.m.Yг.')."\n".$text_error."\n", FILE_APPEND);
    				$tasks[$this -> index]['status'] = 'Ошибка';
    				if (!empty($tasks[$this -> index]['count_error'])) {
    					$count_error = $tasks[$this -> index]['count_error'];
    				}else {
    					$count_error = 0;
    				}
    				$tasks[$this -> index]['count_error'] = ++$count_error;
    				$tasks[$this -> index]['time_done'] = time();
    				$result = file_put_contents(TASKS, json_encode($tasks));
    			}
    		}else {
    			$errore = file_put_contents(ERRORE, 'КМУ '.$this -> kmu['name'].' нет в группе ВК, или ID не занесен в базу данных! '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    			$tasks[$this -> index]['status'] = 'Ошибка';
    			if (!empty($tasks[$this -> index]['count_error'])) {
    				$count_error = $tasks[$this -> index]['count_error'];
    			}else {
    				$count_error = 0;
    			}
    			$tasks[$this -> index]['count_error'] = ++$count_error;
    			$tasks[$this -> index]['time_done'] = time();
    			$result = file_put_contents(TASKS, json_encode($tasks));
    		}
    	}
    	
    	public function add_array_card_wall() {
    		global $tasks;
    		global $mysqli;
    		$arr_id = array();
    		$error = 0;
    		foreach($tasks[$this -> index]['arr_id_kmu'] as $i => $id) {
    			$sql = $mysqli -> query("SELECT * FROM price WHERE namber_p_p=".$id);
    			$kmu = mysqli_fetch_assoc($sql);
    			if (!empty($kmu['vk_id'])) {
    				array_push($arr_id, $kmu['vk_id']);
    			}else {
    				$errore = file_put_contents(ERRORE, 'КМУ '.$kmu['name'].' нет в группе ВК, или ID не занесен в базу данных! '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    				$error++;
    			}
    		}
    		$res = add_array_card_wall($arr_id, $tasks[$this -> index]['text_repost']);
    		if (!empty($res['post_id'])) {
    			if ($error == 0) {
    				$tasks[$this -> index]['status'] = 'Выполнено';
    				$tasks[$this -> index]['time_done'] = time();
    				$result = file_put_contents(TASKS, json_encode($tasks));
    			}else {
    				$tasks[$this -> index]['status'] = 'Выполнено частично';
    				$tasks[$this -> index]['time_done'] = time();
    				$result = file_put_contents(TASKS, json_encode($tasks));
    			}
    		}else {
    			$text_error = serialize($res);
    			$errore = file_put_contents(ERRORE, 'Ошибка при запросе к API ВК при обновлении КМУ! '.date('H:i:s d.m.Yг.')."\n".$text_error."\n", FILE_APPEND);
    			$tasks[$this -> index]['status'] = 'Ошибка';
    			if (!empty($tasks[$this -> index]['count_error'])) {
    				$count_error = $tasks[$this -> index]['count_error'];
    			}else {
    				$count_error = 0;
    			}
    			$tasks[$this -> index]['count_error'] = ++$count_error;
    			$tasks[$this -> index]['time_done'] = time();
    			$result = file_put_contents(TASKS, json_encode($tasks));
    		}
    	}
    	
    	public function delite_kmu() {
    		global $tasks;
    		global $mysqli;
    		$res = delite_catd_vk($this -> kmu['vk_id']);
    		if ($res == true) {
    			$sql = $mysqli -> query("UPDATE price SET vk_id=NULL WHERE namber_p_p=".$this -> kmu['namber_p_p']);
    			if ($sql == true) {
    				$tasks[$this -> index]['status'] = 'Выполнено';
    				$tasks[$this -> index]['time_done'] = time();
    				$result = file_put_contents(TASKS, json_encode($tasks));
    			}else {
    				$tasks[$this -> index]['status'] = 'Выполнено частично';
    				$tasks[$this -> index]['time_done'] = time();
    				$result = file_put_contents(TASKS, json_encode($tasks));
    				$errore = file_put_contents(ERRORE, 'Ошибка подключения к базе данных, не удалось удалить ID_VK из БД! КМУ '.$this -> kmu['name'].' '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    			}
    		}else {
    			$errore = file_put_contents(ERRORE, 'Ошибка при запросе к API ВК при обновлении КМУ! '.date('H:i:s d.m.Yг.')."\n", FILE_APPEND);
    			$tasks[$this -> index]['status'] = 'Ошибка';
    			if (!empty($tasks[$this -> index]['count_error'])) {
    				$count_error = $tasks[$this -> index]['count_error'];
    			}else {
    				$count_error = 0;
    			}
    			$tasks[$this -> index]['count_error'] = ++$count_error;
    			$tasks[$this -> index]['time_done'] = time();
    			$result = file_put_contents(TASKS, json_encode($tasks));
    		}
    	}
    }
    
    class GROUP_OK extends OK {
    	use kmu_trait;
    }
    
    $res = new GROUP_OK($index);
    echo '<pre>';
    print_r($res -> kmu);
    echo '</pre>';
    ?>

    Ошибка: Fatal error: Uncaught Error: Class 'VK_GROUP' not found in W:\domains\el-price-KMU.ru\cron\index.php:44 Stack trace: #0 {main} thrown in W:\domains\el-price-KMU.ru\cron\index.php on line 44
    Строчка с ошибкой (строчка 44):
    $kmu = new VK_GROUP($index);
    Вроде все правильно.