2

私はphpにかなり慣れていないので、このコードをどのように改善するのか考えていました。私はそれが完璧ではないことを知っていますが、PHPで自分自身を改善しようとしているので、建設的な批判が奨励されています。私がお願いするのは、あなたがそれを改善する方法で答えるなら、あなたは答えを少し拡張し、なぜそれが良いのかを私に知らせて、私が改善の全体像をつかむことができるようにすることです。

public function displayArticle(){
    //Check to see if we are getting the home page
    if($_GET['page'] == 'home'){
        //Display the results formatted
        $content = "<article class=\"igpPost\">";
            $content .= "<div class=\"igpPost-Divider\"></div>";
            $content .= "<header>";
            $content .= "<h3><a href=\"#\">Ready Up – StarCraft 2, LoL, and Dota 2 pros head to DreamHack Summer</a></h3>";
            $content .= "<div class=\"igpPost-AuthTime\"><span>Posted By: </span><a href=\"#\">Cameron Lockhart</a> <span>at 07:44PM on June 15, 2012</span></div>";
            $content .= "<div class=\"igpPost-AuthTime\"><span>Tags: </span><a href=\"#\">TAG HERE</a> ,<a href=\"#\">TAG HERE</a> ,<a href=\"#\">TAG HERE</a> ,<a href=\"#\">TAG HERE</a> ,<a href=\"#\">TAG HERE</a> ,<a href=\"#\">TAG HERE</a></div>";
            $content .= "<div class=\"igpPost-Img\"><img src=\"images/news/DreamHack-Summer-2012-logo.jpg\"/></div>";
            $content .= "</header>";
            $content .= "<p>Did last week’s MLG Spring Championship leave you thirsting for more eSports? Then DreamHack Summer 2012 has you covered. With well-attended tournaments for StarCraft 2, League of Legends, and Dota 2, DreamHack should keep you busy throughout the weekend and into the work-week. It starts tomorrow at 11 AM Eastern, and continues through Monday, with the StarCraft 2 Grand Final scheduled for 5:15 PM Eastern.</p>";
            $content .= "<footer class=\"igpPost-Footer\">";
            $content .= "<div class=\"igpPost-ReadMore\">";
            $content .= "<h1><a href=\"#\">Read More..</a></h1>";
            $content .= " </div>";
            $content .= "</footer>";
            $content .= "</article>";
    }
        //If it is not the home page and it is a single article
        if($_GET['article']){
            //Display the article formatted
        }
}

また、これは明らかに完成したスクリプトではありませんが、それを見ると、PHPにとって非常によく似ています。私はいくつかのチュートリアルを読みましたが、それらは正しく、優れたPHPを使用しているという間違った方向に私を送ってくれたと思います。

更新:より説明的な概要が得られるように、コードの一部を修正してみました。

$sql = "SELECT * FROM articles LIMIT $number";
        $stmt = $pdo->query($sql);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);

        while($row = $stmt->fetch()){
            //Display the results formatted
            $content = "<article class=\"igpPost\">";
            $content .= "<div class=\"igpPost-Divider\"></div>";
            $content .= "<header>";
            $content .= "<h3><a href=\"index.php?article=" . $row['id'] ."\">" . $row['title'] . "</h3>";
            $content .= "<div class=\"igpPost-AuthTime\"><span>Posted By: </span><a href=\"#\">" . $row['author'] . "</a> <span>at " . formatDateTime($row['datetime']) . "</span></div>";
            $content .= "<div class=\"igpPost-AuthTime\"><span>Tags: </span>";
            $content .= "<div class=\"igpPost-Img\"><img src=\"" . $row['imglocation'] ."\"/></div>";
            $content .= "</header>";
            $content .= "<p>" . $row['content'] . "</p>";
            $content .= "<footer class=\"igpPost-Footer\">";
            $content .= "<div class=\"igpPost-ReadMore\">";
            $content .= "<h1><a href=\"index.php?article=" . $row['id'] ."\">Read More..</a></h1>";
            $content .= " </div>";
            $content .= "</footer>";
            $content .= "</article>";

            echo $content;
        }

これが私が目指していることです。基本的にはHTMLをPHPから分離しようとしていますが、動的コンテンツを必要な場所に挿入します。これはすべてクラス内にあります。

4

3 に答える 3

2

ここでは、ヒアドキュメント構文(現在の構文と直接同等のもの)など、さまざまなものを使用できます。

            $content = <<<END
<article class="igpPost">
    <!-- ... -->
</article>
END;

(パーツをインデントできないことに注意してくださいEND;。)

もう1つのオプションは、出力バッファリングとincludeコンテンツスクリプトを使用することです。

ob_start();
include 'someViewFile.php';
$content = ob_get_contents();
ob_end_clean();
于 2012-06-24T02:01:36.017 に答える
0

$content変数で何か追加を行う必要がない限り、可能な場合はPHPを終了してください。いつ/どこで/どのように関数を呼び出すかはわかりませんが、いくつかのチェックを行った後、そうではないと思います

<?php 
  //Do any checks/validation etc here before you send something out to the server

?>
<html><head><!--HEADER STUFF HERE--></head>
<body>
<!-- anything you want before your content here -->

<?php
if($_GET['page'] == 'home'){
?>
<div class="igpPost-Divider"></div>
<header>
 ....
</footer>
</article>
<?php
}
  //If it is not the home page and it is a single article
    if($_GET['article']){ ?>
       <!-- HTML for article here --> 
    <?php
    }
?>
</body>
</html>
于 2012-06-24T02:05:58.660 に答える
0

特定のニーズを認識していないため、HTMLの削減についてはわかりませんが、HEREDOCを使用してPHPコードを大幅に簡略化できます。

HEREDOC(PHPマニュアルHEREDOC)は、二重引用符の場合と同様に、文字列を出力し、変数を出力するためのメソッドです。違いは、引用符をエスケープする必要がないことです。

コードでは、次のようにHEREDOCを使用できます。

$sql = "SELECT * FROM articles LIMIT $number";
    $stmt = $pdo->query($sql);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);

    while($row = $stmt->fetch()){
        //Display the results formatted
        $dateTime = formatDateTime($row['datetime']) // functions cannot be used in HEREDOCS, so I replace it with the variable $dateTime declared here
        $content = <<<HERE
<article class="igpPost">
<div class="igpPost-Divider"></div>
<header>
    <h3><a href="index.php?article="$row['id']">$row['title']</h3>
    <div class="igpPost-AuthTime"><span>Posted By: </span><a href="#">$row['author']</a> <span>at $dateTime</span></div>
    <div class="igpPost-AuthTime"><span>Tags: </span>
    <div class="igpPost-Img"><img src="$row['imglocation']"/></div>
    </header>
    <p>$row['content']</p>
    <footer class="igpPost-Footer">
    <div class="igpPost-ReadMore">
    <h1><a href="index.php?article="$row['id']">Read More..</a></h1></div>
    </footer>
</article>
HERE;
echo $content;
}
于 2012-06-24T04:17:13.940 に答える