Jeszcze jeden blog o PHP

Radosne twórczości leniwego programisty PHP

Komunikaty (flash messages) w Symfony2

leave a comment »

Symfony logoPrzykładowy sposób wykorzystania komunikatów w Symfony.
W kontrolerze:
$success = 'Komunikat informujący o powodzeniu wykonanej operacji.';
$this->get('session')->getFlashBag()->add('success', $success);
$error = 'Komunikat informujący o niepowodzeniu wykonanej operacji.';
$this->get('session')->getFlashBag()->add('error', $error);
$warning = 'Komunikat informujący o ostrzeżeniu podczas wykonywanej operacji.';
$this->get('session')->getFlashBag()->add('warning', $warning);
$notice = 'Komunikat informujący o wykonanej operacji.';
$this->get('session')->getFlashBag()->add('notice', $notice);

W szablonie (Twig)

{# twig template #}
{% for type, flashMessages in app.session.flashbag.all() %}
{% for flashMessage in flashMessages %}
      <div class="{{ type }}">{{ flashMessage }}</div>
   {% endfor %}
{% endfor %}

Written by Filip Górczyński

2014.09.17 at 20:45:46

Windows 7, Git, SSH agent – Could not open a connection to your authentication agent.

leave a comment »

GitPo zainstalowaniu Git, stworzeniu nowych kluczy prywatnego i publicznego oraz dodaniu ich do Bitbucketa, mimo wykonania polecenia:

git clone [url-repozytorium]

otrzymujemy komunikat:

Could not open a connection to your authentication agent.

W sieci znalazłem kilka propozycji rozwiązania problemu, ale większość działa jedynie na środowiskach nie Windowsowych i kończy się wykonaniem polecenia eval `ssh-agent`, które na Windowsie oczywiście nie działa.

Moja propozycja rozwiązania.
Pobieramy i instalujemy PuTTY, szczególnie będzie nas interesował PuTTY i Pageant. Jeśli już posiadamy zainstalowaną wersję PuTTY mogliśmy wykorzystywać PuTTYgen do stworzenia pary naszych kluczy.

Uruchamiamy PuTTY, w pole adresu wpisujemy bitbucket.org (lub github.com – w zależności od tego, który host nas interesuje), port zostawiamy domyślny, możemy zaznaczyć opcję, aby nie zamykał okienka, ale to raczej nie ma wielkiego znaczenia.
Próbujemy się połączyć z tym hostem, przed połączeniem poprosi nas o potwierdzenie, czy klucz danego hosta ma zostać dodany do zaufanych. Klikamy TAK. I tutaj już za wiele nam nie będzie potrzebne więc można wszystko pozamykać.
Uruchamiamy Pageant i ładujemy do niego nasz klucz – plik *.ppk, znajdujący się przykładowo w ~/.ssh/id_rsa.ppk).

Po załadowaniu klucza do Pageant powinniśmy już bezproblemowo móc wykonać wszelakie operacje na repozytorium: push, pull, itd.

Written by Filip Górczyński

2014.09.17 at 20:14:35

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

Written by Filip Górczyński

2014.01.11 at 06:04:13

Chrome – problem z wczytywaniem zasobów (obrazków, CSS)

with one comment

Chrome IconKilka instalacji temu pojawiła się w Google Chrome dziwna przypadłość, że nie zawsze wczytuje zasoby, a pomaga dopiero kilkukrotne odświeżenie strony. Proponowane rozwiązania to m. in.: włączenie trybu incognito, czyszczenie cache całego Chrome’a, zmiany w konfiguracji związane z pobieraniem treści stron „na zapas” (przewidywanie?), wyłączanie rozszerzeń, wszelakie kombinacje z ustawieniami proxy, z ustawieniami firewall i antywirusa, ponowne uruchamianie komputera w „safe mode”, reinstalacje sterowników i wiele innych.

W chwili obecnej problem udało się rozwiązać w 2 przypadkach, a jedyne co trzeba było zrobić to:

1. Pobrać aktualną wersję pliku instalacyjnego Google Chrome: klikamy „Pobierz Chrome”.

chromefix_step_12. Udajemy, że akceptujemy klikając „Zaakceptuj i zainstaluj”.

chromefix_step_2

3. Następnie proces ten przerywamy i zamykamy okienko instalacji.

chromefix_step_34. Klikamy „kliknij  tutaj, by spróbować ponownie”.

chromefix_step_45. Będziemy mogli dzięki temu pobrać plik ChromeSetup.exe bezpośrednio – bez uruchamiania automagicznej instalacji.

chromefix_step_56. Gdy już pobierzemy plik na dysk, klikamy na niego prawym przyciskiem myszy, otwieramy okienko „Właściwości” i klikamy „Odblokuj” (prawdę mówiąc, nie wiem dokładnie jakie ma to znaczenie dla systemu operacyjnego :) ). Klikamy OK.

chromefix_step_67. Ostatni krok, prawym przyciskiem myszy klikamy na pliku i wybieramy opcję „Uruchom jako administrator”.

chromefix_step_78. Ostatni krok to najzwyklejsze klikanie dalej podczas instalacji.

Written by Filip Górczyński

2013.11.28 at 18:52:32

cd na sterydach – narzędzie do szybkiej zmiany katalogów w konsoli

leave a comment »

Przeglądając dziś RSSy natrafiłem na genialne w swej prostocie narzędzie – przydatne szczególnie dla osób spędzających dużo czasu w konsoli. Narzędzie to nosi prostą nazwę „go-tool” i dostępne jest pod adresem http://code.google.com/p/go-tool/, a jego jedynym zadaniem jest skrócić czas dostępu do najczęściej odwiedzanych katalogów poprzez tworzenie skrótów.

Instalacja narzędzia jest dość prosta – o ile posiadamy zainstalowanego Pythona:
1. Pobranie archiwum.
2. Rozpakowanie.
3. Przejście do rozpakowanego katalogu z poziomu konsoli.
4. Uruchomienie polecenia: python setup.py install.
5. Uruchomienie pliku go.py w nowo utworzonym katalogu: build/lib/go.py.
6. Wybranie lokalizacji umieszczenia pliku go.bat poprzez wybranie z listy ścieżek.
7. Konfiguracja skrótów już w trakcie korzystania z narzędzia.

Instrukcja obsługi dostępna jest po wywołaniu (http://code.google.com/p/go-tool/wiki/GettingStarted):

$ go --help
Quick directory changing.

Usage:
go <shortcut>[/sub/dir/path]    # change directories
# same as "go -c ..."
go -c|-o|-a|-d|-s ...           # cd, open, add, delete, set
go --list [<pattern>]           # list matching shortcuts

Options:
-h, --help                      print this help and exit
-V, --version                   print verion info and exit

-c, --cd <path>                 cd to shortcut path in shell
-s, --set <shortcut> <dir>      set a shortcut to <dir>
-a, --add-current <shortcut>    add shortcut to current directory
-d, --delete <shortcut>         delete the named shortcut
-o, --open <path>               open the given shortcut path in
explorer (Windows only)
-l, --list [<pattern>]          list current shortcuts

Ciekawą opcją – dostępną tylko w Windows – jest przełącznik -o, który w momencie użycia:

go -o <SKRÓT>

powoduje otwarcie okna w Eksplorerze Windows z katalogiem wskazywanym na <SKRÓT>.

Written by Filip Górczyński

2013.02.28 at 23:43:11

Napisane w Dobre praktyki, Narzędzia, Python, Rozwiązania

Tagged with , ,

Eksport wszystkich baz z MySQL do plików SQL

with 5 comments

Eksport wszystkich baz danych z MySQL.

<?php
header('Content-type: text/html; charset=utf-8');
class Config {
   public static $host = '127.0.0.1';
   public static $username = 'root';
   public static $password = '';
   public static $port = 3306;
}

if (!file_exists('dbdumps') || !is_dir('dbdumps'))
   mkdir('dbdumps', 0700);

$dsn = 'mysql:host=' . Config::$host . ';port=' . Config::$port;
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
$dbh = new PDO($dsn, Config::$username, Config::$password, $options);

$result = $dbh->query('SHOW DATABASES;');
if ($result !== false)
   foreach ($result->fetchAll() as $row) {
      $cmd = 'mysqldump -u ' . Config::$username . ' -p' . Config::$password
         . ' ' . $row['Database'] . ' > dbdumps/' . $row['Database'] . '.sql';
      system($cmd);
      $fileSize = filesize('dbdumps/' . $row['Database'] . '.sql');
      echo 'File ' . $row['Database'] . '.sql saved [' . $fileSize . ' bytes] .<br />';
   }

Written by Filip Górczyński

2012.10.12 at 19:09:15

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 Filip Górczyński

2012.10.12 at 18:56:26

Obserwuj

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

Dołącz do 240 obserwujących.

%d bloggers like this: