Вызов php функции из js

Главные вкладки

Аватар пользователя Sart_ Sart_ 1 марта 2018 в 2:13

Доброго времени суток. При темизации часто использую вызовы фунций (<?php
krumo($node);?> или значений полей вида ( print render($content['title_field']); или
print ($node->field_products_price['und'][0]['value']); ). Иногда field_view_field(), - хотя и знаю что так более правильно.

Сейчас возникла потребность из разметки, которую строит JS вывести к примеру <?php
$node->field_products_price['und'][0]['value']);?>. Инструкции есть двойные кавычки "<?php
$node->field_products_price['und'][0]['value']);?>" и можно передавать значение переменной в js.
Но нужно не значение передать а вызвать эту переменную в нужном месте верстки. Но верстку создает java script и более того с координатной сеткой.
И надо чтобы этот вызов произошел в месте на этой координатной сетке.

Небольшой участок скрипта для примера

......
var $content = $('Content');
if (!!marker.content) $content.text(marker.content);
$content.on('change keydown paste input', function() {
marker.content = $content.text();
});
$text_box.append($content);
.......

Если например так $text_box.append("<?php krumo($node);?>"); то на выходе "<"!--?php krumo($node);?--">" . Оно и понятно учитывая что через ".append". Вот пол дня потратил, но подходящего способа привязать к макету (создаваемому java script) php функцию не нашел. Может у кого идеи будут как это сделать, а то мои закончились.

Комментарии

Аватар пользователя gun_dose gun_dose 1 марта 2018 в 6:51

Пхп выполняется на сервере. Жс в браузере. Поэтому никак.
Однако, судя по коду из вашего примера, вам просто достаточно перейти а вкладку devel со страницы нужной ноды.

Аватар пользователя gun_dose gun_dose 1 марта 2018 в 9:09
1

AJAX нужен для того, чтобы страница обменивалась данными с удалённым сервером, а не для вызова произвольного пхп-кода. Это очень существенный момент. Кроме того, в рамках веб-страницы переменная $node не существует и не может существовать. Соответственно и при вызове аякса она будет другая. Можно конечно передать айдишник и загрузить ноду, но это будет совсем не то, что хочет автор, т.к. придётся объявлять новый роут и писать клиентский js для обработки ответа этого роута.

Поэтому да, автору нужно переосмыслить задачу и подтянуть матчасть.

Аватар пользователя Sart_ Sart_ 2 марта 2018 в 12:46

Да, переосмыслил. - помогло. C JS знаком был очень поверхностно.
Что помогло решить задачу:
Вывел на участке страницы php функцию обернул в <'div> с нумерацией в названии класса.
$x = 0;
while ($x++<$t) {
print '<'div class="image-marker__text-box green row row_';
print $x;
print '">';
print ($items[$x]);
print '<'/div>';
}

Дальше, как оказалось есть такой замечательный jQuery метод .offset().
Можно получать координаты элемента и тут же передавать. И вместо того чтобы пытаться вызвать функцию в нужных местах координатной сетки, просто переместил область, где она вызвана в места, где она должна выводится по задумке.

function() {
var ofs = $('.row.row_1.ui-draggable.ui-draggable-handle').offset();
$('.image-marker__text-box.green.row.row_1').offset(ofs);
var ofs = $('.row.row_2.ui-draggable.ui-draggable-handle').offset();
$('.image-marker__text-box.green.row.row_2').offset(ofs);
var ofs = $('.row.row_3.ui-draggable.ui-draggable-handle').offset();
$('.image-marker__text-box.green.row.row_3').offset(ofs);
}

P.S. Наверное более правильно было бы парсить JSON файл с координатами, а не копировать и передавать уже выведенные через java script, но тут надо уже подтянуть мат. часть более основательно. А пока такой вариант вроде работает.

P.P.S. Совет переосмыслить был очень кстати, оказалось, можно довольно просто решить если зайти с другой стороны.))

Аватар пользователя fairrandir fairrandir 2 марта 2018 в 13:01
1

Заверните пожалуйста код в тэг. Читать сложно.

И почитайте документацию по foreach.

<?php
foreach ($items as $key => $item) {
  print 
'<div class="image-marker__text-box green row row_' $key '">' $item '</div>';
}
?>
Аватар пользователя Sart_ Sart_ 2 марта 2018 в 13:44

Да, код не сообразил как-то, но после комментариев уже поправить не выходит.

По foreach очень существенное замечание, спасибо - так намного удобнее писать.