Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ajax i dostęp do danych zakodowanych JSON
Forum PHP.pl > Forum > XML, AJAX > AJAX
dragon7
Witam. Jak dostać się do elementów tablicy zakodowanej JSON?

  1. public function loadScheduleAction()
  2. {
  3. $em = $this->getDoctrine()->getEntityManager();
  4. $repository = $em->getRepository('MnsPytaniaBundle:Schedule');
  5. $qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder();
  6. $query = $repository->createQueryBuilder('s')->
  7. where($qb->expr()->between('s.date', ':date', ':date2'))->
  8. setParameters(array('date' => new \DateTime('-1days'), 'date2' => new \DateTime('+14days')))->
  9. orderBy('s.date', 'ASC')->
  10. addOrderBy('s.start', 'ASC')->
  11. getQuery();
  12. $results = $query->getResult();
  13.  
  14. $array = array();
  15. foreach($results as $result)
  16. {
  17. $array[] = array('date' => $result->getDate(), 'start' => $result->getStart(), 'end' => $result->getEnd());
  18. }
  19.  
  20. $return = json_encode($array);
  21.  
  22. return new Response($return, 200, array('Content-Type' => 'application/json'));


Gdy przy odbiorze robię takie coś:

CODE

('#schedule').ready(function()
{
$.post(Routing.generate('pytania_mod_load_schedule'),{
},function(data)
{
var items = [];

$.each(data, function(key, val) {
items.push('<li id="' + key + '">' + val + '</li>');
});

$('<ul/>', {
'class': 'my-new-list',
html: items.join('')
}).appendTo('body');

});
});


to otrzymuje parę Object object. Dostęp za pomocą val.date też daje object. Jak zrobić to poprawnie?
toffiak
val: jest tutaj obiektem którego właściwościami są: date, start i end, aby odwołać się do poszczególnych właściwości użyj:
Kod
val.date;
val.start;
val.end


Symfony2 posiada komponent Serializer, dzięki któremu nie musisz używać json_encode, w komponent ten wbudowane są także "normalizery" które przekształcają podane obiekty w wymagane:

Przykład użycia komponentu: kontroler zwraca wybrany, "odfiltrowany" obiekt klasy Product w wybranym formacie
  1. $product = $this->getDoctrine()->getEntityManager()->getRepository('AcmeDemoBundle:Product')->getActiveProductById($id);
  2. $productNormalizer = new ServiceProductNormalizer();
  3. $normalizedProduct = $productNormalizer->normalize($product);
  4. $serializer = new Serializer(array(), array('' . $_format . '' => $this->prepareEncoder($_format)));
  5. $data = $serializer->encode($normalizedProducts, '' . $_format . '');
  6. $response->setContent($data);
  7.  
  8. return $response;
dragon7
W moim przypadku akurat trzeba było zrobić val.date.date, bo pierwszy date to też obiekt. Z drugiej strony to co napisałeś dalej zainteresowało mnie. Mam rozumieć, że klasa ServiceProductNormalizer to Twoja własna klasa implementująca jakiś iterfejs?? No i co z funkcją prepareEncoder? Mój Netbeans o niej nie słyszał.
toffiak
3 dni po czasie ale odpowiem:
ServiceProductNormalizer to klasa implementująca Symfony\Component\Serializer\Normalizer\NormalizerInterface, służy ona do w moim przypadku do "przycięcia" właściwego obiektu Product do postaci tabeli w której znajdują sie tylko wybrane właściwości klasy Product.

Co do prependEncoder to powinienem napisać to wcześniej, jest to po prostu moja metoda pomocnicza kontrolera

  1. protected function prepareEncoder($format) {
  2. $encoder = null;
  3. switch ($format) {
  4. case 'json':
  5. $encoder = new JsonEncoder();
  6. break;
  7. case 'xml':
  8. $encoder = new XmlEncoder();
  9. break;
  10. default:
  11. $encoder = new JsonEncoder();
  12. break;
  13. }
  14. return $encoder;
  15. }


To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.