如何使用UIKit将数据内容从外部JSON注入到一个模式中?

时间:2018-07-06 作者:tiomak

请给我指一下正确的方向。

在一个页面上,我展示了许多产品。数据来自外部json,该json通过jquery/ajax调用,然后通过称为Handlebar(js)的javascript模板引擎显示数据。

通过单击产品,我想显示一个包含产品详细信息的模式。我正在使用一个使用UIkit的主题,所以我想依赖UIkit的modal功能。在我的本地环境中,这是可能的,通过产品id加载json文件(再次使用ajax/jquery调用)。然而,当试图在wordpress内部实现相同的功能时,模式不会显示json中的任何内容(数据),并且保持为空。

我做的最后一次尝试来自本教程:https://gist.github.com/wondergryphon/ab7647c13c36cefb1a0032f1dea9233a 但这并没有让我一事无成。所以我真的不知道这是不是一条正确的道路。代码如下:

首先是触发模式的HTML模板:

   <!-- container where the template gets displayed -->
        <div id="container" class="grid"></div>
  <!-- handlebars template -->    
    <script id="template" type="text/x-handlebars-template">
        <section class="gallery">
            {{#each this}} {{#ads}}
                <article class="item {{category}}">
                    <h3 class="titel">{{brand}}</h3>
                    <img src={{images.0.small}} />
                    <p class="text">{{text}}</p>
              <!-- button toggling the modal -->
                    <button id="md_button" data-id="{{id}}" class="uk-button uk-button-danger" uk-toggle="target: #modal-close-default">Load Modal</button>
                </article>
            {{/ads}} {{/each}}
        </section>
    </script>
</div>   

<!-- modal -->
<div id="dv_modal" class="modal" uk-modal>
<div id="modal_target" class="uk-modal-dialog uk-modal-body">
    <button class="uk-modal-close-default" type="button" uk-close></button>
    <!-- content in functions.php -->
</div>

然后将此函数设置为函数。php

function fetch_modal_content() {
if ( isset($_REQUEST) ) {
$post_id = $_REQUEST[\'id\'];
?>
        <div class="uk-modal-header">
        <h2 class="uk-modal-title"></h2>
        <?php echo get_the_title($post_id); ?>
        </div>

<div class="uk-modal-body">
  <?php echo wpautop(get_the_content($post_id)); ?>
</div>

<?php
}
die();
}
add_action( \'wp_ajax_fetch_modal_content\', \'fetch_modal_content\' );
add_action( \'wp_ajax_nopriv_fetch_modal_content\', \'fetch_modal_content\' ); 
最后一个自定义javascript文件:

var $button = $(\'#md_button\');
var $modal = $(\'#dv_modal\');
var $modal_target = $(\'#modal_target\');

$button.click(function() {

var id = $(this).data(\'id\');

$.ajax({
url: \'https://www.example.json\' + id,
dataType: \'json\',
data: {
  \'action\' : \'fetch_modal_content\',
  \'id\' : id
  },
success:function(data) {
      var data = data.T.ads;
      //console.log(JSON.stringify(data));
      $modal.find(\'.uk-modal-title\').html(data[0].brand);

htmlData = \'<p>\' + data[0].text + \'</p>;

  $modal_target.html(data);
  $modal.modal(\'show\');
}
});
}); 

1 个回复
SO网友:tiomak

好啊我找到的解决方案比我想象的要简单。在脚本上,使用“jQuery”而不是“$”。HTML触发器:

<a href="#myModal" onclick=javascript:openModal({{id}})><article>... 
</article></a>

function openModal(id){

jQuery.ajax({
    type: "GET",
    url: \'https://www.example.json\' + id,
    dataType: \'json\',
    success: function(data) {
        var data = data.T.ads;
        var infoModal = jQuery(\'#myModal\');
        infoModal.find(\'.uk-modal-title\').html(data[0].brand + \' \' + data[0].model);

        htmlData = \'<p>\' + data[0].text + \'</p>;

        infoModal.find(\'.uk-modal-body\').html(htmlData);
        UIkit.modal(infoModal).show();
    }
});

return false;
}

结束