Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >

RiE
Napisane: 19.09.2014, 12:05:52





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Pierwsza sprawa jeżeli musisz robić to w ten sposób to znaczy że coś źle robisz bo Zend Framework 2 posiada zarówno controller plugin jak i view helper który przechowuje dane zalogowanego użytkownika

Druga sprawa to rozwiązanie z dziedziczonym controllerem tak na dobrą sprawę niczego nie rozwiązuje.

Ja proponowałbym skorzystać z ServiceManagera:

W pliku Module.php

  1. 'service_manager' => array(
  2. 'factories' => array(
  3. 'my-session' => function($sm) {
  4. $user_session = new Container('mysession');
  5. return $user_session;
  6. },
  7.  
  8. ),
  9. ),



  1. public function onBootstrap($e) {
  2.  
  3. $serviceManager = $e->getApplication()->getServiceManager();
  4. $viewModel = $e->getApplication()->getMvcEvent()->getViewModel();
  5.  
  6. $session = $serviceManager->get('my-session');
  7.  
  8. $viewModel->login = $session
  9.  
  10. }


I teraz w widoku możesz

  1. <?php echo $this->login; ?>
  Forum: Frameworki · Podgląd postu: #1125525 · Odpowiedzi: 2 · Wyświetleń: 590

RiE
Napisane: 7.08.2014, 09:58:27





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Cytat(markuz @ 5.08.2014, 20:53:04 ) *
Gdzie użyć nowego filtru? W modelu czy w tabeli? Tzn. mam klasę modelu Album z tutoriala oraz AlbumTable. Z tego co widzę klasa Album odpowiada głównie za walidację, natomiast AlbumTable za operacje na bazie.


Tworzysz nową klasę, która dziedziczyć będzie z Zend\Filter\AbstractFilter i później w getInputFilter():

  1. $inputFilter->add(array(
  2. 'name' => 'pole_formularza',
  3. 'filters' => array(
  4. array('name' => 'Moj\Filtr'),
  5. ),
  6. ))



  Forum: Frameworki · Podgląd postu: #1118900 · Odpowiedzi: 3 · Wyświetleń: 613

RiE
Napisane: 18.07.2014, 21:06:54





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Service Manager jest oparty o wzorzec Service Locator i jest to mechanizm slużący do pobierania innych obiektów. Używa się go w module.config.php lub Module.php i składa się z 7 typów(kategorii).

1. abstract_factories pod tym kluczem definiuje się klasy, które muszą implementować ZendServiceManagerAbstractFactoryInterface. Rzadko używane.
2. aliases nadaje klasie alias, np:
  1. 'aliases' => array(
  2. 'translator' => 'MvcTranslator',
  3. ),


Teraz jesteśmy w stanie się odwołać za pomocą

  1. $this->getServiceLocator()->get('translator')


3. factories deklaruje klasy, które powinny implementować Zend/ServiceManager/FactoryInterface. Dość często używane. Np:

  1. 'factories' => array(
  2. 'UserTable' => function($sm) {
  3. $tableGateway = $sm->get('UserTableGateway');
  4. $table = new UserTable($tableGateway);
  5. return $table;
  6. },


Jeżeli klasa ma konstruktor lub jeśli potrzebujemy dodać do klasy obiekty innej klasy to używamy do tego celu właśnie klucza factories. Obiekt jest inicjowany od razu- w momencie kiedy jest wczytywany do Service Managera.

4. invokables definiujemy klasy, które nie mają konstruktora lub jeśli nie musimy z niego(konstruktora) skorzystać. Również dość często używane, jak chociażby dla naszych klas kontrolera. Np:

  1. 'invokables' => array(
  2. 'Application\Controller\Index' => 'Application\Controller\IndexController',
  3. )


Klasy pod tym kluczem są inicjowane dopiero w momencie odwołania się do danego klucza, a nie w momencie 'pobrania' przez ServiceManager

5. services służy głównie do deklarowania 'service'ów' lub klas, które są już zainicjowane. Np:

  1. 'services' => array(
  2. 'name' => $zmienna,
  3. ),


6. initializers nie miałem okazji jeszcze z tego korzystać. Ten klucz definiuje callback, który jest uruchamiany za każdym razem gdy jest tworzony obiekt, w ten sposób jeśli obiekt spełnia wymagania(np. implementuje konkretny interfejs) jeśtemy w stanie 'wstrzepić' inny obiekt.

  1. 'initializers' => array(
  2. function ($instance, $sm) {
  3. if ($instance instanceof AuthorizeAwareInterface) {
  4. $instance->setAuthorizeService($sm->get('auth_service'));
  5. }
  6. }
  7. )


7. shared domyślnie wszystkie service'y od ServiceManagera są 'shared', czyli pracujemy na tym samym obiekcie. Tutaj jesteśmy w stanie to zmienić, gdy np. chcemy żeby za każdym razem był tworzony nowy obiekt.

  1. $table1 = $this->getServiceLocator()->get('UserTable');
  2. $table2 = $this->getServiceLocator()->get('UserTable');
  3. // table1 i table2 to ten sam obiekt


Gdy dodamy:

  1. 'shared' => array(
  2. 'UserTable' => false,
  3. ),


  1. $table1 = $this->getServiceLocator()->get('UserTable');
  2. $table2 = $this->getServiceLocator()->get('UserTable');
  3. // table1 i table2 to różne obiekty



Jak napisałem na początku, Service Manager służy do łatwego dostępu do obiektów. Np. wyobraźmy sobie że tylko dla pewnej akcji chcesz dodać jakiś plik js, możesz to zrobić tak:

  1.  
  2. public function addAction()
  3. {
  4. $this->getServiceLocator()
  5. ->get('viewhelpermanager')
  6. ->get('HeadScript')
  7. ->appendFile('/js/ckeditor/ckeditor.js','text/javascript');
  8. }


Tutaj za pomocą Service Managera dostajemy się do obiektu HeadScript i dzięki temu jesteśmy w stanie dodać plik js z poziomu akcji kontrolera

Najczęśniej używane są factories i invokables. Co to są factories to napisałem wyżej, ale może dodam jeszcze jeden przykład żeby lepiej zobrazować co robi.

Mamy klasę:

  1. class HelloService
  2. {
  3. public function sayHello()
  4. {
  5. return 'Hello World';
  6. }
  7. }


I załóżmy że chcemy wyświetlić w widoku to co zwraca metoda sayHello().
Możemy to zrobić na dwa sposoby.

1. Invokables

W pliku Module.php dodajemy:

  1. public function getServiceConfig()
  2. {
  3. return array(
  4. 'invokables' => array(
  5. 'HelloService'
  6. => 'Helloworld\Service\HelloService'
  7. )
  8. );
  9. }


I teraz w akcji:

  1. public function indexAction()
  2. {
  3. $hello = $this->getServiceLocator()
  4. ->get('HelloService');
  5.  
  6. return new ViewModel(
  7. array('hello' => $hello->sayHello())
  8. );
  9. }


Najpierw dodajmy do ServiceManagera klasę HelloService, później w akcji pobieramy z Service Managera i odwołujemy się do metody sayHello(). Trochę to toporne i niewydajne.

2. Factories

  1.  
  2. 'factories' => array(
  3. 'Helloworld\Controller\Index' => function($sm) {
  4. $controller = new Helloworld\Controller\IndexController();
  5.  
  6. $controller->setHelloService(
  7. $sm->getServiceLocator()
  8. ->get('HelloService')
  9. );
  10.  
  11. return $controller;
  12. }
  13. )


I w akcji:

  1. class IndexController extends AbstractActionController
  2. {
  3. private $helloService;
  4.  
  5. public function indexAction()
  6. {
  7.  
  8. return new ViewModel(
  9. 'hello' => $this->helloService->sayHello()
  10. )
  11. );
  12. }
  13.  
  14. public function setHelloService($service)
  15. {
  16. $this->helloService = $service;
  17. }
  18. }


Tym sposobem dodajemy obiekt klasy HelloService do kontrolera w Service Managerze i teraz w akcji nie musimy pobierać tego obiektu, tylko bezpośrednio możemy na nim pracować. Bardziej czytelniejsze rozwiązanie, wydajne i zalecane.
  Forum: Frameworki · Podgląd postu: #1115990 · Odpowiedzi: 3 · Wyświetleń: 1 533

RiE
Napisane: 9.06.2014, 16:47:22





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Jeżeli dość często potrzebujesz takich informacji w widoku to możesz napisać sobie View Helper, który będzie posiadał takie informacje i prezentował je bezpośrednio w widoku. Nie będziesz musiał wtedy przekazywać za każdym razem tych danych do klasy ViewModel.

Zamiast
  1. $action = $this->getEvent()->getRouteMatch()->getParam('action', 'index');


Możesz użyć pluginu params() w kontrolerze, np:

  1. $action = $this->params()->fromRoute('action', 'index');


Ten plugin posiada również inne metody, dzięki którym możemy pobrać dane z innych źródeł:
- fromFiles()
- fromHeader()
- fromPost()
- fromQuery()

Więcej informacji na ten temat -> http://framework.zend.com/manual/2.0/en/mo...e-params-plugin

Tak, drugi parametr jest to wartość domyślna, która będzie wykorzystywana w przypadku jeśli pierwszy parametr nie ma wartości.
  Forum: Frameworki · Podgląd postu: #1110039 · Odpowiedzi: 6 · Wyświetleń: 466

RiE
Napisane: 23.05.2014, 09:08:40





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Jest na to kilka sposób, dwa najczęściej używane to:

1. Standardowa klasa Select (Zend\Form\Element\Select)

W klasie formularza jest taka definicja pola select:
  1.  
  2. /* Size */
  3. $this->add(array(
  4. 'name' => 'size',
  5. 'type' => 'Zend\Form\Element\Select',
  6. 'attributes' => array(
  7. 'class' => 'form-control'
  8. ),
  9. 'options' => array(
  10. 'label' => 'Size: ',
  11. 'label_attributes' => array(
  12. 'class' => 'control-label',
  13. 'id' => 'size'
  14. ),
  15. ),
  16. ));


W tej samej klasie, dodajesz metodę:
  1. public function setSizesToForm($sizes)
  2. {
  3. $list = array();
  4. foreach($sizes as $size)
  5. {
  6. if($size->getDetailKey() === 'size')
  7. $list[$size->getDetailName()] = $size->getDetailValue();
  8.  
  9. }
  10.  
  11. $this>get('size')->setOptions(array('options' => $list));
  12. }


I w kontrolerze, jak tworzysz instancję formularza to przekazujesz tablicę z danymi, które mają znaleźć się w formularzu albo tablicę obiektów i tam filtrujesz te dane, które Cię interesują
  1. $form = new \Application\Form\MyForm();
  2. $form->setSizesToForm($selectArray());
  3. //... reszta operacji
  4.  
  5. return new ViewModel(array('form' => $form));


2. Używanie klas z Doctrine 2 (DoctrineModule\Form\Element\*)

Doctrine 2 udostępnia 3 klasy do łatwego zarządzania:
- Select (DoctrineModule\Form\Element\ObjectSelect)
- Radio (DoctrineModule\Form\Element\ObjectRadio)
- Checkbox (DoctrineModule\Form\Element\ObjectMultiCheckbox)

Przykład użycia można znaleźć pod tym adresem https://github.com/doctrine/DoctrineModule/...form-element.md.
W skrócie. Definiujemy w tablicy, pod kluczem target_class entity z którego doctrine ma pobrać zawartość do selecta/radio/checkboxa. Następnie:
  1. 'find_method' => array(
  2. 'name' => 'findBy',
  3. 'params' => array(
  4. 'criteria' => array('active' => 1),
  5. 'orderBy' => array('lastname' => 'ASC'),
  6. ),
  7. ),

Następnie podajemy nazwę metody jaką mają być pobrane dane w tym przypadku findBy() oraz parametry wyszukiwania, które jest równoznaczne z:
  1. $em->getRepository('Library\Entity\MyEntity')->findBy(array('active' => 1));
  Forum: Frameworki · Podgląd postu: #1107858 · Odpowiedzi: 5 · Wyświetleń: 468

RiE
Napisane: 22.05.2014, 20:04:30





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Ja osobiście nie jestem zwolennikiem używania adnotacji, nie podoba mi się ten sposób definiowania danych.
Na pewno jest przejrzysty i szybszy(szybciej się go tworzy) niż standardowy sposób definiowania formularza. Do przetwarzania adnotacji używane jest Reflecion API, które pod względem wydajnościowym jest zapewne wolniejsze od typowych funkcji i operacji. Chociaż i z tym jest coraz lepiej wraz z nowszymi wersjami PHP.

Tworząc w Zend 2, na pewno warto być zaznajomionym z tym jak odbywa się tworzenie formularzy w standardowy sposób, jak można 'dobrać się' do odpowiednich właściwości itd.
Większość modułów wykorzystuje standardowy sposób tworzenia formularzy.
  Forum: Frameworki · Podgląd postu: #1107789 · Odpowiedzi: 5 · Wyświetleń: 468

RiE
Napisane: 9.05.2014, 09:59:05





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

1. To używaj odpowiednich tagów przy pisaniu postów na forum, aby zachować formatowanie tekstu, bo strasznie źle się czyta taki plain text.
2. W widoku odwołujesz się w ten sposób do zmiennych nadanych w kontrolerze
  1. $this->{klucz_tablicy_z_kontrolera}


Tak więc, zamiast:
  1. <? foreach($users as $user): ?>
  2. <tr>
  3. <td><?php echo $this->escapeHtml($user->name);?></td>
  4. <td><?php echo $this->escapeHtml($user->email);?></td>
  5. <td><?php echo $this->escapeHtml($user->password);?></td>
  6. <td>
  7. <a href="<?php echo $this->url('users/user-manager', array('action'=>'edit', 'id' => $user->id));?>">Edycja</a> |
  8. <a href="<?php echo $this->url('users/user-manager', array('action'=>'delete', 'id' => $user->id));?>" onclick="return confirm('Jesteś pewien ?')">Usunięcie</a>
  9. </td>
  10. </tr>
  11. <? endforeach; ?>


Powinno być:
  1. <? foreach($this->users as $user): ?>


Dlatego też ten kod zadziałał:
Cytat
zmienna przekazuje do widoku, gdy dodalem ten kod do widoku:
  1. <?php if ($this->users): ?>
  2. <p>
  3. zmienna zostala przekazana
  4. </p>
  5. <?php endif ?>

i wyswietla mi sie tekst zmienna zostala przekazane, wiec nie czaje co jest nie tak i jeszcze raz zwracam sie o pomoc do was

  Forum: Frameworki · Podgląd postu: #1105845 · Odpowiedzi: 10 · Wyświetleń: 594

RiE
Napisane: 25.02.2014, 22:01:58





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Jeżeli klasa ArticleRepository znajduje się w Application\Entities\Repositories to taka też powinna być przestrzeń nazw.
Czyli
  1. namespace Repositories;


zamień na

  1. namespace Application\Entities\Repositories;


I powinno to załatwić sprawę.
  Forum: Frameworki · Podgląd postu: #1093858 · Odpowiedzi: 2 · Wyświetleń: 307

RiE
Napisane: 4.02.2014, 10:38:59





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Co to znaczy że shuffle() nie zadziałało?

1. shuffle()
  1. $tags = explode (",", $tagis);
  2. shuffle($tags);
  3. $tagi='
  4. <a href="tag,'.$tags[0].'.html"><span class="tagi">'.$tags[0].'</span></a>
  5. <a href="tag,'.$tags[1].'.html"><span class="tagi">'.$tags[1].'</span></a>
  6. <a href="tag,'.$tags[2].'.html"><span class="tagi">'.$tags[2].'</span></a>
  7. <a href="tag,'.$tags[3].'.html"><span class="tagi">'.$tags[3].'</span></a>


W starszych wersjach PHP, losowość z shuffle() była dość prymitywna i dostawało się prawie nie zmienioną tablice, ale obecnie fukcja ta działa bardzo dobrze.

2. array_rand()

  1. $tags = explode (",", $tagis);
  2. $random = array_rand($tags, 4);
  3. $tagi='
  4. <a href="tag,'.$tags[$random[0]].'.html"><span class="tagi">'.$tags[$random[0]].'</span></a>
  5. <a href="tag,'.$tags[$random[1]].'.html"><span class="tagi">'.$tags[$random[1]].'</span></a>
  6. <a href="tag,'.$tags[$random[2]].'.html"><span class="tagi">'.$tags[$random[2]].'</span></a>
  7. <a href="tag,'.$tags[$random[3]].'.html"><span class="tagi">'.$tags[$random[3]].'</span></a>


Weź jeszcze pod uwagę że w przypadku kiedy masz małą ilość tagów, np. 4 to może się zdarzyć tak, że akurat wszystkie będą w tej samej kolejności.
  Forum: Przedszkole · Podgląd postu: #1089353 · Odpowiedzi: 5 · Wyświetleń: 241

RiE
Napisane: 3.02.2014, 21:05:03





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Za mądrzejszego się nie uważam, ale postaram się wytłumaczyć smile.gif

To nie licznik dodaje nową linię, tylko znacznik p.
Jeżeli usuniesz licznik, ale nie usuniesz :before to dalej tekst przeskoczy do nowej lini.
Przykład: http://jsfiddle.net/P5dnr/10/


:before tworzy pseudo element, który jest pierwszym dzieckiem.
Zatem Twój kod jest równoważny z tym:
  1. <li><span>Pierwsze dziecko elementu li</span><p>w znacznikach &lt;p&gt;</p></li> // dwie linie
  2. <li><span>Pierwsze dziecko elementu li</span>bez znaczników &lt;p&gt;</li> // jedna linia


Znacznik p domyślnie wyświetla się jako blok(display:block), dlatego przeskakuje do nowej lini.
Rozwiązaniem byłoby nadanie display:inline, albo zmiana znacznika p na jakiś 'inline'.

  Forum: Przedszkole · Podgląd postu: #1089283 · Odpowiedzi: 15 · Wyświetleń: 398

RiE
Napisane: 8.01.2014, 17:45:37





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

To forum nie pomaga w hackingu, robieniu spambotów, manipulowaniu głosami ani innymi podobnymi rzeczami niezgodnymi z ogólnie przyjętymi normami.
  Forum: PHP · Podgląd postu: #1084222 · Odpowiedzi: 4 · Wyświetleń: 2 615

RiE
Napisane: 6.01.2014, 16:31:44





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Hmm... ciężko mi sobie wyobrazić żebyś na localhoście nie mógł stworzyć vhosta, więc zakładam że chodzi o hosting

W takim przypadku na ogól w panelu hostingowym istnieje możliwość przypisania katalogu konkretnej domenie. I wtedy za pomocą kreatora ze standardowego katalogu dajmy na to public_html ustawiasz public_html/public i wtedy domena traktuje ten katalog jak Document Root.

Innym wyjściem jest stworzenie Dowiązania symbolicznego
  Forum: Frameworki · Podgląd postu: #1083841 · Odpowiedzi: 3 · Wyświetleń: 648

RiE
Napisane: 28.12.2013, 00:02:13





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

  1. <?php
  2. // module/Album/view/album/album/delete.phtml:
  3.  
  4. $title = 'Delete album';
  5. $this->headTitle($title);
  6. ?>
  7. <h1><?php echo $this->escapeHtml($title); ?></h1>
  8.  
  9. <p>Are you sure that you want to delete
  10. '<?php echo $this->escapeHtml($album->title); ?>' by
  11. '<?php echo $this->escapeHtml($album->artist); ?>'?
  12. </p>
  13. <?php
  14. $url = $this->url('album', array(
  15. 'action' => 'delete',
  16. 'id' => $this->id,
  17. ));
  18. ?>
  19. <form action="<?php echo $url; ?>" method="post">
  20. <div>
  21. <input type="hidden" name="id" value="<?php echo (int) $album->id; ?>" />
  22. <input type="submit" name="del" value="Yes" />
  23. <input type="submit" name="del" value="No" />
  24. </div>
  25. </form>


Ostatnie dwa inputy zwracają wartość Yes lub No w zależności od tego, który zostanie naciśnięty.
  Forum: Frameworki · Podgląd postu: #1082398 · Odpowiedzi: 1 · Wyświetleń: 714

RiE
Napisane: 1.12.2013, 16:35:27





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Cytat
Moje pytanie brzmi gdzie w kodzie ten doctrine jest użyty??


W tym przykładzie Doctrine używane jest w tym miejscu
  1. namespace SanAuth\Model;
  2.  
  3. use Zend\Form\Annotation;
  4.  
  5. /**
  6.  * @Annotation\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
  7.  * @Annotation\Name("User")
  8.  */
  9. class User
  10. {
  11. /**
  12.   * @Annotation\Type("Zend\Form\Element\Text")
  13.   * @Annotation\Required({"required":"true" })
  14.   * @Annotation\Filter({"name":"StripTags"})
  15.   * @Annotation\Options({"label":"Username:"})
  16.   */
  17. public $username;
  18.  
  19. /**
  20.   * @Annotation\Type("Zend\Form\Element\Password")
  21.   * @Annotation\Required({"required":"true" })
  22.   * @Annotation\Filter({"name":"StripTags"})
  23.   * @Annotation\Options({"label":"Password:"})
  24.   */
  25. public $password;
  26.  
  27. /**
  28.   * @Annotation\Type("Zend\Form\Element\Checkbox")
  29.   * @Annotation\Options({"label":"Remember Me ?:"})
  30.   */
  31. public $rememberme;
  32.  
  33. /**
  34.   * @Annotation\Type("Zend\Form\Element\Submit")
  35.   * @Annotation\Attributes({"value":"Submit"})
  36.   */
  37. public $submit;
  38. }

Jeżeli miałeś wcześniej styczność z Doctrine to pewnie wiesz że pozwala na budowe tabel za pomocną adnotacji, które później są parsowane na odpowiednie wartości odpowiednich pól i generowany jest w ten sposób kod SQL. Zend framework 2 pozwala na budowe formularzy za pomocą adnotacji, wykorzystywany jest wtedy silnik doctrine to parsowania kodu. Tak też jest w tym przypadku, wszystko to co znajduje się w komentarzach parsowane jest na odpowiednie klasy, metody, wartości.

Więcej informacji na ten temat znajdziesz w dokumentacji Zend Quick Start- Using Annotations
Wyszczególniony fragment:
Cytat
Form annotations require Doctrine\Common, which contains an annotation parsering engine


  Forum: Frameworki · Podgląd postu: #1078392 · Odpowiedzi: 1 · Wyświetleń: 1 104

RiE
Napisane: 1.12.2013, 17:08:11





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Cytat
Jeśli chodzi zaś o te rozszerzenia - to w chrome próbuje używać portu 63342 - jaki powinien być poprawny?

Przyznam sie szczerze że nie korzystam z wtyczki do przeglądarek, tylko ze skryptozakładek(bookmarklets), xDebug domyślnie nasłuchuje na porcie 9000 więc chyba taki powinien być.

Funkcja Start Debug dodaje ciastko o wartości odpowiadającej kluczowi, więc to dziwne że nie działa skoro Debug this page wykorzystuje ten sam mechanizm.
Pierwsza sprawa to sprawdziłbym czy aby na pewno po kliknięciu Start Debug, przeglądarka ma cookie o nazwie XDEBUG_SESSION i wartości zgodnej z pliku ini. Domyślnie PHPSTORM. Upewni się że żadna wtyczka nie blokuje tego ciastka. Często zdarza się że wtyczki, które zapobiegają śledzeniu usuwają pliki cookie.

Ciężko mi coś doradzić, bo w przypadku Listenera nie ma za dużo ustawień, a co za tym idzie za dużo szans popełnienia błędu.
  Forum: Komputery i oprogramowanie · Podgląd postu: #1078396 · Odpowiedzi: 6 · Wyświetleń: 1 459

RiE
Napisane: 1.12.2013, 11:00:02





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Postaram się opisać krok po kroku, ale zaczne od artykułu który może być pomocny, co prawda dotyczy on PHPStorm 2.0, ale opisuje kiedy używać remote debug itp.
Configuring PHP debugging in PhpStorm 2.0
PHPStorm umożliwia debugowanie wielu rzeczy i to miałem na myśli pisząc o wybraniu odpowiedniej opcji do debugowania. Można debugować całą aplikację, pojedyńczy skrypt, PHPUnit, skrypty JS, itd. Od razu przyznam się że nie sprawdzałem wszystkich tych opcji, bo nie miałem jeszcze potrzeby.

Artykuł wyżej opisuje 3 możliwości debugowania, wtedy tylko tyle było, teraz jest więcej, ale chyba te 3 sposoby są najcześniej wykorzystywane
1. Listener (uniwersalny)
2. Remote Debug (dla każdego projektu trzeba robić nową konfigurację)
3. Web Application Debug (dla każdego projektu trzeba robić nową konfigurację)

Ja opiszę tutaj pierwszą możliwość

Na początku trzeba zainstalować xDebug, to pominę bo myślę że jest 'oczywistą oczywistością'
Następnie w pliku php.ini:
  1. [xDebug]
  2. zend_extension = ""// Ścieżka do pliku .dll
  3. xdebug.profiler_append = 0
  4. #Ustawienia profilera
  5. xdebug.profiler_enable_trigger = 1
  6. xdebug.profiler_output_dir = "" // Ścieżka gdzie mają być gromadzone pliki
  7. xdebug.profiler_output_name = "cachegrind.out.%t-%s"
  8.  
  9. xdebug.remote_host=localhost
  10. xdebug.remote_port=9000
  11. xdebug.idekey=PHPSTORM // Bardzo ważny jest tutaj ten klucz
  12. xdebug.remote_mode=req
  13. xdebug.remote_handler=dbgp
  14. xdebug.remote_enable=1


Następny krok to bookmarklets. Z oficjalnej strony(http://www.jetbrains.com/phpstorm/marklets/index.html) możemy wygenerować funkcje, które umożliwią nam start debugera, istnieją też dodatki z tego co wiem na Chrome i Firefox. Nie ważne z czego skorzystamy, najważniejsze jest żeby IDE Key był identyczny z tym z pliku .ini

Teraz File -> Settings -> PHP -> Server i wypełniamy name, host i upewniamy się że zaznaczony jest nasz Debuger z rozwijanej listy.

Kolejny etap to włączenie nasłuchiwania, ikona przypominająca telefon, obok ikony 'Debug'.
Robimy breakpointa.
Przechodzimy do przeglądarki, włączamy nasz plugin, który generuje IDE Key, odświeżamy stronę iii... powiniśmy zostać automatycznie przeniesieni do aplikacji PHPStorm, który pokaże okienko do debugowania.

Ważna rzecz: Używając Listenera nie ma potrzeby dawać Edit Configuration i wybierać opcji debugowania, więc nie myśl że dodatkowo trzeba jeszcze coś wypełniać. To co wyżej napisałem powinno umożliwić debugowanie aplikacji.

Może jeszcze to się przydać:
Zero-configuration Web Application Debugging with Xdebug and PhpStorm

  Forum: Komputery i oprogramowanie · Podgląd postu: #1078347 · Odpowiedzi: 6 · Wyświetleń: 1 459

RiE
Napisane: 30.11.2013, 11:13:55





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Nie napisałeś czy zależy Ci na local czy remote debug
Pierwsze krok jaki powinieneś poczynić to File -> Settings -> PHP -> Servers. Kliknąć zielony plus i dodać hosta, przy okazji w sekcji Debug możesz ustawić jakieś niestandardowe ustawienia, ale do pierwszego uruchomienia debugera nie są potrzebne tam żadne zmiany.
Później dajesz Edit Configuration -> zielony plus i wybierasz co konkretnie chcesz debugować. Dokumentacja, którą podałeś pokazuje nieco starszą wersję PHP Storm (mniej możliwości debugowania).

Polecam filmy na youtube jeżeli potrzebujesz krok po korku

Debugging PHP with PhpStorm solidna prezentacja 57min z oficjalnego kanału jetBrainsTV
Advanced Debugging in PhpStorm - PhpStorm Video Tutorial ten sam kanał, bardziej o możliwościach debugowania niż samej konfiguracji.

Setup xDebug with PHPStorm przystępnie w 5 min pokazane jak skonfigurować xDebuga


  Forum: Komputery i oprogramowanie · Podgląd postu: #1078135 · Odpowiedzi: 6 · Wyświetleń: 1 459

RiE
Napisane: 28.11.2013, 10:37:43





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Proponowałbym skorzystać z gotowego modułu Doctrine 2 do Zend Framework 2. DoctrineORMModule. Konfiguracja bardzo prosta, wystarczy podać dane do bazy danych i możemy korzystać z dobrodziejstw ORM, gdzie mechanizm o którym wspomniałeś jest czymś standardowym.
W kontrolerze wystarczy:
  1. $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');

I mamy dostęp do Entity Managera.

Tutaj jeszcze krótka prezentacja pokazująca współprace ZF2 i Doctrine 2.
http://marco-pivetta.com/doctrine-orm-zf2-tutorial/#/

Ewentualnym rozwiązaniem jest stworzenie z istniejących bibliotek Zenda własnego systemu do zarządzania relacjami, ale będzie to raczej bardzo prymitywne DBAL, tylko pytanie czy jest sens wymyślać koło na nowo?
  Forum: Frameworki · Podgląd postu: #1077814 · Odpowiedzi: 3 · Wyświetleń: 692

RiE
Napisane: 17.11.2013, 21:12:26





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Można ściągnąć sobie framework i przeglądnąć, albo zbadać te przykłady narzędziami dla developerów, czy to wbudowanymi czy dodatkowymi takimi jak FireBug.
  Forum: Przedszkole · Podgląd postu: #1075937 · Odpowiedzi: 5 · Wyświetleń: 194

RiE
Napisane: 17.11.2013, 20:57:21





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Zobacz jak formatują formularze popularne frameworki CSS. Tutaj masz przykład Bootstrapa
http://getbootstrap.com/css/#forms
Bardzo rzadko spotykam się z formularzami na tabelkach, na ogół to pozostałości z poprzedniej epoki, jednak nadal się zdarzają.
  Forum: Przedszkole · Podgląd postu: #1075933 · Odpowiedzi: 5 · Wyświetleń: 194

RiE
Napisane: 15.11.2013, 23:26:34





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Cytat
przeróżne testy (benchmarki) ukazują, że Zend w wersji 2 jest strasznie powolny


Mógłbyś podać linki do tych testów? Bo z tego co pamiętam to owszem, były takie testy, ale z pierwszego/drugiego kwartału 2012 roku, kiedy Zend 2 był jeszcze we wczesnej becie. Jeżeli dobrze pamiętam to firma Zend zapowiedziała że optymalizacją zajmie się dopiero w kolejnych odsłonach frameworka po ukończeniu bety i wypuszczeniu stabilnej wersji. Więc testy przeprowadzone na 2.1/2.2 byłyby miarodajne, natomiast na te z 2012 roku patrzyłbym z przymróżeniem oka.

Uważam że testy frameworka nie odzwierciedlają prawdziwej wydajności aplikacji i nie brałbym ich jako jedynego kryterium przy wyborze. Zend 2 nie jest przeznaczony do małych projektów i stawianie na nim strony dla zakładu fryzjerskiego byłoby przerostem formy nad treścią.
W becie, Zend 2 do rozruchu podstawowej aplikacji(Skeleton Application) ładował ponad 160 plików, gdzie Symfony 2 potrzebował ~40 jeżeli dobrze pamiętam. O ilości wywoływanych funkcji nawet nie będę wspominał bo cóż... taka jest specyfika tego frameworku.
W Zend 2 zmieniła się nieco architektura całego frameworka, mamy nowości typu EventManager, ServiceManager itp. przy prostej stronie z całego tego dobrodziejstwa nawet nie skorzystamy, a większość ładowana jest na 'dzień dobry'. Potrzebowałbyś podpiąć zaczep pod routing adresu? Nie ma problemu wystarczy jedna linijka kodu, jak chcesz i kiedy chcesz. Możesz podpiąć się praktycznie w każde miejsce, nie modyfikująć standardowych plików. A jak jest w innych frameworkach? Niektóre nie mają nawet takiej możliwości, inne wymagają dodatkowych bibliotek, a jeszcze inne wymagają modyfikowania plików.

To wszystko przekłada się na szybkość.
Zend framework 2 jest wolniejszy od Zend 1- zgoda, natomiast z tym że jest "strasznie powolny" to bym polemizował.

Dodam jeszcze że za kilka/kilkanaście (Wstępna data miała być podana 6 listopada) miesięcy ma być wydany Zend 3, już trwają prace nad nim. Będzie on zmienioną wersją Zend 2. Architektura ma zostać ta sama, na pewno większą role ma odgrywać Dependency Injection, które obecnie jest uznawane za zbędny luksus, reszta zmian ma dotyczyć bibliotek, chociaż wszystko cały czas jest obgadywane i każdy ma wpływ na rozwój tego frameworka. Nowe wersja ma być prostsza, ulepszona, szybsza, a co będzie to się okaże.
Tutaj link do sugestii Zend 3 http://www.google.com/moderator/#15/e=207d...f=207d6f.6bdbc1

Cytat
Czy ZF 2 jest gotowy "do produkcji"?

Nie jest to żadna Alfa, ani Beta, tylko stabilna wersja, która konkuruje na równi z innymi frameworkami. Zdarzają się bugi, jak wszedzie, ale są one łatane.

Cytat
Jak bardzo odstaje od 1.x?


Architektura jest inna przez co można doznać szoku przesiadając się z pierwszej wersji na drugą. Natomiast biblioteka klas jest mniej więcej ta sama. Niektóre klasy nie różnią się niczym(nawet nazwy metod są identyczne), inne zostały nieco inaczej przepisane.

Cytat
Jak wiele tracę skupiając się na wersji 1.x?

Po wydaniu stabilnej wersji Zend 2 było coś mówione że prace nad wersją 1 mają być zakończone. Tzn. ma nie być rozwijana, nie wiem czy coś się zmieniło bo nie bardzo interesuje się Zend 1, natomiast wiadomo jak to jest z oprogramowaniem, które nie jest rozwijane.

Cytat
Jak wiele zyskuję skupiając się na wersji 2.x?

Przede wszystkim zyskujesz to co oferuje nowsza wersja PHP. Zend 2 wymaga PHP 5.3, przesterzenie nazw są standardem. Nie przypominam sobie tego w Zend 1.
Masz okazje zaryzykować i skorzystać z frameworka, które być może będzie wyznaczało nowe standardy, za którymi inne firmy będą podążać, albo... będziesz miał okazje skorzystać z frameworka, któremu nadadzą nazwę 'Niewypał' i dość szybko zostanie zapomniany.

  Forum: Frameworki · Podgląd postu: #1075667 · Odpowiedzi: 3 · Wyświetleń: 1 120

RiE
Napisane: 21.08.2013, 17:26:53





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Odnośnie pytania o wynagrodzenie to brakuje najważniejszych informacji. Netto czy brutto, w ojro czy złotówkach
  Forum: Praca oferowana (Job offers) · Podgląd postu: #1061605 · Odpowiedzi: 3 · Wyświetleń: 1 052

RiE
Napisane: 29.07.2013, 14:24:07





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Dzieje się tak, ponieważ metoda isValid() sprawdza czy dane podane przez użytkownika są poprawne tj. przechodzą walidację.
Ty natomiast nie masz żadnej walidacji, dlatego wyświetla 'ok'.
Odnośnie tego:
  1. 'required' => true


Nie jestem pewny czy wyżej wymieniony parametr przyjmuje wartość true, natomiast jestem pewny że przyjmuje wartość 'required' gdyż jest to atrybut pola formularza
  1. <input type="text" name="field_1" required="required">


Jak zrobić aby formularz poddawany był walidacji?

W modelu utwórz akcję w której zadeklarujesz validatory, filtry. Np:

Register\Model\RegisterUser

  1. public function mojaValidacja()
  2. {
  3. $inputFilter = new InputFilter();
  4. $factory = new InputFactory();
  5.  
  6. $inputFilter->add($factory->createInput(array(
  7. 'name' => 'password',
  8. 'required' => true, // Dopiero ten parametr oznacza że pole jest wymagane. Jest on zbędny bo z tego co mi wiadomo domyślnie każde pole ma required = true.
  9. 'filters' => array(
  10. array('name' => 'StripTags'),
  11. array('name' => 'StringTrim'),
  12. ),
  13. 'validators' => array(
  14. 'name' => 'StringLength',
  15. 'options' => array(
  16. 'encoding' => 'UTF-8',
  17. 'min' => 6,
  18. 'max' => 100,
  19. ),
  20. ),
  21. 'name' => 'NotEmpty',
  22. 'options' => array(
  23. 'messages' => array(
  24. NotEmpty::IS_EMPTY => 'Mój własny komunikat w przypadku kiedy pole jest puste'
  25. )
  26. )
  27. )
  28. ),
  29. )));
  30. ...
  31. return $inputFilter;
  32. }


W kontrolerze:

  1. public function indexAction()
  2. {
  3. $form = new RegisterForm();
  4.  
  5. $request = $this->getRequest();
  6. if ($request->isPost()) {
  7. $registerUser = new RegisterUser();
  8. $form->setInputFilter($registerUser->mojaValidacja());
  9. $form->setData($request->getPost());
  10.  
  11. if($form->isValid()) {
  12. $validated_data = $form->getData();
  13. // kod wykonany po przejściu walidacji
  14. }
  15. }
  16. return array('form' => $form);
  17. }


Wtedy nasze dane poddawane są walidacji.

Cytat
prosze wytłumaczcie mi o co chodzi z funkcja $form->getData skoro i tak pokazują aby pobierac dane z klasy request? ($this->getRequest()->getPost());


Ten kod:
  1. $this->getRequest()->getPost();


Zwraca dane wpisane przez użytkownika

Kod:
  1. $form->getData();


Zwraca dane po walidacji

Wobraź sobie że użytkownik wpisuje w polu hasło takie coś:
<p>mojetajnehaslo</p>

Jeżeli po metodzie isValid() nie pobierzesz przefiltrowanych danych to walidacja nie ma zbytnio sensu. Ponieważ dalej będziesz operował na danych wpisanych przez użytkownika, a nie przefiltrowanych.
  Forum: Frameworki · Podgląd postu: #1058024 · Odpowiedzi: 2 · Wyświetleń: 535

RiE
Napisane: 13.10.2012, 08:38:12





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

Skrypt nie działa dlatego że w momencie wczytania pliku głównego nie ma elementu #navigation
Rozwiązaniem tego problemu może być użycie metody live()
  1. $(document).ready(function() {
  2. $("#navigation > li").live('click', function() {
  3. alert("OK");
  4. });
  5. aeroWin('#i1', '#d1', 920, 700);
  6. });
  Forum: JavaScript · Podgląd postu: #999079 · Odpowiedzi: 2 · Wyświetleń: 210

RiE
Napisane: 12.10.2012, 10:57:16





Grupa: Zarejestrowani
Postów: 97
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----

A czy koniecznie musi być nałożenie innego balonika na istniejący? Nie może być zamiana domyślnego na inny?
W stylach:
  1. .czerwony {
  2. background:url() //adres obrazka
  3. width: //szerokość obrazka
  4. height: //wysokość obrazka
  5. }
  6. .zielony {
  7. background:url() //adres obrazka
  8. width: //szerokość obrazka
  9. height: //wysokość obrazka
  10. }
  11. //itd


JQuery:
  1. var kolor;
  2.  
  3. $("li").hover(
  4. function () {
  5. kolor = $(this).attr('id');
  6. $('.gora').addClass(kolor);
  7. },
  8. function () {
  9. $('.gora').removeClass(kolor);
  10. }
  11. );


HTML
W miejscu gdzie są wszystkie kwadraciki z kolorem do wyboru, nalezy zrobić coś takiego:
Nazwa ID musi odpowiadać nazwie klasy (#czerwony -> .czerwony)
  1. <ul>
  2. <li id="czerwony"><img src="czerwony-kwadracik.jpg"><li>
  3. <li id="zielony"><img src="zielony-kwadracik.jpg"></li>
  4. </li>
  5.  
  6. <ul>


Nazwy elementów przyjąłem z mojego poprzedniego posta. Jeżeli są inne to wystarczy podmienić na własne.
Zaznaczę jeszcze że jest to dość prymitywny sposób, ale szalenie prosty.
  Forum: Po stronie przeglądarki · Podgląd postu: #998921 · Odpowiedzi: 6 · Wyświetleń: 454

2 Stron V   1 2 >

New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 10:40