We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 14806
    • 72 Posts
    Добрый день,

    решил выводить ссылки на новые статьи с сайта modx на фотогалерею, для этого воспрользовался JSON. К сожалению, наткнулся на множество нюансов, некоторые из которых поборол, некоторые нет.

    1. Оказалось, что если в поле introtext содержатся коды новой строки, то JSON нарушается, поэтому создал собственные темплейты, чтобы исключить introtext из вывода.
    2. Пробовал парсить результат через jQuery, наткнулся на проблему невозможности прямого парсинга результатов с другого домена, в итоге, решил обрабатывать результаты на php.
    3. Сейчас столкнулся с тем, что json_decode() не работает с выводом Ditto, вот пример:

    $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
    var_dump(json_decode($json));
    var_dump(json_decode($json, true));
    
    $content = file_get_contents('http://imagemaster.ru/json.js');
    
    var_dump($content);
    var_dump(json_decode($content));
    var_dump(json_decode($content, true));
    


    В итоге получаем:
    http://imagemaster.ru/json.js - исходный json
    http://gallery.imagemaster.ru/jparser.php - парсер smiley

    object(stdClass)#1 (5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) } 
    
    array(5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) } 
    
    string(615) " { "title":"json", "link":"http://imagemaster.ru/json.js.html", "description":"", "language":"ru", "copyright":"ImageMaster - все о цифровой фотографии 2009", "ttl":"120", "entries":[ { "title":"Bibble 5.0.1", "url":"http://imagemaster.ru/bibble-5-0-1.html", }, { "title":"Save As или Save for Web", "url":"http://imagemaster.ru/save-for-web-vs-save-as.html", }, { "title":"Правила фотогалереи", "url":"http://imagemaster.ru/gallery-rules.html", }, { "title":"DxO Optics Pro 6.1.2", "url":"http://imagemaster.ru/195.html", } ] }" 
    
    string(615) " { "title":"json", "link":"http://imagemaster.ru/json.js.html", "description":"", "language":"ru", "copyright":"ImageMaster - все о цифровой фотографии 2009", "ttl":"120", "entries":[ { "title":"Bibble 5.0.1", "url":"http://imagemaster.ru/bibble-5-0-1.html", }, { "title":"Save As или Save for Web", "url":"http://imagemaster.ru/save-for-web-vs-save-as.html", }, { "title":"Правила фотогалереи", "url":"http://imagemaster.ru/gallery-rules.html", }, { "title":"DxO Optics Pro 6.1.2", "url":"http://imagemaster.ru/195.html", } ] }" 
    
    string(615) " { "title":"json", "link":"http://imagemaster.ru/json.js.html", "description":"", "language":"ru", "copyright":"ImageMaster - все о цифровой фотографии 2009", "ttl":"120", "entries":[ { "title":"Bibble 5.0.1", "url":"http://imagemaster.ru/bibble-5-0-1.html", }, { "title":"Save As или Save for Web", "url":"http://imagemaster.ru/save-for-web-vs-save-as.html", }, { "title":"Правила фотогалереи", "url":"http://imagemaster.ru/gallery-rules.html", }, { "title":"DxO Optics Pro 6.1.2", "url":"http://imagemaster.ru/195.html", } ] }"
    


    Т.е. простейший пример распарсился, а json с сайта нет. Может кто подсказать, как таки распарсить эту строчку? Мне просто нужно получить список ссылок на статьи с названиями.

    Upd: Решил проблему, дело было в лишней крайней запятой внутри entries.
      • 14806
      • 72 Posts
      Решил здесь рассказать, как я сделал вывод в JSON:

      1. Создал страницу json.js, тип содержимого: text/javascript.

      [!Ditto? &summarize=`8` &parents=`3` &depth=`4` &hideFolders=`1` &paginate=`0` &truncLen=`400` &tpl=`json_tpl`  &tplLast=`json_tpl_last` &format=`json` &language=`russian-UTF8`!]


      В ней описал вызов Ditto и передал два темплейта, обычной и крайней записей.

      2. Создал чанки:

      json_tpl
      	{
      	 "title":"[+json_pagetitle+]",
      	 "url":"[(site_url)][~[+id+]~]",
      	 "description":"[+json_description+]"
      	},
      


      json_tpl_last
      	{
      	 "title":"[+json_pagetitle+]",
      	 "url":"[(site_url)][~[+id+]~]",
      	 "description":"[+json_description+]"
      	}
      


      Код для чанков взял из assets/snippets/ditto/formats/json.format.inc.php, выкинув ненужное. Заметьте, код в json.format.inc.php судя по всему неправильный, т.к. там присутствует запятая после крайнего элемента, а из-за этого не работает парсинг json_decode.

      3. Создал на фотогалерее файл modx_json.php:

      <?php
      
      function utf8_to_cp1251($s)
      {
      	for ($c=0;$c<strlen($s);$c++)
      	{
      	   $i=ord($s[$c]);
      	   if ($i<=127) $out.=$s[$c];
      		   if ($byte2){
      			   $new_c2=($c1&3)*64+($i&63);
      			   $new_c1=($c1>>2)&5;
      			   $new_i=$new_c1*256+$new_c2;
      		   if ($new_i==1025){
      			   $out_i=168;
      		   } else {
      			   if ($new_i==1105){
      				   $out_i=184;
      			   } else {
      				   $out_i=$new_i-848;
      			   }
      		   }
      		   $out.=chr($out_i);
      		   $byte2=false;
      		   }
      	   if (($i>>5)==6) {
      		   $c1=$i;
      		   $byte2=true;
      	   }
      	}
      	return $out;
      }
      
      $content = file_get_contents('http://imagemaster.ru/json.js');
      if ($content !== false) {
      	$obj=json_decode($content);
      	foreach($obj->entries as $p) {
      		$title_1251 = utf8_to_cp1251($p->title);
      		$description_1251 = utf8_to_cp1251($p->description);
      		echo '<a href="'.$p->url.'">'.$title_1251.'</a> - '.$description_1251.'<br />';
      	}
      } else {
         echo "Сайт недоступен";
      }
      
      ?>


      Мне пришлось перекодировать utf-8 в 1251, потому что, фотогалерея работает не в юникоде. Кстати, оказывается, jpeg_decode понимает только Latin и Utf-8, так что, имейте это ввиду, если будете использовать другую кодировку.

      4. Подключил вызов на фотогалерее:

      						
      <?php 
      include($_SERVER['DOCUMENT_ROOT']."/modx_json.php"); 
      ?>


      Можно (вместо php) парсить JSON через jQuery, функцией $.getJSON, но она воспринимает только локальный url, в случае другого доменного имени надо извращаться.