প্লেইন পিএইচপি ব্যবহার করে টেমপ্লেট সিস্টেমটি কীভাবে গঠন করবেন?


15

আমি এই প্রশ্নটি স্ট্যাকওভারফ্লোতে পড়ছিলাম:

/programming/104516/calling-php-functions-within-heredoc-strings

এবং গৃহীত উত্তরটি এর মতো সরল পিএইচপি টেম্পলেটগুলি করতে বলে:

template.php:

<HTML>
    <Head> -এর
        <শিরোনাম> <? = $ শিরোনাম?> </ শিরোনাম>
    </ Head> এর
    <Body> এর
        <? = GetContent ()?>
    </ Body> এর
</ HTML>

index.php:

<? PHP

$ শিরোনাম = 'ডেমো শিরোনাম';

ফাংশন getContent () {
    প্রত্যাবর্তন '<p> হ্যালো ওয়ার্ল্ড! </ p>';
}

( 'Template.php') অন্তর্ভুক্ত;

?>

আমার কাছে উপরের দিক থেকে এটি কাঠামোগতভাবে কাঠামোগত নয় যে টেম্পলেট.এফপি অন্যান্য স্ক্রিপ্টগুলিতে সংজ্ঞায়িত ভেরিয়েবলের উপর নির্ভর করে। আপনি যখন কোড করেন তখন কোডটি কার্যকর করতে একটি অন্তর্ভুক্ত () include('template.php')ব্যবহার করেন (কোনও ক্লাস বা তত্ক্ষণিকভাবে কার্যকর করা হয় না এমন ফাংশন অন্তর্ভুক্ত করার জন্য অন্তর্ভুক্ত () ব্যবহার করার বিপরীতে)।

আমি মনে করি যে কোনও ফাংশনের অভ্যন্তরে আপনার টেম্পলেটটি মোড়ানো একটি আরও ভাল পদ্ধতির:

template.php:

<? PHP

ফাংশন টেম্পলেট ($ শিরোনাম, $ সামগ্রী) {
    ob_start (); ?>

<HTML>
    <Head> -এর
        <শিরোনাম> <? = $ শিরোনাম?> </ শিরোনাম>
    </ Head> এর
    <Body> এর
        <? = $ বিষয়বস্তু?>
    </ Body> এর
</ HTML>

    <? পিএইচপি রিটার্ন ob_get_clean ();
}

?>

index.php:

<? PHP

Require_once ( 'template.php');

মুদ্রণ টেম্পলেট ('ডেমো শিরোনাম', '<p> হ্যালো ওয়ার্ল্ড! </ p>');

?>

দ্বিতীয় পদ্ধতির কি আরও ভাল? এটি করার আরও ভাল উপায় আছে?

উত্তর:


12

পরামিতিগুলির নাম না থাকায় আমি দ্বিতীয় পন্থাটি করব না।

টেমপ্লেট সিস্টেমটি কীভাবে কাজ করা উচিত তা বর্ণনা করার জন্য একটি সুস্পষ্ট লিখিত রচনাটি পারর থেকে আসে, এটি প্রায়শই লোকেরা টেমপ্লেট সিস্টেম এবং / অথবা ওয়েব-এমভিসি ফ্রেমওয়ার্ক লেখেন।

ব্যক্তিগতভাবে, আমি সাধারণত যা পছন্দ করি তা হ'ল একটি বৈশিষ্ট্য অ্যারে সহ একটি অ্যারেঅবজেক্ট শ্রেণি প্রয়োগ করা, এবং টেমপ্লেটটি উল্লেখ করা হবে $this->propertyName, যা আসলে টেমপ্লেট অবজেক্টের হবে $this->property['name']। এটি ব্যবহার করে __setএবং সহজেই অর্জন করা যেতে পারে __get:

class Template {
  private $_scriptPath=TEMPLATE_PATH;//comes from config.php
  public $properties;
  public function setScriptPath($scriptPath){
    $this->_scriptPath=$scriptPath;
  }
  public function __construct(){
      $this->properties = array();
  }
  public function render($filename){

   ob_start();
   if(file_exists($this->_scriptPath.$filename)){
     include($this->_scriptPath.$filename);
    } else throw new TemplateNotFoundException();
    return ob_get_clean();
  }
  public function __set($k, $v){
      $this->properties[$k] = $v;
  }
  public function __get($k){
      return $this->properties[$k];
  }
}

এবং একটি টেমপ্লেট দেখতে হবে:

<html>
      <head>
         <title><?=$this->title?></title>
      </head>
      <body>Hey <?=$this->name?></body>
</html>

এবং অনুরোধ মত দেখতে হবে:

$view = new Template();
$view->title="Hello World app";
$view->properties['name'] = "Jude";
echo $view->render('hello.inc');

যতদূর আমার মনে আছে, পুরানো সিমফনি ১.x এবং জেনড_ভিউ টেম্পলেট ইঞ্জিনগুলি এটি দেখতে ভাল লাগে এবং আমার পক্ষে এটি ঠিক আছে।


টিনিবুটস্ট্রংও একই রকম কিছু করে
ইজকাটা

কিছু স্কোর বলতে কীভাবে আপনি লুপিং পরিচালনা করবেন? আপনি কি আলাদা "সাব" টেম্পলেট ব্যবহার করেন?
রায়ান

আমি অবাক হই the টেমপ্লেটে এটি ব্যবহার করে মুক্তি পাওয়ার কোনও উপায় আছে কিনা, উদাহরণস্বরূপ কেবলমাত্র $ শিরোনাম বা $ নাম।
রায়ান

1
@ রায়ান আপনি extract($this->properties);অন্তর্ভুক্ত বিবৃতিটির ঠিক আগে, ভেরিয়েবলগুলিতে বৈশিষ্ট্যগুলি বের করতে ব্যবহার করতে পারেন ।
জয়স বাবু

1

কোনও টেম্পলেট সর্বদা বাইরের ভেরিয়েবলের উপর নির্ভর করে এবং পিএইচপি একটি গতিশীল ভাষা হওয়ায় সংকলনের সময় প্রয়োগ করার কোনও উপায় নেই যে তারা সেখানে থাকবে। সুতরাং প্রথম পদ্ধতির সম্ভবত ঠিক আছে; যদিও এখনও কয়েকটি সমস্যা রয়েছে:

  • উদাহরণটি এইচটিএমএল-এনকোডিং আউটপুটটির যত্ন নেয় না, যার অর্থ আপনার সম্ভাব্য এক্সএসএস দুর্বলতা রয়েছে।
  • যদি এই ভেরিয়েবলগুলির মধ্যে একটি সেট না করা থাকে তবে কোডটি একটি সতর্কতা বাড়িয়ে তুলবে; সতর্কবার্তাটি অর্থবোধ করে কিনা তা আপনি দেখতে পাবেন না (সম্ভবত পরিবর্তনশীল alচ্ছিক)।

খুব সহজ পদ্ধতির মধ্যে একটি ফাংশন লিখতে হয়, খুব সংক্ষিপ্ত নাম সহ, যা এই উভয়ের যত্ন নেয়; এটি _()একটি সাধারণ সম্মেলন বলে মনে হচ্ছে। একটি সাধারণ সংস্করণ এটির মতো দেখতে পারে:

function _($raw) {
    if (isset($raw)) {
        return htmlspecialchars($raw);
    }
}

এবং তারপরে আপনার টেমপ্লেটে আপনি কি করতে পারেন:

<title><?= _($title) ?></title>

_()ফাংশনটি করার জন্য আরও কিছু জিনিস :

  • আপনি htmlspecialcharsকাঁচা স্ট্রিংয়ের চেয়ে এইচটিএমএল পাস করতে চান এমন ক্ষেত্রে কলটিকে ওভাররাইড করার অনুমতি দেওয়ার জন্য এটি দ্বিতীয় যুক্তি দিন Give
  • প্রকারের চেক যোগ করুন যাতে অ্যারে এবং অবজেক্টগুলি ফল না দেয় Arrayএবং Objectবরং অর্থবহ কিছু (বা খালি স্ট্রিং) দেয়।
  • আন্তর্জাতিকীকরণ সহায়তা যুক্ত করুন (আরও একটি যুক্তি)।
  • ডিবাগ মোডে থাকা অবস্থায়, ভেরিয়েবলের নামটি যদি কিছু সংজ্ঞায়িত না করা হয় তবে কিছু বিশেষ বিন্যাসের সাথে মুদ্রণ করুন। এইভাবে, আপনি টেমপ্লেটটিতে কোনও ভুল আছে কিনা তা একটি ঝলক দেখে দেখতে পারেন।

1

প্রথমটি template.phpলোড করা সহজ যেমন স্বপ্নের উইভার / ব্লুগ্রিফন / যা কিছুতে এবং কোনও সার্ভার-সাইড অ-সচেতন ওয়েব ডিজাইনার দ্বারা সম্পাদিত, দ্বিতীয় ... ভাল এখনও এটি করা সম্ভব, তবে এটি সম্পাদনার প্রক্রিয়া চলাকালীন ভেঙে যাওয়ার সম্ভাবনা অনেক বেশি ।

তৃতীয় পক্ষের ডিজাইনাররা সাধারণত যেভাবে পছন্দ করেন এটি বেনিফিট সহ এইচটিএমএলের মতো দেখতে রাখার জন্য আমি প্রথমে যাব ।


কি অর্থে? আপনি কী বোঝাতে চেয়েছেন এটি ড্রাগ এবং ড্রপ ব্যবহার করে পরিবর্তন করা যাবে না? পাঠ্যগতভাবে দ্বিতীয়টি প্রথম হিসাবে একই তবে পিএইচপি-র কয়েকটি লাইন জড়িত। সুতরাং ধরে নিই যে এটি সর্বদা সেই কাঠামোটিই রাখবে, তাদের পক্ষে হাত দ্বারা সম্পাদনা করা খুব কঠিন নয়।
রায়ান

1
একটি ভাল টেম্পলেট বিকাশকারীদের জন্য অর্থবোধ করে, একটি দুর্দান্ত টেম্পলেট ডিজাইনারদের বোধ করে।
সাইট্রিকগুই

1

কোডিগিটার আমার প্রিয় কাঠামো হওয়ায় আমি আপনাকে একটি কোডইনিটার-ইশ সমাধান প্রস্তাব করছি:

class Template {
    protected $path, $data;

    public function __construct($path, $data = array()) {
        $this->path = $path;
        $this->data = $data;
    }

    public function render() {
        if(file_exists($this->path)){
            //Extracts vars to current view scope
            extract($this->data);

            //Starts output buffering
            ob_start();

            //Includes contents
            include $this->path;
            $buffer = ob_get_contents();
            @ob_end_clean();

            //Returns output buffer
            return $buffer;
        } else {
            //Throws exception
        }
    }       
}

আপনার টেমপ্লেটটি দেখতে এমন হবে:

<html>
    <head>
        <title><?=$title?></title>
    </head>
    <body>
        <?=$content?>
    </body>
</html>

এবং আপনি ক্লাসটি ইনস্ট্যান্টিয়েট করে কনস্ট্রাক্টর প্যারামিটার হিসাবে অ্যারেতে ডেটা পাস করে এবং 'রেন্ডার' পদ্ধতিটি কল করে এটি রেন্ডার করবেন:

$data = array('title' => 'My title', 'content' => 'My content');
$tmpl = new Template('template.php', $data);
echo $tmpl->render();

এইভাবে আপনি সরাসরি অন্তর্ভুক্ত কোডটি সম্পাদন করছেন না এবং আপনি আপনার টেম্পলেটটি পাঠযোগ্যও রাখছেন, তাই ডিজাইনাররা খুশি হবেন।


-3

পিএইচপি কোনও প্রোগ্রামিং ভাষা নয়। সুতরাং আপনার ভাষায় যদি সত্যিকারের টাইপ সিস্টেম না থাকে তবে শক্তভাবে টাইপ করা লেখা সম্ভব নয়। তবে আপনি পিএইচপি-ঝড়ের মতো আপনার আইডিইটিকে আপনার যে কৌশলটি করতে চান তা করতে সহায়তা করতে পারেন ...

আপনার দর্শন সংজ্ঞা:

interface mySimpleView { 
  public function getTitle(); 
} 

আপনার টেম্পলেট ফাইল:

<?php
/**
* @var $this mySimpleView  <== Your IDE will try to use this type.
*/
?>

<h1><?= $this->getTitle() ?></h1>
<p><?= $this->getContent() ?></p> <!-- <= IDE will warn you !  -->
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.