Создайте DOM ID с переменными php, используя цикл php foreach - PullRequest
2 голосов
/ 28 мая 2019

Фон

Я встраиваю твиты с помощью заводской функции Javascript в Твиттере. Документация здесь .

Функция вставки Javascript в Twitter:

    twttr.widgets.createTweet(
      '20',
      document.getElementById('container'),
      {
        theme: 'dark';
      }
    );

В документации указано, что в документе необходим элемент с идентификатором DOM 'container'.

    <div id="container"></div>

Что я делаю с этой функцией

В приведенном выше примере, представленном в документации Твиттера, добавлен твит с идентификатором «20». На своей странице я встраиваю первое x количество твитов по определенной теме, используя идентификаторы, предоставленные в ответе JSON от запроса searchTweets . Ответ сохраняется в $string в виде строки json_decoded.

Моя проблема:

Мне нужно пройтись по элементам в ответе JSON, чтобы получить идентификаторы твитов для добавления в функцию twttrwidgets.createTweet.

В настоящее время я жестко кодирую функцию createTweet - единственный динамический бит - это создание элементов и идентификаторов DOM для передачи каждой из функций.

Попытка 1: цикл по каждому элементу создает и увеличивает ID

    <?php

    $i = 1;
    foreach ($string as $tweets)
    {
    //echo '<div id="tweet'.$i'" tweetID'.$i'="'$tweets['id']'"></div>';
    ?>

      <div id="tweet.<?php echo $i?>" tweetID.<?php echo $i?>="<?php echo         $tweets['id']?>"></div>
    <?php
    //  echo "<div id='tweet' tweetID='1130852255945486337'></div>"
      $i++;
    }
     ?>

Примечание. Я подтвердил, что $tweets['id'] дает идентификаторы в ответе json, как я тестировал, просто распечатав все $tweets['id'] на странице

Цель этого цикла - создать что-то вроде этого

    <div id="tweet1" tweetID1="123abc"></div>
    <div id="tweet2" tweetID2="123abc"></div>
    <div id="tweet3" tweetID3="123abc"></div>
    <div id="tweet4" tweetID4="123abc"></div>

Я понимаю, как у меня в данный момент есть цикл, он будет создавать столько же div, сколько было элементов в JSON - это нормально для меня сейчас.

После этого я бы создал твиты с последующим кодом.

    <script>

    window.onload = (function(){

    var tweet1 = document.getElementById("tweet1");
    var id1 = tweet1.getAttribute("tweetID1");

    var tweet2 = document.getElementById("tweet2");
    var id2 = tweet2.getAttribute("tweetID2");

    var tweet3 = document.getElementById('tweet3');
    var id3 = tweet3.getAttribute("tweetID3");

    var tweet4 = document.getElementById("tweet4");
    var id4 = tweet4.getAttribute("tweetID4");

    twttr.widgets.createTweet(
      id1, tweet1,
      {
        conversation : 'none',    // or all
        cards        : 'hidden',  // or visible
        linkColor    : '#cc0000', // default is blue
        theme        : 'light',    // or dark
        align        : 'center'
      })
    .then (function (el) {
      el.contentDocument.querySelector(".footer").style.display = "none";
    });

  //3 more blocks just like twttr.widgets.createTweet(){...} with correct params

Это не сработало, и я не могу понять, почему. Этот код работает, если я жестко кодирую в 4 из идентификаторов, как я упоминал в цели цикла. Вот и снова.

    <div id="tweet1" tweetID1="123abc"></div>
    <div id="tweet2" tweetID2="123abc"></div>
    <div id="tweet3" tweetID3="123abc"></div>
    <div id="tweet4" tweetID4="123abc"></div>

Вот весь мой скрипт php. Обратите внимание, что это не включает файл APIwrapper, включенный в начало, и мои токены и ключи были отредактированы.

    <?php

    //echo "<h2>Simple Twitter API Test</h2>";

    require_once('TwitterAPIExchange.php');

    /** Set access tokens here - see: https://dev.twitter.com/apps/ **/
    $settings = array(
        'oauth_access_token' => "",
        'oauth_access_token_secret' => "",
        'consumer_key' => "",
        'consumer_secret' => ""
    );

    $url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
    $requestMethod = "GET";
    if (isset($_GET['user']))  {$user = preg_replace("/[^A-Za-z0-9_]/", '', $_GET['user']);}  else {$user  = "iagdotme";}
    if (isset($_GET['count']) && is_numeric($_GET['count'])) {$count = $_GET['count'];} else {$count = 20;}
    $getfield = "?screen_name=$user&count=$count";
    $twitter = new TwitterAPIExchange($settings);
    $string = json_decode($twitter->setGetfield($getfield)
    ->buildOauth($url, $requestMethod)
    ->performRequest(),$assoc = TRUE);
    if(array_key_exists("errors", $string)) {echo "<h3>Sorry, there was a problem.</h3><p>Twitter returned the following error message:</p><p><em>".$string[errors][0]["message"]."</em></p>";exit();}


     ?>


    <?php

    $i = 1;
    foreach ($string as $tweets)
    {
      echo '<div id="tweet'.$i'" tweetID'.$i'="'$tweets['id']'"></div>';
    //  echo "<div id='tweet' tweetID='1130852255945486337'></div>"
      $i++;
    }
     ?>


    <html><body>

    <script sync src="https://platform.twitter.com/widgets.js"></script>

    <script>

      window.onload = (function(){

        var tweet1 = document.getElementById("tweet1");
        var id1 = tweet1.getAttribute("tweetID1");

        var tweet2 = document.getElementById("tweet2");
        var id2 = tweet2.getAttribute("tweetID2");

        var tweet3 = document.getElementById('tweet3');
        var id3 = tweet3.getAttribute("tweetID3");

        var tweet4 = document.getElementById("tweet4");
        var id4 = tweet4.getAttribute("tweetID4");

        twttr.widgets.createTweet(
          id1, tweet1,
          {
            conversation : 'none',    // or all
            cards        : 'hidden',  // or visible
            linkColor    : '#cc0000', // default is blue
            theme        : 'light',    // or dark
            align        : 'center'
          })
        .then (function (el) {
          el.contentDocument.querySelector(".footer").style.display = "none";
        });

        twttr.widgets.createTweet(
          id2, tweet2,
          {
            conversation : 'none',    // or all
            cards        : 'hidden',  // or visible
            linkColor    : '#cc0000', // default is blue
            theme        : 'light',    // or dark
            align        : 'center'
          })
        .then (function (el) {
          el.contentDocument.querySelector(".footer").style.display = "none";
        });

        twttr.widgets.createTweet(
          id3, tweet3,
          {
            conversation : 'none',    // or all
            cards        : 'hidden',  // or visible
            linkColor    : '#cc0000', // default is blue
            theme        : 'light',    // or dark
            align        : 'center'
          })
        .then (function (el) {
          el.contentDocument.querySelector(".footer").style.display = "none";
        });

        twttr.widgets.createTweet(
          id4, tweet4,
          {
            conversation : 'none',    // or all
            cards        : 'hidden',  // or visible
            linkColor    : '#cc0000', // default is blue
            theme        : 'light',    // or dark
            align        : 'center'
          })
        .then (function (el) {
          el.contentDocument.querySelector(".footer").style.display = "none";
        });

      });

    </script>
    </body></html>

Я считаю, что проблема заключается в динамическом создании элементов <div></div>, но я не могу понять, почему на этом этапе. Я делаю это правильно? Я уверен, что есть гораздо более эффективный способ сделать это, но похоже, что он должен работать.

Моя проблема уникальна для возможного дубликата, предоставленного, потому что проблема не в том, чтобы прикрепить событие к идентификатору, а в фактическом создании самого идентификатора, а моя проблема конкретно в php.

1 Ответ

2 голосов
/ 29 мая 2019

Вы пропустили некоторые операторы concat в этой строке.

// What you have
echo '<div id="tweet'.$i'" tweetID'.$i'="'$tweets['id']'"></div>';

// Correct
echo '<div id="tweet'.$i.'" tweetID'.$i.'="'.$tweets['id'].'"></div>';

Также обратите внимание на комментарий Chay22 о том, что ваш вывод находится за пределами тегов html. Все остальное в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...