Ręczna instalacja Magento na linuxpl.com

Gdy chcesz zainstalować wersje 1.3.2.4 Magento na hostingu linuxpl.com poprzez rozpakowanie paczki instalacyjnej w public_html a następnie wskazanie adresu http://twojserwer.com/install w przeglądarce, pojawia się błąd:

Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 19456 bytes) in /home/yourname/domains/yourdomain.com/public_html/app/code/core/Mage/Core/functions.php on line 314

Co zrobić ?

Z jakiś niewiadomych przyczyn serwer źle interpretuje ustawienia php w pliku .htaccess zawartego oryginalnie w instalacji Magento. Zmodyfikuj plik .htaccess (root instalacji Magento) usuwając wszystko pomiędzy <IfModule mod_php5.c> aż do pierwszego </IfModule>, zapisz i instalacja powinna już przebiegać bezbłędnie.

Ostatecznie plik .htaccess powinien wyglądać tak:

Czytaj dalej »

Samozatrudnienie, ciąg dalszy – jak obniżyć koszty ZUS

O samozatrudnieniu ciąg dalszy. Tym razem jak obniżyć składki ZUS. Możliwe ?

Tak, możliwe. Pomysł nie jest mój, wyczytałem gdzieś w internecie napisany małym druczkiem w komentarzu i postanowiłem sprawdzić na “żywych” danych czy rzeczywiście działa.

Pomysł jest prosty. Są dwie osoby prowadzące działalność gospodarczą. Osoby te zatrudniają się wzajemnie na podstawie umowy o pracę. Etat, pół etatu nie istotne. Ważne aby zarabiały na tym etacie przynajmniej minimalne wynagrodzenie. Wówczas w prowadzonej działalności gospodarczej odprowadzają tylko składkę zdrowotną. Jak to wygląda dokładniej ?

Osoba fizyczna prowadząca działalność gospodarczą

Minimalne koszty ZUS przy prowadzeniu działalności gospodarczej to obecnie 839,02 zł.

Wykorzystanie pomysłu i wzajemne zatrudnienie.

Odprowadzamy tylko zdrowotne tj. 224,24 plus koszty związane z zatrudnieniem pracownika 99,10 (zdrowotne pracownika) + 174,94 (zus pracownika) + 237,46 (zus pracodawcy). Razem 735,74. Daje to oszczędności ok. 100 zł miesięcznie/1200 zł rocznie. Identyczną sytuację ma druga osoba.

Dodatkowe oszczędności można poczynić przy obliczaniu podatku dochodowego…

Czy warto ?

Minusem może być zwiększona buchalteria, niezbędne jest również aby osoby wykorzystujące pomysł miały do siebie bezgraniczne zaufanie ;)

Płaca – umowa o pracę czy faktura VAT ?

Pytanie, które mnie ostatnio nurtowało. Czy lepiej jest podpisać umowę o pracę czy posiadać własną firmę i rozliczać się przez Fakturę VAT (zakładam branżę IT) ? Niewątpliwie obie formy mają swoje wady i zalety.

Faktura

  • zalety
    • rozliczanie za godziny  – wolność wyboru dni wolnych i godzin pracy
    • na ZUS płaci się minimalną stawkę, można poświęcić więcej pieniędzy na “normalne” firmy ubezpieczeniowe
  • wady
    • jeśli umowa nie zapewnia stałej liczby godzin – może być kłopot ze stabilizacją, tym bardziej jeśli umowa nie ma okresu wypowiedzenia
    • w przypadku choroby brak wynagrodzenia (można zniwelować ubezpieczając się)
    • w przypadku urlopu brak wynagrodzenia (zależy od konstrukcji umowy)
    • zmienne wynagrodzenie zależne od liczby przepracowanych godzin (również zależy od konstrukcji umowy)

Umowa o pracę

  • zalety
    • stabilizacja związana z comięsięcznym przypływem środków finansowych
    • ochrona pracownika związana z postanowieniami kodeksu pracy (okres wypowiedzenia, płatny urlop, wynagrodzenie w przypadku choroby)
    • od składek ZUS nie płacimy podatku
  • wady
    • bardzo duże kwoty, które niepotrzebnie uciekają do ZUS
    • urlopy i dni wolne należy konsultować z pracodawcą
    • niezmienne godziny pracy

Porównanie

A teraz małe porównanie jak to wygląda z punktu widzenia pracodawcy i pracownika jeśli chodzi o wynagrodzenie. Załóżmy zarobki 4000 PLN netto (tj. ‘na rękę’). Zakładamy również że zarówno w przypadku umowy o prace jak i faktury pracujemy 1832 godziny w roku (tj, 2024 nomatywnego czasu pracy minus średni urlop 24 dni). Umowa o pracę urlop przewiduje, umowa pomiędzy firmami przeważnie nie – nalezy wziąć to pod uwagę.

Umowa o pracę – koszty dla pracodawcy

Zakładam ubezpieczenie na fundusz wypdakowy dla firmy zatrudniającej <10 osoó (= 1,80%) i zwykłe koszty uzyskania przychodu oraz odliczam kwotę wolną od podatku.

Wynagr.
brutto
Składki ZUS NFZ Koszty uzyskania przych. Zaliczka
na PIT
Do wypłaty Koszt Pracodawcy
ZUS Suma
5 645,00 773,93 438,40 111,25 433 3 999,67 1 050,54 6 695,53

Łączny koszt dla pracodawcy to 6695,53 zł miesięcznie. To ok.  6695 zł miesięcznie * 12 miesięcy / 1832 przepracowane godziny = 43,85 zł za godzinę.

Faktura VAT – koszty dla pracodawcy i pracownika

Czytaj dalej »

Problemy z Symfony

Jeszze trochę o Symfony, tym razem o problemach jakie ostatnio napotkałem.

1. UTF-8 a BOM i nie BOM

Autorzy Symfony polecają kodowanie wszystkich plików .php w UTF-8. Ja również gorąco polecam UTF-8 ale trzeba uważać na BOM. Sposoby kodowania plików w UTF-8 są dwa. Z BOM i bez BOM (zobacz np. Notepad++). Ten pierwszy dodaje na początek pliku kilka znaków informujących o sposobie kodowania.  Niestety te dodatkowe kilka bajtów bardzo przeszkadza Symfony. Każdy plik php ładowany przez Symfony automatycznie (np. pliki z klasami, projectConfiguration.class.php) powoduje wysłanie do bufora wyjściowego tych właśnie znaków. Przeszkadza to zarówno przy wysyłaniu plików binarnych (np. w przykładzie poniżej) jak i przeszkadza również generatorowi admin’a, PHP zgłasza błąd typu “Parse error”.

Niedoposzczalne jest również stosowanie BOM dla plików .yml, parser Yaml z takimi plikami po prostu  sobie nie radzi.

2. Wysyłanie pliku

Sprawa wydaję się być oczywista, wystarczy zagooglować i znaleźć można kilka przykładów dobrego kodu jak w kontrolerze wytawić plik do przeglądarki. Z jakiś tajemniczych powodów u mnie żaden z wyszukanych snippetów nie zadziałał. Symfony uparcie wysyłało po raz kolejny nagłówki chociaż rezultat działania akcji był sfView::NONE.

Kod teoretycznie poprawny:

private function sendFile($filename, $name = null)
{
  $this->setLayout(false);
  sfConfig::set('sf_web_debug', false);
  $this->getResponse()->clearHttpHeaders();
  $this->getResponse()->setHeaderOnly(true);
  $this->getResponse()->setHttpHeader('Pragma: no-cache', true);
  $this->getResponse()->setContentType('application/octet-stream');
  $this->getResponse()->sendHttpHeaders();
  readfile($filename);
  return sfView::NONE;
}

Kod który zadziałał u mnie:

public function sendFile($filename, $name = null)
{
  $this->setLayout(false);
  sfConfig::set('sf_web_debug', false);
  ob_end_clean();
  //coś inicjuje wysylanie bufora
  //dodaje to niepotrzebne znaki na początku pliku
  header('Content-type: application/octet-stream', true);
  if ($name)
    header('Content-Disposition: attachment; filename="'.$name.'"');
  header('Pragma: no-cache', true);
  readfile($filename);
  die();
  //nic więcej nie potrzebuje
  //nie chcę pononwego wysyłania nagłówków HTTP
}

Niezbyt elegancko ale skutecznie.

3. sfContext a linia poleceń Symfony

Jeśli podczas wykonywania zadań z linii komend Symfony zdarzy się Wam błąd typu

Default context does not exist

oznacza to że wasz kod lub plugin który używacie używa:

sfContext::getInstance()

W trybie linii komend nie ma użytkownika i nie ma kontekstu. Szczególna pułapka tkwi w zainstalowanych pluginach, gdzie użyty jest powyższy kod w np. w metodzie configure(). Jeśli niezbędne jest użycie sfContext::getInstance() wówczas polecam:

    if(sfContext::hasInstance())
      $context=sfContext::getInstance();
    else
      //zrob cos innego

VED – wizualny edytor HTML

Dziś trochę zabawy. Przedstawiam VEDa. Projekt który jest wersją innego mojego większego projektu. Napisany spontanicznie i dla czystej satysfakcji :)

Oto VED.

Jak go używać:

  1. Przeciągnij i upuść kontener z prawego panelu na środkowy
  2. Prawym klawiszem myszy klknij właśnie upuszczony kontener
  3. Wybierz Edit i edytuj zawartość kontenera.
  4. Przeciągaj i edytuj kolejne kontenery.
  5. Ustawiaj na stronie i zmieniaj rozmiary kontenerów
  6. Finał: Naciśnij Preview. VED wygeneruje stronę w HTML :o
  7. Have fun !

Oczywiście sam edytor jest jeszcze we wczesnej fazie alfa (i nie wiem czy z niej wyjdzie ;) ), dużo funkcji brakuje lub nie działa chociażby kontenery css i js, przydałoby się więcej komponentów w zakładce Library itp.

Dla zainteresowanych: po stronie serwera jest php, korzystam również z bibliotek javascript: mootools, fckeditor, ext, wz_jsgraphics, draw2d.

Symfony plugins – automatyczne tworzenie paczki PEAR

Wstęp

Wpis nie będzie o tym jak napisać plugin do Symfony ale jak zrobić z już napisanego pluginu, prawie autamtycznie, paczkę PEAR, która wymagana jest przy dodawaniu pluginu do repozytorium pluginow na www.symfony-project.org. Instrukcje dotyczą systemu Windows.

Przygotowania

Po pierwsze, załóż konto na stronie Symfony. Po drugie zainstaluj  PHP.

Instalacja PEAR i PFM

W wersji PHP (skompilowanego) dla Windows trzeba zainstalować biblioteki PEAR. Przejdź do katalogu gdzie zainstalowany jest PHP i wykonaj polecenie:

go-pear.bat

Następnie trzeba uaktualnić biblioteki do najnowszej wersji (alpha):

pear channel -update pear.php.net
pear upgrade PEAR

Teraz potrzebujemy narzędzia do generowania plików z definicją dla PEAR:

pear install PEAR_PackageFileManager_Cli-0.3.0

W trakcie instalacji mogą wystąpić błęd typu: Failed to download NAZWA_BIBLIOTEKI within preffered state stable, latest realease is ……, use “channel://pear.php.net/NAZWA_BIBLIOTEKI”. Wówczas każdą taką bibliotekę, która jeszcze nie jest w fazie “stable”, instaluj ręcznie za pomocą polecenia:

pear install channel://pear.php.net/NAZWA_BIBLIOTEKI

Po prawidłowej instalacji PFM  w katalogu PHP winien być widoczny plik “pfm”. Jest to plik php, warto stworzyć dla niego plik uruchamiający pfm.bat:

"C:\Program Files\PHP5\php.exe" -f "C:\Program Files\PHP5\pfm"

Teraz uruchomienie PFM będzie odbywało się za pomocą jednego polcenia w linii komend: pfm

W miarę automatyczne tworzenie paczki

Dodaj kanał Symfony do PEAR:

pear channel-add http://pear.symfony-project.com/channel.xml

Przejdź teraz do katalogu gdzie przygotowany jest plugin. Nie zapomnij o plikach README i LICENSE, które winny znaleźć się w korzeniu. Przykładowa strukutra powinna wyglądać tak:

2009-07-20  13:44    <DIR>          .
2009-07-20  13:44    <DIR>          ..
2009-06-18  19:42    <DIR>          config
2009-06-18  19:42    <DIR>          lib
2009-06-18  19:42    <DIR>          web
2009-07-16  11:31             1˙081 LICENSE
2009-07-20  11:59             1˙707 README

Plik README  musi być w formacie Markdown. Polecam skorzystanie z narzędziaa “Dingus“, które konwertuje format markdown do html. Więcej o formacie markdown tutaj.

Czytaj dalej »

Sztuczki w Symfony

Dzisiaj garść sztuczek, które wykorzystuje w mojej codziennej pracy z Symfony. Może okażą się komuś pomocne:

Pobierz wartość z konfiguracji

$wartosc = sfConfig::get("app_sekcja_zmienna");

Pobiera wartość z pliku /apps/current_appname/configs/app.yml, który winien wyglądać tak:

all:
  sekcja:
    zmienna: wartość

Istnieje możliwość dalszego zagłębiania sekcji, np.

all:
  sekcja:
    podsekcja:
      zmienna: wartość

Ale wówczas należy skorzystać:

$temp = sfConfig::get("app_sekcja_podsekcja);
$wartosc = $temp["zmienna"];

Logowanie do debuggera Symfony

W Symfony można logować dowolną wartość, która później wyświetla się w pasku debuggera -> logs. W kontrolerze można skorzystać z:

$this->logMessage("Twój debug");

W innym miejscu, np. w modelu można skorzystać z:

sfContext::getInstance()->getLogger()->log("Twój debug");

Stosowanie globalnych części szablonu (partials)

Normalnie używam

<?php include_partial('errors', array('form' => $form)) ?>

Wówczas Symfony szuka części w apps/current_app/modules/current_module/templates/_errors.php

Jeśli chcemy wskazać konkretny moduł:

<?php include_partial(nazwa_modulu/errors',
      array('form' => $form)) ?>

Wówczas Symfony szuka części w apps/current_app/modules/nazwa_modulu/templates/_errors.php

Gdy użyjemy:

<?php include_partial('global/errors', array('form' => $form)) ?>

Wówczas Symfony będzie szukało części w apps/current_app/templates/_errors.php. Wniosek nasuwa się sam, nie nalezy używać nazwy ‘global’ jako nazwy modułu :)

Wyświetlenie dowolnej zawartości

echo sfYamlInline::dump($dowolna_zmienna);

$dowolna_zmienna może być naprawdę dowolną zmienną, również obiektem i tablicą. Zmienna zostanie tak sformatowana aby była czytelna dla człowieka.

I18n

Przy wielojęzycznej stronie w szablonach korzystamy z

<?php echo __("Polski string") ; ?>

Po stronie kontrolera lub modelu:

 sfContext::getInstance()->getI18N()->__('Polski string');

Przydaje się szczególnie do określania etykiet dla formularzy po stronie modelu.

Symfony dla projektantów stron

Pierwszy wpis o tym jak programista Symfony chciałby współpracować z projektantem stron WWW. Zakładam, że jestem programistą Symfony i stworzyłem jedną aplikację o nazwie frontend przy pomocy Symfony i Doctrine. Wygląd aplikacji jest bardzo siermiężny a poniższa wiedza to to co próbuje przekazać projektantowi stron aby, już bez mojej pomocy, mógł samodzielnie zmodyfikować szablony wpływające na wygląd strony.

Struktura MVC

Symfony jest frameworkiem MVC. Model – View – Controller. Dla projektanta stron najistotniejsza jest oczywiście warstwa View, przy czym Symfony korzysta z systemu szablonów. Dla potrzeb szablonów ważne jest aby poznać wszystkie dostępne ścieżki (routes) które może realizować kontroler. Plik z definicjami ścieżek znajduje się w /apps/frontend/config/routing.yml a definicja jednej ścieżki w tym pliku wygląda:

obiekt_show:
      url:     /obiekt/pokaz/:slug
      param:   { module: obiekt,  action: pokaz }

Plik może mieć dowolną liczbę takich ścieżek. Kontroler otrzymuje  żądanie od użytkownika porównuje go do _url_ i jeśli pasuje, wywołuje odpowiedni _action_ (tutaj ‘pokaz’) w odpowiednim _module_ (tutaj ‘obiekt’). Dwukropek przed nazwą członu w _url_ oznacza zmienną, dlatego _url_ może wyglądać tak:

    /obiekt/pokaz/zielony-obiekt

lub tak:

    /obiekt/pokaz/zupelnie-inny-czerwony

_obiekt_show_ to nazwa ścieżki używana później do generowania url’i za pomocą url_for (patrz niżej).

Struktura szablonów

Filozofia Symfony odnośnie szablonów polega na wykorzystaniu zwykłych plików .php. Instrukcje wykorzystywane w szablonach to tagi php i są ograniczone do zestawu podobnego jaki używa się w innych systemach szablonów (np. Smarty).

Przyjmuje, że mamy tylko jedną aplikację i programista nazwał ją frontend. Każdy szablon dla konkretnego modułu znajduje się w katalogu /apps/frontend/nazwa_modulu/templates, szablony globalne znajdują się w katalogu /apps/frontend/templates

Do wyświetlenia wyniku działania akcji z przykładu powyżej kontroler używa szablonu zapisanego w pliku /apps/frontend/modules/obiekt/templates/pokazSuccess.php. “Dokleja” końcówkę `Success.php` do nazwy akcji. Każdy szablon jest natomiast ‘dekorowany’ layout’em znajdującym się w /apps/frontend/templates/layout.php.

Tworzenie szablonów

Czytaj dalej »