Odrzucanie ciastek top-domain na subdomenie

Dodany: 12 maja, 2014 | Kategoria: Apache, PHP

Załóżmy, że mamy stronę: mojadomena.pl i vip.mojadomena.pl – ale na obu jest logowanie. Ciastka z mojadomena.pl będą wtedy przesłaniać te z vip.mojadomena.pl. W PHP można jednak problem obejść:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// fix subdomain cookies
// based on from http://stackoverflow.com/a/9678857/1823945
// little changes by gnysek.pl
function skip_top_level_cookies()
{
    if (!empty($_SERVER['HTTP_COOKIE'])) {
        $domains_counter = array();
        foreach (explode(';', $_SERVER['HTTP_COOKIE']) as $cookie_variable_string) {
            $key_value = explode('=', $cookie_variable_string);
            $cookie_var_name = trim($key_value[0]);
            if (!array_key_exists($cookie_var_name, $domains_counter)) {
                $domains_counter[$cookie_var_name] = 1;
            }
            $http_cookie_variables[$cookie_var_name][$domains_counter[$cookie_var_name]] = (!empty($key_value[1])) ? urldecode(trim($key_value[1])) : '';
            $domains_counter[$cookie_var_name]++;
        }

        $levelDomain = substr_count($_SERVER['HTTP_HOST'], '.');

        $newCookies = array();
        foreach ($http_cookie_variables as $cookieName => $cookie) {
            if (array_key_exists($levelDomain, $cookie)) {
                $newCookies[$cookieName] = $cookie[$levelDomain];
            } else {
                $newCookies[$cookieName] = $cookie[1];
            }
        }
        $_COOKIE = $newCookies;
    }
    return true;
}

if (substr_count($_SERVER['HTTP_HOST'], '.') > 1) {
    skip_top_level_cookies();
}
Tagi: , , , , Brak komentarzy »

MySql – szybki import CSV do bazy

Dodany: 8 kwietnia, 2013 | Kategoria: PHP

Potrzebowałem zaimportować plik CSV do bazy danych. Niby proste zadanie, odpaliłem PhpMyAdmina, mieliło mi plik kilka minut, po czym wysypało się na timeoucie po 5 minutach i wstawieniu 3 tys. rekordów – na 12639 dostępnych. To stanowczo za długo. Poszperałem więc po sieci, jak zwykle pomocny okazał się stackoverflow i dzięki temu dostałem takie oto zapytanie, do odpalenia w mysql z terminala (lub cmd):

LOAD DATA LOCAL INFILE "plik.csv"
INTO TABLE twoja_tabela
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';

Załadowało się w ułamku sekundy.

Terminal to jednak terminal :)

1 Komentarz »

phpMyAdmin – Zablokowane przez politykę bezpieczeństwa treści

Dodany: 21 stycznia, 2013 | Kategoria: PHP

Miałem jakiś czas temu problem z phpMyAdminem pod chrome, po zaistalowaniu WAMPPa, wyświetlał się komunikat:

Zablokowane przez politykę bezpieczeństwa treści
Ta strona posiada politykę bezpieczeństwa treści, która nie pozwala na osadzenie jej w taki sposób.

Rozwiązaniem jest edycja

\libraries\header_http.inc.php

i usunięcie/zakomentowanie linijki zawierającej ustawianie nagłówka:

"X-Content-Security-Policy"
Tagi: , , , , , , , , Brak komentarzy »

Gdzie jest aplikowana paginacja na kolekcji widoku kategorii w Magento?

Dodany: 9 października, 2012 | Kategoria: Magento, PHP

Potrzebowałem znaleźć, gdzie jest ograniczana kolekcja produktów w widoku kategorii, przez co zamiast X produktów wyświetla się np. 9.

1
2
class Mage_Catalog_Block_Product_List {
...
162
163
// set collection to toolbar and apply sort
$toolbar->setCollection($collection);
Tagi: , , , , , , Brak komentarzy »

Miniaturka obrazków youtube

Dodany: 5 listopada, 2011 | Kategoria: PHP

Miniaturka obrazków do youtube:

http://img.youtube.com/vi/VIDEO_ID/1.jpg
Tagi: , , Brak komentarzy »

Includowanie bloku Magento bezpośrednio w templatce

Dodany: 27 lipca, 2011 | Kategoria: Magento, PHP

Gdy wstawimy blok do pliku layoutu, będzie on wczytany przy generowaniu strony (nawet jeśli go nie wyświetlamy w templatce) i sprawdza cache. Dzisiaj miałem taki problem, ze aby nie nadpisywać całego magento i wyswietlania kategorii, najprościej było po prostu ustawić pewien parametr w templatce a potem ten drugi blok miał go odczytywać aby utworzyć klucz dla cache. Tu pojawił się problem, bowiem aby skorzystac z getChildHtml() musiałem ustawić blok w layoucie, co powodowało, ze generował się klucz do cache z parametru, którego jeszcze nie było i sypało błędem.

Poszukałem rozwiazania w googlach i było prawie dobre – niestety okazało się, że metoda setData wcale nie ustawi zmiennej $this->_template, a $this->_data[’template’] dla bloku, przez co output HTMLowy się nie wykonywał ($this->getTemplate() zwracało NULL).

Zatem prawidłowe rozwiązanie to:

echo $this->getLayout()
->createBlock('Name_Module_Block_Type', 'name')
->setTemplate('name/module/type.phtml')
->toHtml();
Tagi: , , , , , , , Brak komentarzy »

isset – nieistniejąca tablica w stringu

Dodany: 16 lipca, 2011 | Kategoria: PHP

Ostatnio przy okazji szukania pewnego błędu w kodzie byłego pracownika w pracy natknęliśmy się na ciekawą rzecz. Mianowicie w pewnej pętli foreach definiowana była zmienna tekstowa, a kawałek dalej sprawdzane było czy jest zdefiniowany w tej zmiennej pewien klucz tablicy – jeśli nie, przeskakujemy do kolejnej iteracji. W pierwszej chwili oczywistym wydało się, że skoro zmienna jest stringiem, a sprawdzamy czy istnieje klucz tablicy, to isset zwróci false i tak naprawdę pętla zawsze skacze do kolejnej iteracji.
Otóż nie. Ponieważ string jest tablicą zawierającą kolejne znaki tekstu, okazało się, że użycie klucza nieliczbowego rzutowane jest na 0, zatem funkcja isset nie sprawdza, czy istnieje klucz, ale czy istnieje pierwszy znak w owym stringu. Zatem:

1
2
3
4
5
6
7
8
$var = 'foobar';

var_dump( $var );
var_dump( isset($var) );
var_dump( $var['test'] );
var_dump( isset($var['test']) );
var_dump( isset($var[0]['test']) );
var_dump( empty($var['test']) );

drukuje

1
2
3
4
5
6
string(6) "foobar"
bool(true)
string(1) "f"
bool(true)
bool(false)
bool(false)

Ach to typowanie dynamiczne w PHP :)

Tagi: , , 1 Komentarz »

Yii – renderowanie widoków z dowolnego folderu

Dodany: 22 stycznia, 2011 | Kategoria: Yii

Wyświetlanie widoku z innego kontrolera/folderu/ścieżki w tym obecnym.
Sprawiło mi to trochę problemu, a sprawa taka prosta…

$this->render('/index'); – wyrenderuje nazwaKontrolera/index.php
$this->render('//index'); – wyrenderuje views/index.php
$this->render('//folder/plik'); – wyrenderuje views/folder/plik.php

Tagi: , , , , , Brak komentarzy »

Yii – gettery do AR

Dodany: 22 stycznia, 2011 | Kategoria: Yii

Modele korzystające z AR zwracają dane bezpośrednio z bazy, co jednak gdy chcemy np. przerobić datę tam zapisaną z postaci unix na ludzką ??
Teoretycznie najprościej było by po wczytaniu rekordu zaktualizować go (np. $this->time = date('H:i:s', $time) w afterFind()), ale ma to jedną wadę – do formularzy edycyjnych trafi ta zmodyfikowana data, a przecież do bazy trafia ona jako INT, więc się wszystko sypnie.
Odpowiedź prosta – napisać nową metodę gettera w modelu, która zwraca datę, np. getCzytelnaData():

1
2
3
public function getCzytelnaData() {
    return date('H:i:s', $this->data);
}

Potem możemy wypisać taką datę w widoku zamiast $this->data które zwraca np. 1123123123, to $this->czytelnaData (metoda magiczna CActiveRecord::__get), a do widgetów wpisujemy jako pole z modelu 'czytelnaData’ :) Takiego pola nie ma w bazie, ale to nie znaczy, ze nie musi być w modelu – w ten sposób mozna sporo bajerów zrobić ;)

Tagi: , , , Brak komentarzy »