Ergebnis 1 bis 4 von 4

Thema: PHP - Videos dynamisch mit Schleife einbinden

  1. #1

    PHP - Videos dynamisch mit Schleife einbinden

    Hi,

    ich arbeite momentan an einem Studienprojekt und habe mich heute das erste mal mit PHP auseinandergesetzt.

    Ich möchte gerne dynamisch Videos auf eine Seite einbinden.

    Die Anzahl der Videos kann varieren und soll dann auch immer variabel eingebunden werden.

    Das txt.-File enthält die Pfade zu den Videos welche ich mit Explode trenne und in einem Array zurückgebe. Auf jedem Array-Platz steht jetzt eine Adresse als String.

    Klicke auf die Grafik für eine größere Ansicht 

Name:	Unbenannt.jpg 
Hits:	21 
Größe:	98,8 KB 
ID:	22851

    Im HTML-Bereich binde ich die Videos mit ihren Adressen aus dem Array über den Video-Befehl ein.

    Das klappt auch.

    Allerdings ist das ja nicht dynamisch sondern auch statisch, da im HTML-Bereich bei einer Erhöhung der Anzahl der Videos, diese ja wieder per Hand eingebunden werden müssen.

    Ich möchte aber eine Schleife haben welche die größe des Arrays abmisst und alle Videos einbindet.

    Nur kann man ja keine Schleifen im HTML-Bereich benutzen und im PHP-Bereich funktioniert der Video-Einbindungs-Befehl ja nicht, welcher im HTML-Bereich verwendet wird?

    Was gäbe es für eine Möglichkeikt, dass mit der Schleife zu lösen.

  2. #2
    Was die Schleife angeht: es gibt in PHP auch foreach, das über alle Elemente eines Arrays iteriert.

    Was das Einbinden angeht: wie du schon erkannt hast, lässt sich PHP innerhalb des HTML-Markups beliebig "an- und ausknipsen" (was nicht schön ist, aber das ist eine andere Geschichte).

    Du kannst also deine Schleife in einem PHP-Block starten, zu HTML wechseln und die Schleife dann in einem neuen PHP-Block wieder schließen.
    PHP-Code:
    <?php foreach ($zerlegen as $src) { ?>
        <video src="<?php echo $src?>" width="640" height="480"></video>
    <?php ?>
    Es gibt auch eine alternative Syntax, die vermutlich genau für solche Schleifen mit HTML-Inhalt gedacht ist.
    PHP-Code:
    <?php foreach ($zerlegen as $src): ?>
        <video src="<?php echo $src?>" width="640" height="480"></video>
    <?php endforeach; ?>
    Edit:

    Geändert von Cepanks (24.10.2015 um 23:09 Uhr)

  3. #3
    Noch ein paar Tipps:
    1. Gebe der Variablen sprechende Namen, wofür sie dienen. Das dient zur besseren Verständnis des Codes.
    2. Wenn du eine Variable definieren willst, die aber nur an einer einzigen Stelle und nicht wesentlich zur besseren Verständnis des Codes benötigt wird, dann lass sie weg.
    3. Das "an- und ausknipsen" lässt sich besser mit der Funktion sprintf "umgehen". Es soll verhindern, dass php und HTML-Code vermischt werden. So eine Vermischung wendet man eigentlich nur an, wenn man eine Art Template-System besitzt, also wenn man eine reine HTML-Datei verwendet und Platzhalter mit php gefüllt werden sollen.
    4. sog. Magic Numbers (deine Breite und Höhe für das Video) als konstanten ablegen. Magic Numbers heißen nicht umsonst so, weil keiner so richtig nachvollziehen kann, woher sie eigentlich stammen. Als Konstante haben dann diese Zahlen sprechende Namen.
    5. Kapsel die Logik von der View. Es ist schlechter Stil, wenn Logik und View vermischt werden. Daher baue eine Funktion, die dir den HTML-Teil als String zurückgibt.


    Wenn man das alles berücksichtigt, dann sieht der Code in etwa so aus:

    PHP-Code:
    <?php
        define
    ("VIDEO_WIDTH"640);
        
    define("VIDEO_HEIGHT"480);

        echo 
    getHtmlVideoTags('content.txt''|'VIDEO_WIDTHVIDEO_HEIGHT);

        function 
    getHtmlVideoTags($filename$separator$videoWidth$videoHeight)
        {
            
    $result '';
            foreach(
    file($filename) as $line)
            {
                foreach(
    explode($separator$line) as $videoUrl)
                {
                    return 
    getHtmlVideoTag($videoUrl$videoWidth$videoHeight);
                }
            } 

            return 
    $result;
        }

        function 
    getHtmlVideoTag($videoUrl$videoWidth$videoHeight)
        {
            return 
    sprintf('<video src="%s" width="%d" height="%d"></video>'$videoUrl$videoWidth$videoHeight);
        }
    ?>
    Wenn meine php-Kenntnisse noch stimmen, sollte es so richtig sein. Ich habs aber nicht getestet.
    Der Vorteil bei der Abkapselung ist halt, dass der HTML-Teil nun wiederverwendbar ist, falls du irgendwo weitere Videos mit einer anderen Auflösung einbinden möchtest.
    Theoretisch könnte man sogar noch anfangen und den String <video src="%s" width="%d" height="%d"></video> in eine eigene Datei auszulagern, sodass man alle HTML-Teile in einer zentralen Datei sammelt.
    Man könnte auch noch weiterspinnen und die Funktion getHtmlVideoTags in zwei Funktionen aufzusplitten. Also so:

    PHP-Code:
    <?php
        define
    ("VIDEO_WIDTH"640);
        
    define("VIDEO_HEIGHT"480);

        echo 
    getHtmlVideoTagsByFile('content.txt''|'VIDEO_WIDTHVIDEO_HEIGHT);

        function 
    getHtmlVideoTagsByFile($filename$separator$videoWidth$videoHeight)
        {
            
    $result '';
            foreach(
    file($filename) as $line)
            {
                
    $result .= getHtmlVideoTags(explode($separator$line), $videoWidth$videoHeight);       
            }

            return 
    $result;
        }

        function 
    getHtmlVideoTags($videoUrls$videoWidth$videoHeight)
        {
            
    $result '';
            foreach(
    $videoUrls as $videoUrl)
            {
                
    $result .= getHtmlVideoTag($videoUrl$videoWidth$videoHeight);
            } 

            return 
    $result;
        }

        function 
    getHtmlVideoTag($videoUrl$videoWidth$videoHeight)
        {
            return 
    sprintf('<video src="%s" width="%d" height="%d"></video>'$videoUrl$videoWidth$videoHeight);
        }
    ?>
    Achso und lasse das <br/><br/> weg. Den Abstand zwischen den Video-Elementen konfigurierst du dann mit CSS. Ein Abstand mittels <br/><br/> zu erzeugen, ist eine der Todsünden.

    Ich weiß auch, dass mein Code länger und vielleicht auch zuerst komplizierter aussieht, aber es hilft ungemein Code-Fragmente wiederzuverwenden, wenn die Funktionen nur eine Sache übernehmen. Das ist ein Teilaspekt des sog.Single-Responsibility-Prinzips

    Edit:
    Eine schnellere Variante als sprintf ist wohl die sog. Double-Quote-Variante:
    PHP-Code:
        function getHtmlVideoTag($videoUrl$videoWidth$videoHeight)
        {
            return 
    "<video src=\"$videoUrl\" width=\"$videoWidth\" height=\"$videoHeight\"></video>";
        } 
    php hat nämlich die Eigenheit, dass Strings, die in doppelten Hochkommata stehen, analysiert und ggf. Variablen eingesetzt werden. Dadurch spart man sich die mühselige Konkatenierung, die Cepanks in seiner dritten Lösung vorgeschlagen hat, aber sie hat den Nachteil, dass doppelte Hochkommata im String escaped werden müssen, was die Lesbarkeit verschlechtert.

    Geändert von Whiz-zarD (25.10.2015 um 03:30 Uhr)

  4. #4
    Hey ihr Beiden, vielen Dank für eure Hilfe.

    Mein Denkfehler war, dass ich dachte der Inhalt der Schleife wäre eine untrennbarer Einheit mit dem Kopf und entweder müsste alles in PHP sein oder nichts.

    Mit dem Programmierstil habt ihr absolut recht und ich muss mich da auch noch ordentlich in PHP einarbeiten.

    Immerhin soll der Code auch wartbar bleiben.

    Das bedeutet natürlich die Wichtigsten Methoden in anderen PHP-Dateien abzulegen und diese dann einzubinden.

    Ich bitte allerdings um etwas Nachsicht. Ich habe zwar etwas Erfahrung mit Java und C aber seit einiger Zeit schon nicht mehr programmiert .

    Das ist jetzt ein funktionaler Throw-Away-Prototyp um die Grundidee zu demonstrieren.

    PS: @Whiz-zarD

    Danke für den kurzen Crash Kurs. Super hilfreich .

    PS: Hier meine Lösung, die "Magic Numbers" hab ich vergessen, die speicher ich noch ein .

    Habs selbstständig gemacht um was zu lernen, fühl mich aber fast doof bei euren perfekten Lösungen hier :

    Klicke auf die Grafik für eine größere Ansicht 

Name:	Unbenannt.png 
Hits:	6 
Größe:	33,8 KB 
ID:	22852

    Geändert von Pepo (25.10.2015 um 13:13 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •