سؤال

أنا فقط على استعداد للبكاء. لقد قرأت الصفحة اليدوية PHP.NET، حاولت عشرات عمليات بحث Google مع عبارات مختلفة، ومكلف مئات من خيوط Stackoverflow. لقد رأيت هذه الطريقة قيد الاستخدام، لكنها لا تعمل من أجلي. يبدو أساسيا. لدي بعض الأسئلة أو المشاكل ذات الصلة لا أعرف كيفية العثور على إجابات على.

الجزء المهم من ملف PHP يبدو وكأنه هذا:

switch() {
…other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = file_get_contents('signup.html');
}

$tpl_src = addslashes(file_get_contents('index.tpl'));
eval("\$html = \"$tpl_src\";");
echo $html;

يتضمن ملف Index.tpl خطوطا مثل هذه:

<title>{$tpl['title']}</title>
<meta name="description" content="{$tpl['description']}" />
nav, etc…
<div id="main-content"> {$tpl['page-content']} </div>

أنا أحب كيف أنيق ونظيفة الرمز هو، دون مجموعة كاملة من اضافية <?=…?>'س.

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

بعد ذلك، هذا فقط لا يعمل على الإطلاق. إذا قمت بإزالة علامات الاقتباس الفردية من المفاتيح المتغيرة، فهي جيدة، لكن PHP.NET تقول إنك لا يجب عليك عدم القيام بذلك في حالة تصبح اسمي ثابتا في مرحلة ما. عادلة بما فيه الكفاية. ولكن كيف يمكنني إصلاح هذا؟ أحب استخدام مجموعة لاستئناف في حالة أريد بناء روتين فرعي تقييم ويمكن فقط تمرير $ tpl إليها.

أخيرا، لا يتم طباعة $ TPL ["محتوى الصفحة". يتم تعيين المتغير بخير. استطيع ان استخدم echo $tpl['page-content'] لاختبار، ولكن يبدو كخط فارغ واحد في HTML النهائي.

أنا متأكد من أن هناك بعض جوانب اللغة التي لا أعرفها حتى الآن. أي مساعدة هي محل تقدير كبير!!

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

المحلول

كما أشار فولكر، addslashes يبدو أن مشكلة. يحاول addcslashes في حين أن. أيضا، أوصي بشدة بإجراء هذه الوظيفة، لتبسيط Sanitation / تحليل:

function render ($file, $vars)
{
    // .. extra sanitisation, validation, et al.
    $_html = '';
    $_raw_file = addcslashes (file_get_contents ($file), '"\\');
    extract ($vars, EXTR_SKIP);
    eval ('$_html = "'.$_raw_file.'"');

    return $_html;
}

ودعا هكذا:

switch() {
// …other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = render ('signup.html');
}

echo render ('index.tpl', $tpl);

ملاحظة: استخدام extract أعلاه يعني أن HARS الخاص بك سوف تكون ببساطة $title, ، ليس $tpl['title'], ، إلخ.

نصائح أخرى

عادة لا تستخدم محددات السلسلة في توسيع متغير السلسلة. بمعنى آخر "$tpl[content]" بدلا من "$tpl['content']".

بالنسبة إلى الأقواس، فإنهم يحددون المتغير عندما قد تأتي أحرف المعرف مباشرة قبل أو بعد الاسم. علي سبيل المثال:

$item = "Cup";
$text = "I smashed four $items"; // won't work
$text = "I smashed four {$item}s"; // will work.

// 2nd output: "I smashed four Cups"

يضيف AddSlashes () مخلوطا قبل كل من علامات اقتباس مفردة ومضاعفة داخل السلسلة. سيكون التعليمات العامة التي تم إنشاؤها على مثالك

$html = "<title>{$tpl[\'title\']}</title>
<meta name=\"description\" content=\"{$tpl[\'description\']}\" />
nav, etc…¦
<div id=\"main-content\"> {$tpl[\'page-content\']} </div>";

و {$ tpl [\'لقب\']} لا تحلل جيدا.

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