Ich zögere, es eine "API" zu nennen, da ich ziemlich sicher bin, dass dies nicht ganz dem entspricht, was "API" heute bedeutet. Aber es ist eine Programmierung, die mit einer Anwendung interagiert, also was auch immer. Letzte Woche habe ich das JavaScript vorgestellt, das Sie auf Ihrer Seite einfügen können, um ein zufälliges Design-Zitat auf Ihrer Seite hinzuzufügen von Quotes on Design. Heute werden wir uns ansehen, wie es erstellt wurde und wie es funktioniert. Danke nochmals an David Walsh, der mir bei der Erstellung geholfen hat.
Wie funktioniert es?
Ich wollte wirklich sicherstellen, dass es so einfach wie möglich zu verwenden ist, was im Grunde bedeutete, dass es ein "Snippet" sein musste. Es musste auf jeden Fall JavaScript sein, da dies uns die Möglichkeit gibt, das DOM zu verändern und das Zitat nach Bedarf einzufügen. Zuerst habe ich reines JavaScript verwendet. Ich habe es den RSS-Feed der Website lesen lassen und zufällig eines davon eingefügt. Es stellte sich als schmerzhaft langsam heraus, erforderte eine JavaScript-Bibliothek und war auf die letzten 10 hinzugefügten Zitate beschränkt.
David schlug vor, die JavaScript-Datei tatsächlich zu einer PHP-Datei zu machen. Was?
Tricky Tricky – Das JavaScript ist eigentlich PHP
Letztendlich muss das JavaScript tatsächlich JavaScript sein. Aber wir können die benötigten Informationen zuerst mit PHP sammeln und dann dynamischechoausgeben, was wir brauchen. Sie können dies in Aktion sehen, wenn Sie die JS-Datei direkt aufrufen.
Damit der Server es als PHP erkennt
Zuerst müssen wir sicherstellen, dass der Server die Datei als PHP interpretiert, trotz ihrer .js-Dateiendung. Dies tun wir mit ein wenig HTAccess-Magie
<FilesMatch "^.*?api.*?$">
SetHandler php-script
</FilesMatch>
Ich habe diese .htaccess-Datei im Verzeichnis "api" auf dem Server platziert. Im Wesentlichen besagt sie, dass jede Datei mit "api" im Namen als PHP interpretiert werden soll. Dies funktioniert nur auf Apache-Servern und variiert von Server zu Server leicht. Dies ist, was für mich bei Media Temple (gs) funktioniert hat.
Damit der Browser es als JavaScript erkennt
Unsere Datei, api.js, ist nun bereit, auf dem Server als PHP interpretiert zu werden. Wir müssen nur noch sicherstellen, dass sie vom Browser immer noch als JavaScript gesehen wird. Machen wir das also, indem wir ganz oben dies einfügen:
<?php
header('Content-Type: text/javascript');
?>
Die gewünschte JavaScript-Ausgabe
Bevor wir mit dem PHP beginnen, werfen wir einen Blick darauf, was wir letztendlich von dem JavaScript benötigen. Wir brauchen eine einfache Funktion, die diegetElementByIdMethode verwendet, um unser "quote"-Div anzusprechen, und dann dieinnerHTMLEigenschaft, um das Zitat in die richtige Markup-Struktur einzufügen.
function getQuote(id) {
document.getElementById(id).innerHTML = "<p class='qod-quote'>',QUOTE-GOES-HERE,'</p><p class='qod-author'><a href='',PERMALINK-GOES HERE,''>',AUTHOR-GOES-HERE,'</a></p>";
}
Machen Sie sich keine Sorgen um das QUOTE-GOES-HERE-Geschäft, dafür werden wir später das PHP benötigen. Dann müssen wir diese Funktion aufrufen, wenn die Host-Website geladen ist.
window.onload = getQuote("quote");
Daten mit PHP abrufen
Offensichtlich müssen wir die Lücken in der obigen Funktion mit tatsächlichen Daten füllen. Dafür benötigen wir das PHP. Die Daten befinden sich in einer WordPress-Datenbank, daher müssen wir uns mit dieser Datenbank verbinden und dann eine Abfrage formulieren, um das zu erhalten, was wir brauchen.
Mit der Datenbank verbinden
$link = mysql_connect('localhost','database_user','database_password');
mysql_select_db('database_name',$link);
Ein zufälliges Zitat abfragen
Das Folgende holt einen einzelnen zufälligen Eintrag aus der Datenbank. Vieles davon ist spezifisch für eine WordPress-Datenbank, daher machen wir spezielle Dinge wie die Sicherstellung, dass der Eintrag veröffentlicht ist und ein Beitrag ist (im Gegensatz zu einer Seite).
$query = 'SELECT post_content AS quote, post_title AS author, guid AS permalink FROM wp_posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY rand() LIMIT 1';
$result = mysql_query($query,$link) or die(mysql_error().': '.$query);
Ergebnis in ein Array umwandeln
$row = mysql_fetch_assoc($result);
Daten in Funktion einfügen
Wir haben bereits gesehen, wie das endgültige JavaScript aussehen soll, aber jetzt können wir es mit den richtigen Daten füllen! Die meisten Daten können wir direkt aus unserem $result-Array übernehmen, aber das Zitat muss ein wenig speziell bereinigt werden, um Sonderzeichen zu berücksichtigen.
$quote = str_replace('"','"',$row['quote']);
Und die endgültige Funktion, die wir einfachechoausgeben
echo 'function getQuote(id) { document.getElementById(id).innerHTML = "<p class='qod-quote'>',$quote,'</p><p class='qod-author'>',$row['author'],'</p>"; } window.onload = getQuote("quote");';
können. Wie Sie sehen können, nachdem wir die Funktion definiert haben, rufen wir sie während des onload-Ereignisses des Fensters auf, was sie auslöst, wenn die aufrufende Seite bereit ist.
Habe ich Optionen?
Nur eine: Wenn Sie den Permalink nicht auf Quotes on Design haben möchten, können Sie ihn deaktivieren, indem Sie einen Parameter (?link=no) an die URL anhängen. Noch ein cooler Grund, die PHP/JavaScript-Kombination zu verwenden!
<script type="text/javascript" src="http://quotesondesign.com/api/api.js?link=no"></script>
Dieser Code sollte ziemlich einfach anzupassen sein, um eine "API" für fast jeden WordPress-Blog hinzuzufügen.
Brauche kleine API Chris! JavaScript ist sehr praktisch, da es mit PHP generiert werden kann und viel clientseitige Programmierung vermeidet.
Verzeihen Sie mir bitte, falls diese Fragen dicht sind
Wurde die Aliasbildung der js-Datei mit api im Namen vorgenommen, damit sie als PHP geparst wird, um die mögliche Einschränkung zu überwinden, keine Dateien von nicht derselben Domain serverseitig einzubinden (wie bei der Anpassung von url_fopen oder ähnlichem in PHP.INI zur Erhöhung der Sicherheit)?
Warum muss auch eine onload-Funktion ausgeführt werden, da PHP (wie Sie gezeigt haben) die Ausgabe (und div-Wrapper) direkt von überall ausgeben kann, wo Sie das Zitat auf Ihrer Webseite platzieren?
Danke für Ihre Zeit (& ausgezeichnete 'API'), Chris & David!
1. Die htaccess-Spielerei war wirklich unnötig, da sie nur die URL Ihrer JS-Datei verschönert – der Browser kümmert sich nicht um Dateiendungen, das Setzen des Content-Type ist alles, was Sie tun müssen.
2. Warum überladen Sie window.onload.. würde das nicht jedes andere window.onload-Verhalten überschreiben?
3. Was ich stattdessen anstelle einer php-API tun würde, ist, alle Zitate als Textdatei zu speichern (sagen wir 1.xml, 2.xml…. ) und das JavaScript (einfaches JavaScript.. kein PHP) eine Zufallszahl wählen zu lassen und dann diese XML-Datei herunterzuladen und anzuzeigen (XMLHttpRequest sollte das tun)
Hauptpunkt ist, dass der Server nicht jedes Mal PHP ausführen und zufällig eine Datenbankabfrage durchführen muss für jede einzelne Anfrage nach einem Zitat.
z.B. api.js würde eine Zufallszahl auswählen, $ZUFALL.xml herunterladen und diese verwenden, um Verhalten zu window.onload hinzuzufügen und dieses $ZUFALL.xml Zitat in die Seite einzufügen.
Sie müssen api.js weiterhin ändern, wenn die Anzahl der Zitate zunimmt, aber ansonsten sollte alles in Ordnung sein...
Jedes neue Zitat würden Sie in CURRENT_MAX_QUOTES+1.xml veröffentlichen.
Gute Idee! Persönlich bevorzuge ich JSON gegenüber XML, besonders angesichts der einfachen Datenstruktur...
Nützlich. Danke für den "Tricky Tricky"-Abschnitt. :-)
Ich hasse PHP, habe mich an Rails gewöhnt und seitdem nie wieder auf PHP zurückgeblickt.
@duryodhan, Ihre Lösung klingt gut, aber warum einzelne XML-Blätter? Warum nicht die Zitate als Tags so gestalten:
<quote>
<quote-content>
"Hallo."
</quote-content>
<quote-author>
"John Smith"
</quote-author>
</quote>
Ich bin nicht gut mit XML, fragte mich nur, warum mehrere Dateien verwendet werden sollten...
Ich habe schon einmal etwas Ähnliches gemacht, um Schlagzeilen über ein Netzwerk von Blogs zu syndizieren. Es ist ein ziemlich nützlicher Trick.
Die htaccess-Magie ist wirklich unnötig, da sie nur die URL Ihrer JS-Datei verschönert — der Browser kümmert sich nicht um Dateiendungen, das Setzen des Content-Type ist alles, was Sie tun müssen.
Sie könnten also api.js auch in api.php umbenennen und die Leute auffordern, Folgendes einzufügen:
<script type="text/javascript" src="http://quotesondesign.com/api/api.php?link=no"></script>Außerdem sollten Sie eine Art Caching einrichten, um zu verhindern, dass Sie jedes Mal eine Verbindung zu MySQL herstellen müssen, nur um ein zufälliges Zitat zu erhalten. Zum Beispiel könnten Sie alle Ihre Zitate in einer Datei speichern und zufällig ein Zitat aus der Datei auswählen, anstatt aus der DB.
Holen Sie sich Ihre Zitate in ein Array und speichern Sie das Array mit serialize() + unserialize() **oder** (ich bevorzuge letzteres, da die Leistung besser zu sein scheint) verwenden Sie var_export() und binden Sie die Datei als PHP-Datei ein.
Richten Sie eine Routine ein, um den Cache zu aktualisieren (z.B. wenn die Cache-Datei älter als eine Stunde ist — filemtime()).
Wählen Sie ein zufälliges Zitat mit array_rand().
Ich habe gerade Ihren Vorschlag mit einer einfachen PHP-Datei ausprobiert, die einfach "hallo Welt" an den Browser ausgibt. Es passiert nichts, selbst mit allow_url_fopen = on und allow_url_include = on in der php.ini-Datei. Zuerst habe ich den src=non-same-domain Typ einer PHP-Datei versucht, und dann eine lokale PHP-Datei, die die nicht-derselben-Domain PHP-Datei einbindet. Beide führten zu keinem Erfolg. Irgendwelche Vorschläge?
Falls Sie sich gefragt haben, mit allow_url_fopen = on und allow_url_include = on, wenn ich einfach die lokale PHP-Datei einbinde (und diese wiederum die nicht-derselben-Domain PHP-Datei einbindet), wie erwartet, erhalte ich die Ausgabe von "hallo Welt".
Entschuldigung, falls ich Ihr Problem missverstanden habe, aber versuchen Sie seinen ersten Vorschlag, nur JavaScript mit der Dateiendung PHP einzubinden? Wenn ja, dann haben "allow_url_include" und "allow_url_fopen" damit nichts zu tun, soweit ich weiß.
Denken Sie daran, dass das PHP-Skript den JavaScript-Code ausgeben muss. Wenn Sie das PHP-Skript von Ihrem Browser aus aufrufen und es einfach "hallo Welt" auf dem Bildschirm ausgibt, wäre dies wie das Einbinden einer JavaScript-Datei mit dem Inhalt "hallo Welt". Versuchen Sie, dass PHP Folgendes ausgibt: alert('hallo Welt'); was zu dem JavaScript-Code geändert werden kann, der "hallo Welt" dynamisch in die Seite einfügt, anstatt eines Alerts.
Denken Sie auch daran, die Header-Anweisung einzufügen, die Chris oben erwähnt hat.
Entschuldigen Sie nochmals, falls ich missverstanden habe, was Sie zu tun versuchen.
Vielen Dank, Chris und David, für die Erstellung dieses Codes! Großartige Arbeit, Chris, wie immer, mit dem Beitrag! Ich erinnere mich, dass ich zuerst entdeckt habe, dass PHP JavaScript-Code ausgeben kann, der in eine Seite eingebunden werden kann. Ich war ziemlich erstaunt...
Wow, ich sehe hier einige verrückte Wissenschaft. Danke Chris. Es ist immer eine Freude, Ihre Beiträge zu lesen. Bleiben Sie verrückt!
@Paul: So ziemlich dasselbe, was ich gesagt habe.
@Johan
das ist nur 1 Zitat.. Chris hat tausend Zitate und er möchte zufällig eines anzeigen... deshalb sagte ich, er kann 1.xml, 2.xml... 1000.xml haben... das JavaScript wird eine Zufallszahl generieren und dann die entsprechende .xml herunterladen.. alle werden das gleiche Stylesheet haben.
Ich bin ein großer Verfechter von KISS, daher meine Wahl.
und die Wahl von JSON/XML/microFormat ist zweitrangig.. mein Hauptpunkt war die Wahl des Designs...
Ja, ich weiß, aber in dem bisschen, was ich über XML gelesen habe, heißt es, dass man mit JavaScript auf alle Knoten in einem XML-Blatt zugreifen kann, wie ein Array: quote[0], quote[1]... quote[1000]. Ich irre mich vielleicht, aber es erscheint mir ziemlich seltsam, für jedes neue Zitat eine neue Datei zu erstellen. Denken Sie nicht?
Sie könnten auch eine PHP-API erstellen.
api.php
$quote = getQuoteFromDatabase(); // gibt Array zurückecho serialize($quote);
site.php
$quoteData = file_get_contents('http://qod/api.php');$quote = unserialize($quoteData);
echo $quote['author'] . ' sagte: ' . $quote['quote'];
Können Sie für http://quotesondesign.com/api/api.js ein Far Future Expires Header hinzufügen? Das würde YSlow ein wenig glücklicher machen.
Hey, ich glaube, wir könnten eine Download-Datei verwenden, oder? :D