【问题标题】:Issues appending strings in PHP在 PHP 中附加字符串的问题
【发布时间】:2017-11-28 09:26:19
【问题描述】:

我正在使用 Codeigniter 并编写了一个方法来创建 css/js 链接,将它们连接起来,然后将它们传递给我的视图。它以前可以工作,直到我决定使用最新的 CI 版本创建项目的干净副本,但现在无法正常工作。

连接数据的方法部分如下:

foreach ($header_css as $item) {
   $str .= '<link rel="stylesheet" href="'. base_url() . $item . '" type="text/css" />';
}

JS 文件也有类似的。打印上一段代码时,我得到一个空字符串,所以我决定使用 htmlentities:

foreach ($header_css as $item) {
   $str .= htmlentities('<link rel="stylesheet" href="'. base_url() . $item . '" type="text/css" />');
}

它可以工作......部分。我的意思是,如果我此时打印带有链接的字符串,但是现在当我将字符串传递给视图时,数据将打印在屏幕上,而不是添加到头部。所以这是我的观点:

<!doctype html>

<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?php echo (isset($title)) ? $title : ''; ?></title>
    <meta name="description" content="Test">
    <meta name="author" content="Test">

    <?php
        # load assets
        echo (isset($assets)) ? $assets : '';
    ?>

    <script>var ajax_home = "<?php echo base_url(); ?>ajax/";</script>
</head>

<body>

与资产相呼应的部分是在屏幕上打印变量的内容,而不是将资产解析为&lt;script&gt;...&lt;/script&gt;&lt;link rel="stylesheet" ... /&gt;

有任何迹象表明为什么会发生这种情况?

谢谢。

【问题讨论】:

  • 我不明白你到底想要什么。你能发布更多的代码吗?那么你的 foreach 放在哪里,变量$assets 是在哪里以及如何定义的?您对 HTML 输出的确切期望是什么?您当前的输出是什么?它会帮助我们帮助你;)
  • @be-ndee 对不起。不太确定我在解释中遗漏了什么。我需要的是 $assets 的内容不要打印在屏幕上,而是实际加载资产。 Asses 是一个字符串,例如:'127.0.0.1/storedashboard/assets/css/bootstrap/bootstrap.min.css" type="text/css" />127.0.0.1/storedashboard/assets/DataTables/datatables.min.css" type="text/css “ />”。同样,这是在屏幕上打印的内容,而不是实际为资产创建 html 源
  • 那么您的 foreach 循环正在生成 $str 并且您正在将 $assets 传递到您的视图中......这是什么以及如何发生的? (注意:你应该在循环之前初始化 $str 否则 PHP 会抛出一个警告......

标签: javascript php css html codeigniter


【解决方案1】:

连接数据的方法部分如下:

foreach ($header_css as $item) {
   $str .= '<link rel="stylesheet" href="'. base_url() . $item . '" type="text/css" />';
}

JS 文件也有类似的。打印前一段代码时,我得到一个空字符串,所以我决定使用 htmlentities: 下面的代码不是用于 JavaScript,而是用于样式表

foreach ($header_css as $item) {
   $str .= htmlentities('<link rel="stylesheet" href="'. base_url() . $item . '" type="text/css" />');
}

应该是这样的,

foreach ($header_js as $item) {
  $str .= "<script type='text/javascript' src='". base_url() . $item . "'/>";
}

& 你的观点有(咳咳!):

<?php
  # load assets
  echo (isset($assets)) ? $assets : '';
?>

所以,我的问题是:

  1. $str 变量在哪里以及为什么不使用内部视图而不是 $assets 它应该是 echo (isset($str)) ? $str : '';
  2. 我假设您在控制器中使用您的函数作为方法并在其中存储所有 js 和 css 文件构建 多变的。所以..are you returning that $str variable.. ?

好吧,这是给你的一些例子,希望你能解决你的问题:)

/**
 * Build Css or Script link
 * @param  array  $assets [description]
 * @param  string $type   [description]
 * @return [type]         [description]
 */
function build_assets($assets = array(), $type = 'css')
{
    $str = '';
    if (!empty($assets) && is_array($assets) && $type == 'css') {
        foreach ($assets as $key => $file) {
            $str .= "<link type='text/css' rel='stylesheet' href='" . base_url($file) . ".css' />";
        }
    } elseif (!empty($assets) && is_array($assets) && $type == 'javascript') {
        foreach ($assets as $key => $file) {
            $str .= "<script type='text/javascript' src='" . base_url($file) . ".js'></script>";
        }
    }
    return $str;
}
/**
 * Testing the method
 * @return [type] [description]
 */
function index()
{
    $data = [];
    // get all style sheets
    $style = $this->build_assets(['style', 'page', 'form']);
    // get all js files
    $script = $this->build_assets(['style', 'page', 'form'], 'javascript');
    // assign in 'assets' variable
    $data['assets'] = $style . $script;
    // send to template/view
    $this->load->view('ViewTemplate', $data);
}

&查看代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CodeIgniter</title>
    <!-- CSS and JavaScript -->
    <?php echo isset($assets) ? $assets : '' ?>
    <!-- End Here -->
</head>
<body>
   <di class="welcome">Say Hello to CodeIgniter!!!</di> 
</body>
</html>

【讨论】:

  • 这正是我所拥有的。我的“build_assets”方法在一个助手中,我从控制器调用它,然后将它传递给视图。 build_assets 的返回是返回“”。如果我使用 htmlentities 那么它会返回正确的字符串,但是在视图中回显它时会将内容打印到屏幕中
  • 这个问题肯定与字符有关。我刚刚将它们从字符串中删除,并且正在打印结果。我是否需要打开/关闭任何 CI 设置才能允许这些字符?
  • 它现在正在工作(出于某种我仍然不明白的原因)。尽管如此,字符串并未打印在屏幕上,但正在加载源。感谢您的帮助
  • @johansebasb 很高兴我能帮助你,如果你没有得到数据或空值,那么你可以通过 print_r() 在你的控制器或辅助函数中检查,以了解你的代码在哪里中断。我认为您不需要 htmlentities,因为您没有在文件名中发送任何 html 字符,因此只需 build_assets 并打印来自辅助函数的内容...&一件事您可以通过查看源查看您的字符串。它不会显示在页面中,因为您在 html head 部分而不是在 body 部分中回显资产..
猜你喜欢
  • 2016-06-11
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多