Jak dodać font do Photoshop bez instalacji w Windows?
Wystarczy wrzucić pliki czcionek do folderu
C:\Program Files (x86)\Common Files\Adobe\Fonts\
dla wersji 32-bit
lub
C:\Program Files\Common Files\Adobe\Fonts\
dla wersji 64-bit.
Jeśli katalog Fonts nie istnieje, to należy go utworzyć.
Web Majster - triki i rozwiązania. Pokazuję ciekawe rozwiązania w PHP, frameworku Kohana PHP, JavaScript i jQuery, htaccess i mod_rewrite oraz inne.
sobota, 1 kwietnia 2017
ś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:
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
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:
Oba zapytania są równoważne.
Rozwiązanie jest takie:
|
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:
Ten sposób działa w normalnych przeglądarkach.
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:
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.
Aby wartości w drzewie miały za każdym razem takie same wartości, można ustawić generator liczb losowych.
Te ustawienia wygenerują tablicę o tej strukturze:
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.
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.
Subskrybuj:
Posty (Atom)