У меня есть приложение, основанное на 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
Спасибо за вашу помощь !
PHP не является языком на стороне клиента, Javascript - это. Вам нужно написать содержимое массива с помощью twig, потому что в js-коде вы не можете получить доступ к массиву php:
<script>
var items = {{ itemsjs }};
...
{% for i in items %}
alert ('{{ i.name }}');
{% endfor %}
...
alert('{{ i.name }}')
view source
в вашем браузере). Вы увидите ТОЧНО, какую веточку выплюнул для этого{{ itemjs }}
, и это скажет вам, как получить доступ к тому, что находится в ней.