sobota, 31 maja 2014

Zwiń / Rozwiń - mechanizm show() i hide() w JQuery + toggle | JQUERY

Przychodzi ten moment kiedy na stronie statyczny widok przestaje nam już wystarczać a ruch i animacja to coś czego bardzo pożądamy. Chciałbym w tym poście przedstawić trzy przydatne funkcje JQuery, które mogą uatrakcyjnić naszą stronę oraz wpłynąć na lepszą jej organizację. Chodzi o funkcje show() , hide() oraz toggle.

Wyobraźmy sobie takowe zadanie: mamy przycisk (w formie buttona z tekstem Pokaż), który po kliknięciu ma odsłonić ukryty akapit:

<script>
function pokaz_akapit(){
    $('.ukryty_akapit').show();
}

$(document).ready(function(){
    $('#pokaz').click(pokaz_akapit);

});
</script>
<input id="pokaz" type="submit" value="Pokaż" />

<p class="ukryty_akapit" style="display:none;">
Tutaj jest ukryty tekst.
</p>

W powyższym kodzie widzimy przycisk (input type="submit"), który po kliknięciu ma odsłonić tekst niewidoczny dla użytkownika znajdujący się w akapicie o klasie "ukryty_akapit". (a dlaczego nie widać na dzień dobry tego akapitu? A no dlatego, że akapit ma własność - display:none;). W JQuery wychwytujemy klik zdarzeniem click a w parametrze podajemy funkcję pokaz_akapit (ją właśnie ma wykonać po kliku w buttona). Po kliku .... tak, tylko jedna linijka - odwołanie do elementu na którym chcemy wykonać operację i operacja , w naszym przypadku show(). Jesteśmy zadowoleni że użytkownik skontaktował się z naszą stroną interaktywnie, jednak czujemy, ze czegoś nam brakuje. Sprzydałoby się schować akapit po ponownym kliknięciu na przycisk. Tu od razu przedstawiam funkcję hide(), która chowa element na którym jest wykonana. Myślę, że poradzicie sobie z obsługą hide;a i show;a w jednym kodzie.

Czyli mamy wszystko. Możemy spokojnie odejść od komputera i zanurzyć się w swoim ulubionym napoju. Hola, Hola. Pisałem o 3 funkcjach , więc kolej jeszcze na tajemniczą funkcję toggle(). Prosto pisząc funkcja ta zawiera w sobie działanie show() i hide() jednocześnie. Czyli jak jest odsłonięty element to go schowa, a jak jest ukryty to go pokaże. A jak to w kodzie by wyglądało na gotowo? A no może być tak:

<script>
function pokaz_ukryj_akapit(){
    $('.ukryty_akapit').toggle();
}

$(document).ready(function(){
    $('#pokaz_ukryj').click(pokaz_ukryj_akapit);

});
</script>
<input id="pokaz_ukryj" type="submit" value="Pokaż/Ukryj" />

<p class="ukryty_akapit">
Tutaj jest ukryty tekst.
</p>

A tu fenomenalny przykład działania toggle ;) :



środa, 9 kwietnia 2014

Przelatywanie po tablicy - pętla for, pętla foreach | PHP

Piękno programowania znajduje się w tablicach. Odpowiednie szufladki tablicowe pomogą nam w dyskretny sposób przechować nasze dane, a liczne funkcje tablicowe wykonanie na danych chcianej operacji. Stwórzmy sobie przykładową tablicę, od razu dając do "szufladek" wartości i wypiszmy ją za pomocą konstrukcji rodem z C++, czyli zwykłym forem

Pętla for

$tablica = array(13,34,12,19,46,3);

for($i=0;$i<count($tablica);$i++){
    echo $tablica[$i].'<br/>';
}
W tablicy mamy nasze numery do dużego lotka, aby przelecieć po wszystkich sześciu liczbach użyliśmy pętli for. Co się w niej dzieje? Mówimy jej tak: najpierw zacznij od 0 (nasze $i), rób dopóki nasze $i będzie mniejsze od ilości elementów tablicy, a po każdym wykonanym przebiegu dodaj do $i jedyneczke (magiczne $i++). Jeśli nasze $i będzie już równe ilości tablicy to pętla się nie wykona (sprawa indeksu zerowego w innym poście). W środku echujemy nasze elementy z odpowiednimi indeksami i widzimy na ekranie nasze szczęśliwe liczby.

Pętla foreach

foreach($tablica as $key=>$value){
    echo 'indeks: '.$key.' wartość: '.$value.'<br/>';
}

echo 'Witaj w gronie milionerów;)';
Aby za każdym razem nie forować się możemy użyć przyjaźniejszej konstrukcji mianowicie pętli foreach. Wytłumaczenia wymagają tylko dwie zmienne: $key - oznacza indeks tablicy (oczywiście liczony od zera jak nas uczył Grębosz), $value - dane znajdujące się pod danym indeksem (nasza liczba z lotka). Na samym końcu widzimy informację o wyniku losowania w telewizji za pomocą funkcji echo .

poniedziałek, 7 kwietnia 2014

Przyłączmy się do <head> czyli załączanie zewnętrznych plików do strony www | Programowanie

W kodowaniu strony www nadchodzi wreszcie czas by ustrukturyzować nasze wypociny w bardziej przystępny sposób. Podstawą będzie dołączenie zewnętrznych plików z kodem CSS (kaskadowe arkusze styli) i javascript. Czynność tą należy uczynić w sekcji  <head> .... </head> znajdującą się tuż po znaczniku <html>.

Załączenie plików CSS

Nasz kod css znajduje się w dwóch plikach z rozszerzeniem css, przykładowo style1.css oraz style2.css. W strukturze katalogu naszej www (najczęściej public_html) tworzymy sobie folder o wdzięcznej nazwie css i w nim umieszczamy kaskadowe arkusze styli. Porządek w folderze już mamy, ale nasza strona wciąż nie ma wytycznych co gdzie i jak ma wyglądać. Pomóżmy jej wstawiając poniższe linijki w sekcji head:

<link href="css/style1.css" rel="stylesheet" type="text/css" media="all" />
<link href="css/style2.css" rel="stylesheet" type="text/css" media="all" /> 
Strona odżyła paletą barw i przyzwoitym ułożeniem poszczególnych elementów, a logo na środku już nie straszy. Pozostała nam kwestia oskryptowania naszej stronki, a z racji, że wcześniej umieszczamy kod np w folderze "js" a plik nazywa się myscript1.js w headzie pojawi się dodatkowa linijka:
<script type="text/javascript" src="js/myscript1.js"></script>

Wytłumaczenie (brak)

Mam taką zasadę, że pewnych rzeczy nie trzeba tłumaczyć, kod wydaje się być zrozumiały a tajemnicze "text/javascript" w dołączonej linijce wyjaśni się z pewnością wraz ze wzrostem umiejętności samoczynnie.

sobota, 5 kwietnia 2014

Animacja w PHP | klasa gifcreator | animacje gif

Jak zrobić animację w PHP? Chcemy warunkować nasze animację, generować ją dynamicznie, mieć wpływ na to co na obrazku ma się pojawić, czasem możemy mieć ochotę na jakąś funkcję z czasem i tak można to zrobić, z pomocą przychodzi nam PHP a dokładnie klasa gifcreator. Aby móc zacząć swoją zabawę animacyjną musimy sobie załączyć klasę z odpowiednimi funkcjami, dzięki którym tworzenie naszego gifa będzie odbywało się na "wyższym poziomie". Klasę można umieścić w osobnym pliku (i to jest wskazane przy obiektowym programowaniu), albo na potrzeby małego skryptu bezpośrednio w naszych wypocinach. Klasa wygląda tak i grzebanie w niej dla podstawowych zamiarów może wyjść nam na złe. Przyklejmy więc poniższy kod.

Klasa gifcreator: 

class gifcreator
{

    /**
     * Version
     *
     * @var string
     */
    const VERSION     = 'GifCreator v0.3';

    /**
     * Gif header
     *
     * @var string
     */
    const GIF_HEADER  = 'GIF89a';

    /**
     * Output image width
     *
     * @var int
     */
    private $_width;

    /**
     * Output image height
     *
     * @var int
     */
    private $_height;

    /**
     * Number of loops
     *
     * @var int
     */
    private $_loops    = 0;

    /**
     * Disposal method
     *
     * @var int
     */
    private $_disposal = 2;

    /**
     * Colour for transparency
     *
     * @var int
     */
    private $_colour   = -1;

    /**
     * Image frames
     *
     * @var array
     */
    private $_frames = array();

    /**
     * Global params
     *
     * @var array
     */
    private $_global = array();

    /**
     * Constructor - Setup global settings
     *
     * @param int $loops            Number of times the animation is repeated (or 0 for infinite)
     * @param int $disposal            The global frame disposal method (A value from 0 to 3)
     * @param int $transparency        The colour to use for transparency (array containing RGB values or -1 to ignore)
     * @param int $width            Width of the output image (requires GD, leave null to disable)
     * @param int $height            Height of the output image (requires GD, leave null to disable)
     */
    public function __construct($loops = 0, $disposal = 2, $transparency = array(-1, -1, -1), $width = null, $height = null)
    {
        $this->_loops     = $loops;
        $this->_disposal  = $disposal >= 0 && $disposal <= 3 ? $disposal : 2;
        $this->_colour    = $transparency[0] > -1 || $transparency[1] > -1 || $transparency[2] > -1 ?
                            $transparency[0] | $transparency[1] << 8 | $transparency[2] << 16 : -1;
        $this->_width     = $width;
        $this->_height    = $height;
    }

    /**
     * Add a frame to the animation
     *
     * @param string $data            The frame data which can be any image supported by GD provided GD is installed
     * @param int $duration            The duration of the frame
     * @param bool $resize            Resize the frame to the output width/height
     * @param int $xpos            The horizontal offset for the frame
     * @param int $ypos            The vertical offset for the frame
     * @param int $orDisposal        Override the global disposal setting for this frame
     * @param array $orTransparency    Override the global transparency setting for this frame
     */
    public function addFrame($data, $data2, $duration, $resize = false, $xpos = 0, $ypos = 0, $orDisposal = false, $orTransparency = true)
    {
        // Resize or convert the image if GD is enabled (also GD will notice any bad data)
        if (function_exists('gd_info')) {
            if ($resize) {
                $data = $this->_resizeImage($data,$data2);
            } else {
                $data = $this->_convertImage($data);
            }
        } else {
            // Verify the data looks like it is a gif image
            $header = substr($data, 0, 6);
            if ($header != 'GIF87a' && $header != 'GIF89a') {
                throw new Exception(self::VERSION . ' Error: Data does not appear to be a valid gif image.');
            }
            if (strstr($data, 'NETSCAPE') !== false) {
                throw new Exception(self::VERSION . ' Error: Animated gif frames are not currently supported.');
            }
        }
        // Populate global values form first frame
        if (!count($this->_global)) {
            $this->_defineGlobals($data);
        }
        // Define frame specific vars
        $locStr = 13 + 3 * (2 << ( ord($data{10}) & 0x07));
        $locEnd = strlen($data) - $locStr - 1;
        $locTmp = substr($data, $locStr, $locEnd);
        $locLen = 2 << (ord($data{10}) & 0x07);
        // Extract local colour pallet
        $locRGB = substr($data, 13, 3 * (2 << (ord($data{10}) & 0x07)));
        // Frame disposal override
        if ($orDisposal !== false) {
            $locDis = $orDisposal >= 0 && $orDisposal <= 3 ? $orDisposal : 2;
        } else {
            $locDis = $this->_disposal;
        }
        // Frame transparency override
        if ($orTransparency !== false) {
            $locCol = $orTransparency[0] > -1 || $orTransparency[1] > -1 || $orTransparency[2] > -1 ?
                      $orTransparency[0] | $orTransparency[1] << 8 | $orTransparency[2] << 16 : -1;
        } else {
            $locCol = $this->_colour;
        }
        // Look for transparent colour in the pallet
        if ($locCol > -1 && ord($data{10}) & 0x80) {
            for ($i = 0; $i < (2 << (ord($data{10}) & 0x07)); $i++) {
                if (ord($locRGB{3 * $i + 0}) == (($locCol >> 16) & 0xFF) &&
                    ord($locRGB{3 * $i + 1}) == (($locCol >> 8)  & 0xFF) &&
                    ord($locRGB{3 * $i + 2}) == (($locCol >> 0)  & 0xFF)) {
                    $locExt = "!\xF9\x04" . chr (($locDis << 2) + 1) . chr(($duration >> 0) & 0xFF) .
                              chr(($duration >> 8) & 0xFF) . chr($i) . "\x0";
                    break;
                }
            }
        }
        if (!isset($locExt)) {
            $locExt = "!\xF9\x04" . chr(($locDis << 2) + 0) . chr(($duration >> 0) & 0xFF) .
                      chr(($duration >> 8) & 0xFF) . "\x0\x0";
        }
        // Extract the image descriptor
        switch ($locTmp{0}) {
            case '!':
                $locImg = substr($locTmp, 8, 10);
                $locTmp = substr($locTmp, 18, strlen($locTmp) - 18);
                break;
            case ',':
                $locImg = substr($locTmp, 0, 10);
                $locTmp = substr($locTmp, 10, strlen($locTmp) - 10);
                break;
        }
        // Modify image position in image descriptor
        if ($xpos > 0) {
            $locImg{1} = chr($xpos & 0xff);
            $locImg{2} = chr(($xpos >> 8) & 0xFF);
        }
        if ($ypos > 0) {
            $locImg{3} = chr($ypos & 0xff);
            $locImg{4} = chr(($ypos >> 8) & 0xFF);
        }
        // Create frame
        $frame = '';
        if (ord($data{10}) & 0x80 && count($this->_frames)) {
            if ($this->_global['len'] == $locLen) {
                if ($this->_blockCompare($this->_global['rgb'], $locRGB, $locLen) ) {
                    $frame .= $locExt . $locImg . $locTmp;
                } else {
                    $byte  = ord($locImg{9});
                    $byte |= 0x80;
                    $byte &= 0xF8;
                    $byte |= ord($this->_global['frame']{10}) & 0x07;
                    $locImg{9} = chr($byte);
                    $frame .= $locExt . $locImg . $locRGB . $locTmp;
                }
            } else {
                $byte  = ord($locImg{9});
                $byte |= 0x80;
                $byte &= 0xF8;
                $byte |= ord($data{10}) & 0x07;
                $locImg{9} = chr($byte);
                $frame .= $locExt . $locImg . $locRGB . $locTmp;
            }
        } else {
            $frame .= $locExt . $locImg . $locTmp;
        }
        $this->_frames[] = $frame;
    }

    /**
     * Get the animation
     *
     * @return string
     */
    public function getAnimation(){
   
        return $this->_getHeader() . implode($this->_frames) . $this->_getFooter();
    }

    /**
     * Get animation header
     *
     * @return string
     */
    private function _getHeader()
    {
        if (!isset($this->_global['frame'])) {
            throw new Exception(self::VERSION . ' Error: A frame must be added before header can be generated.');
        }
        $header = self::GIF_HEADER;
        $cmap = 0;
        if (ord($this->_global['frame']{10}) & 0x80) {
            $cmap = 3 * ( 2 << (ord($this->_global['frame']{10}) & 0x07));
            $header .= substr($this->_global['frame'], 6, 7);
            $header .= substr($this->_global['frame'], 13, $cmap);
            $header .= "!\377\13NETSCAPE2.0\3\1" . $this->_word($this->_loops) . "\0";
        }
        return $header;
    }

    /**
     * Get animation footer
     *
     * @return string
     */
    private function _getFooter()
    {
        return ';';
    }

    /**
     * Resize image (using GD library)
     *
     * @param string $data
     * @return string
     */
    private function _resizeImage($data,$data2)
    {
        // Create image from data
        //$img = imagecreatefromstring($data);
        $img = imagecreatefrompng($data2);
        if (!$img) {
            throw new Exception(self::VERSION . ' Error: Image format is invalid or unsupported.');
        }
        if (imageistruecolor($img)) {
            $newImg = imagecreatetruecolor($this->_width, $this->_height);
           
            //$tran = imagecolortransparent($newImg, imagecolortransparent($img));
            //imagefill($newImg, 0, 0, $tran);
           
            //imagealphablending($img, false);
            //imagesavealpha($img, true);
            //$newImg = imagecreatetruecolor($this->_width, $this->_height);
            //imagealphablending($newImg, false);
            //imagesavealpha($newImg, true);
       
        } else {
            $newImg = imagecreate($this->_width, $this->_height);

        }
       

       
               
        // Resample
        imagecopyresampled($newImg, $img, 0, 0, 0, 0, $this->_width, $this->_height, imagesx($img), imagesy($img));
        imagedestroy($img);
        // Get image as gif
        ob_start();
       
        imagegif($newImg);
        $resImg = ob_get_contents();
        imagedestroy($newImg);
        ob_end_clean();
        return $resImg;
    }

    /**
     * Convert image to gif (using GD library)
     *
     * @param string $data
     * @return string
     */
    private function _convertImage($data)
    {
        // Create image from data
        $img = imagecreatefromstring($data);
        if (!$img) {
            throw new Exception(self::VERSION . ' Error: Image format is invalid or unsupported.');
        }
        // Get image as gif
        ob_start();
       
        imagegif($img);
        $resImg = ob_get_contents();
        imagedestroy($img);
        ob_end_clean();
        return $resImg;
    }

    /**
     * Get global params from the first frame
     *
     * @param string $data
     * @return void
     */
    private function _defineGlobals($data)
    {
        $this->_global['frame'] = $data;
        $this->_global['len']   = 2 << (ord($data{10}) & 0x07);
        $this->_global['rgb']   = substr($data, 13, 3 * (2 << (ord($data{10}) & 0x07)));
    }

    /**
     * Block comparism
     *
     * @param string $global
     * @param string $local
     * @param int $length
     * @return bool
     */
    private function _blockCompare($global, $local, $length)
    {
        for ($i = 0; $i < $length; $i++) {
            if ($global{3 * $i} != $local{3 * $i} ||
                $global{3 * $i + 1} != $local{3 * $i + 1} ||
                $global{3 * $i + 2} != $local{3 * $i + 2}) {
                return false;
            }
        }
        return true;
    }

    /**
     * Word
     *
     * @param int $int
     * @return string
     */
    private function _word($int)
    {
        return chr($int & 0xFF) . chr(($int >> 8) & 0xFF);
    }

}
Najpierw stwórzmy sobie nowy obiekt naszej klasy czyli np:
$gif = new gifcreator(1, 2, array(255, 255, 255), 66, 18);
W construct naszej klasy widzimy parametry a ciut wyżej ładnie zakomentowane informacje, które mówią za co dany atrybut odpowiada. W naszym przykładzie pierwszy parametr mówi, że pętla animacyjna będzie przechodziła tylko raz, następny argument "disposal" jest dosyć tajemniczy, można zrobić test z wartościami (od 0 do 3). Trzecim parametrem jest tablica z wartościami transparentnymi koloru, my mamy trzy 255 czyli kolor biały. Następnie dwie wartości - rozmiarówki width (szerokość) i height (długość).

Stworzenie anima

Obiekt mamy to zróbmy coś na nim. Z racji, że klasa pomaga w tworzeniu animacji skorzystamy z funkcji do skreowania naszego migającego obrazka za pomocą funkcji addFrame:

// Add each frame to the animation
$gif->addFrame(file_get_contents('../images/animacja/1.png'),'../images/animacja/docelowy.png', 45, true);
$gif->addFrame(file_get_contents('../images/animacja/2.png'),'../images/animacja/docelowy.png', 45, true);      // Output the animated gif

//header('Content-type: image/gif');
header('Content-type: image/gif');
echo $gif->getAnimation();
Co się dzieje w powyższym kodzie? Mamy przygotowane dwa statyczne obrazki 1.png i 2.png, które mają wejść w gifa i obrazek "puszka", tam ma być docelowy gif. Wywołujemy funkcję addFrame podając ścieżki do naszych statyków podając ścieżkę docelową  (docelowy.png) i ustalając czas przejścia pomiędzy klatkami. Finalnie dajemy headerka i echujemy naszego gifka ciesząc się z przechodzących klatek na obrazku.

czwartek, 3 kwietnia 2014

Mieszarka elementów w tablicy | JAVASCRIPT

Przedstawie krótkiego posta z gotową funkcją na czele, która miesza wartości w tablicy (w technologii Java Script)

Najpierw kod:

function mieszamy(tablica) {
    for (var i = 0; i < tablica.length; i++) { 

        var j = Math.floor(Math.random() * tablica.length);
        var temp = tablica[i]; 
        tablica[i] = tablica[j]; 
        tablica[j] = temp;
    }
    return tablica;
}
Nasz algorytm idzie w pętli for, przechodząc po kolei elementy tablicy. W środku losujemy wartość z przedziału od 0 do tablica.length-1 (dlatego minus 1 bo tablica idzie od indeksu "0") . Tworzymy zmienną tymczasową temp gdzie podstawiamy wartość obecnie literowanego indeksu. Następnie pod bieżący indeks podstawiamy wylosowaną wartość a pod wylosowany wartość z bieżącego indeksu i VUALA.

poniedziałek, 31 marca 2014

Losowanie elementów z tablicy | JAVASCRIPT

Java Script podbija internet a biblioteki lotne (np. JQuery czy Prototype) dają niesamowite możliwości. Co jeśli zajdzie potrzeba wykonania losowych elementów na stronie z pewnego zbioru a możliwości techniczne wskazują na Java Script ? Najlepiej elemnty ułożyć w tablicy i za pomocą funkcji wylosować określoną ilość elementów.

Tworzymy tablicę JS

Chcemy otrzymać efekt losowości np. filmików - zwiastunów na stronie. Najpierw wrzućmy nasze zasoby do tablic. Aby utworzyć tablicę możemy posłużyć się przykładowo następującym kodem:
  var table_trailer = new Array(
  'film1',
  'film2',
  'film3',
  'film4',
  'film5',
  'film6'
  );

Funkcja losująca

Następnie stwórzmy sobie funkcję, która będzie zwracać losowe elementy (w parametrach tej funkcji będziemy przesyłać naszą tablicę i liczbę elementów losowych, które chcemy uzyskać):
function array_rand(input, num_req) {
  //  discuss at: http://phpjs.org/functions/array_rand/
  // original by: Waldo Malqui Silva
  //   example 1: array_rand( ['Kevin'], 1 );
  //   returns 1: 0

  var indexes = [];
  var ticks = num_req || 1;
  var checkDuplicate = function(input, value) {
    var exist = false,
      index = 0,
      il = input.length;
    while (index &lt; il) {
      if (input[index] === value) {
        exist = true;
        break;
      }
      index++;
    }
    return exist;
  };
Funkcja zwróci nam indeksy losowe z naszej tablicy, my sobie zapiszemy to w następujący sposób:
table_trailer2 = array_rand(table_trailer,3);

 var index1 = table_trailer2[0];
 var zwiastun1 = table_trailer[index1];
 //alert(zwiastun1);

 var index2 = table_trailer2[1];
 var zwiastun2 = table_trailer[index2];
 //alert(zwiastun2);

 var index3 = table_trailer2[2];
 var zwiastun3 = table_trailer[index3];
Mamy wylosowane indeksy, w naszym przykładzie w drugim parametrze funkcji array_rand daliśmy "3" gdyż chcemy 3 losowe elementy ,mamy również tablicę w całości, nie pozostaje nic innego jak wypisanie losowych elementów na stronie. Z racji, że na co dzień korzystam z JQuery wykonam powyższe zadanie za pomocą funkcji html:
 $('.trailer1').html(zwiastun1);
 $('.trailer2').html(zwiastun2);
 $('.trailer3').html(zwiastun3);

Całość dla szybkich koderów

Dla leniwych, którzy nie mają czasu na rozkminkę i poznawanie mechanizmu losowania wklejam poniższy kod w całości. (Uwaga potrzebna jest załączona biblioteka Jquery)
function array_rand(input, num_req) {
  //  discuss at: http://phpjs.org/functions/array_rand/
  // original by: Waldo Malqui Silva
  //   example 1: array_rand( ['Kevin'], 1 );
  //   returns 1: 0

  var indexes = [];
  var ticks = num_req || 1;
  var checkDuplicate = function(input, value) {
    var exist = false,
      index = 0,
      il = input.length;
    while (index &lt; il) {
      if (input[index] === value) {
        exist = true;
        break;
      }
      index++;
    }
    return exist;
  };

  if (Object.prototype.toString.call(input) === '[object Array]' &amp;&amp; ticks &lt;= input.length) {
    while (true) {
      var rand = Math.floor((Math.random() * input.length));
      if (indexes.length === ticks) {
        break;
      }
      if (!checkDuplicate(indexes, rand)) {
        indexes.push(rand);
      }
    }
  } else {
    indexes = null;
  }

  return ((ticks == 1) ? indexes.join() : indexes);
}



$(document).ready(function() {
  var table_trailer = new Array(
  'film1',
  'film2',
  'film3',
  'film4',
  'film5',
  'film6'
  );



 table_trailer2 = array_rand(table_trailer,3);

 var index1 = table_trailer2[0];
 var zwiastun1 = table_trailer[index1];
 //alert(zwiastun1);

 var index2 = table_trailer2[1];
 var zwiastun2 = table_trailer[index2];
 //alert(zwiastun2);

 var index3 = table_trailer2[2];
 var zwiastun3 = table_trailer[index3];
 //alert(zwiastun3);

 $('.trailer1').html(zwiastun1);
 //$('.trailer1').appendTo(zwiastun1);
 //$('.trailer2').appendTo(zwiastun2);
 $('.trailer2').html(zwiastun2);
 //$('.trailer3').appendTo(zwiastun3);
 $('.trailer3').html(zwiastun3);


});

środa, 26 marca 2014

OPERATOR LOGICZNY OR, znak != , nawiasy | Podstawy Sqla - cz.2

Słówko AND daje wiele możliwości. W operatorach logicznych należy wyróżnić operator OR (lub), który daje dodatkowe możliwości.

Operator logiczny OR

Najlepszym przekonaniem się o sile OR jest wykonanie testu zapytaniowego. Chcemy wyselekcjonować wszystkich panów, którzy mają na nazwisko albo Kowalski albo Nowak albo dajmy na to nazwisko naszego rajdowca Kubica. Jak to zrobić?, ano można tak:

SELECT * FROM Klienci WHERE nazwisko = 'Kowalski' OR nazwisko = 'Nowak' OR nazwisko = 'Kubica'

W wyniku otrzymamy nazwiska pasujące do 'Kowalski' lub pasujących do 'Nowak' lub pasujących do 'Kubica'. Na podstawie naszej tabelki otrzymujemy dwóch Kowalskiego i Nowaka, a Kubicy, którego nie ma w bazie, nie ma i w naszych wynikach.

Znak porównania !=

Ten operator logiczny pozwoli nam na wykluczanie nie chcianych rekordów np. wypisz wszystkich panów za wyjątkiem panów, którzy mają na imie Piotr. Zapytanie będzie wyglądać następująco:

SELECT * FROM Klienci WHERE imie != 'Piotr'

W klauzuli WHERE wykluczamy wszystkich Piotrów.

Nawiasy okrągłe ( )

Nawiasy jak to jest i w matematyce pozwalają na sterowanie ważności wykonywania warunków jak również pozwalają na łączenie różnych warunków w jedną całość. Można sobie wymyślać, że chcemy wszystkich Kowalskich lub wszystkich, którzy mają na imię Jan a nazwisko Nowak. Za pomocą nawiasów możemy wykonać taką akcję sqlową:

SELECT * FROM Klienci WHERE nazwisko = 'Kowalski' OR (imie = 'Jan' AND nazwisko = 'Nowak')

niedziela, 23 marca 2014

Zapytanie WHERE, kombinacje | Podstawy Sqla - cz.3

W poprzedniej części nauczyliśmy się wyszukiwać Brzęczyszczykiewicza z bazy poznając przy okazji słówko kluczowe WHERE. Możliwości tej klauzuli nie kończą się na porównywaniu określonych ciągów tekstowych (stringów) czy liczbowych, a dają cały asortyment by nasze zapytanie stało się takim jakim chcemy.

LIKE

Wyobraźmy sobie sytuację, gdzie w bazie mamy trzech panów: pan Robert Adamski, pan Bartłomiej Adamczyk, pan Adam Małysz. Naszym pierwszym celem są panowie, którzy mają w nazwisku ciąg "Adam", czyli chcielibyśmy w wynikach zobaczyć Adamskiego oraz Adamczyka. Małysz oczywiście nie powinien się dokoptować do wyników z racji iż jego nazwisko nie pasuje do naszego wzorca. Z pomocą przychodzi klauzula LIKE, którą używamy przy okazji WHERE. Oznacza porównywanie tekstu, ale nie identyczność od początku do końca. Przykład rozjaśni tą sprawę:

Select * FROM Klienci WHERE nazwisko LIKE 'Adam%'

,widzimy słówko kluczowe LIKE a następnie 'Adam%' co oznacza znajdź wszystkich o nazwisku Adam ... a znak procentu % mówi, że dalej może się dziać co chce czyli daje możliwość wyszukania Adamskiego czy Adamczyka.

OPERATOR LOGICZNY AND

Aby Adam M. nie poczuł się urażony stworzymy zapytanie, które pomoże mu znaleźć się w wynikach. Wykorzystamy do tego operator logiczny AND a przy okazji zobaczymy kombinację poszerzającą nasze horyzonty. Czyli zróbmy sobie powyższe kryteria oraz dodajmy panów, którzy mają na imię tylko i wyłącznie Adam. Można to ująć w ten sposób:

Select * FROM Klienci WHERE nazwisko LIKE 'Adam%' AND imie = 'Adam'

Dodaliśmy "AND imie = 'Adam'" co tłumaczyć nie trzeba a co daje panu Adamowi miejsce w naszej liście klientów.

piątek, 21 marca 2014

Zapytanie SELECT, klauzula WHERE | Podstawy Sqla - cz.1

Język SQL pozwala na przetwarzanie danych zapisanych w bazie danych. W moim poradniku przedstawiam wersje MySQL z racji, że korzystam z niej na codzień i nawet odczuwam odwzajemnioną sympatię. Najprostszą operacja w SQL jest wyszukanie informacji. Używamy do tego zapytania SELECT, które pobiera określone dane z określonych tabel w bazie.

Dla przykładu przyjmijmy, że mamy takową tabelę:

Tabelka ta nosi nazwę Klienci, zawiera 3 kolumny:

id (int11) - kolumna z id,
imie (varchar 350) - kolumna w której przechowujemy imie,
nazwisko (varchar 350) - kolumna z nazwiskiem.

Na powyższym screenie widzimy 3 zapisane rekordy pana Kowalskiego Jana , Piotra Nowaka oraz Grzegorza Brzęczyszczykiewicza. Powiedzmy że chcemy uzyskać wszystkie rekordy znajdujące się w tabeli Klienci czyli mieć w wynikach wszystkich trzech panów. Na myśl wszystko nasuwa się i prawidłowo gwiazdka * czyli w zapytaniu mamy:

SELECT  *  FROM Klienci

co można przetłumaczyć - pokaż wszystkich z tabeli Klienci. Uzyskamy wszystkie dane delikwentów łącznie z przyporządkowanym numerkiem id. No dobra, ale na cóż nam wszyscy jak szukamy Grzegorza B. W SQL jest to możliwe i nawet przyjemne w wykonaniu np:

SELECT * FROM Klienci WHERE imie = "Grzegorz" AND nazwisko = "Brzęczyszczykiewicz"

Angielskojęzyczni nie będą mieli problemów w rozgryzieniu powyższego zapytania, jednak szacunek dla użytkowników różego rodzaju ;) nakazuje mi wytłumaczenie słówka WHERE. Zapytanie możemy przetłumaczyć : pokaż wszystkich użytkowników z tabeli Klienci GDZIE (po polsku KTÓRZY) ci klienci mają na imie Grzegorz i zarazem na nazwisko Brzęczyszczykiewicz. W wyniku otrzymamy jednego pana, gdyż tylko jeden pasujący znajduje się w bazie.

środa, 19 marca 2014

Stylowanie css pod przeglądarkę Internet Explorer cz.2

Internet Explorer

W poprzedniej części przekazałem informacje na temat tricków / hacków pod Internet Explorer, które w szybki sposób mogą pomóc w problemie błędnego wyświetlania elementów na stronie. Jest to podejście doraźne, raczej nie polecane. Znacznie lepszym rozwiązaniem jest tworzenie wspólnego kodu html/css dla wszystkich przeglądarek.

Gdy jesteśmy w trakcie tworzenia strony internetowej możemy odrazu zwracać uwagę na efekty naszej pracy w wszystkich przeglądarkach lub trzymać się pewnych określonych schematów w szablonach css.

Najnowsze wersje Internet Explorer (IE 11), są już na tyle dopracowane, że możemy przyjąć poprawność i zbieżność interpretacji kodu  html i css w przeglądarkach Firefoxa, chroma i explorera. Jednakże istnieje  duże grono użytkowników korzystających z starszych wersji przeglądarek w tym IE8i z tego względu należy wsiąść pod uwagę tą odsłonę IE.

Dziś skupie się na elementach blokowych na stronie i ich pozycjonowaniu w kaskadowym arkuszu styli.

1. Znaczenie ważności elementów blokowych względem siebie.

Jeżeli używamy akapitów nie zagnieżdżajmy akapit w akapicie czyli przykładowy kod:

<p class="first_p">
<p class="content_1">
Akapit kontener nr 1. Lorem Ipsum ...
</p>
</p>

jest nieprawidłowy pod względem semantycznym. Zauważyłem, że IE nie lubi takich struktur i błędnie (albo i bezbłędnie wytyka nam błędy) je interpretuje. Poprawnie było by opakowanie naszego akapitu divem, który znaczeniowo jest ważniejszy. Czyli można byłoby powyższy kod przedstawić następująco:

 <div class="first_container">
<p class="content_1">
Akapit kontener nr 1. Lorem Ipsum ...
</p>
</div>


2. Trzymanie się konwencji.

Kolejną poradą jest trzymanie się pewnego schematu przy tworzeniu i pozycjonowaniu elementów blokowych na stronie. Pamiętajmy o możliwości opakowywania poszczególnych elementów, nadawania im określonych rozmiarów (własność width i height) oraz możliwością sterowania pozycją poprzez padding i margin. Opakowania znacznie uproszczają kontrolę nad poszczególnymi elementami HTML oraz wzajemną interakcje pomiędzy nimi. Czyli można przyjąć następujący schemat "podstawowy" przy tworzeniu nowego bloka np:

Dla kodu HTML:


<div id="header">
 <div class="logo">
 Nasze logo
 </div>
</div> 

Kod CSS:

#header{ margin:0; padding:0; }
.logo{ margin:0; padding:0; }

sobota, 15 marca 2014

Wyszukiwanie z/bez polskich znaków pojedyńczego wyrazu | MySql

Na stronach www coraz częściej pojawiają się szukajki, które wyszukują słowo/ słowa kluczowe łącząc się z bazą i zadając odpowiednie zapytanie SQL. Czasem istnieje potrzeba zmodyfikowania zapytania pod określone założenia (np. wyszukiwanie z i bez polskich znaków pojedyńczego wyrazu ) i zapytanie typu:

SELECT name FROM articles as a WHERE a.`name` LIKE '%{$searchQuery}%'

nie spełnia naszych oczekiwań. Z pomocą przychodzą wyrażenia regularne, które możemy użyć w naszym zapytaniu sqlowym. Należy użyć słówko kluczowe REGEXP a następnie wstawić odpowiednie wyrażenie regularne. Przykładowo chcemy uzyskać w wynikach wszystkich autorów o nazwisku "LEM" (czyli wyrazy "Lemowski" czy "Kotlemowski" nie wchodzą wgrę). Korzystając z REGEXP zapytanie może wyglądać tak:

SELECT surname FROM authors as a WHERE a.`name` REGEXP '[[:<:]]{$searchQuery}[[:>:]]'

gdzie $searchQuery = "Lem". W wynikach otrzymamy wszystkich autorów o nazwisku Lem. W zapytaniu ciąg znaków [[:<:]] oznacza początek wyrazu, a ciąg [[:>:]] oznacza koniec wyrazu. Pomiędzy początkiem i końcem wyrazu widzimy zmienną, która jest stringiem, w naszym przypadku zawiera wyraz LEM.

Więcej o REGEXP znajdziesz tutaj.

czwartek, 13 marca 2014

Stylowanie css pod przeglądarkę Internet Explorer

Internet Explorer

Często zdarza się, że nasze style css są inaczej interpretowane przez przeglądarkę Internet Explorer niż chcielibyśmy. W poście tym opiszę sposoby radzenia sobie z takim problemem.

1. Załączenie zewnętrznych arkuszy stylów, które będą interpretowane tylko przez Internet Explorer.

W sekcji <head> ... </head> należy wstawić kod załączenia pliku css pod IE wraz z komentarzami np:

<!--[if IE]>
 <link rel="stylesheet" type="text/css" href="all-ie-only.css" />
<![endif]-->

Kod ten będzie działał dla wszystkich wersji Interner Explorer, natomiast inne przeglądarki nie będą brały go pod uwagę.

2. Zastosowanie tricków, hacków w css.

Tutaj nie tworzymy dodatkowych plików CSS, natomiast wykorzystujemy pewne właściwości przeglądarek.

Niektóre tricki działają tylko w poszczególnych wersjach internet explorer, a niektóre we wszystkich z wyłączeniem określonych wersji.

Widoczne tylko w IE-6

* html #div { margin: 20px; }

Widoczne tylko w IE-7

*+html #div { margin: 20px; }

Widoczne tylko w IE-8

#div { margin: 20px \0/; }

Widoczne tylko w IE-7 & IE-8

#div { margin: 20px\9; }

Niewidoczne w IE-7

#div { _margin: 20px; }

Niewidoczne w  IE 6 i wcześniejszych wersjach

#div { margin/**/: 20px; } html > body #div { margin: 20px; }

poniedziałek, 10 marca 2014

Debugowanie kodu w Internet Explorer

IE

Podczas tworzenia stron internetowych często przy finalizowaniu takowej strony napotykamy na zaskoczenie związane z Internetem Explorerem. Oczywiście, jeśli przy tworzeniu htmla i cssa jesteśmy niefrasobliwi i korzystamy z narzędzi (przeglądarek), które z naszego punktu widzenia są najlepsze.

Nieoczekiwanie (albo oczekiwanie;)) widzimy, że nasza strona nie jest naszą stroną w przeglądarce IE. Szybko sprawdzamy poprawność wpisanego adresu url i czujemy się nieswojo. Aby zapobiec szokowi związanemu z innym wyglądem naszej witryny należy tworzyć stronę z dodatkową myślą :

 "Jak to będzie wyglądać w Internet Explorer ?".

W Firefox czy w Chrome wiemy jak z debugować kod html/css/js, natomiast przy pierwszym starciu z IE zaczynamy nerwowo szukać edycji kodu. Aby móc edytować kod w IE należy zainstalować dodatek debugbar ze strony:

Po instalacji uzyskujemy opcje pozwalające na sprawdzeniu kodu i wprowadzenie poprawek na żywo.