Hoe kan ik deze uitvoer verbeteren om niet zoveel HTML te bevatten?

Ik ben redelijk nieuw in PHP en vroeg me af hoe ik deze code zou kunnen verbeteren. Ik weet dat het niet perfect is, maar elke opbouwende kritiek wordt aangemoedigd als ik probeer mezelf te verbeteren in PHP. Al het mogelijke is dat als je antwoordt met een manier om het te verbeteren, je het antwoord een beetje uitbreidt en laat me weten waarom het beter is, zodat ik het volledige beeld van de verbetering kan krijgen.

public function displayArticle(){
    //Check to see if we are getting the home page
    if($_GET['page'] == 'home'){
        //Display the results formatted
        $content = "
"; $content .= "<div class=\"igpPost-Divider\"></div>"; $content .= "
"; $content .= "

Ready Up – StarCraft 2, LoL, and Dota 2 pros head to DreamHack Summer

"; $content .= "<div class=\"igpPost-AuthTime\">Posted By: Cameron Lockhart at 07:44PM on June 15, 2012</div>"; $content .= "<div class=\"igpPost-AuthTime\">Tags: TAG HERE ,TAG HERE ,TAG HERE ,TAG HERE ,TAG HERE ,TAG HERE</div>"; $content .= "<div class=\"igpPost-Img\"></div>"; $content .= "
"; $content .= "

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.

"; $content .= "
"; $content .= "<div class=\"igpPost-ReadMore\">"; $content .= "

Read More..

"; $content .= " </div>"; $content .= "
"; $content .= "
"; } //If it is not the home page and it is a single article if($_GET['article']){ //Display the article formatted } }

Ook is dit duidelijk niet een volledig script maar als je het bekijkt lijkt het veel te veel voor PHP. Ik heb een paar tutorials gelezen en ik denk dat ze me de verkeerde kant op hebben gestuurd door correct te zijn en goede PHP te gebruiken.

Update: ik heb de code doorgenomen en geprobeerd een deel ervan te herzien, zodat het een meer beschrijvend overzicht gaf:

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

        while($row = $stmt->fetch()){
            //Display the results formatted
            $content = "
"; $content .= "<div class=\"igpPost-Divider\"></div>"; $content .= "
"; $content .= "

" . $row['title'] . "

"; $content .= "<div class=\"igpPost-AuthTime\">Posted By: " . $row['author'] . " at " . formatDateTime($row['datetime']) . "</div>"; $content .= "<div class=\"igpPost-AuthTime\">Tags: "; $content .= "<div class=\"igpPost-Img\"></div>"; $content .= "
"; $content .= "

" . $row['content'] . "

"; $content .= "
"; $content .= "<div class=\"igpPost-ReadMore\">"; $content .= "

Read More..

"; $content .= " </div>"; $content .= "
"; $content .= "
"; echo $content; }

This is what im going for, im basically trying to separate the html from the PHP but insert the dynamic content in the places it needs to be. This is all within a class.

2
terwijl het niet slecht is om $ _ GET te gebruiken in een klassefunctie, raad ik aan het door te geven als een parameter van buitenaf, bijvoorbeeld displayArticle ($ type) en binnen en de functie voert een schakelaar uit ($ type)
toegevoegd de auteur tradyblix, de bron
Is de inhoud altijd statisch?
toegevoegd de auteur Brad Christie, de bron

3 antwoord

Je kunt hier verschillende dingen gebruiken, waaronder de syntaxis van de heredoc (het directe equivalent van wat je hebt):

            $content = <<
    <!-- ... -->

END;

(Merk op dat u het deel END; niet kunt inspringen.)

Een andere optie is om output-buffering te gebruiken en include een inhoudsscript:

ob_start();
include 'someViewFile.php';
$content = ob_get_contents();
ob_end_clean();
2
toegevoegd

Sluit PHP gewoon af wanneer je kunt, tenzij je iets extra moet doen met de variabele $ content . Ik weet niet zeker wanneer/waar/hoe je je functie aanroept, maar ik ga uit van wat controles en wat niet

<?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>
.... <?php } //If it is not the home page and it is a single article if($_GET['article']){ ?> <!-- HTML for article here --> <?php } ?> </body> </html>
0
toegevoegd
lijkt op spaghetti code, overwerk zal dit alles moeilijk maken om naar te kijken.
toegevoegd de auteur tradyblix, de bron
Ik zou een paar dingen te zeggen hebben als zij op het werk code als deze hebben geschreven. Het is perfect voor beginners, maar geen benadering om aangemoedigd te worden. Het is hel om te debuggen, inspringen is een nachtmerrie en onmogelijk om in het algemeen te lezen. Niet markeren (zoals je de tijd hebt genomen voor een goed voorbeeld, en het kan als goed worden beschouwd voor een beginner) maar het is echt niet de juiste manier om iemand te leren vooruit te gaan. Sorry voor de openhartigheid.
toegevoegd de auteur Robbie, de bron
Ik heb echt geen echt serieus werk met PHP gedaan en in een groter bereik wordt deze stijl waarschijnlijk onhandelbaar. Maar deze manier van doen is een van de dingen waar ik van hou van PHP, je kunt gewoon in en uit HTML breken, zelfs binnen controlestructuren zoals als en voor
toegevoegd de auteur Russ, de bron

Ik weet niet hoe ik de HTML moet beperken, want ik ben me niet bewust van je specifieke behoeften, maar je kunt de PHP-code enorm vereenvoudigen met een HEREDOC.

HEREDOC ( PHP Manual HEREDOC ) is een methode voor het uitvoeren van tekenreeksen en het uitvoeren van variabelen binnen als met dubbele aanhalingstekens. Het verschil is dat het niet nodig is om aan welke offerte dan ook te ontsnappen.

Uw code kan een HEREDOC als volgt gebruiken:

$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 = <<
<div class="igpPost-Divider"></div>

$row['title']

<div class="igpPost-AuthTime">Posted By: $row['author'] at $dateTime</div> <div class="igpPost-AuthTime">Tags: <div class="igpPost-Img"></div>

$row['content']

HERE; echo $content; }
0
toegevoegd
De regel "<div class =" igpPost-AuthTime "> Geplaatst door: $ row ['auteur'] op $ dateTime </div> "kan een probleem zijn. Ik denk dat de # in eruit zal zien als een opmerking voor php. Dus je hebt daar een oplossing voor nodig.
ja dat was gewoon een plaatshouder voor de html ruwe diepgang. Ik ga absoluut door en gebruik heredoc. Ik waardeer de hulp en uitleg enorm.
toegevoegd de auteur Cameeob2003, de bron