سؤال

لدي وظيفة تقوم بالتمرير عبر أنواع مختلفة من القوائم المأخوذة من MySQL وتعرضها على هيئة "موجز" على غرار Facebook.كل نوع من القوائم له مظهر مختلف، وبالتالي يتطلب قالبًا مختلفًا.

فيما يلي مثال الوظيفة أدناه الذي يمكن استدعاؤه 100 مرة (إذا كان هناك 100 قائمة):

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include($abs_path . '/templates/photo.php');
            break;

        case 'video':
            include($abs_path . '/templates/video.php');
            break;

    }

}

هل هناك طريقة أفضل للقيام بذلك، حيث لا يحتمل أن ينتهي بي الأمر بـ 100 تضمين - مما قد يؤدي إلى إبطاء عمليتي؟هل يمكنني بطريقة ما حفظ التضمين مرة واحدة على الصفحة، والرجوع إليه عدة مرات حسب الحاجة؟

...أم أن هذه هي أفضل الممارسات؟

وأريد أيضًا أن أعرف كيفية القيام بذلك بنفسي، بدون محرك قوالب...

يحرر:لا يتم حل المشكلة عن طريق include_once فقط (لا أعتقد ذلك)... أحتاج إلى أن أكون قادرًا على إعادة استخدام الملف المضمن عدة مرات، مع استبدال المتغيرات في كل مرة.

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

المحلول

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

يمكنك، من الممكن، تغليف كود كل قالب في وظيفة، ولكن:

/*
photoTemplate.php
*/

<?php
function loadPhotoTemplate($id) {
?>
  <div id="photo">
...
  </div>
<?php
}
?>


/*
listing.php
*/

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include_once($abs_path . '/templates/photo.php');
            loadPhotoTemplate($id);
            break;

        case 'video':
            include_once($abs_path . '/templates/video.php');
            loadVideoTemplate($id);
            break;
    }

}

سيؤدي هذا إلى تحميل كل ملف قالب مرة واحدة على الأكثر، ثم قم باستدعاء الوظيفة في كل مرة تريد فيها عرض القالب مع البيانات المحددة لذلك العنصر.

يحرر

ربما يكون من الأفضل تضمين جميع ملفات القالب في البداية، ثم ما عليك سوى استدعاء الوظيفة المناسبة في المحول.وظائف PHP *_once() بطيئة، حيث يجب عليها الرجوع إلى قائمة الملفات المضمنة/المطلوبة مسبقًا في كل مرة يتم استدعاؤها.

نصائح أخرى

وإنشاء مجموعة من القوالب المسموح بها. هل تعمل ننظر لنرى إذا كان القالب المطلوب في صفيف. إذا كان كذلك، ثم استخدم $ نوع المتغير لإدراج الملف. نعم، بشكل عام يجب أن لا تستخدم البيانات التي يتم توفيرها المستخدم في اسم ملف التضمين، ولكن منذ كنت قد صادق عليها ضد مجموعة معروفة حسن القيم، انها آمنة.

إذا قلقكم هو الأداء، وأنا شخصيا لن ندخل في هذه الحلقة على الإطلاق.

وعلى افتراض أن ينظر إلى العناصر الموجودة في قائمة أكثر كثيرا مما كنت خلق، وأود أن توليد HTML كما يتم إنشاء العناصر وتخزين الناتج جنبا إلى جنب مع البيانات في قاعدة البيانات. (أو في memcache أو ملفات أو أي مكان آخر - ولكن توليد عليه وتخزينه)

في القيام بذلك كنت نقل هذا المنطق مرة أخرى في عملية إنشاء وحدات لذلك كنت تفعل بيان switch نفسه، ولكن فقط لعنصر واحد في وقت واحد - كنت الاستغناء عن حلقة

وبعد ذلك في وقت العرض، بدلا من استدعاء display_listing()، كنت أردد للتو HTML قمت بتخزينها بالفعل.

وأعتقد أنك يجب أن ننظر إلى عدد قليل من الأشياء. أولا، هناك حتى احتمال سوف تشمل نفس "القالب" 100 مرة؟ الذي يبدو وكأنه كمية هائلة من المحتويات وضع على الصفحة.

إذا أنا باستخدام "قصاصات" صغيرة - أقول، صف الجدول هذا ما تتكرر مرات عديدة - وأميل إلى استخدام دالة تقوم بإرجاع سلسلة، مثل هذا:

/* snippets.php */
function tableRow( $row )
{
    return
        '<tr><td>' . $row['var1'] . '</td>' .
        '<td>' . $row['var2'] . '</td></tr>';
}

/* main page/view */
foreach ( $data as $row )
    echo tableRow( $row );

والميزة الرئيسية هنا هي أنك يمكن أن يكون الحلقات وجميع أنواع في وظيفة.

إذا كنت تبحث عن متغير استبدال التوالي، يمكنك إنشاء الخاصة بك مصغرة القوالب في ملف HTML. شيء من هذا القبيل:

<p>{name}<br />
  Posted {date} by {author}</p>

وبعد ذلك نقرأ في القالب، وتمرير السلسلة بأكملها إلى وظيفة display_listing، والذي يدير str_replace على جميع المتغيرات {}. لا أعتقد أنه سيكون هناك الكثير من ضربة الأداء، ولكن عليك أن تحاول ذلك للتأكد.

وتحتاج إلى استخدام وظيفة include_once بدلا من ذلك من include.

<اقتباس فقرة>   

ووinclude_once () يتضمن بيان   ويقيم الملف المحدد   أثناء تنفيذ البرنامج النصي.   هذا هو سلوك مماثل ل   تشمل () بيان، مع فقط   الفرق هو أن إذا كان رمز من   أدرج ملف بالفعل،   لن يتم تضمين مرة أخرى. كما   يوحي اسمها، سيتم تضمينه   مرة واحدة فقط.

إذا كنت تريد الذهاب ليكون بما في ذلك القوالب باستخدام مفتاح لكلمات رئيسية مختلفة، ثم عليك أن تحدد متغير، ويقول $ template_filename، في التبديل ثم بمجرد الخروج من التبديل، قم بما يشمل مثل ذلك:

include_once("/templates/{$filename}.php");

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

وهذه الطريقة يبدو معقولا بالنسبة لي ولكن.

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