Lydia: Filtrera innehåll med HTMLPurifier

  • Författare
  • Meddelande
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11180
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Lydia: Filtrera innehåll med HTMLPurifier

Inlägg13 apr 2012, 14:26

Detta är en del i tutorialen Lydia: ett PHP-baserat, MVC-inspirerat CMF. Senast uppdaterad 2012-04-16.

Vi lägger till en ny funktion för att filtrera och formattera innehållet som HTML, med det externa biblioteket HTMLPurifier.


Vad är HTMLPurifier?

HTMLPurifier är ett PHP-libb som tar "smutsig" HTML-kod och formatterar och filtrerar den på ett säkert sätt. Tanken är att låta webbplatsens användare/besökare skriva innehåll som HTML och låta HTMLPurifier "rena" HTML-koden så att den blir säker och validerar.

Det första vi behöver göra är att läsa in oss på hur HTMLPurifier fungerar och vem som använder det idag. Deras webbplats är en bra startplats, http://htmlpurifier.org/.

Ok, då har vi koll, då startar vi.


Välj paket och ladda ned

Det finns flera alternativ att ladda ned HTMLPurifier, jag väljer det alternativ där all kod är samlad i en fil, det som kallas "Standalone distribution". Så här i början känns det enklare att hantera allt i en fil. I förlängningen kommer jag nog att använda git-varianten.


Strategi för att integrera med Lydia

Jag skapar en wrapper-klass, CHTMLPurifier, vars ansvar blir att integrera Lydia med HTMLPurifier. Jag lägger koden för HTMLPurifier i samma katalog och implementationen av CHTMLPurifier följer.

CHTMLPurifier
Kod: Markera allt
<?php
/**
* A wrapper for HTMLPurifier by Edward Z. Yang, http://htmlpurifier.org/
*
* @package LydiaCore
*/
class CHTMLPurifier {

  /**
   * Properties
   */
  public static $instance = null;


  /**
   * Purify it. Create an instance of HTMLPurifier if it does not exists.
   *
   * @param $text string the dirty HTML.
   * @returns string as the clean HTML.
   */
   public static function Purify($text) {   
    if(!self::$instance) {
      require_once(__DIR__.'/htmlpurifier-4.4.0-standalone/HTMLPurifier.standalone.php');
      $config = HTMLPurifier_Config::createDefault();
      $config->set('Cache.DefinitionImpl', null);
      self::$instance = new HTMLPurifier($config);
    }
    return self::$instance->purify($text);
  }
 
 
}


Jag gör en variant av Singleton och gömmer all kod bakom en statisk metod, CHTMLPurifier::Purify(). Tills vidare använder jag ingen cachning men det behövs säkert i längden. Om jag skulle valt att använda cachning så hade jag sparat cache-filerna i min katalog site/data, den är tänkt för precis sådana här saker.

Det var integrationen, då är det bara att använda.


Lägger till filtret "htmlpurify" i CMContent

Jag uppdaterar min funktion Filter() med stöd för filtret "htmlpurify".

CMContent::Filter()
Kod: Markera allt
  /**
   * Filter content according to a filter.
   *
   * @param $data string of text to filter and format according its filter settings.
   * @returns string with the filtered data.
   */
  public static function Filter($data, $filter) {
    switch($filter) {
      case 'htmlpurify': $data = nl2br(CHTMLPurifier::Purify($data)); break;
      case 'bbcode': $data = nl2br(bbcode2html(htmlEnt($data))); break;
      case 'plain':
      default: $data = nl2br(makeClickable(htmlEnt($data))); break;
    }
    return $data;
  }


Sådär, nu är det bara att testa och läsa in sig på vad HTMLPurifier egentligen gör och hur den kan konfigureras.

Följande källkod med HTML och JavaScript:

Bild


Set ut så här när det presenteras.

Bild


Sammanfattningsvis

Vi fick nu ett säkert sätt att låta användaren skriva in HTML som innehåll. Det finns mycket att lära om HTMLPurifier men detta visar hur man kan integrera extern kod in i sitt ramverk.

Du kan testa min kod och se källkoden som vanligt via följande länkar. Du loggar in med root:root eller doe:doe.

http://dbwebb.se/lydia/tags/v0.2.15/
http://dbwebb.se/lydia/tags/v0.2.15/content
https://github.com/mosbth/lydia/tree/v0.2.15

Detta var sista delen i denna tutorial, gå tillbaka till översikten..
...
..:
.... /mos

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 35 gäster