TEMPLATE 🕌 Türkiye İftar Sayacı – XenForo Sidebar Widget’ı [Ramazan Özel]

Önemli Uyarı

XenConsept forumumuzda Türk içerik sağlayıcıların ücretli eklenti ve temalarını paylaşmak kesinlikle yasaktır. Buna uymayan üyeler uyarılmaksızın forumdan kalıcı olarak uzaklaştırılır.

Important Warning

Sharing paid plugins and themes from Turkish content providers is strictly prohibited on our XenConcept forum. Members who violate this rule will be permanently banned from the forum without warning.

ALemci44

User
Katılım
30 Ara 2025
Konular
23
Mesajlar
94
Beğeni
46
Konum
Küçükköy
Web sitesi
www.kucukkoyluler.com
Merhaba arkadaşlar,


Ramazan ayına özel olarak hazırladığım Türkiye İftar Sayacı widget’ını paylaşmak istedim!

Bu widget ile forumunuzun sidebar’ına kolayca ekleyebilir, kullanıcılarınıza canlı iftar saatlerini gösterebilirsiniz.

✨ Özellikler:
  • 🇹🇷 81 il için iftar saati ve geri sayım
  • ⏳ Aktif şehir sayaçlı ve parlayan renk efekti
  • 🌟 Hover efektli şehir listesi, aktif şehir vurgulu
  • 🕌 Başlık ikonu küçültüldü, dernek yazısı parlayan yeşil
  • 🖱️ Scroll okları ile 10 şehir görünümü, liste kaydırılabilir
  • 💻 XenForo sidebar widget uyumlu, ekstra dosya gerekmez
  • 🔔 İsteğe göre aktif şehir uyarısı ve sesli bildirim eklenebilir
💡 Kullanımı:
  1. Admin CP → görünüm ve diller → Widgets → Custom HTML Widget oluşturun.
  2. Widget’ı forum listesi sidebar pozisyonuna ekleyin.
  3. Kodun tamamını HTML alanına yapıştırın.
  4. Geliştirme modunu açarsanız değişiklikleri anında görebilirsiniz.

📌 Notlar:
  • İlk yüklemede şehirler API üzerinden çekildiği için kısa süreli “yükleniyor…” görünebilir.
  • Kod tamamen responsive ve XenForo temanızla uyumludur.
Kod:
<div style="
width:100%;
color:white;
font-family:Arial, sans-serif;
font-size:13px;
background:linear-gradient(180deg,#111,#1b1f3a);
padding:10px;
border-radius:12px;
box-sizing:border-box;
box-shadow:0 0 15px rgba(0,0,0,0.4);
">

<!-- Başlık -->
<div style="text-align:center;font-weight:bold;font-size:14px;margin-bottom:4px;">
🕌 <span style="font-size:12px;">TÜRKİYE İFTAR SAYAÇ</span>
</div>

<!-- Dernek yazısı parlayan yeşil -->
<div style="text-align:center;font-size:12px;margin-bottom:10px;color:#0f0; font-weight:bold; text-shadow: 0 0 5px #0f0, 0 0 10px #0f0, 0 0 15px #0f0;">
Küçükköylüler Sosyal Kültürel<br>
Yardımlaşma ve Dayanışma Derneği
</div>

<!-- Aktif şehir ve sayaç -->
<div id="activeCity" style="text-align:center;font-weight:bold;font-size:16px;">
İstanbul
</div>

<div id="bigCountdown" style="
font-weight:bold;
color:#ffd700;
text-align:center;
margin:6px 0 10px 0;
">Yükleniyor...</div>

<!-- Şehir listesi -->
<div id="cityList" style="max-height:220px;overflow:hidden;">Yükleniyor...</div>

<!-- Oklar aşağıda -->
<div style="text-align:center;margin-top:8px;">
<button onclick="scrollUp()">⬆</button>
<button onclick="scrollDown()">⬇</button>
</div>

</div>

<style>
/* Hover efekt ve aktif şehir glow animasyonu */
@keyframes glow {
  0% {text-shadow: 0 0 2px #0f0;}
  50% {text-shadow: 0 0 8px #0f0;}
  100% {text-shadow: 0 0 2px #0f0;}
}

#cityList div:hover {
    background: rgba(0,255,0,0.1);
    animation: glow 1.5s infinite;
}

#cityList .activeCityItem {
    background: rgba(0,255,0,0.25);
    font-weight: bold;
    color: #0f0;
    animation: glow 2s infinite alternate;
}

/* XenForo sidebar uyumu */
.p-body-sidebar .block-body {
    padding: 0 !important;
}
.p-body-sidebar button {
    font-size: 11px;
    padding: 2px 6px;
}
</style>

<script>
const cities = [
"İstanbul","Ankara","İzmir","Bursa","Antalya","Adana","Konya","Gaziantep","Şanlıurfa","Kocaeli",
"Adıyaman","Afyonkarahisar","Ağrı","Aksaray","Amasya","Ardahan","Artvin","Aydın","Balıkesir","Bartın",
"Batman","Bayburt","Bilecik","Bingöl","Bitlis","Bolu","Burdur","Çanakkale","Çankırı","Çorum",
"Denizli","Diyarbakır","Düzce","Edirne","Elazığ","Erzincan","Erzurum","Eskişehir","Giresun","Gümüşhane",
"Hakkari","Hatay","Iğdır","Isparta","Kahramanmaraş","Karabük","Karaman","Kars","Kastamonu","Kayseri",
"Kırıkkale","Kırklareli","Kırşehir","Kilis","Kütahya","Malatya","Manisa","Mardin","Mersin","Muğla",
"Muş","Nevşehir","Niğde","Ordu","Osmaniye","Rize","Sakarya","Samsun","Siirt","Sinop",
"Sivas","Şırnak","Tekirdağ","Tokat","Trabzon","Tunceli","Uşak","Van","Yalova","Yozgat","Zonguldak"
];

let iftarTimes = {};
let activeCity = "İstanbul";
let visibleStart = 0;
const visibleCount = 10;

// ✅ Paralel fetch ile tüm şehirleri aynı anda çek
async function fetchTimesParallel() {
  const promises = cities.map(async city => {
    try {
      const url = `https://api.aladhan.com/v1/timingsByCity?city=${city}&country=Turkey&method=13`;
      const res = await fetch(url);
      const data = await res.json();
      iftarTimes[city] = data.data.timings.Maghrib;
    } catch(e) {
      iftarTimes[city] = null;
    }
  });
  await Promise.all(promises);
}

// Listeyi render et
function renderList(){
  let html = "";
  const slice = cities.slice(visibleStart, visibleStart + visibleCount);

  slice.forEach(city=>{
    const activeClass = (city === activeCity) ? 'activeCityItem' : '';
    const leftText = iftarTimes[city] ? "--" : "Yükleniyor...";
    html += `
      <div onclick="setActiveCity('${city}')" class="${activeClass}"
      style="cursor:pointer;padding:4px 0;display:flex;justify-content:space-between;">
        <span>${city}</span>
        <span id="left-${city}">${leftText}</span>
      </div>
    `;
  });

  document.getElementById("cityList").innerHTML = html;
}

// Scroll fonksiyonları
function scrollDown(){
  if(visibleStart + visibleCount < cities.length){
    visibleStart++;
    renderList();
  }
}

function scrollUp(){
  if(visibleStart > 0){
    visibleStart--;
    renderList();
  }
}

// Aktif şehir seç
function setActiveCity(city){
  activeCity = city;
  document.getElementById("activeCity").innerHTML = city;
  renderList();
}

// Sayaçları güncelle
function updateCountdown(){
  const now = new Date();

  cities.forEach(city=>{
    if(!iftarTimes[city]) return;
    const [h,m] = iftarTimes[city].split(":");
    const t = new Date();
    t.setHours(h,m,0);
    let diff = t - now;

    const el = document.getElementById("left-"+city);
    if(!el) return;

    if(diff <= 0){
      el.innerHTML = "🌙";
      return;
    }

    let hours = Math.floor(diff/3600000);
    let minutes = Math.floor((diff%3600000)/60000);
    el.innerHTML = hours + "s " + minutes + "d";
  });

  if(iftarTimes[activeCity]){
    const [h,m] = iftarTimes[activeCity].split(":");
    const t = new Date();
    t.setHours(h,m,0);
    let diff = t - now;

    if(diff <= 0){
      document.getElementById("bigCountdown").innerHTML = "🌙 İFTAR VAKTİ!";
      return;
    }

    let hours = Math.floor(diff/3600000);
    let minutes = Math.floor((diff%3600000)/60000);
    let seconds = Math.floor((diff%60000)/1000);

    document.getElementById("bigCountdown").innerHTML =
      "⏳ " + hours + "s " + minutes + "d " + seconds + "sn";
  }
}

// Başlat
async function init(){
  renderList(); // Önce Yükleniyor...
  await fetchTimesParallel(); // Tüm şehirleri aynı anda çek
  renderList(); // Artık saatler hazır
  setInterval(updateCountdown,1000);
}

init();
</script>
 
  • Beğen
Tepkiler: XenConsept
Emeğinize sağlık.

Api nedeniyle zaman verisi çekemeyen olursa, tüm şehirler yerine belirli şehirleri seçerek listeyi azaltabilir.
Bunun için aşağıdaki formatı kullanabilirsiniz;




Kod:
<div style="width:100%;color:white;font-family:Arial,sans-serif;font-size:13px;background:linear-gradient(180deg,#111,#1b1f3a);padding:10px;border-radius:12px;box-sizing:border-box;box-shadow:0 0 15px rgba(0,0,0,0.4);">

<div style="text-align:center;font-weight:bold;font-size:14px;margin-bottom:4px;">
🕌 <span style="font-size:12px;">TÜRKİYE İFTAR SAYAÇ</span>
</div>

<div style="text-align:center;font-size:12px;margin-bottom:10px;color:#0f0;font-weight:bold;text-shadow:0 0 5px #0f0,0 0 10px #0f0;">
Küçükköylüler Sosyal Kültürel<br>Yardımlaşma ve Dayanışma Derneği
</div>

<div id="activeCityName" style="text-align:center;font-weight:bold;font-size:16px;">İstanbul</div>
<div id="bigCountdown" style="font-weight:bold;color:#ffd700;text-align:center;margin:6px 0 10px 0;min-height:20px;">Yükleniyor...</div>

<div id="cityList" style="max-height:240px;overflow:hidden;border-top:1px solid rgba(255,255,255,0.1);padding-top:5px;"></div>

<div style="text-align:center;margin-top:8px;">
<button class="btn-scroll" onclick="scrollUp()">⬆</button>
<button class="btn-scroll" onclick="scrollDown()">⬇</button>
</div>
</div>

<style>
.city-row{cursor:pointer;padding:6px;display:flex;justify-content:space-between;border-bottom:1px solid rgba(255,255,255,0.05);transition:0.2s;}
.city-row:hover{background:rgba(0,255,0,0.1);}
.activeCityItem{background:rgba(0,255,0,0.2);font-weight:bold;color:#0f0;}
.btn-scroll{background:#2c3e50;color:white;border:none;padding:5px 15px;border-radius:4px;cursor:pointer;}
</style>

<script>
const cities = ["Adana","Adıyaman","Afyonkarahisar","Ağrı","Aksaray","Amasya","Ankara","Antalya","Ardahan","Artvin","Aydın","Balıkesir","Bartın","Batman","Bayburt","Bilecik","Bingöl","Bitlis","Bolu","Burdur","Bursa","Çanakkale","Çankırı","Çorum","Denizli","Diyarbakır","Düzce","Edirne","Elazığ","Erzincan","Erzurum","Eskişehir","Gaziantep","Giresun","Gümüşhane","Hakkari","Hatay","Iğdır","Isparta","İstanbul","İzmir","Kahramanmaraş","Karabük","Karaman","Kars","Kastamonu","Kayseri","Kilis","Kırıkkale","Kırklareli","Kırşehir","Kocaeli","Konya","Kütahya","Malatya","Manisa","Mardin","Mersin","Muğla","Muş","Nevşehir","Niğde","Ordu","Osmaniye","Rize","Sakarya","Samsun","Şanlıurfa","Siirt","Sinop","Sivas","Şırnak","Tekirdağ","Tokat","Trabzon","Tunceli","Uşak","Van","Yalova","Yozgat","Zonguldak"];

let iftarTimes = {};
let activeCity = "İstanbul";
let visibleStart = 0;
const visibleCount = 7;

async function fetchCityTime(city) {
    if (iftarTimes[city]) return iftarTimes[city];
    try {
        const response = await fetch(`https://api.aladhan.com/v1/timingsByCity?city=${city}&country=Turkey&method=13`);
        const data = await response.json();
        const time = data.data.timings.Maghrib;
        iftarTimes[city] = time;
        return time;
    } catch (e) {
        return null;
    }
}

function getCountdown(timeStr) {
    if (!timeStr) return null;
    const now = new Date();
    const [h, m] = timeStr.split(':');
    const target = new Date();
    target.setHours(h, m, 0);
   
    let diff = target - now;
    if (diff < 0) return "İftar Açıldı";
   
    const hh = Math.floor(diff / 3600000);
    const mm = Math.floor((diff % 3600000) / 60000);
    const ss = Math.floor((diff % 60000) / 1000);
    return { hh, mm, ss, text: `${hh}s ${mm}d ${ss}sn`, short: `${hh}s ${mm}d` };
}

async function renderList() {
    const listDiv = document.getElementById("cityList");
    let html = "";
    const slice = cities.slice(visibleStart, visibleStart + visibleCount);

    for (let city of slice) {
        const time = await fetchCityTime(city);
        const cd = getCountdown(time);
        const activeClass = city === activeCity ? 'activeCityItem' : '';
        const timeText = cd === "İftar Açıldı" ? "🌙" : (cd ? cd.short : "...");
        html += `<div class="city-row ${activeClass}" onclick="setActiveCity('${city}')"><span>${city}</span><span>${timeText}</span></div>`;
    }
    listDiv.innerHTML = html;
}

async function updateUI() {
    const time = await fetchCityTime(activeCity);
    const cd = getCountdown(time);
    const bigCounter = document.getElementById("bigCountdown");
    const activeName = document.getElementById("activeCityName");

    activeName.innerText = activeCity;
    if (cd === "İftar Açıldı") {
        bigCounter.innerText = "🌙 İFTAR VAKTİ!";
    } else if (cd) {
        bigCounter.innerText = "⏳ " + cd.text;
    }
    renderList();
}

function setActiveCity(city) {
    activeCity = city;
    updateUI();
}

function scrollDown() {
    if (visibleStart + visibleCount < cities.length) { visibleStart++; renderList(); }
}

function scrollUp() {
    if (visibleStart > 0) { visibleStart--; renderList(); }
}

async function init() {
    await fetchCityTime(activeCity);
    updateUI();
    setInterval(updateUI, 1000);
}

init();
</script>


Eğer kendinden sonra gelen widget ile arasında boşluk bırakmak istiyorsanız, ilk satırdaki <div> kodu içine margin-bottom:10px; ekleyin.
 
  • Beğen
Tepkiler: ALemci44

TEMPLATE Kaynak alanı ızgara görünümü

TEMPLATE İletişim yolları duyuru bölümüne ramazan ayı html