Jeszcze jeden blog o programowaniu

Radosne twórczości leniwego programisty

Archive for the ‘Drupal’ Category

Odtwarzanie tabeli InnoDB

leave a comment »

MySQL logoW kilku projektach zdarzyło mi się z bliżej nieokreślonych powodów podczas próby czyszczenia cache w Drupalu wystąpienie błędu MySQL w postaci:

mysql> show tables;
+--------------------------------------+
| Tables_in_drupal7demo                |
+--------------------------------------+
| ...                                  |
| cache_apachesolr                     |
| ...                                  |
+--------------------------------------+
108 rows in set (0.00 sec)
mysql> TRUNCATE `cache_apachesolr`;
ERROR 1146 (42S02): Table 'drupal7demo.cache_solr' doesn't exist

Mogło to być spowodowane wykonaniem polecenia TRUNCATE `cache_apachesolr` i sposobem w jaki w rzeczywistości wykonywane jest polecenie TRUNCATE.

Jednym z najprostszych rozwiązań jakie udało mi się znaleźć jest odtworzenie struktury tabeli, a ponieważ praktycznie każda próba odczytu/zapisu z/do tabeli zwróci komunikat błędu (np.: ERROR 1030 (HY000): Got error -1 from storage engine) musimy dodać jeszcze jedno polecenie w ostateczności wykonując poniższe polecenia:

ALTER TABLE `cache_apachesolr` DISCARD TABLESPACE;
DROP TABLE IF EXISTS `cache_apachesolr`;
CREATE TABLE `cache_apachesolr` (
`cid` varchar(255) NOT NULL DEFAULT '' COMMENT 'Primary Key: Unique cache ID.',
`data` longblob COMMENT 'A collection of data to cache.',
`expire` int(11) NOT NULL DEFAULT '0' COMMENT 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
`created` int(11) NOT NULL DEFAULT '0' COMMENT 'A Unix timestamp indicating when the cache entry was created.',
`serialized` smallint(6) NOT NULL DEFAULT '0' COMMENT 'A flag to indicate whether content is serialized (1) or not (0).',
PRIMARY KEY (`cid`),
KEY `expire` (`expire`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Cache table for apachesolr to store Luke data and...';

Potencjalne przyczyny problemu: http://dba.stackexchange.com/a/6269

Źródło rozwiązania: http://www.palominodb.com/blog/2011/11/02/how-recreate-innodb-table-after-tablespace-has-been-removed

Kilka innych pomysłów, które można wypróbować by odzyskać tabele: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file

Reklamy

Written by filipgorczynski

2014.01.11 at 06:04:13

Drupal 6 – Własny blok zmiany języka

leave a comment »

Domyślny blok „Przełączanie języków” nie posiada zbyt ciekawych możliwości formatowania. Często tego typu elementy opisuje się w HTML na liście, co później znacznie ułatwia dla tej struktury określanie kaskadowych arkuszy stylów. Poniżej  sposób na zastosowanie swojego bloku bazujący na module locale domyślnie dostarczanym z Drupalem:

<?php
/**
* Implements hook_block();
*/
function hook_block($op = 'list', $delta = 0, $edit = array()) {
  if ($op == 'list') {
    $blocks['custom_language_switcher'] = array(
      'info' => t('Custom Language Switcher'),
    );
  return $blocks;
} else if ($op == 'view') {
  switch ($delta) {
    case 'custom_language_switcher':
      if (variable_get('language_count', 1) > 1
        && variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE) != LANGUAGE_NEGOTIATION_NONE) {
        $path = drupal_is_front_page() ? '<front>' : $_GET['q'];
        $languages = language_list('enabled');
        $links = array();
        foreach ($languages[1] as $language)
          $links[$language->language] = array(
            'href' => $path,
            'title' => $language->native,
            'language' => $language,
            'attributes' => array('class' => 'language-link'),
          );
        drupal_alter('translation_link', $links, $path);

        $block = array(
          'subject' => t('Custom Language Switcher'),
          'content' => _custom_get_language_switcher($links)
        );
      }
      break;
    }
    return $block;
  }
}

function _custom_get_language_switcher($links = array()) {
  global $language;
  $html = '';
  if (count($links)) {
    $html = '<ul class="language-switcher">';
    foreach ($links as $key => $value) {
    $active = '';
      if ($key == $language->language)
        $active = ' class="active"';
      $html .= "\t\t" . '<li' . $active . '><a href="' . url($value['href'], array('language' => $value['language'])) . '"' . $active . '>' . $value['title'] . '</a></li>' . "\n";
    }
    $html .= "\t" . '</ul>' . "\n";
  }
  return $html;
}

Written by filipgorczynski

2012.10.12 at 18:56:26

Drupal 7 – instalacja w języku polskim

leave a comment »

System Drupal sprowadza proces instalacji do możliwie najprostszych kroków i instalacja w języku angielskim jest bardzo intuicyjna, jednak czasem może zaistnieć potrzeba wprowadzenia instalacji w języku ojczystym.

Podczas uruchomienia procesu instalacyjnego Drupala drugi krok prosi nas o wybranie języka instalacji.

Jeśli potrzebujemy innego języka niż angielski dostajemy link prowadzący do opisu jak zrealizować instalację we własnym języku (Learn how to install Drupal in other languages – Naucz się jak zainstalować Drupala w innych językach). Jeśli ktoś nie poradziłby sobie z instalacją Drupala w języku angielskim, to zapewne także niewiele zrozumie z tego opisu.

Zgodnie z tym opisem przechodzimy na stronę z tłumaczeniem projektu Drupal (http://localize.drupal.org/translate/downloads) i wyszukujemy interesujący nas język. W naszym przypadku pobieramy język Polski

a ponieważ instalujemy Drupala w wersji 7 pobieramy najaktualniejsze tłumaczenie – dla wersji 7.15.
Zgodnie z krokiem drugim poradnika pobrany plik musimy skopiować do katalogu w którym przechowujemy Drupala – dokładnie do katalogu /profiles/standard/translations/.

Ostatni krok to kliknięcie linka „Reload the language selection page after adding translations” lub najzwyklejsze odświeżenie strony co przeniesie nas do kroku drugiego naszej instalacji:

Wybieramy język Polski i cieszymy się instalacją w rodzimym języku.

Written by filipgorczynski

2012.09.08 at 21:22:46

Uruchamianie własnego kodu PHP w kontekście Drupala 7 + tworzenie node’ów

leave a comment »

Kilka dni temu pojawiła się potrzeba zaimportowania z przygotowanego pliku kilku wpisów do postaci node’ów. Oprócz oczywistego faktu wczytywania z pliku i modyfikacji treści należało uruchomić własny skrypt w sposób, który pozwalałby m.in. na korzystanie z modułów Drupala – stworzenie i zapisanie node’ów do bazy.

Samo uruchomienie własnego kodu PHP w kontekście Drupala 7 z dostępem do modułów wymaga poniższych linijek. Jak łatwo zauważyć, jest t kod żywcem skopiowany z pliku index.php z katalogu głównego Drupala.

<?php
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

Kolejnym wyzwaniem jest stworzenie obiektu node’a oraz zapisanie go do bazy Drupala.

$node = new stdClass();
$node->type = 'content_type'; // typ node'a jaki chcemy stworzyć (page, article, ...)
$node->title = $details['name'];
$node->language = LANGUAGE_NONE;
$node->field_country[LANGUAGE_NONE][0]['tid'] = $term->tid;
$node->field_city[LANGUAGE_NONE][0]['value'] = $_details['city'];
$node->field_street[LANGUAGE_NONE][0]['value'] = $details['street'];
$node->field_zip[LANGUAGE_NONE][0]['value'] = $details['zip'];
$node->field_website[LANGUAGE_NONE][0]['url'] = $details['www'];
$node->field_phone[LANGUAGE_NONE][0]['value'] = $details['phone'];
$node->field_email[LANGUAGE_NONE][0]['value'] = $details['email'];

node_object_prepare($node);
module_load_include('inc', 'pathauto');
$node->path['alias'] = preg_replace('/[^a-z0-9_]/i', '-', pathauto_cleanstring($title));
node_save($node);

Zasada jest dość prosta. Tworzymy prosty obiekt w PHP i nadajemy wszystkie wymagane wartości. Nazewnictwo pól w tworzonym obiekcie (np.: field_email)
musi być takie jak pól określanych przy tworzeniu danego typu treści.
Stała LANGUAGE_NONE jest określa dowolny język (wartość ‚und’) i zaleca się zawsze podawanie tej wartości – oczywiście stosownie zmieniając ją, jeśli node ma zostać dodany w określonym języku.
Funkcja node_object_prepare opakowuje obiekt w dodatkowe pola, które są wymagane do poprawnego zapisania node’a do bazy.
Wykorzystując module_load_include – będącą funkcją znajdującą się w jądrze Drupala wczytujemy wymagane moduły – zabezpieczając się przed dostępem do funkcji, których definicji jeszcze nie udało się załadować do pamięci. W naszym wypadku wczytujemy moduł Pathauto aby wygenerować alias dla naszego node’a – ładniej wyglądał będzie adres /nasz-nowy-node niż node/123.

Wykorzystane funkcje:
drupal_bootstrap
node_object_prepare
module_load_include
pathauto_cleanstring
node_save

Drupal 6 – Instalacja

2 Komentarze

W związku z tym, że od pewnego czasu próbuję nauczyć się Drupala na poziomie „początkujący” postaram się opisywać różne rozwiązania potencjalnych problemów, konfiguracje oraz opisy modułów. Wpis ten (mam nadzieję, że kolejne się także pojawią) dotyczy aktualnie stabilnej wersji 6.25 ze względu na ogromną ilość materiałów i  modułów dostępnych w sieci. Proszę o wyrozumiałość, gdyż sam jestem na etapie nauki i do kompletnego opanowania tego CMSa dużo mi jeszcze brakuje. Powstające wpisy nie są kompletnym opisem możliwości Drupala ani rozwiązań użytych przy budowie stron – mają być dla mnie jedynie materiałem do przypominania róznych zagadnień.

Pierwszym krokiem, jaki należy wykonać jest sprawdzenie wymagań jakie stawia nam Drupal. Dokładne informacje znajdują się na stronie http://drupal.org/requirements. W skrócie są to:

Miejsce na dysku 15 MB – zalecałbym więcej (moduły, skórki, dodatkowe pliki),
Serwer WWW:  Apache 1.3, Apache 2.x lub Microsoft IIS,
Serwer baz danych: MySQL 4.1 lub nowszy,
PHP 4.4.0 lub nowszy (5.2 zalecany) – warto także włączyć np.: APC

Jeśli spełniamy wymagania kroku pierwszego, to…

Drugi krok to pobranie aktualnej wersji Drupala ze strony projektu http://drupal.org/project/drupal. Adres ten używany jest także do określania lokalizacji modułów Drupala. Sam Drupal jak i jego moduły traktowane są w tym wypadku tak samo. Moduły dostępne są więc pod adresem http://drupal.org/project/NAZWA_MODUŁU. Pobrane archiwum instalacyjne Drupala należy rozpakować w katalogu głównym serwera lub odpowiednio do katalogu – w moim przypadku jest to katalog drupal_install (ścieżka c:/htdocs/drupal_install).

Tworzymy bazę danych (dowolny klient MySQL, np. phpMyAdmin), która zostanie wykorzystana przez Drupala – także nazwałem ją drupal_install. Jako metodę porównywania napisów utf8_general_ci.

Instalacja CMS rozpoczyna się od przejścia pod adres http://localhost/drupal_install, co zaowocuje pojawieniem się pierwszego ekranu, w którym będzie można wybrać język instalacji. Tutaj wybrałem język angielski jako domyślny. Wybranie innego języka do instalacji przedstawię w innym wpisie.

Drupal 6 - Instalacja: Ekran powitalny

Wybieramy więc opcję „Install Drupal in English”. Pojawia się kolejny ekran z nieprzyjemnym czerwonym komunikatem informującym o braku pliku z ustawieniami oraz przedstawia sposób jego utworzenia.

Drupal 6 - Instalacja: Plik z konfiguracją

Postępując zgodnie z zaleceniami przechodzimy do katalogu ./sites/default gdzie znajdziemy plik default.settings.php, który zaleca się skopiować pod nową nazwą settings.php oraz nadajemy mu prawa do zapisu przez serwer www (w Windowsie nie jest to wymagane). Następnie odświeżamy stronę lub klikamy w link na dole strony „try again” co przeniesie nas do ekranu konfiguracji bazy danych.

Drupal 6 - Instalacja: Konfiguracja bazy danych

Wypełniamy wymagane pola – w domyślnej instalacji MySQL wypełnić musimy tylko nazwę bazy danych (Database name) oraz nazwę użytkownika (Database username). Jeśli MySQL został wcześniej skonfigurowany, podajemy także odpowiednie hasło, ewentualnie port (jeśli inny niż domyślny 3306) oraz prefiks w tabeli, jeśli chcemy w jakiś sposób wyróżnić aktualną instalację Drupala lub jeśli wymaga tego środowisko. Jeśli wprowadzone informacje nie pozwolą połączyć się z bazą danych zostaniemy poproszeni o ich weryfikację.

W przedostatnim kroku określamy podstawową konfigurację strony – jej nazwę, główny adres e-mail oraz co najważniejsze nazwę i hasło głównego administratora. Jest to osoba o praktycznie nieograniczonej potędze w środowisku Drupala – użytkownik o ID = 1. Ze względów bezpieczeństwa warto określić dla niego skomplikowane hasło.
Jedną z bardzo przydatnych opcji – zalecanych do włączenia – jest Clean URLs. Pozwala ona wykorzystać możliwości mod_rewrite w serwerze Apache – co ostatecznie przekłada się na ładne adresy URL, np.: serwer.com/to-jest-nowa-strona zamiast serwer.com zamiast serwer.com/?q=node/1.

Drupal 6 - Instalacja: Konfiguracja strony

Dobrze jest także pozostawić zaznaczoną opcję Check for updates automatically ponieważ dzięki temu Drupal co jakiś czas będzie informował nas o pojawiających się aktualizacjach – zarówno w samym jądrze Drupala jak i w zainstalowanych modułach. Kliknięcie przycisku Save and continue spowoduje wyświetlenie paska postępu informującego o  tworzeniu struktury bazy danych oraz przebiegu instalacji.

Drupal 6 - Instalacja: Podsumowanie instalacji

Gdy pasek postępu osiągnie magiczne 100% otrzymamy podsumowanie instalacji oraz możliwość odwiedzenia strony świeżo zainstalowanej wersji Drupala. Automatycznie zostaniemy także zalogowani na konto administratora (które utworzyliśmy w kroku Configure site).

Drupal 6 - Instalacja: Koniec instalacji

Dobrym pomysłem jest także usunięcie kilku plików z katalogu głównego Drupala, m. in.: INSTALL.mysql.txt, INSTALL.pgsql.txt, install.php.

Powyższy proces instalacji opisany jest także (po angielsku) w pliku INSTALL.txt .

Written by filipgorczynski

2012.06.27 at 20:21:48

Drupal 6 i najnowsza wersja jQuery

leave a comment »

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

Wolno działający panel admina Drupal 6

leave a comment »

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

%d blogerów lubi to: