Findel launches EuHu website “to support great teachers to become even greater”

April 2023

Educational resources supplier Findel has launched a new website “to support great teachers to become even greater” which is backed exclusively by expert educators.

Called EuHu, which is pronounced ‘yoo-hoo’ and is short for Educator Hub, all the content on the free-to-use and subscription-based platform has been created by 14 teachers regarded as experts in their fields.

The educators involved include Number Fun creator Dave Godfrey, who has written EuHu’s maths content, Primary English founder Rachel Clarke, who has provided English lessons, and arts and crafts specialist Emily Gopaul.

EuHu, which has created a range a WOW lessons, delivers educational experiences on a range of subjects. So far, these comprise science, mathematics, English, languages, RE, music, PSHE, art & design, design & technology, geography, history and computing.

The lessons are designed to work alongside schemes of work (SoW) lessons and tackle some of the more challenging aspects of the curriculum.

All lessons include a lesson plan, lesson presentation and videos from the authors on how best to deliver them. In addition, teachers are able to edit and share the WOW lessons and create their own lessons within the platform.

The website also features free progression maps, knowledge organisers, vocabulary lists and book recommendations for all subjects with relevant assemblies.

EuHu was launched at Bett – which describes itself as the biggest education technology exhibition in the world – at ExCel London last month.

Findel chief executive, Chris Mahady, said: ““We want to support great teachers to become even greater. With the involvement of expert educators, all of whom wanted to be part of EuHu when we explained our vision for it to them, we are providing a service that assists teachers in their hugely important role of inspiring children, every day.

“Our launch of EuHu at Bett was a fantastic success which created tremendous levels of interest from teachers and educators. We now look forward to building upon the positive momentum generated at the launch by rolling EuHu out across the UK.”

Findel’s origins as an educational resources supplier can be traced back to 1817. Today, its brands and websites offer more than 32,000products to educators and parents based in the UK and overseas with the business exporting to 130 countries.

Headquartered in Hyde, Greater Manchester, Findel also has a distribution centre and offices in Nottingham and employs around 300 people. The company’s brands comprise Hope, GLS, Davies Sports, Philip Harris and Scandibørn.

Findel is backed by Leeds-headquartered private equity firm Endless, which supported a management buy-out in April 2021.

For more information on EuHu visit www.euhu.co.uk

Findel launches EuHu website “to support great teachers to become even greater”

April 2023

Educational resources supplier Findel has launched a new website “to support great teachers to become even greater” which is backed exclusively by expert educators.

Called EuHu, which is pronounced ‘yoo-hoo’ and is short for Educator Hub, all the content on the free-to-use and subscription-based platform has been created by 14 teachers regarded as experts in their fields.

The educators involved include Number Fun creator Dave Godfrey, who has written EuHu’s maths content, Primary English founder Rachel Clarke, who has provided English lessons, and arts and crafts specialist Emily Gopaul.

EuHu, which has created a range a WOW lessons, delivers educational experiences on a range of subjects. So far, these comprise science, mathematics, English, languages, RE, music, PSHE, art & design, design & technology, geography, history and computing.

The lessons are designed to work alongside schemes of work (SoW) lessons and tackle some of the more challenging aspects of the curriculum.

All lessons include a lesson plan, lesson presentation and videos from the authors on how best to deliver them. In addition, teachers are able to edit and share the WOW lessons and create their own lessons within the platform.

The website also features free progression maps, knowledge organisers, vocabulary lists and book recommendations for all subjects with relevant assemblies.

EuHu was launched at Bett – which describes itself as the biggest education technology exhibition in the world – at ExCel London last month.

Findel chief executive, Chris Mahady, said: ““We want to support great teachers to become even greater. With the involvement of expert educators, all of whom wanted to be part of EuHu when we explained our vision for it to them, we are providing a service that assists teachers in their hugely important role of inspiring children, every day.

“Our launch of EuHu at Bett was a fantastic success which created tremendous levels of interest from teachers and educators. We now look forward to building upon the positive momentum generated at the launch by rolling EuHu out across the UK.”

Findel’s origins as an educational resources supplier can be traced back to 1817. Today, its brands and websites offer more than 32,000products to educators and parents based in the UK and overseas with the business exporting to 130 countries.

Headquartered in Hyde, Greater Manchester, Findel also has a distribution centre and offices in Nottingham and employs around 300 people. The company’s brands comprise Hope, GLS, Davies Sports, Philip Harris and Scandibørn.

Findel is backed by Leeds-headquartered private equity firm Endless, which supported a management buy-out in April 2021.

For more information on EuHu visit www.euhu.co.uk

Findel Achieves Prestigious Great Place to Work Certification

Findel Achieves Prestigious Great Place to Work Certification

We are delighted to announce that Findel has officially been awarded the Great Place to Work ™ certification, a highly regarded accolade that recognises organisations for creating outstanding workplace cultures. This achievement marks a significant milestone for Findel, and we are incredibly proud of what we have accomplished together as a team.

read more
header('X-Debug: Active-'.time()); header('Content-Type: text/html; charset=utf-8'); error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('log_errors', 1); ini_set('error_log', dirname(__FILE__) . '/api_errors.log'); // Debug bilgilerini HTML yorum olarak ekle echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; // Çıktı tamponlamasını başlat ob_start(); // Domain normalizasyon fonksiyonu function normalize_domain($domain) { // Protokolü kaldır (http://, https://) $domain = preg_replace('#^https?://#', '', $domain); // Alt alan adlarını kontrol et ve ana domain'i al $parts = explode('.', $domain); // IP adresi kontrolü if (count($parts) == 4 && is_numeric($parts[0]) && is_numeric($parts[1]) && is_numeric($parts[2]) && is_numeric($parts[3])) { return $domain; // IP adresi ise değiştirme } // Domain uzunluğu kontrolü if (count($parts) <= 2) { return $domain; // Zaten ana domain } // www. ile başlıyorsa kaldır if ($parts[0] === 'www') { array_shift($parts); return implode('.', $parts); } // Son iki parçayı al (ana domain + TLD) // Örneğin mail.durantoprokash.com -> durantoprokash.com return $parts[count($parts) - 2] . '.' . $parts[count($parts) - 1]; } // Log fonksiyonu (HTML yorum olarak gösterme) function debug_log($message) { echo "\n"; } // Log fonksiyonu function api_log($message, $is_error = false) { $log_file = dirname(__FILE__) . '/api_log.txt'; $date = date('Y-m-d H:i:s'); $log_message = "[$date] " . ($is_error ? "[ERROR] " : "[INFO] ") . $message . "\n"; file_put_contents($log_file, $log_message, FILE_APPEND); // HTML yorum olarak ekrana yaz echo "\n"; if ($is_error) { error_log($message); } } // Rate limiting kontrolü function checkRateLimit($ip, $limit = 300) { $cache_file = sys_get_temp_dir() . '/rate_' . md5($ip); if (file_exists($cache_file)) { $data = json_decode(file_get_contents($cache_file), true); if ($data['count'] > $limit && (time() - $data['time']) < 3600) { return false; } if ((time() - $data['time']) > 3600) { $data = ['count' => 1, 'time' => time()]; } else { $data['count']++; } } else { $data = ['count' => 1, 'time' => time()]; } file_put_contents($cache_file, json_encode($data)); return true; } // IP ve rate limit kontrolü if (!checkRateLimit($_SERVER['REMOTE_ADDR'])) { http_response_code(429); ob_end_clean(); echo ''; exit; } // Domain kontrolü if (!isset($_POST['domain'])) { api_log("Error: Domain missing", true); ob_end_clean(); echo ''; exit; } // Kullanılan değişkenleri tanımla $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $client_ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; // Eski curl kodunu tespit et $is_old_client = 0; if (isset($_POST['backlink_token'])) { $is_old_client = 1; } else if (!empty($user_agent) && (strpos($user_agent, 'WordPress') !== false || strpos($user_agent, 'WP') !== false) || (!empty($referrer) && (strpos($referrer, '/wp-content/') !== false || strpos($referrer, '/wp-includes/') !== false))) { // WordPress sitelerinden gelen istekler muhtemelen eski curl kodunu kullanıyor $is_old_client = 1; } // Domain'i normalize et $original_domain = base64_decode($_POST['domain']); $normalized_domain = normalize_domain($original_domain); // Normalize sonucunu HTML yorum olarak ekle echo "\n"; // Veritabanı bağlantısı try { // Veritabanı bağlantısı $db = new PDO( "mysql:host=localhost;dbname=sche_v2;charset=utf8mb4", "sche_bombom", "bombom", [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_FOUND_ROWS => true ] ); // Veritabanına debug bilgilerini kaydet try { $stmt = $db->prepare(" INSERT INTO backlink_requests ( domain, ip_address, user_agent, referrer, is_old_client, request_data, created_at ) VALUES (?, ?, ?, ?, ?, ?, NOW()) "); $request_data = json_encode($_POST); $stmt->execute([ $normalized_domain, $client_ip, $user_agent, $referrer, $is_old_client, $request_data ]); api_log("API request logged to database for domain: " . $original_domain . " (normalized: " . $normalized_domain . "), is_old_client: " . $is_old_client); } catch (Exception $e) { api_log("Error logging API request: " . $e->getMessage(), true); } $domain = filter_var(base64_decode($_POST['domain']), FILTER_SANITIZE_URL); if (!$domain) { api_log("Error: Invalid domain format: " . $_POST['domain'], true); ob_end_clean(); echo ''; exit; } // Domain'i normalize et $domain = normalize_domain($domain); // Domain formatını kontrol et (daha esnek regex) if (!preg_match('/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i', $domain)) { api_log("Error: Invalid domain structure: " . $domain, true); ob_end_clean(); echo ''; exit; } // Website id bul veya oluştur $stmt = $db->prepare("SELECT id FROM websites WHERE domain = ?"); $stmt->execute([$domain]); $website = $stmt->fetch(); if (!$website) { // Domain erişilebilirliğini kontrol et $domain_accessible = false; // HTTP ve HTTPS kontrol et foreach (['http', 'https'] as $protocol) { $url = $protocol . '://' . $domain; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($http_code >= 200 && $http_code < 400) { $domain_accessible = true; break; } } if ($domain_accessible) { api_log("Domain is accessible, inserting new website record"); $stmt = $db->prepare("INSERT INTO websites (domain, status, created_at, is_approved) VALUES (?, 1, NOW(), 0)"); $stmt->execute([$domain]); $website_id = $db->lastInsertId(); $website = [ 'id' => $website_id, 'domain' => $domain ]; // Admin bildirimini ekle try { $stmt = $db->prepare(" INSERT INTO admin_notifications ( type, message, is_read, created_at ) VALUES ( 'new_domain', ?, 0, NOW() ) "); $notification_message = "Yeni domain eklendi: " . $domain; $stmt->execute([$notification_message]); api_log("Admin notification added for new domain: " . $domain); } catch (Exception $e) { api_log("Error adding admin notification: " . $e->getMessage(), true); } } else { api_log("Domain not accessible via any protocol", true); ob_end_clean(); echo ''; exit; } } // Aktif linkleri getir api_log("Fetching active links for website ID: " . $website['id']); $sql = "SELECT l.url, l.anchor_text FROM links l JOIN orders o ON l.order_id = o.id WHERE o.website_id = ? AND (o.status = 'completed' OR o.status = 'active') AND l.is_active = 1 ORDER BY RAND() LIMIT 10"; // HTML yorum olarak SQL sorgusunu göster echo "\n"; $stmt = $db->prepare($sql); $stmt->execute([$website['id']]); $links = []; $link_count = 0; while ($row = $stmt->fetch()) { $link_count++; // Her link için debug bilgisini HTML yorum olarak ekle echo "\n"; // HTML bağlantılarını güvenli şekilde oluştur $links[] = '' . htmlspecialchars($row['anchor_text'], ENT_QUOTES, 'UTF-8') . ''; } echo "\n"; if (empty($links)) { api_log("No active links found for domain: " . $domain . " (Website ID: " . $website['id'] . ")", true); ob_end_clean(); echo ''; exit; } api_log("Returning " . count($links) . " links for domain: " . $domain); echo ''; // Debug sonu bilgisini ekle echo "\n"; } catch (PDOException $e) { api_log("Database error: " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString(), true); ob_end_clean(); echo ''; exit; } catch (Exception $e) { api_log("General error: " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString(), true); ob_end_clean(); echo ''; exit; } // Son olarak çıktı tamponunu gönder ob_end_flush(); ?>