Baza modelek Glamour Models: Modelki, Fotomodelki, Hostessy

sobota, 1 kwietnia 2017

Jak dodać font do Photoshop bez instalacji w Windows

Jak dodać font do Photoshop bez instalacji w Windows?

Wystarczy wrzucić pliki czcionek do folderu
C:\Program Files (x86)\Common Files\Adobe\Fonts\

środa, 6 stycznia 2016

Jak stworzyć archiwum Zip w PHP

Przykład rekursywnego tworzenia archiwum Zip:

<?php

$directory = 'files';

$path = __DIR__ . '/' . $directory;
$filename  = sprintf('%s.zip', $path);


$zip = new ZipArchive;
$zip->open($filename, ZipArchive::CREATE);

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file) {
    if (! $file->isDir()) {
        $filePath = $file->getRealPath();
 
        $relativePath = substr($filePath, strlen($path) + 1);
 
        $zip->addFile($filePath, $relativePath);
    }
}

$zip->close();

środa, 31 grudnia 2014

Pobranie poprzedniego i następnego rekordu dowolnego zapytania w MySQL

Poniższe funkcje są przykładem, jak pobrać sąsiadujące wiersze w dowolnym zapytaniu z uwzględnieniem sortowania:

public function getPrevItem($id, $onlyActive = true, $categoryId = null) {
    $where = ' WHERE 1 = 1 ';
    $sqlParams = array();

    if ($onlyActive) {
        $where .= ' AND a.`active` = 1 AND c.`active` = 1 ';
    }

    if ($categoryId !== null) {
        $where .= ' AND a.id_category = ? ';
        $sqlParams[] = $categoryId;
    }

    $this->getSql()->query("SET @item_offset = -1");
    $sql = "SELECT * FROM (
                SELECT @item_offset := @item_offset + 1 AS `item_offset`, id
                FROM (
                    SELECT a.id
                    FROM  `articles` a
                    JOIN `articles_category` c ON c.id = a.id_category
                    $where
                    ORDER BY a.`pos` DESC, a.`id` DESC
                ) AS x
            ) AS t WHERE t.id = ?";

    $itemOffset = (int) $this->getSql()->value($sql, array_merge($sqlParams, array($id)));
    if ($itemOffset == 0) {
        return false;
    }

    $prevOffset = $itemOffset - 1;
    $sql = "SELECT a.*, c.name AS category_name, c.slug AS category_slug
            FROM `articles` a
            JOIN `articles_category` c ON c.id = a.id_category
            $where
            ORDER BY a.`pos` DESC, a.`id` DESC
            LIMIT 1
            OFFSET $prevOffset";

    $prev = $this->getSql()->one($sql);
    return $prev;
}

public function getNextItem($id, $onlyActive = true, $categoryId = null) {
    $where = ' WHERE 1 = 1 ';
    $sqlParams = array();

    if ($onlyActive) {
        $where .= ' AND a.`active` = 1 AND c.`active` = 1 ';
    }

    if ($categoryId !== null) {
        $where .= ' AND a.id_category = ? ';
        $sqlParams[] = $categoryId;
    }

    $this->getSql()->query("SET @item_offset = -1");
    $sql = "SELECT * FROM (
                SELECT @item_offset := @item_offset + 1 AS `item_offset`, id
                FROM (
                    SELECT a.id
                    FROM  `articles` a
                    JOIN `articles_category` c ON c.id = a.id_category
                    $where
                    ORDER BY a.`pos` DESC, a.`id` DESC
                ) AS x
            ) AS t WHERE t.id = ?";

    $itemOffset = (int) $this->getSql()->value($sql, array_merge($sqlParams, array($id)));

    $nextOffset = $itemOffset + 1;
    $sql = "SELECT a.*, c.name AS category_name, c.slug AS category_slug
            FROM `articles` a
            JOIN `articles_category` c ON c.id = a.id_category
            $where
            ORDER BY a.`pos` DESC, a.`id` DESC
            LIMIT 1
            OFFSET $nextOffset";

    $next = $this->getSql()->one($sql);
    return $next;
}


Legenda:
$this->getSql()->query() - wykonuje zapytanie
$this->getSql()->value() - zwraca wartość pierwszej kolumny w pierwszym rekordzie wyniku zapytania
$this->getSql()->one() - zwraca jeden rekord zapytania

wtorek, 13 sierpnia 2013

Ignorowanie polskich znaków w MySQL

Jeśli chcemy znaleźć słowo 'żółw', można wpisać tylko 'zolw' (opcja dla leniwych lub niewyedukowanych).
Rozwiązanie jest takie:

SELECT * 
FROM `animals` 
WHERE `name` COLLATE utf8_general_ci LIKE '%zolw%';

SELECT * 
FROM `animals` 
WHERE `name` COLLATE utf8_general_ci LIKE '%żółw%';

Oba zapytania są równoważne.

czwartek, 14 lutego 2013

Zaślepka dla nie załadowanych obrazków w jQuery

Witam,
pokażę jeden ze sposobów na wstawienie zaślepki obrazków, które nie zostały wczytane:

$(window).load(function() {
  var w, h, w1, h1;
  $('img').each(function() {
    if (!this.complete
        || typeof this.naturalWidth == "undefined"
        || this.naturalWidth == 0) {
      w = 100;
      h = 100;
      w1 = parseInt($(this).attr('width'), 10);
      h1 = parseInt($(this).attr('height'), 10);
      if (w1 && h1) {
        w = w1;
        h = h1;
      }
      this.src = 'http://placehold.it/'+w+'/'+h;
    }
  });
});

Ten sposób działa w normalnych przeglądarkach.

niedziela, 16 września 2012

Generowanie struktury drzewiastej do testów

Jak wygenerować tablicę, która będzie reprezentować strukturę drzewiastą?

Pomocna będzie funkcja do generowania losowych wartości tekstowych:
function randomText(){
 $ch = range('a', 'z');
 $count = count($ch);
 $length = rand(5, 10);
 $text = '';
 
 for($i=0; $i < $length; $i++){
  $text .= $ch{rand(0, $count-1)};
 }
 
 return $text;
}

Utwórzmy klasę Tree, która będzie miała trzy prywatne właściwości określające wygenerowane drzewo, liczbę poziomów drzewa oraz liczbę gałęzi na każdym poziomie.
Do metody Tree::makeTree() przekazujemy wartości, które określą nam wielkość drzewa.
W końcu generujemy rekurencyjnie drzewo w prywatnej metodzie Tree::_makeTree(). Wartości przekazywane do tej metody to aktualny poziom, numer gałęzi na poziomie oraz numer węzła w drzewie, tzn. klucz w tablicy rodzica.
class Tree{
 private $tree; // wygenerowane drzewo
 private $levels; // liczba poziomów drzewa
 private $branches; // liczba gałęzi na każdym poziomie
 
 public function makeTree($levels, $branches){
  $this->tree = array();
  $this->levels = $levels;
  $this->branches = $branches;
  
  $this->_makeTree();
 }
 
 private function _makeTree($level = 0, $branch = 0, $id = null){
  if ($level > $this->levels) {
   return;
  }
  
  $this->tree[] = array('value' => randomText(), 'parent' => $id);
  
  end($this->tree);
  $id = key($this->tree);
  
  for($i=0; $i < $this->branches; $i++) {
   $this->_makeTree($level+1, $i, $id);
  }
 }
 
 public function getTree(){
  return $this->tree;
 } 
}

Aby wartości w drzewie miały za każdym razem takie same wartości, można ustawić generator liczb losowych.
srand(0);
$t = new Tree();
$t->makeTree(3,2);
var_dump($t->getTree());

Te ustawienia wygenerują tablicę o tej strukturze:
array
  0 => 
    array
      'value' => string 'eifefuq' (length=7)
      'parent' => null
  1 => 
    array
      'value' => string 'yknjklv' (length=7)
      'parent' => int 0
  2 => 
    array
      'value' => string 'fovima' (length=6)
      'parent' => int 1
  3 => 
    array
      'value' => string 'rtnuteg' (length=7)
      'parent' => int 2
  4 => 
    array
      'value' => string 'miagkiylls' (length=10)
      'parent' => int 2
  5 => 
    array
      'value' => string 'xbpvmgosn' (length=9)
      'parent' => int 1
  6 => 
    array
      'value' => string 'tqwrsjw' (length=7)
      'parent' => int 5
  7 => 
    array
      'value' => string 'ocjmxpr' (length=7)
      'parent' => int 5
  8 => 
    array
      'value' => string 'uarkvdrq' (length=8)
      'parent' => int 0
  9 => 
    array
      'value' => string 'coehs' (length=5)
      'parent' => int 8
  10 => 
    array
      'value' => string 'nkdupaci' (length=8)
      'parent' => int 9
  11 => 
    array
      'value' => string 'hvcjublmpy' (length=10)
      'parent' => int 9
  12 => 
    array
      'value' => string 'gihucb' (length=6)
      'parent' => int 8
  13 => 
    array
      'value' => string 'zzkpck' (length=6)
      'parent' => int 12
  14 => 
    array
      'value' => string 'nbjtsdg' (length=7)
      'parent' => int 12

wtorek, 21 lutego 2012

Miniaturki automatycznie zapisane na serwerze

Masz zdjęcia normalnych rozmiarów, jednak nie chcesz przerabiać wszystkich na miniatury.
Można za pomocą CSS lub atrybutów width i height zmniejszyć ich wymiary na ekranie, ale ich rozmiar będzie nadal tak duży, jak dużego zdjęcia, co powoduję że się dłużej ładują.

Pokażę trick wykorzystujący JavaScript/JQuery, .htaccess/mod_rewrite i oczywiście PHP, który będzie tworzył miniatury w locie i zapisywał je na serwerze, gdy tylko zdjęcie zostanie wyświetlone za pierwszym razem.