Szybka instalacja Drupala na Ubuntu

Opublikowano // Twój komentarz
Ten post jest krótką notatką o tym jak szybko i wygodnie tworzyć wirtualne hosty i instalować na nich Drupala ze zdefiniowanym zestawem modułów.

Na wstępie mała sugestia dla ambitnych webdeveloperów pracujących na Windows: Z doświadczeń moich i moich znajomych wynika jasno, że bardziej, niż pracować na czymś w rodzaju WAMP, opłaca się odpalić jakąkolwiek dystrybucję Linuxa na wirtualnej maszynie i przesyłać sobie pliki po przez Sambę. W przypadku Drupala jest genialne rozwiązanie w postaci projektu Quickstart - fork Ubuntu skonfigurowany specjalnie do pracy z Drupalem.

Ja przedstawię sposób jak uprościć sobie stawianie nowego deploya na zwykłym Ubuntu/Kubuntu. W tym celu napisałem sobie prosty skrypt basha który automatycznie tworzy vhosta, opcjonalnie tworzy bazę danych MySQL oraz pobiera rdzeń Drupala wraz z modułami, które najczęściej używam. Pozostaje tylko tradycyjnie dokończyć instalację strony w przeglądarce.

Wymagania:

Teraz wystarczy  tylko w konsoli przejść do katalogu ze skryptami i wpisać

sudo ./new-vhost.sh
sudo ./install-drupal.sh

Jeśli masz swój własny plik drush.make z listą modułów wystarczy zedytować  w skrypcie ścieżkę do tego pliku:
 
drush make https://raw.github.com/fadehelix/DrupalDevelopmentScripts/master/drush/default.make .

Drupal tips: Wyświetlanie pola date jako texfield (zamiast fieldset)

Opublikowano // Twój komentarz
Pole daty z modułu Date domyślnie jest renderowane jako fieldset. Niestety póki co, twórca modułu nie daje nam możliwości wyświetlania pola jako zwykły textfield w efekcie czego pole daty zawsze wyróżnia się w formularzu.
Jak narazie najprostszym rozwiązaniem problemu jest zainstalowanie patcha do modułu date:
cd <your_drupal_site>/sites/all/modules/date
mkdir patch
wget http://drupal.org/files/date_option_render_as_regular_field-1467712-60.patch patch
patch -p1  < patch/date_option_render_as_regular_field-1467712-60.patch



Po tej operacji w ustawieniach pola pojawi się sekcja Advanced settings w której możemy zaznaczyć, aby  pole było renderowane jako zwyły textfield.
Po więcej informacji proponuję zajrzeć na stronę : http://drupal.org/node/1467712

Edit:
Jest też drugie rozwiązanie będące bardziej "drupal friendly", które znalazłem na codekarate.com. Wystarczy mianowicie w pliku template.php nadpisać funkcję theme_date_combo: 


function MYTHEME_date_combo($variables) {
  return theme('form_element', $variables);
}
 
 
Szczegółowy opis na http://codekarate.com/blog/removing-fieldset-drupal-7-date-field

Czy warto przesiąść się z D7 na Presflow 7 ?

Opublikowano // Twój komentarz
Robiąc sobie research dotyczący wydajności Drupala 7 natknąłem się na projekt Pressflow - fork kropelki stworzony na potrzeby serwisów wymagających skalowalności i obsługi dużego ruchu.

Pierwsze, co zwróciło moją uwagę to duży przycisk z napisem "Download and Install Pressflow 6" Czyżby nie istniała wersja siódma ? Okazuje się, że istnieje i ma się dobrze, a dlaczego nie chwalą się tym na stronie głównej ? Za odpowiedź niech posłuży fragment faq:

If your project is built on Drupal 7 you might not need to use Pressflow at this time because the key enhancements from Pressflow 6 were added to Drupal 7.
 Tak więc Pressflow 7 będzie wart uwagi, gdy zostanie zamrożony kod D8.
 Additionally, as Drupal 8 matures, significant enhancements will likely be backported to Pressflow 7.

Profile 2 feat. hook_form_alter i #states

Opublikowano // Twój komentarz
Przypadek:
Masz formularz rejestracji użytkownika stworzony z poziomu modułu Profile2 w którym chcesz aby jakieś pole pojawiało się gdy np. wybrany checkbox zostanie zaznaczony.
Rozwiązaniem jest stworzenie własnego modułu z wykorzystaniem hook_form_alter i dodanie do wybranego pola atrybutu #states.

Problem:
Standardowo wystarczy podać samą nazwę pola które steruje widzialnością i wszystko gra. Jednak w przypadku Profile2 to nie zadziałało i nie mogłem pojąć dlaczego... .

Rozwiązanie:
Otóż okazało się, że wszystkiemu winna była źle podawana nazwa pola sterującego, która powinna wyglądać mniej więcej tak:
profile_nazwaprofilu[field_nazwapola][jezyk][parametr_value_pola]
a w praktyce najlepiej użyć Firebuga, zaznaczyć pole  i skopiować wartość jego atrybutu name :)

Oto przykładowy kod:


/**
 * Implements hook_form_alter().
 */
function testmodul_form_alter(&$form, &$form_state, $form_id) {
if($form_id == 'user_register_form') {
$form['profile_fadehelix']['field_inne_opcje']['#states'] = array(
'visible' => array(':input[name="profile_fadehelix[field_opcje][und][inne]"]' => array('checked' => TRUE)),
);
return $form;
}
}

* field_inne_opcje to pole tekstowe które ma się pojawić po zaznaczeniu checkboxa field_opcje[und][inne]

"Waga" modułów w Drupal 7

Opublikowano // Twój komentarz
Problem:
Potrzebujesz aby Twój  moduł wywoływał hook_form_alter jako ostatni - ma operować na formularzu już gotowym, przetworzonym przez wszystkie inne moduły.

Rozwiązaniem jest ustawienie kolejności wywołań danego hooka.
w D6 dało się to zrobić edytując bazę danych, co nie było zbyt elastycznym i eleganckim rozwiązaniem. Na szczęście w D7 stworzono hook_module_implements_alter który pozwala na kontrolę kolejności wywołań danego hooka przez określone przez programistę  moduły.
W najprostszej wersji wystarczy podać tylko nasz moduł i będzie on wtedy ustawiony na końcu kolejki.

Ponieważ sama dokumentacja hooka nie jest zbyt bogata polecam świetny tutorial na ten temat.

Rozwiązanie to działa w moim przypadku, gdzie musiałem wywołać hook_form_alter()  swojego modułu  po tym jak  Profile2 dodał swoje pola do formularza rejestracji użytkownika.


/**
* Implements hook_module_implements_alter()
*/
function alter_register_worker_module_implements_alter(&$implementations, $hook) {
  //Any change here requires Caches to be cleared.
//dpm($implementations);
  switch ($hook) {
    case 'form_alter':
      $m1 = $implementations['mojmodul'];
      unset($implementations['mojmodul']);

      $implementations['mojmodul'] = $m1;
      break;
  }
//dpm($implementations);
}



Jeśli odkomentujesz funkcje dpm() wyswietli się kolejność modułów - przed i po naszej implementacji.

Nieregularne, klikalne kształty w HTML i CSS - szybkie studium przypadku

Opublikowano // Twój komentarz
Mamy do wyboru trzy drogi:
W zasadzie każda jest dobra i  wszystko zależy od naszych nawyków i tego, jaki mamy cel.


1. Imagemap

Przykład:


Jest to pierwszy i najszybszy sposób jeśli mamy w miarę nieskomplikowane kształty. Technika ta polega na - jak sama nazwa wskazuje - na nakładaniu na obrazek (<img>) interaktywnych obszarów <area>.
Znacznik <area> przyjmuje do parametru shape  trzy opcje: rect, circle, lub poly. Najciekawszy jest ten ostatni, ponieważ pozwala na stworzenie dowolnego kształtu. Wymaga "jedynie" policzenia sobie współrzędnych  punktów, ale to przestaje być problemem, jeśli skorzystamy z generatora takiego, jak np http://www.maschek.hu/imagemap/imgmap, który przy okazji generuje nam cały kod html.

Zalety: Szybkość i prostota tworzenia klikalnych obszarów.

Wady: Przede wszystkim brak możliwości dodania efektu typu zmiana koloru do stanu mouseover (jest to osiągalne dopiero przy użyciu pluginu do jQuery o nazwie Maphighligts).



2. CSS Sprites
Technika bardzo popularna przy wykonywaniu menu stron. W skrócie polega ona na stworzeniu jednej dużej grafiki zawierającej wygląd wszystkich stanów obiektu i przesuwanie jej.
Polecam tutorial na CSS Tricks.
Zabawa z użyciem tej techniki do nieregualrnych kształtów polega na stworzeniu "obszaru klikalnego" (lubię posługiwać się nazwą hit area używaną w ActionScript) z większej ilości niewidocznych elementów osadzonych wewnątrz naszego obiektu. Gwoli uczciwości podejrzałem ten sposób analizując klikalną mapę Polski, do której twórcy mam wielki szacunek.
Na szybkości napisałem sobie narzędzie do generowania kodu CSS tychże małych elementów po narysowaniu sobie ich: https://github.com/fadehelix/IsCSSGenerator.

Zalety: Możliwość dowolnej modyfikacji wyglądu stanów.

Wady: W przypadku nieregularnych kształtów duża praco i czasochłonność.


3. RaphaelJS
Bilioteka http://raphaeljs.com/ działa na bazie elementu <canvas>. Szczerze mówiąc, w moim konkretnym przypadku, odsiałem to rozwiązanie na samym początku, ale lepiej przyjrzeć się tej bibliotece w wolnym czasie, ponieważ widać, że pozwala na bardzo dużo.

Drupal: Formularz z auto uzupełnianiem i dynamicznym dodawaniem pól

Opublikowano // Twój komentarz
Na potrzeby jednego z projektów stworzyłem sobie prosty moduł generujący formularz służący do składania zamówień na produkty. 
Formularz składa się z dodawanych poprzez AJAX pól tekstowych które mają  autouzupełnianie wpisywanych nazw produktów.
W konfiguracji podajemy kategorię (tymczasem tylko jedną, ponieważ tyle mi wystarczyło) z której są pobierane nazwy produktów oraz e-mail na który zamówienie ma być wysyłane.
Wypada też dodać sensowne komentarze w kodzie :)

Zapraszam do pobierania, zgłaszania krytycznych uwag, sugestii oraz do commitowania 
http://drupal.org/sandbox/fadehelix/1387290

Póki co moduł jest w fazie bardzo roboczej (rozwojowej) - nie stworzyłem jeszcze do niego testów oraz muszę w końcu wymyślić jak dodać w ustawieniach ścieżkę do formularza.
Za sugestie z góry dziękuję :)