Доступ к пространству имен Javascript из файла phtml

0

Я использую файл phtml, который должен читать статический объект json из файла javscript, размещенного на том же сервере.

У меня возникли проблемы с доступом к объекту JSON, чтобы я мог манипулировать им и заставить его отображаться на экране (в конечном итоге с соответствующими якорями и т.д.),

Вот как я пытаюсь получить доступ к объекту, но php является относительно новым для меня.

<?php
require_once '/path/to/my/resource.js';
$json = ns.path.VARIABLE;
?>
<?php echo $json; ?>

И мой файл javascript, расположенный по адресу /path/to/my/resource.js:

ns.path.VARIABLE = {
    Part1: {
        'Key1': 'Value1',
        'Key2': 'Value2'
    }
    Part2: {
        'Key1': 'Value1',
        'Key2': 'Value2'
    }
}

У меня нет успеха. Я могу сказать, что файл js становится включенным в ответ на браузер, но я не могу перейти к объекту VARIABLE Json.

Любая идея о том, как получить доступ к JSON, который я буду анализировать и отображать в браузере?

Теги:
require

2 ответа

1

Это невозможно. PHP работает на сервере, а JS работает на клиенте. Ваш лучший шанс - удалить часть ns.path.VARIABLE из вашего файла и прочитать ее как фактический файл JSON с помощью file_get_contents() на нем

пример

resource.json

{
    Part1: {
        'Key1': 'Value1',
        'Key2': 'Value2'
    }
    Part2: {
        'Key1': 'Value1',
        'Key2': 'Value2'
    }
}

PHP-код

<?php 

$json = json_parse(file_get_contents('resource.json'));

Просто как тот!

РЕДАКТИРОВАТЬ

На конкретном коде, который вы опубликовали, вы можете сделать следующее, но оно не выглядит безопасным или гибким:

// Load the file as a string
$js_string  = file_get_contents('resource.js');
// Remove the namespace part so that you can parse it as a JSON string
$js_string = str_replace('ns.path.VARIABLE =', '', $js_string);
// Convert it to an associative array you can use in PHP
$array = json_decode($js_string);
0

Здесь есть несколько вещей. Прежде всего, то, что вы называете JSON, на самом деле не является JSON. Запустите его через инструмент, подобный http://jsonlint.com/, и вы увидите. Правильный JSON должен выглядеть так:

{
    "Part1": {
        "Key1": "Value1",
        "Key2": "Value2"
    },
    "Part2": {
        "Key1": "Value1",
        "Key2": "Value2"
    }
}

Кроме того, вы смешиваете PHP и Javascript. Как уже говорили другие, JS работает в браузере, PHP работает на сервере. Вы не можете смешивать их так, как вы пытаетесь. Ответ @Loupax предоставлен в основном правильно, но я считаю, что это можно сделать намного проще. И это не потребует, чтобы ваш включенный файл был JSON, обычный JS-объект. (есть разница); Что-то вроде этого:

<script type="text/javascript">
   var ns = {
      path: {}
   };
   <?= include '/path/to/my/resource.js'; // this will just paste the contents of that file inside this script block before sending it to the browser ?>;
   // here you can use that object 
   console.log(ns.path.VARIABLE.Part1.Key1); 
</script>

Обратите внимание: сначала мне нужно было создать объект ns объектом path внутри, чтобы иметь возможность назначить ему объект VARIABLE. Это также предполагает, что вы сохранили этот так называемый файл JSON как есть, за исключением отсутствующей запятой между Part1 и Part2

Трудно сказать только из фрагмента вашего кода, но я думаю, что вам, вероятно, удастся просто назвать его variable, и тогда вам не придется делать этот первый шаг. Кроме того, немного советов, старайтесь быть последовательными при именовании переменных. Общий консенсус в том, что классы начинаются с прописных букв, функций и переменных с строчными буквами, а константы - в верхнем регистре. Вам не обязательно следовать этим правилам, но просто старайтесь придерживаться своего выбора. Это упростит кодирование и отладку.

Как вывод, мой код, вероятно, будет выглядеть примерно так:

файл //include.js

{
    part1: {
        key1: 'Value1',
        key2: 'Value2'
    },
    part2: {
        key1: 'Value1',
        key2: 'Value2'
    }
}

view.phtml

<script type="text/javascript">
   var paths = <?= include 'file/to/include.js'; ?>;
   console.log(paths.part1.key1); 
</script>

Ещё вопросы

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