سؤال

أنا أعمل على موقع ويب تم ترميزه في ColdFusion.لدي قالب CSS/HTML وأرغب في تطبيقه على محتوى كل صفحة، دون تكرار أي تعليمات برمجية أكثر من اللازم.لقد أفسدتني الصفحات الرئيسية لـ ASP.NET، والتي ستكون طريقتي المفضلة لتنفيذ هذا الموقع.لسوء الحظ، هذا الخيار غير متاح بالنسبة لي.يجب أن يعمل هذا الموقع على Coldfusion MX 7.كما أن المطور الذي يقود المشروع لا يحب Fusebox، لذا فقد تم إلغاء هذا الخيار.

سيكون التنقل الرئيسي والرأس الرسومي والتذييل هو نفسه في كل صفحة.من المحتمل أن تختلف علامة العنوان والعلامات الوصفية والتنقل من المستوى الثاني من صفحة إلى أخرى.وبصرف النظر عن ذلك، فإن "منطقة المحتوى الرئيسي" للصفحة فقط هي التي ستختلف.

بالنظر إلى هذه المعلمات، كيف يمكنني ترميز الموقع لتحقيق أقصى قدر من قابلية الصيانة؟

هل كانت مفيدة؟

المحلول

هناك عدد كبير من الطرق للقيام بذلك باستخدام ColdFusion.


application.cfc يتم تنفيذه على كل طلب وله طريقتان (onRequestStartو onRequestEnd) التي يمكن استخدامها لإلحاق/إلحاق المحتوى بالبرنامج النصي الرئيسي في الصفحة.

تجدر الإشارة أيضًا إلى أنه من الممكن تمديد/وراثة ملف Application.cfc الخاص بك، مما يسمح بمجموعة أكثر تعقيدًا من أحداث RequestStart/End. مزيد من التفاصيل هنا و هنا.


العلامات المخصصة تسمح لك بإنشاء علامة يمكنك لفها حول كل قالب لتطبيق التخطيط/إلخ.كما يسمح أيضًا للسمات/إلخ بتحديد نص شائع ولكنه متغير.

على سبيل المثال:

<cf_page PageTitle="My Page">
    [main page content]
</cf_page>

وداخل العلامة المخصصة (page.cfm) لديك:

<cfif ThisTag.ExecutionMode EQ 'start'>
    <cfparam name="Attributes.PageTitle" default=""/>
    <cfcontent reset/><cfoutput><!DOCTYPE html>
    <html>
    <head>
        <title>My Website - #Attributes.PageTitle</title>
        [styles and scripts and stuff]
    </head>
    <body>
        <div id="heading">
            <img src="my_website_logo.png" alt="My Website"/>
        </div>
        <ul id="mainmenu" class="nav">
            [menu]
        </ul>
        <h1>#Attribute.PageTitle#</h1>
    </cfoutput>
<cfelse>
    <cfoutput>
        <div id="footer">
            [footer]
        </div>
    </body></html></cfoutput>
</cfif>

وبالطبع يمكنك إما إنشاء علامات مخصصة متعددة، أو علامة واحدة تعمل بطرق متعددة اعتمادًا على السمات المحددة.


لقد ذكر هنري بالفعل MVC إطار أعمال, ، لكنك لا تحتاج إلى إجراء MVC للاستفادة من وظيفة القالب/التخطيط.

صندوق الفيوزات يمكن أن تفعل MVC، لكنها لا تفعل ذلك يتطلب عليك القيام بذلك، وفي كلتا الحالتين تعد متغيرات المحتوى الخاصة بفيسبوك أداة جيدة لتنفيذ المحتوى المعياري - ما لم يتمكن المطور الرئيسي الخاص بك من ذلك يبرر كراهيته لـ Fusebox (واقتراح بديل يناسب مشروعك بشكل أفضل!) فلا يوجد أي سبب على الإطلاق لعدم اتباعه - فهو إطار عمل ناضج ومعروف، وسهل الاستخدام، والعديد من المطورين، وما إلى ذلك.

ومع ذلك، إذا لم يكن Fusebox خيارًا حقًا، فقم بإلقاء نظرة عليه قائمة أطر عمل تشارلي أريهارت - تلك الصفحة بشكل عام عبارة عن قائمة ضخمة من الأدوات التي تستحق النظر إليها.


على أية حال، ينبغي أن يوفر لك هذا ما يكفي من الأشياء لتأخذها بعين الاعتبار في الوقت الحالي...

نصائح أخرى

بدأ مطورو ColdFusion في استخدام علامة مخصصة تسمى cf_bodycontent في أواخر التسعينيات لتجنب الاضطرار إلى تضمين ملفات رأس وتذييل منفصلة.كان ذلك قبل ست أو سبع سنوات من ظهور الصفحات الرئيسية لـ ASP.NET.؛-)

الآن هناك علامة أصلية تفعل الشيء نفسه: com.cfsavecontent.إليك جوهر كيفية استخدام الأشخاص لمحتوى cfsavecontent في القوالب.

   <!--- index.cfm --->
   <cfsavecontent variable="content">
      <cfinclude template="#url.action#.cfm">
   </cfsavecontent> 

   <cfinclude template="template.cfm">

   <!--- template.cfm --->
   <cfparam name="title" default="Welcome">
   <html>
      <head><cfoutput>#title#</cfoutput></head>
      <body>
         ... header, menu, sidebar, whatever ...
         <cfoutput>#content#</cfoutput>
         ... right column, footer ...
      </body>
   </html>

   <!--- foo.cfm --->
   <cfset title="Welcome to Foo">
   Hello World! I'm the page at index.cfm?action=foo

   <!--- bar.cfm --->
   <cfset title="Welcome to Bar">
   Hello World! I'm the page at index.cfm?action=bar

إذا كنت تريد وضع قالب داخل قالب، فما عليك سوى إضافة محتوى cfsavecontent آخر.

   <!--- index.cfm --->
   <cfsavecontent variable="content">
      <cfinclude template="#url.action#.cfm">
   </cfsavecontent> 

   <cfsavecontent variable="content">
      <cfinclude template="internal_template.cfm">
   </cfsavecontent>

   <cfsavecontent variable="content">
      <cfinclude template="master_template.cfm">
   </cfsavecontent>         

   <cfoutput>#content#</cfoutput>         

يمكنك إعادة البناء لقطع التكرار.

   <!--- index.cfm --->
   <cfsavecontent variable="content">
       <cfinclude template="#url.action#.cfm">
   </cfsavecontent> 

   <cfparam name="templates" default="internal,master">

   <cfloop list="#templates#" index="t">
       <cfsavecontent variable="content">
           <cfinclude template="#t#_template.cfm">
       </cfsavecontent>
   </cfloop> 

   <cfoutput>#content#</cfoutput>  

إذا كنت تريد أن يقوم أحد القوالب "بتوسيع" قالب آخر، فربما يمكنك القيام بذلك عن طريق تحويل القائمة إلى مكدس، وجعل كل قالب يدفع أصله إلى المكدس.

  <!--- internal_template.cfm --->
  <cfset templates = listAppend("master", templates)>  

  ...
  <cfoutput>#content#</cfoutput>
  ...


  <!--- index.cfm --->
  <cfsavecontent variable="content">
      <cfinclude template="#url.action#.cfm">
  </cfsavecontent> 

  <cfparam name="templates" default="internal">

  <cfloop condition="listlen(templates) gt 0">
      <cfset t = listFirst(templates)>
      <cfset templates = listRest(templates)>
      <cfsavecontent variable="content">
          <cfinclude template="#t#_template.cfm">
      </cfsavecontent>
  </cfloop> 

  <cfoutput>#content#</cfoutput> 

وبالتالي لديك StackBox، وهو إطار عمل ColdFusion تم اختراعه على StackOverflow.:-)

يمكنك محاولة أحد الأطر MVC بدعم قالب (تقريبا كل شخص لديه ذلك).

ColdBox و <لأ href = "http://www.model-glue.com/coldfusion.cfm "يختلط =" نوفولو noreferrer "> طراز الغراء أو ماخ-II و < وأ href = "http://www.fusebox.org/" يختلط = "نوفولو noreferrer"> Fusebox ...

وهذه الموانئ جاليون المنتدى مقارنات أبرز الصفحة كيفية معالجة كل إطار قوالب. ..

وتحقق من CFINCLUDE

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top