Dzisiaj będzie wpis o ułatwianiu życia użytkownikom paneli administracyjnych. Chodzi tutaj o sytuację, gdy użytkownik naszej strony wkleja byle jak jakiś tekst z Worda do TinyMCE, a następnie dziwi się, że na stronie wychodzi kaszana.
Parę rzeczy da się poprawić z automatu poprzez przetworzenie przez procesor tekstu. Skąd taki wziąć? A napiszemy sobie sami.
W tym wpisie stworzymy „rusztowanie”, a w następnej części parę modułów robiących jakieś konkretne rzeczy.
Pierwsze czego potrzebujemy to interfejs pojedynczego modułu przetwarzającego tekst. Będzie banalnie prosty: metoda process pobiera stringa i zwraca przetworzonego stringa.
interface TextJob {
public function process($string);
}
Dalej piszemy klasę procesora tekstu.
class TextProcesser {
private $jobsToDo = array();
private function __construct() {}
public static function getInstance($params = array()) {
$textProcesser = new TextProcesser();
foreach ($params as $param) {
try {
if (!class_exists($param)) throw new Exception('Klasa ' . $param . ' nie istnieje!');
$param = new $param;
if (!($param instanceof TextJob)) throw new Exception('Klasa ' . $param . ' nie obsluguje interfejsu TextJob!');
} catch (Exception $e) {
echo $e->getMessage();
die();
}
$textProcesser->addJob($param);
}
return $textProcesser;
}
private function addJob(TextJob $tj) {
$this->jobsToDo[] = $tj;
}
public function processJobs($string) {
foreach ($this->jobsToDo as $job) {
$string = $job->process($string);
}
return $string;
}
}
Po kolei:
- Zmienna
$jobsToDotrzyma tablicę prac do wykonania. - Klasy nie będziemy tworzyć poprzez konstruktor, dlatego został zmieniony na prywatny.
- Statyczna metoda
getInstancetworzy obiekt procesora i przy okazji sprawdza czy podana tablica$paramszawiera istniejące klasy i czy implementują one interfejsTextJob. - Metoda
addJobdodaje kolejną pracę do wykonania do kolejki. processJobswykonuje właściwą robotę — pobiera stringa do przetworzenia i w kolejności dodania prac przetwarza go.
Co mamy do tej pory? Klasę, do której możemy dodawać tyle konkretnych zadań ile chcemy, o ile tylko implementują interfejs TextJob. W następnej części będziemy wyrzucać zbędne spacje, dodawać twarde spacje i szukać linków.
