Jeszcze jeden blog o PHP

Radosne twórczości leniwego programisty PHP

Drupal 6 i najnowsza wersja jQuery

Skomentuj »

Od kilku już projektów w Drupalu spotykałem się z problemem przy wykorzystaniu najaktualniejszej wersji jQuery. Drupal w wersji 6 wykorzystuje jQuery w wersji 1.2.6. Instalacja modułu jquery_update trochę poprawia tą sytuację jednak nadal pozostajemy z wersją 1.3.2. W chwili pisania tego tekstu najnowszą wersją jQuery jest 1.7.1, więc jak widać sporo rzeczy mogło ulec zmianie. Korzystając z najnowszej wersji jQuery mamy w dodatku pewność, że znalezione błędy zostały poprawione (i ewentualnie, powstały nowe), kod został przepisany by działać szybciej, zwiększył się asortyment funkcji.

/*! jQuery v1.7.1 jquery.com | jquery.org/license */
// źródło najaktualniejszej wersji jQuery

$$ = jQuery.noConflict();

console.log('o1. ', $.fn.jquery);
// o1. 1.2.6
// LUB
// o1. 1.3.2

(function($) {
// W tej przestrzeni znajdzie się nasz kod
console.log('o2. ', $.fn.jquery);
   // o2. 1.7.1
})($$);

Co się tutaj dzieje?

Poprzez funkcję jQuery.noConflict() obiektu jQuery utworzymy referencję $$, która będzie przechowywała nowy obiekt biblioteki jQuery (1.7.1 w tym wypadku). Zmienna $$ będzie dostępna w zasięgu globalnym (window), a my będziemy posiadać zmienne $$ (wersja  1.7.1) oraz $ (wersja 1.2.6/1.3.2).

Tworzymy następnie kolejny zasięg poprzez wywołanie kolejnej funkcji anonimowej, do której przekazujemy wcześniej utworzony obiekt jQuery 1.7.1. Drugie wywołanie funkcji anonimowej moglibyśmy pominąć i odwoływać się w naszym kodzie do jQuery wykorzystując zmienną $$, ale osobiście uważam to za mało wygodne.

Written by filipgorczynski

2012.02.20 at 20:47:31

Brak ikon na podstronach serwera Apache po instalacji środowiska WAMP

Skomentuj »

Instalacja środowiska WAMP to dopiero początek. Z czasem przychodzi potrzeba konfigurowania i poprawiania jego sposobu działania. Jednym z problemów na które natrafiłem jest brak wyświetlania ikonek na podstronach serwera Apache podczas przeglądania struktury katalogów. W miejsce katalogów pojawiał się np. napis [DIR]. Same ikonki znaleźć możemy w katalogu serwera Apache, w moim przypadku jest to C:\wamp\bin\apache\Apache2.2.17. Oczywiście chodzi o katalog icons. Aby wyświetlać ikonki poprawnie – lub ewentualnie podmienić ikonki na własne – musimy poprawić ścieżkę do katalogu z ikonkami.

Plik z odpowiednią konfiguracją znajdziemy w C:\wamp\bin\apache\Apache2.2.17\conf\extra. Interesuje nas plik httpd-autoindex.conf.

Alias /icons/ "C:/wamp/bin/apache/Apache2.2.17/icons/"

<Directory "C:/wamp/bin/apache/Apache2.2.17/icons">
   Options Indexes MultiViews
   AllowOverride None
   Order allow,deny
   Allow from all
</Directory>

Jedyną czynnością jaką musimy wykonać jest określenie w obu miejscach prawidłowych ścieżek do naszego katalogu z ikonkami oraz restart serwera.

Written by filipgorczynski

2012.02.12 at 19:36:43

Wolno działający panel admina Drupal 6

Skomentuj »

Od pewnego czasu katowałem się bardzo wolno działającym panelem administracyjnym Drupala w przeglądarce Firefox nawet przy czystej instalacji. Dzięki pomocy  znajomego okazało się, że problemem jest ustawienie na podstronie konfiguracji odpowiedniej wartości dla zmiennej.
W Firefoxie w pasku adresu wpisujemy

about:config

Potwierdzamy, że zgadzamy się z warunkami.
Na otwartej podstronie wyszukujemy:

network.dns.disableIPv6

i zmieniamy ją na TRUE.
Dodatkowo, spotkałem się także z zaleceniami wykomentowania (znak #) linijki

::1 localhost

w pliku

c:\Windows\System32\drivers\etc\hosts

Panel administracyjny powinien znacznie przyspieszyć.

Written by filipgorczynski

2012.01.29 at 13:50:19

Błąd podczas testów – PHP Fatal error: Call to a member function toString() on a non-object in ./PEAR/PHPUnit/Extensions/SeleniumTestCase.php on line 1041

Skomentuj »

H:\htdocs\demo\protected\tests>phpunit functional/SiteTest.php

PHPUnit 3.6.3 by Sebastian Bergmann.

Configuration read from H:\htdocs\demo\protected\tests\phpunit.xml

.PHP Fatal error: Call to a member function toString() on a non-object in C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php on line 1041
PHP Stack trace:
PHP 1. {main}() C:\wamp\bin\php\php5.3.4\phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() C:\wamp\bin\php\php5.3.4\phpunit:44
PHP 3. PHPUnit_TextUI_Command->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:125
PHP 4. PHPUnit_TextUI_TestRunner->doRun() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:187
PHP 5. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\TestRunner.php:325
PHP 6. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:705
PHP 7. PHPUnit_Framework_TestSuite->runTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:745
PHP 8. PHPUnit_Extensions_SeleniumTestCase->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:772
PHP 9. PHPUnit_Framework_TestResult->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:527
PHP 10. PHPUnit_Framework_TestCase->runBare() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestResult.php:649
PHP 11. PHPUnit_Extensions_SeleniumTestCase->onNotSuccessfulTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestCase.php:888

Fatal error: Call to a member function toString() on a non-object in C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php on line 1041

Call Stack:
 0.0009 633648 1. {main}() C:\wamp\bin\php\php5.3.4\phpunit:0
 0.1198 1189176 2. PHPUnit_TextUI_Command::main() C:\wamp\bin\php\php5.3.4\phpunit:44
 0.1199 1189760 3. PHPUnit_TextUI_Command->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:125
 1.2804 7611776 4. PHPUnit_TextUI_TestRunner->doRun() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:187
 1.3653 8098120 5. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\TestRunner.php:325
 1.3654 8098680 6. PHPUnit_Framework_TestSuite->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:705
 12.7230 8521360 7. PHPUnit_Framework_TestSuite->runTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:745
 12.7230 8521360 8. PHPUnit_Extensions_SeleniumTestCase->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:772
 12.7230 8521408 9. PHPUnit_Framework_TestResult->run() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:527
 12.7230 8522416 10. PHPUnit_Framework_TestCase->runBare() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestResult.php:649
 22.3495 8661592 11. PHPUnit_Extensions_SeleniumTestCase->onNotSuccessfulTest() C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestCase.php:888

W pliku C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php linijkę 1041 zmieniamy z:

$message = $e->getComparisonFailure()->toString();

na

$message = $e->getComparisonFailure()->exceptionToString;

Powinno zadziałać:
</pre>
H:\htdocs\demo\protected\tests>phpunit functional/Sitetest.php
PHPUnit 3.6.3 by Sebastian Bergmann.

Configuration read from H:\htdocs\demo\protected\tests\phpunit.xml

..E

Time: 37 seconds, Memory: 8.50Mb

There was 1 error:

1) SiteTest::testLoginLogout
Trying to get property of non-object

C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:1042
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestCase.php:888
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestResult.php:649
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Extensions\SeleniumTestCase.php:527
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:772
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:745
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\Framework\TestSuite.php:705
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\TestRunner.php:325
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:187
C:\wamp\bin\php\php5.3.4\PEAR\PHPUnit\TextUI\Command.php:125
C:\wamp\bin\php\php5.3.4\phpunit:44

FAILURES!
Tests: 3, Assertions: 6, Errors: 1.


Written by filipgorczynski

2012.01.07 at 11:46:30

Obsługa kodowania UTF-8 w edytorze gVim

Skomentuj »

Jednym z popularniejszych edytorów dla programistów jest gVim. Jednak sama jego instalacja nie wystarczy, by zapisywać pliki w kodowaniu UTF-8 bez znacznika BOM. Rozwiązanie zawdzięczam użytkownikowi devgreg ze strony devPytania.pl. Należy dodać poniższy kawałek kodu

 if has("multi_byte")
        if &termencoding == ""
            let &termencoding = &encoding
        endif
        set encoding=utf-8
        setglobal fileencoding=utf-8
        "setglobal bomb
        set fileencodings=ucs-bom,utf-8,latin1
   endif

do pliku c:\Program Files (x86)\Vim\_vimrc.

Źródło: http://devpytania.pl/questions/6708/gvim-i-poprawna-obsuga-utf-8

Written by filipgorczynski

2011.11.28 at 22:25:12

Napisane w Rozwiązania

Notepad++ i problem z literką ł

Skomentuj »

Natknąłem się na dziwną przypadłość Notepad++, której niestety nie udało się skonfigurować. Instalacja pluginu Zen Coding spowodowała brak możliwości wprowadzenia literki ł. Rozwiązaniem niestety okazało się usunięcie tego pluginu poprzez usunięcie z katalogu C:\Program Files (x86)\Notepad++\plugins  NppScripting.dll i katalogu NppScripting. Nie zauważyłem jeszcze ubocznych efektów po usunięciu tego rozszerzenia.

Wysłanie maila do autorów poskutkowało poniższą odpowiedzią:

1. Otwórz plik %Notepad++%\plugins\NppScripting\includes\Zen Coding.js
a. Jeśli plik nie istnieje użyj %Notepad++%\plugins\NppScripting\start.js
2. Znajdź następujący tekst “addMenuItem(‘Klucz’, ‘wartość’, ‘Ctrl+Alt+L’);”  // linijka 8003
3. Dokonaj odpowiednich zmian i zapisz

Written by filipgorczynski

2011.11.26 at 20:34:32

Zwracanie wartości z funkcji w postaci obiektu

Skomentuj »

PHP
class ErrorReporting {
    const INFO = 0;
    const WARNING = 1;
    const ERROR = 2;
    const SUCCESS = 4;

    private $_message = '';
    private $_class = '';
    private $_type;
    private $_value = null;

    /**
     *
     * @param ErrorReportingType $type
     * @param mixed $value
     * @param String $message
     */
    public function __construct($type, $value, $message = '') {
        $this->_type = $type;
        $this->_value = $value;
        $this->_message = $message;
        switch($this->_type) {
            case ErrorReporting::ERROR:
                $this->_class = 'error';
                break;
            case ErrorReporting::WARNING:
                $this->_class = 'warning';
                break;
            case ErrorReporting::INFO:
                $this->_class = 'info';
                break;
            case ErrorReporting::SUCCESS:
                $this->_class = 'success';
                break;
        }
    }

    /**
     *
     * @param String $key
     * @return mixed
     */
    public function __get($key) {
        switch($key) {
            case 'Message':
                return $this->_message;
                break;
            case 'Class':
                return $this->_class;
                break;
            case 'Type':
                return $this->_type;
                break;
            case 'Value':
                return $this->_value;
                break;
        }
    }

    /**
     *
     * @param String $key
     * @param mixed $value
     * @return mixed
     */
    public function __set($key, $value) {
        switch($key) {
            case 'Message':
                return $this->_message = $value;
                break;
            case 'Class':
                return $this->_class = $value;
                break;
            case 'Type':
                return $this->_type = $value;
                break;
            case 'Value':
                return $this->_value = $value;
                break;
        }
    }

    public function __toString() {
        return '<div class="'.$this->_class.'">'.$this->_message.'</div>';
    }
}

CSS

.success {background-image: url(../images/accept.png); background-color: #dff2bf; color:#4f8a10}
.error, .error_message {background-image: url(../images/exclamation.png); background-color: #ffbaba; color:#d8000c}
.info {background-image: url(../images/information.png); background-color:#bde5f8; color:#00529b}
.warning {background-image: url(../images/error.png); background-color:#feefb3; color:#9f6000}
.info,
.success,
.warning,
.error,
.validation,
.error_message {border: 1px solid; margin: 10px auto; padding: 4px 10px 4px 35px; background-repeat: no-repeat; background-position: 10px 6px}
.success ul,
.error ul,
.warning ul,
.info ul {list-style: disc}
.success li,
.error li,
.warning li,
.info li {margin-left: 20px}

Ikonki, których użycie warto rozważyć to np.: famfamfam.com lub Knob icon set.

ErrorReporting

Cała paczka gotowa do pobrania: ErrorReporting

Written by filipgorczynski

2011.11.14 at 22:05:29

Python i błąd R6034: An application has made an attempt to load the C runtime library incorrectly

Skomentuj »

Od kilku dni próba uruchomienia jakiegokolwiek modułu Pythona pobranego z sieci kończyła się poniższym komunikatem:

R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application's support team for more information.

Ciężko cokolwiek konkretnego na ten temat znaleźć w sieci, jednak warto spróbować poniższego rozwiązania. Trudno określić, co może być konkretną przyczyną takiego stanu rzeczy – problem pojawiał się praktycznie w każdym module – dlatego przedstawię wszystko co zrobiłem w kierunku poprawienia tego dziwnego zachowania.

  1. Usunięcie ze zmiennej systemowej PATH wszystkich nawiązań do innych wersji Pythona
  2. Instalacja MinGW oraz dodanie ścieżki do zmiennej systemowej PATH
  3. Dodanie zmiennej PYTHONPATH do zmiennych użytkownika
  4. Dodanie ścieżki do Pythona do zmiennej systemowej PATH

Opis dotyczy Windows 7 oraz Pythona w wersji 2.7.2 dla systemów 32 bitowych – istniał częsty problem z dostępnością modułów 64 bitowych.

1. Usunięcie ze zmiennej systemowej PATH wszystkich nawiązań do innych wersji Pythona
Na początku proponuję wyrzucić ze zmiennej PATH wszystkie odwołania do innych wersji Pythona. Może to być cokolwiek, np.: Panda3D czy Blender – dostarczany jest z nimi ich Python, co może powodować konflikty. Tymczasowo wszystkie odwołania wyrzucamy, w razie potrzeby jeśli wszystko przejdzie pomyślnie, będziemy mogli przywrócić dodatkowe wpisy w zmiennej PATH. Modyfikację zmiennych systemowych dokonać możemy w poniższy sposób:
Wciskamy jednocześnie WIN+Pause/Break aby otworzyć informacje o Systemie Windows. W otwartym oknie wybieramy “Zaawansowane ustawienia systemu”, zakładka “Zaawansowane” i przycisk “Zmienne środowiskowe”.

2. Instalacja MinGW oraz dodanie ścieżki do zmiennej systemowej PATH.
Ze strony SourceForge.net pobieramy mingw-get-inst.exe który zatroszczy się o pobranie odpowiednich komponentów i całą instalację. Zakładam, że zostanie zainstalowany w C:\MinGW. Do zmiennej systemowej PATH dodajemy na samym początku ścieżkę do instalacji MinGW (C:\MinGW\bin).

3. Dodanie zmiennej PYTHONPATH do zmiennych systemowych.
Okno edycji zmiennych wywołujemy jak w punkcie 1. W otwartym oknie w sekcji “Zmienne użytkownika dla [nazwa użytkownika]” jeśli nie istnieje, dodajemy nową zmienną PYTHONPATH i nadajemy jej wartość w postaci ścieżki instalacji Pythona – dla mnie jest to C:\Python27\.

4. Dodanie ścieżki do Pythona do zmiennej systemowej PATH.
Wszystko wykonujemy jak powyżej, jednak tym razem modyfikacja dotyczy zmiennej PATH/Path w sekcji “Zmienne systemowe”. Dodajemy ścieżkę do naszej instalacji Pythona do tej zmiennej – najlepiej zaraz za ścieżką do MinGW.

Proszę o informację, czy pomogło w Waszym przypadku.

Arduino Uno – kolejny kawałek krzemu w domu

z 4 uwagami

Arduino Nie wiem czemu, ale od zawsze czułem pociąg do wszelkiej maści krzemowych wynalazków, płytek, układów scalonych. Niewiele z tego rozumiałem – i nic się w tej materii nie zmieniło – ale pociąg pozostał. Krążąc swego czasu po sieci natknąłem się na płytkę Arduino, jej prostoście oraz możliwości jej programowania w języku C-podobnym. Szczególnie urzekła mnie ta prostota, która oferuje łagodne wprowadzenie w świat elektroniki. W związku z wieloma nieudanymi próbami poznania chociaż minimalnie środowiska sprzętowego postanowiłem spróbować raz jeszcze. Im więcej czytałem nt. Arduino tym bardziej chciałem to posiadać (to chyba coś jak z kobiecymi butami i torebkami). Wreszcie zamówiłem Starter Kit. Po sumiennej instalacji wszystkich sterowników i pobraniu Arduino IDE oraz przejściu na spokojnie przez wszystkie kroki, samą płytkę udało mi się uruchomić i odpalić na niej prosty programik, który migał diodką dołączoną czerwoną diodką. Oprócz tego nie udały się wszystkie próby złożenia czegoś PROSTEGO na płytce prototypowej: poparzyłem się baterią 9V, która też poraziła mnie prądem (słabo, ale dało się odczuć) oraz uszkodziłem wcześniej wspomnianą czerwoną diodę LED.
Płytka znajduje się w niewielkim pudełeczku, jak poniżej (z niewielkim gratisem):
Arduino BOX
A sama płytka wygląda tak:
Arduino board
Wracam do nauki podstaw elektroniki.

Strona projektu: arduino.cc
Dystrybutor w Polsce: nettigo.pl
Kilka ciekawych projektów opartych o Arduino: Top 40 projektów

Written by filipgorczynski

2011.06.24 at 09:50:15

Dodawanie obiektu SimpleXmlElement jako dziecka do innego obiektu SimpleXmlElement

Skomentuj »

Application - XML Podczas budowania struktury XML z wykorzystaniem SimpleXmlElement dla jachcenawakacje.pl natknąłem się na problem dodawania do obiektu typu SimpleXmlElement jako dziecka innego obiektu SimpleXmlElement – wyciętego z innej struktury XML. Problem jest o tyle dziwny, że metoda SimpleXmlElement::addChild() przyjmuje jako wartość tylko i wyłącznie łańcuch znaków. W związku z dość sporą ilością kodu, jaki trzeba by napisać, aby przenieść jedną strukturę XML do innej takie rozwiązanie nie wchodziło w grę. Z pomocą przyszedł kod udostępniony przez członka społeczności Stackoverflow.

<?php
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><element></element>');
$request = $xml->addChild('request');
$request->addChild('type', 'test');
$sxe = simplexml_load_string('<sxe></sxe>');
$inner1 = $sxe->addChild("inner1");
$inner2 = $inner1->addChild("inner2");
$inner3 = $inner2->addChild("inner3");
$toDom = dom_import_simplexml($xml);
$fromDom = dom_import_simplexml($sxe);
$toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
header('Content-type: application/xml; charset=utf-8');
echo $xml->asXML();

Oczywiście najważniejsze są tutaj linie 9-11, które to realizują całe zadanie kopiowania struktury pomiędzy XML.
Efekt poniżej:

<?xml version="1.0" encoding="UTF-8"?>
<element>
    <request>
        <type>test</type>
    </request>
    <sxe>
        <inner1>
            <inner2>
                <inner3/>
            </inner2>
        </inner1>
    </sxe>
</element>

Link do oryginału: http://stackoverflow.com/questions/4778865/php-simplexml-addchild-with-another-simplexmlelement/4778964#4778964

Written by filipgorczynski

2011.06.15 at 11:06:42

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.