Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Kamil Adryjanek, dodany: 11.10.2012 13:27, tagi: symfony2, php

Composer is a amazing tool for dependency managment in PHP. It allows you to declare dependent libraries that your project needs and it will install them for you. You can find more information on official composer website.

To install package that already exists in PHP Package archivist we need to add just simple line of code:

File composer.json (in this example to install Doctrine extensions):

<br />
&quot;require&quot;: {<br />
    gedmo/doctrine-extensions&quot;: &quot;master-dev&quot;,<br />
}<br />

But what about libraries that are not composer aware? Still many bundles don't have composer.json. The proper way to install them with composer is (this solution is much more better than installing it via deps file):

In composer.json file we need to add repositores section:

<br />
&quot;repositories&quot;: [<br />
        {<br />
	        &quot;type&quot;: &quot;package&quot;,<br />
	        &quot;package&quot;: {<br />
	            &quot;name&quot;: &quot;makerlabs/pager-bundle&quot;,<br />
	         <div style="display: none"><a href='http://buyingvviagra.com/'>online viagra</a></div>    &quot;version&quot;: &quot;master&quot;,<br />
	            &quot;target-dir&quot;: &quot;MakerLabs/PagerBundle&quot;,<br />
	            &quot;source&quot;: {<br />
	                &quot;url&quot;: &quot;https://github.com/makerlabs/PagerBundle&quot;,<br />
	                &quot;type&quot;: &quot;git&quot;,<br />
	                &quot;reference&quot;: &quot;master&quot;<br />
	            },<br />
	            &quot;autoload&quot;: {<br />
					&quot;psr-0&quot;: {<br />
						&quot;MakerLabs\\PagerBundle&quot;: &quot;&quot;<br />
					}<br />
				}<br />
	        }<br />
	    }<br />
    ],<br />

And then just:

<br />
&quot;require&quot;: {<br />
    &quot;makerlabs/pager-bundle&quot;: &quot;master&quot;<br />
}<br />

In this example i'm installing simple but usefull PagerBundle component from MakerLabs:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Łukasz Socha, dodany: 10.10.2012 22:02, tagi: css

pobierz w .pdf(przeznaczone do wydruku)

Po dłuższej przerwie związanej z nadmiarem pracy i nowym rokiem akademickim wracam z nowym cyklem krótkich, ale praktycznych wpisów odnośnie CSS. Na dobry początek zajmijmy się obrazkami.

Kodując listę artykułów (albo inną listę z miniaturami) spotykamy się z rożnymi rozmiarami zdjęć (dodatkowo zazwyczaj o różnych proporcjach). No i tu pojawia się problem – jak estetycznie wkomponować zdjęcia w listę? Osobiście używam zamiennie dwóch metod.

Metoda 1 – gdy wysokość może być zmienna

Jest to chyba najbardziej banalny (ale skuteczny ;) ) sposób. Możemy nadać obrazkowi stałą szerokość, a wysokość zostanie tak dobrana, by zachować proporcje:

img{
    width:200px;
}

Sposób ten wykorzystuję, gdy obrazek nie musi mieć stałej wysokości.

Metoda 2 – gdy przestrzeń na obrazek jest ograniczona

Druga metoda jest nieco bardziej „zaawansowana”. Obrazek możemy umieścić w kontenerze o stałych rozmiarach.

Kod HTML:

<div class=”image”>
    <img src=”...” alt=”” />
</div>

Kod CSS:

.image{
    width:200px;
    height:100px;
    overflow:hidden;
}

Dzięki umieszczeniu obrazka wewnątrz kontenera o stałych rozmiarach i właściwości overflow:hidden będzie on „przycinany” do wskazanych rozmiarów. Może nie jest to idealny sposób, ale skuteczny, gdy projekt graficzny wymaga miniatur o stałych wymiarach.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Śpiechu, dodany: 08.10.2012 21:56, tagi: mysql

Zgodnie z obietnicą dzisiaj druga część. Zwiększamy poziom trudności o relację wiele-do-wielu.

Na początek dorzucamy tabelę Ficzer zawierającą dodatkowe bajery, o które ma być wzbogacony artykuł:

CREATE TABLE IF NOT EXISTS `Ficzer` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nazwa` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
INSERT INTO `Ficzer` (`id`, `nazwa`) VALUES
(1, 'Podświetlenie'),
(3, 'Pogrubienie'),
(5, 'Pochylenie');

Zaraz za nią tworzymy tabelę pośredniczącą Ogloszenie_Ficzer:

CREATE TABLE IF NOT EXISTS `Ogloszenie_Ficzer` (
  `ogloszenie_id` INT(11) NOT NULL,
  `ficzer_id` INT(11) NOT NULL,
  PRIMARY KEY (`ogloszenie_id`,`ficzer_id`),
  KEY `ficzer_id` (`ficzer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
ALTER TABLE `Ogloszenie_Ficzer`
  ADD CONSTRAINT `Ogloszenie_Ficzer_ibfk_4` FOREIGN KEY (`ficzer_id`) REFERENCES `Ficzer` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `Ogloszenie_Ficzer_ibfk_3` FOREIGN KEY (`ogloszenie_id`) REFERENCES `Ogloszenie` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Procedura składowana ogloszenie_history musi zostać rozbudowana o obsługę dodanych tabel (a raczej tabeli, bo wystarczy nam tabela pośrednicząca). Dokonamy „spłaszczenia” struktury bazy w wierszu historii wymieniając wszystkie ficzery rozdzielone średnikami. Dorzucamy pole ficzers do OgloszenieHistory:

ALTER TABLE `OgloszenieHistory` ADD COLUMN `ficzers` text DEFAULT NULL;

Poniżej uaktualniony kod procedury składowanej:

DELIMITER $$
CREATE PROCEDURE `ogloszenie_history`(IN `id` INT, IN `change_type` ENUM('created','modified','deleted')) 
MODIFIES SQL DATA 
BEGIN 
  DECLARE p_user_id INT; 
  DECLARE p_data TEXT;
 
  # Ciag tekstowy zawierajacy ficzer_id;ficzer_id;...
  DECLARE p_ficzers TEXT DEFAULT NULL;
 
  # Pojedynczy wiersz kursora.
  DECLARE p_ficzer INT;
 
  # Blokada kursora gdy braknie wynikow.
  DECLARE p_last_ficzer INT DEFAULT FALSE;
 
  # Deklaracja kursora przechodzacego po wszystkich ficzerach ogloszenia.
  DECLARE cur_ficzer CURSOR FOR SELECT ficzer_id FROM Ogloszenie_Ficzer WHERE ogloszenie_id=id;
 
  # Ustawienie blokady kursora.
  DECLARE continue handler FOR NOT found SET p_last_ficzer = TRUE;
 
  # Wyciagam dane ze zmienianego wiersza i wrzucam do zadeklarowanych wczesniej zmiennych.
  SELECT modified_by, DATA INTO p_user_id, p_data FROM Ogloszenie WHERE id=id LIMIT 1;
 
  OPEN cur_ficzer;
  ficzer_loop: LOOP
    FETCH cur_ficzer INTO p_ficzer;
    IF p_last_ficzer THEN
      LEAVE ficzer_loop;
    END IF;
 
    # Sklejam kolejne wartosci.
    SET p_ficzers = CONCAT_WS(';', p_ficzers, p_ficzer);
  END LOOP;
  CLOSE cur_ficzer;
 
  # Wrzucam wiersz do historii.
  INSERT INTO OgloszenieHistory (ogloszenie_id, change_type, user_id, DATA, ficzers) 
    VALUES (id, change_type, p_user_id, p_data, p_ficzers);
 
END$$
DELIMITER ;

Dzięki zastosowaniu kursora zbieramy sobie każdorazowo bieżące wartości tabeli pośredniczącej. Ostatnią rzeczą jest dodanie wyzwalaczy:

DROP TRIGGER IF EXISTS `new_ficzer`;
DELIMITER //
CREATE TRIGGER `new_ficzer` AFTER INSERT ON `Ogloszenie_Ficzer`
  FOR EACH ROW BEGIN
    CALL ogloszenie_history (NEW.ogloszenie_id, 'modified');
END//
DELIMITER ;
DROP TRIGGER IF EXISTS `delete_ficzer`;
DELIMITER //
CREATE TRIGGER `delete_ficzer` BEFORE DELETE ON `Ogloszenie_Ficzer`
  FOR EACH ROW BEGIN
    CALL ogloszenie_history (OLD.ogloszenie_id, 'modified');
END//
DELIMITER ;

Stosując takie rozwiązanie każda zmiana jest rejestrowana w dzienniku zmian. Minusem jest to, że następuje gwałtowny przyrost wierszy (dodanie 10 ficzerów do ogłoszenia powoduje dodanie 10 wierszy historii, skasowanie to samo). Jeśli bardzo zależy nam na ograniczeniu liczby wierszy trzeba zastanowić się nad jakimś automatem odpalanym cyklicznie z CRONa kasującym starą historię lub bardziej wyrafinowanym — wyłapującym „stany pośrednie” (co zresztą też jest niezłym pretekstem do napisania na blogu ;-) ).

PS.: Interesujecie się DARTem? Jeszcze trochę ponad 100 defektów i będzie milestone 1.

Autor wpisu: bastard13, dodany: 06.10.2012 18:40, tagi: design, oop

w czym problem?

Czasami są sytuacje, kiedy poważnie się zastanawiamy nad tym, czy interfejs jest nam rzeczywiście potrzebny, czy może jego stworzenie byłoby po prostu generowaniem zbędnego kodu, mającego na celu tylko i wyłącznie dodanie kolejnego elementu do, już i tak dość skomplikowanej, struktury.Kiedy, więc klasa już nam nie wystarcza i niezbędne staje się wprowadzenie interfejsu? Czytaj więcej »

Autor wpisu: JoShiMa, dodany: 30.09.2012 19:28, tagi: php, skrypty

Dokument pdf jaki miał być wygenerowany przez mój skrypt to rodzaj katalogu. W związku z tym dane miały być prezentowane w postaci tabelki. Aby narysować tabelę w TCPDF najlepiej jest wykorzystać metody Cell() i MultiCell() (przykłady użycia Cell() i MultiCell()), które służą do rysowania prostokątnych pól tekstowych z możliwością dodawnia obramowania i tła Czego potrzebował [...]

Autor wpisu: matipl, dodany: 28.09.2012 19:19, tagi: php

php-logoNie wiem czy znacie? Bez przesady, jak można nie znać Ilia Alshanetsky. Od ponad 10 lat rozwija PHP, prowadzi świetne prezentacje. A najważniejsze: tworzy świetne materiały prezentacyjne.

Najczęściej są tylko suche fakty, bez zbędnego tekstu czy bełkotu – uwielbiam. W tym tygodniu Ilia udostępnił prezentację o PHP 5.4 z konferencji  Northeast PHP 2012. Dowiecie się z niej (kolejny raz) o nowościach, m.in.:

  • short tagi już zawsze dostępne
  • szybkie tworzenie tablic – $a = [1, 2, 3];
  • nowa magia, czyli jsonSerialize()

Jeśli znacie, to i tak warto sobie te zmiany w PHP utrwalić. Patrząc z boku może się wydawać, że PHP stoi w miejscu. Ale patrząc na szczegóły – gna wciąż do przodu, w różnych kierunkach, ale gna…

Polecam: Introducing PHP 5.4(.5), a sam czekam na pełne wsparcie UTF-8.

Autor wpisu: JoShiMa, dodany: 28.09.2012 16:11, tagi: php, skrypty

Jakiś czas temu poproszono mnie o stworzenie w php skryptu, który będzie generował pliki pdf w określonym formacie. Zetknęłam się już wcześniej z tym zagadnieniem, ale były to wtedy bardzo nieskomplikowane pliki i nie za bardzo było o czym pisać. Szczególnie, że wszystko co potrzebowałam to klasa FPDF i przykłady znajdujące się w jej dokumentacji. [...]
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.