Konsekwencje złego planowania
Data: 2016-03-04, autor: Michał MisztalNo i sprawa się rypła. A wszystko przez "a poprawi się później". Ja wiem, że się nie poprawi. Później będzie tylko gorzej. Niedawno poprawiałem to i owo na stronie (widać zmiany) i czepiłem się sekcji "Muzyka na dziś". W zasadzie to czegoś takiego miało tutaj nie być. Powstało przypadkiem i zostało. Problem jest w sposobie wklejania kodu filmiku na stronę. Otóż sekcja "Muzyka na dziś" to nie jest kolejna klasa ale zwykły (tak, niech przełknę te gorzkie słowa) artykuł z iframe Youtube'a, czyli wygląda to tak
<div class="muzyka">
<iframe width="640" height="360" src="https://www.youtube.com/embed/Ra1TSmmUY90?rel=0" frameborder="0" allowfullscreen></iframe>
</div>
Ble, paskudztwo. Zwykłe artykuły można tak pisać. Do tego uświadomiłem sobie, że nie mam żadnych (!) korzyści z takiego formatu. Nico. Chciałem dodać fikuśne linki do ostatnich filmików w aside (czyli po prawej) ale nie da się. Fakt, mógłbym napisać funkcję która wyłuska identyfikator youtuba z artykułu ale to nieergonomiczne i nieładne. Poza tym zwalidujcie stronę z iframe'ami z Youtube. I co? No, niezbyt pięknie to wygląda. Wypadałoby chociaż skasować formatowanie html'a.
Żeby ratować sytuację dodałem kolumnę do tabeli z artykułami (teraz sobie myślę, że powinienem dodać również i kategorie) o nazwie tajemniczej "yt_id". W kolumnie tej znajdować się będą identyfikatory filmu z Youtube. Zasada działania jest prosta. Na podstawie identyfikatora tworzony jest iframe do filmu + miniatura filmu. I volia. Wszystko powinno działać jak trzeba. Zresztą działa.
W końcu doszło do tego, że całkowicie przerobiłem kod przetwarzający sekcję muzyki. Poprzednio miałem jedno okienko na treść i w nim lądował iframe filmu i podpis. Teraz mam to wyodrębnione a całość do kupy składa PHP. Wkleję może fragment kodu generującego artykuł
public function wyswietl_Artykul(){
$tmp=new PlikiDoPobrania($this->aDane['tresc']);
$tmp->utworz();
$this->aDane['tresc']=$tmp->zamienTresc();
$tmpLinki=new LinkiPodArtykulem($this->aDane['tresc']);
$tmpLinki->utworz();
$this->aDane['tresc']=$tmpLinki->zamienTresc();
$data= dataMiesiacSlownie($this->aDane['data']);
echo "<div data-art-id='".$this->aDane['id']."' class='artykul'>";
echo "<a href='".STRONA.$this->aDane['alias']."'>";
echo "<h1 class='tytul'>".$this->aDane['tytul']."</h1></a>";
new DivClear;
$this->wstawLogoKategorii();
if((strpos($this->aDane['tagi'],'muzyka')>0)||(strpos($this->aDane['tagi'],'muzyka')===0)) $this->formatujMuzykaNaDzis();
echo "<div class='tresc'>".$this->aDane['tresc'];
new DivClear;
new Tagi($this->aDane['tagi']);
echo "<div class='data'>";
echo "Dodane w dniu $data przez ".$this->aDane['autor'];
if(!stristr($this->aDane['tagi'], 'muzyk')){
echo "<br>Kopiowanie powyższych wypocin dozwolone pod warunkiem podania źródła, znaczy tandemu autor + link do strony";
}
echo "</div></div>";
echo "</div>";
}
Jak widzimy przed umieszczeniem muzyki na stronie całość jest formatowana. Funkcja formatujMuzykaNaDzis wyglada tak
public function formatujMuzykaNaDzis(){
echo '<div class="muzyka">';
$Y=new Youtube;
echo $Y->mPrefix.$this->aDane['yt_id'].$Y->mSuffix;
echo '</div>';
}
Dane pobierane są z obiektu klasy Youtube ktory ma na sztywno wbite cechy i służy jako dawca. Dzięki takiemu rozwiązaniu mam większą kontrolę nad kodem. Po pierwsze drobna zmiana nie wymaga edycji wszystkich wpisów, po drugie tak jest dużo ładniej. Tak wiem - publiczne cechy = ble, ale kodem zarządzam tylko ja więc mogę sobie pozwolić.
To rozwiązało sporo moich kłopotów. I jeżeli chodzi o filmy to pozostała mi tylko edycja wpisów muzyki by wywalić iframe'y. Jeszce tylko napomknę o okienku z losową muzyką po prawej. Dzięki posiadaniu identyfikatora możliwym się ono stało. Kod który mi to robi z automatu
public function asideLosowaMuzyka($ilosc){
$licznik=0;
$Y=new Youtube;
$sql="SELECT `tytul`,`alias`,`yt_id` FROM `artykuly` WHERE `tagi` LIKE '%muzyka%' ORDER BY RAND() DESC LIMIT ".$ilosc;
try {
$pdo=new PDO('mysql:host='.HOST.';dbname='.DB_NAME,DB_GUEST, DB_PASSWORD_GUEST );
$result=$pdo->query($sql);
while($row=$result->fetch()){
echo '<div>';
echo '<a href="'.ROOT.$row['alias'].'">';
echo '<img src="'.$Y->fPrefix.$row['yt_id'].$Y->fSuffix.'" title="'.$row['tytul'].'" alt="'.$row['tytul'].'">';
echo '</a>';
echo '</div>';
$licznik++;
}
$result->closeCursor();
} catch (PDOException $ex) {
echo 'Błąd połączenia ' . $ex->getMessage();
}
return $licznik;
}
Przyznaję się bez bicia, że na cześć tego artykułu trochę posprzątałem w kodzie.
Troszkę mi to zajęło, dłużej niż zwykle bo pogoda szarobura i na rowerze nie można pojeździć a jak każdy wie najlepsze pomysły wpadają podczas wycieczek rowerowych. Cóż, wiedziałem, że do tego dojdzie. Po prostu wiedziałem. Ale gdy doszło to jakoś tak nie dowierzałem.