المرشِل: التقدم، والخص، و L ليّل و (العربية (Arabic))

المرشِل: التقدم، والخص، و L ليّل و

Monday, 10 November 2025

//

7 minute read

أولاً

لقد وضعت شريط ترشيح مناسب لقائمة المدونات: اللغة، مدى التاريخ، الصنف، والبطاطا التي تظل متقلبة مع HTMX.

إنها قريبة الآن - ولكن كما هو الحال دائماً، فإن ال20% الأخيرة هي الجزء الحار: التواريخ، المخابئ، و"لماذا يعمل ذلك محلياً وليس بعد المبادلة؟".إذا كنت تريد الغوص العميق مع الكثير من الرموز والرسوم التوضيحية، انظر:

///blog/ vVterبار التقدم والإسس

تذكّرْ هذا الموقعِ a عمل في التقدمِ، هذا النوعِ مِنْ المادةِ سَيَحْدثُ عندما تَأْكلُ غذاءَ كلبِكَ الخاصِ!

  • TTL؛ DR
  • شريط مرشح جديد: لِغة + سِرْض + تاريخ المدى
  • HTMx مبادلات جزئية تُبقي الصفحة سريعة ؛ تعمل إلى الخلف/ إلى الأمام لأنني أضغط دائماً على الواجهة المحدّثة/blog/calendar-daysيُنتَجُ مِنْ a صغير
  • نقطة الوصل
  • الثبات: النطاقات التاريخية التي يجري إسقاطها عند تغيير اللغة/الطلب
  • ثابت: لا يمكن تقويم التقويم بعد مبادلات HTMX أو تغييرات الموضوع

جاري تش جاري تغييره حالياً بـ كل ملف

  • ما الذي يعمل بشكل جيد
  • سُجُول URUR_ URUR الأول: الكل الكل تفاعلات تحديث الـ URL; يمكنك أن تُثبِك إلى حالة مرشِحةLinkUrlميزات الميزات المُطرَكَزات المُطرَكَجَزَة
  • هو موجود على الخادم
// Server: cache and vary for index
[ResponseCache(Duration = 300, VaryByHeader = "hx-request",
  VaryByQueryKeys = new[] { "page", "pageSize", nameof(startDate), nameof(endDate), nameof(language), nameof(orderBy), nameof(orderDir) },
  Location = ResponseCacheLocation.Any)]
[OutputCache(Duration = 3600, VaryByHeaderNames = new[] { "hx-request" },
  VaryByQueryKeys = new[] { nameof(page), nameof(pageSize), nameof(startDate), nameof(endDate), nameof(language), nameof(orderBy), nameof(orderDir) })]
public async Task<IActionResult> Index(int page = 1, int pageSize = 20, DateTime? startDate = null, DateTime? endDate = null,
  string language = MarkdownBaseService.EnglishLanguage, string orderBy = "date", string orderDir = "desc")
{
    var posts = await blogViewService.GetPagedPosts(page, pageSize, language: language, startDate: startDate, endDate: endDate);
    posts.LinkUrl = Url.Action("Index", "Blog", new { startDate, endDate, language, orderBy, orderDir });
    if (Request.IsHtmx()) return PartialView("_BlogSummaryList", posts);
    return View("Index", posts);
}

نطاقات نطاقات مُرجع مُجِد إلى قيم الاستعلام الحالية إذا كان حاضراً و مُبرزاً مع الوظائف

الحشرات التي قمت بتثبيتها (و الميزات الجديدة!)

& مراقبة الشبهية والمحتوى

  • **أكبر إضافة: الإدارة السليمة لإبراز الوظائف:**الوظـالاتIsHidden:: يمكن الآن وضع علامات على الوظائف مخفية ()؛
  • (أ) ولن تظهر في القوائمScheduledPublishDateالوظائف التي يمكن أن يكون لها:
  • « وما يظهر من بعد ذلك إلا بعد ذلك » أي خلق « وما يظهر بعد ذلك من بعد ذلك من بعد ذلك من بعد ذلك من بعد ذلك إلا كل خلق بعد ذلك وما بعد ذلك من بعد ذلك من بعد ظهور بعد ذلك الوقت وما بعد ذلك من بعد البعث إلا بعد ذلك الوقت وما بعد ذلك من بعد البعث إلا بعد ذلك الوقت وما إلا بعد ذلك من بعد البعث إلا بعد ذلك الوقت وما إلا بعد البعث إلا بعد ذلك من بعد ذلك من بعد خلق بعد ذلك الوقت وما إلا بعد ذلك من بعد هذا إلا بعد ذلك من بعد خلق بعد ذلك ، إلا بعد خلق بعد هذا بعد هذا بعد هذا بعد حين بعد حين بعد هذا ، إلا بعد حين بعد حين بعد هذا ، إلا بعد هذا بعد حين بعد حين بعد حين بعد حين بعد حين بعد حين بعد حين ، إلا إلا بعد بعد حين بعد حين بعد حين بعد حين بعد بعد بعد حين بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد حين ، إلا إلا إلا إلا إلا إلا إلا بعد بعد إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد كما بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد كما بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا إلا إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا إلا إلا إلا بعد بعد إلا إلا إلا إلا إلا إلا بعد بعد بعد بعد بعد بعد إلا إلا بعد بعد إلا بعد بعد بعد بعد بعد بعد بعد إلا إلا بعد بعد بعد بعد إلا إلا إلا إلا إلا إلا إلا إلا إلا إلا إلا إلا إلا بعد إلا إلا إلا إلا إلا بعد بعد بعد بعد بعد إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا إلا إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد إلا بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعد بعدعدد الوظائف المشابطIsPinned• وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة: وظيفة واحدة
// BlogService now filters appropriately
var now = DateTimeOffset.UtcNow;
postQuery = postQuery.Where(x =>
    !x.IsHidden &&
    (x.ScheduledPublishDate == null || x.ScheduledPublishDate <= now));

// Pinned posts sorted first on page 1
if (isFirstPage)
{
    postQuery = postQuery.OrderByDescending(x => x.IsPinned)
                         .ThenByDescending(x => x.PublishedDate.DateTime);
}

تصدر أولا في الصفحة ١ )الأكبر بالنسبة للإعلانات(

  • **نطاق النطاق/blog/date-range**نقطة الوصل
  • : ترجع تواريخ المآذن/الحد الأقصى عبر جميع الوظائف (لغة- واعلم) بحيث يمكن لمختار التاريخ أن يضع حدودا معقولة<clear-param>* مضافا
<clear-param name="startDate">Clear Date</clear-param>
<clear-param all="true" exclude="language">Clear All Filters</clear-param>

منفذ إلى سهولة

  • بوصة
    • فقدان النطاق التاريخي عند تبديل اللغة أو الترتيبnew URL(window.location.href)بدء التشغيل من:
langSelect.addEventListener('change', async function(){
  const u = new URL(window.location.href);
  u.searchParams.set('language', langSelect.value);
  u.searchParams.set('page','1');
  const [ob,od] = (orderSelect.value||'date_desc').split('_');
  u.searchParams.set('orderBy', ob);
  u.searchParams.set('orderDir', od);
  if(input._flatpickr && input._flatpickr.selectedDates.length===2){
    const [s,e] = input._flatpickr.selectedDates;
    u.searchParams.set('startDate', s.toISOString().substring(0,10));
    u.searchParams.set('endDate',   e.toISOString().substring(0,10));
  }
  applyNavigation(u);
});
  • وفقط تجاوز تغير المجاميع؛ إذا كان مُنتقى المُنتقى مُنتقى، أعد تطبيقه.

    • لا تنشئ بعد مبادلات HTMXfp.redraw()في: التدمير/الإعادة: التدمير/إعادة إنشاء النقطات المسطحة في الداخل، ثم جلب الملامح البارزة للشهر والمكالمات المرئيةhtmx:afterSwap.
  • « ثم يعيدون » إلى يوم القيامة في يوم القيامة .

    • لا ينطبق على التقويم<html class>الثابت: يُلاحظfp.redraw()ومـا يتصـل ومـا يتصـل

عندما يتغيّر.

sequenceDiagram
  participant User
  participant JS as blog-index.js
  participant HT as HTMX
  participant S as Server

  User->>JS: Change language/order or pick a date range
  JS->>JS: Update URLSearchParams, pushState
  JS->>HT: htmx.ajax('GET', /blog?...)
  HT->>S: GET /blog
  S-->>HT: HTML partial (_BlogSummaryList)
  HT-->>User: Swap #content

كيف تتكلل القطع

HTMXXX HTMX صفحة طلب الكشف عن الطلبpagerequestيعمل شريط مرشح مخصصاً

public static bool IsPageRequest(this HttpRequest request)
{
    return request.Headers.ContainsKey("pagerequest") &&
           request.Headers["pagerequest"] == "true";
}

ترويسة لمساعدة الخادم في التمييز بين حمولات الصفحة الكاملة ومبادلات HTMX الجزئية:

**هذا يسمح للمتحكم أن يعيد فقط المنظر الجزئي لطلبات HTMX و كامل صفحات المتصفح للملاحة المباشرة.**ملاحظة ملاحظة

:تمديد مساعد واستفسار البارامتر أوضح Alpine.js المكون يستحق الغوص العميق الخاص به سوف أغطي هذه بالتفصيل في وظيفة مستقبلية عن مكونات HTMX/Alpin التي يمكن إعادة استخدامها في المبنى.

  • ما زال يجب القيام به
  • ما قبل تحديد التاريخ السريع (الأيام 7/30 الأخيرة، هذا العام)
  • المصدر المحلي لغوية

دعم دعم مفتاح دعم دعم على مقط

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.