Как получить доступ к массиву php в jquery

0

У меня есть приложение, основанное на symfony 2.3. В jQuery части моего файла twig мне нужно получить доступ к массиву php. Я не уверен, как это достичь.

То, что я пробовал:

В контроллере:

public function indexAction() 
{
    ...
    $items = $em->getRepository('MyBundle:Item')->findBy(array(), array('position' => 'ASC')); 
    //$itemsjs = json_encode($items);
    ...
    return $this->render('MyBundle:Default:index.html.twig', array(
        ...,
        'items' => $items,
        'itemsjs' => $itemsjs,
        ...,
    ));
}

В начале файла TWIG у меня есть:

<script>
var cal1 = $('#cal1');
var cal2 = $('#cal2');
...

function fillCalendar(mois, annee, cal)
{
    cal.css('display', 'none');
    var id = $(cal).attr('id');
...

function changeMonths(step)
{
    ...
    {% for item in items %}
        fillCalendar(newMonth-12*Math.floor((newMonth)/13), newYear+Math.floor((newMonth)/13), {{ 'cal' ~ item.id }});
    {% endfor %}
    ...

Любая помощь будет приятной...

EDIT: Дополнительная информация о моем приложении: эта часть основана на http://www.symfocal.com/ Но мне нужно изменить способ отображения календарей.
Я изменил код, вдохновленный вашими ответами
Не нужно преобразовывать php-массив в json-формате - его передают на ветку, поэтому массив должен быть доступен для веточки.
Я получаю 2 строки, но работает только первый (появляются дни)
Если я считаю сгенерированный HTML, то создается впечатление, что цикл {% for item in items%} работает неправильно:
{{'cal' ~ item.id}} становится всегда cal1, но для второй строки он должен стать cal2 (в базе данных есть два элемента с идентификаторами 1 и 2)

EDIT2: я изменил код: я заменил:

{{ 'cal' ~ item.id }}

от:

'cal{{ item.id }}' 

Протестировано

alert ('cal{{ item.id }}'); 

в цикле => работает Но в функции fillCalendar я получу ошибку, которой я раньше не был: Uncaught TypeError: Object cal1 не имеет метода 'css'

Поэтому, когда я звоню в цикле:

fillCalendar(newMonth-12*Math.floor((newMonth)/13), newYear+Math.floor((newMonth)/13), 'cal{{ item.id }}' );

Я получаю эту ошибку в этой инструкции: cal.css('display', 'none'); Но я определил cal1 и cal2, как вы можете видеть, поэтому я не понимаю!

EDIT3: OK Я тоже решил эту проблему : Uncaught TypeError: Object # <HTMLBodyElement> не имеет метода 'css' Но теперь даты не заполняются - идентификатор элементов кажется правильным:

...
<td class="cell_calendar"><a id="cal1_cell_5" href="#"></a></td>
...

(В оригинальном symfocal id делает заливку:

<a id="cal1_cell_5" href="#" title="2013-11-01">1</a> 

)

Ошибка JS не возникает!

EDIT4: я добавил еще одну строку в исходном коде выше:

var id = $(cal).attr('id');

Я изменил его, прежде чем он был var id = cal.attr('id'); но, как вы видели с модификациями, я сделал это, не работая больше. Только мне кажется, что я не могу получить идентификатор таким образом (позже, когда я обманул его неопределенным)

Как я могу получить этот идентификатор, чтобы он работал?

EDIT5: Исходная проблема решена. Для последней проблемы jquery я сделал новое сообщение: не могу получить attr id с jquery

Спасибо за вашу помощь !

  • 1
    посмотрите на сгенерированный источник страницы (например, view source в вашем браузере). Вы увидите ТОЧНО, какую веточку выплюнул для этого {{ itemjs }} , и это скажет вам, как получить доступ к тому, что находится в ней.
  • 0
    @MarcB Не «точно», браузер может изменить, если это неправильная разметка.
Показать ещё 2 комментария
Теги:
arrays

1 ответ

0

PHP не является языком на стороне клиента, Javascript - это. Вам нужно написать содержимое массива с помощью twig, потому что в js-коде вы не можете получить доступ к массиву php:

<script>
var items = {{ itemsjs }};
...
{% for i in items %}
    alert ('{{ i.name }}');
{% endfor %}

...
  • 0
    Хорошо, но когда я пытаюсь это {% для я в пунктах%} alert (i); {% endfor%} Я получаю сообщение об ошибке, что я не определен - поэтому я пришел к выводу, что мне тоже нужно получить доступ к i в ветке. Я изменил свой код и отредактировал пост: но цикл, кажется, не работает правильно
  • 0
    upps, alert('{{ i.name }}')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню