Хотя я включаю файлы по классу в php, файл не видит никаких переменных - как будто их не существует - PullRequest
0 голосов
/ 18 января 2020

Я создал класс для создания виджетов. Вы вызываете функцию stati c, передаете переменные и получаете свой сладкий виджет.

Пока это работает, потому что я использую переменные, созданные в файле виджета. Но теперь я попытался использовать некоторую «глобальную» переменную, и она этого не видит.

Под «глобальными» я подразумеваю мои определенные глобальные переменные (не phps), такие как $ di c, который является объектом класса словаря.

Почему это так? Я действительно не хочу создавать эти переменные в каждом виджете.

Я думаю, это потому, что я создаю временный файл. (Мне нужно заменить {{ title }} действительным заголовком, поэтому я получаю код виджета, заменяю заголовок, создаю новый файл tmp с замененным заголовком и включаю его, затем удаляю)

Глобальная переменная:

$dic = new Dictionary(isset($_COOKIE["language"]) ? htmlspecialchars($_COOKIE["language"]) : _LANG); // THE GLOBAL VARIABLE

Код виджета:

<span>{{ title }}</span>
<form action="<?php echo Path::GetCurrentURL(); ?>" method="post">
  <?php // for some reason it doesn't see any global variables so you have to create then once more in widgets which drives me nuts ugh?>
   <input type="submit" name="logoutAdm" value="<?php $dic->Translate("Log out"); ?>">
</form>

Включение функции:

{
      $path = Path::Widgets("ShopPanelTitle.php");
      if (file_exists($path)) {
        $widget = file_get_contents($path);
        $widget = str_replace("{{ title }}", $title, $widget);
        $pathTmp = Tools::TMPName(".php",Path::TMP(""));
        echo $pathTmp;
        $file = fopen($pathTmp, "w+");
        fwrite($file,$widget);
        fclose($file);
        // for some reason it doesn't see any global variables so you have to create then once more in widgets
        include $pathTmp;
        unlink($pathTmp);
      }
}

Как я вызываю функцию:

<?php Widgets::ShopPanelTitle($dic->Translate("Main",true)) ?>

Нет более подходящего кода. Если вы хотите увидеть весь код, который используется, вопрос будет очень длинным и будет запрошен за раскрытие секретов компании: /.

Path :: Widgets - возврат пути к папке виджетов

Tools :: TMPName - вернуть случайное имя

Что я получу:

<span>Title</span>
<form action="currentPage.php" method="post">
</form>

Что я хочу получить:

<span>Title</span>
<form action="currentPage.php" method="post">
   <input type="submit" name="logoutAdm" value="Log out">
</form>

1 Ответ

1 голос
/ 19 января 2020

Благодаря Магнусу Эрикссону помогу я выяснил, насколько глупа была моя проблема.

Я заменил заполнитель {{title}} на $ title и заметил, что он работает просто отлично. Так что проблема была в области видимости, я должен был сказать функции не использовать локальную переменную $ di c, а "искать" глобальную "$ di c".

Код виджета:

public static function ShopPanelTitle($title)
 {
   global $dic;
   $path = Path::Widgets("ShopPanelTitle.php");
   if (file_exists($path)) {
     $title = $dic->Translate($title,true);
     include $path;
   } else {
     Tools::JSLog("Widget file " . $path . " doesn't exist.");
   }
 }

Виджет:

<span><?= $title ?></span>
<form action="<?php echo Path::GetCurrentURL(); ?>" method="post">
    <input type="submit" name="logoutAdm" value="<?= $dic->Translate("Log out"); ?>">
</form>

Вызов виджета:

<?php Widgets::ShopPanelTitle("Main") ?>

Так что, думаю, мне нужно кое-что почитать в топи c из переменная область действия .

Еще раз благодаря Магнус Эрикссон , очень полезно.

...