We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 19033
    • 892 Posts
    こんにちは。よろしくお願い致します。

    Ditto2.0.2 において、format=`rss`を指定したとき、テンプレートを
    チャンクで指定できるようになったはずですが、「header」をチャンクで指定しますと、
    XML パースエラーが出てしまいます。

    &tpl=`チャンク名`では、ちゃんとテンプレートを指定できているようで、
    チャンクに書いた内容が出力に反映されます。

    同様に&header=`チャンク名`も指定できると思うのですが、エラーになってしまうのです。
    (footer も指定するとエラーになってしまいました)。

    どこが良ろしくないのでしょうか。。 huh

    現在、MODxは095で試しています。
    よろしくお願いします。。
      • 33488
      • 429 Posts
      エラーってXMLのパースってことですよね??
      だとすると、ヘッダー部分の書式とアイテムの構造があってないってことでは???
      formatをrssとしてテンプレートを自作するということは、RSSを2.0ではなくて1.0とか0.91とかの形式でってことでしょうか?

      うーむ、解決のネタにならずにすいません :’(
        • 19033
        • 892 Posts
        ZerRoさん。いつもありがとうございます。

        デフォルトのrssのテンプレートの[+summary+]の部分を
        [+introtext:notags+] とかにして、htmlタグを除去したかったのと、
        あと、テスト的にいろいろやってみたかったのです。。

        で、たとえば、以下のようにすると
        [[Ditto? &parents=`54,70,307` &format=`rss` &summarize=`999` &total=`999` &showInMenuOnly=`1` &depth=`1` &tpl=`ditto_rsstpl` &language=`japanese-utf8`]]


        tplにはditto_rsstplが使われて、意図したとおりの結果が得られるのですが、
        パラメータに「&header=`ditto_rssheader`」として、たとえば、
        ditto_rssheaderには、dittoの外部リソース「format/rss.format.inc.php」の中の
        「$rss_header = <<<TPL」以下をそっくり、書いたとします。
        ちなみに、rss_header 以下は以下のようなのですが:
        <?xml version="1.0" encoding="[+rss_charset+]" ?>
        [+rss_xsl+]
        <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
        	<channel>
        			<title>[*pagetitle*]</title>
        			<link>[+rss_link+]</link>
        			<description>[*description*]</description>
        			<language>[+rss_lang+]</language>
        			<copyright>[+rss_copyright+]</copyright>
        			<ttl>[+rss_ttl+]</ttl>
        

        上記をチャンクに書いて、「&header=`チャンク名`」で呼び出せば、
        理屈では、&headerを指定しない場合と同じ状態になるはずですよね??
        でも、エラーになっちゃうのです。。

        具体的には以下のような画面表示で:
        XML パースエラー: 構文エラー。
        URL: http://www.liolion.info/modx/modx_indx.xml
        行番号: 1, 列番号: 1:ditto_rssheader			<item>

        ソースをみると、以下のようになっています。
        ditto_rssheader			<item>
        				<title>SEO Strict URLs</title>
        				<link>http://www.liolion.info/modx/resource/seo_strict_urls.html</link>
        				<description><![CDATA[ SEO Strict URLs プラグインは、フレンドリURLを利用している場合にMODxがはき出してしまう複数のURLをひとつに統一します。複数のURLを持つページは、サーチエンジンなどからペナルティを課せられる場合があります。このプラグインはそれを避けることができるでしょう。 ]]></description>
        				<pubDate>Sun, 12 Aug 2007 22:46:41 +0900</pubDate>
        				<guid isPermaLink="false">http://www.liolion.info/modx/resource/seo_strict_urls.html</guid>
        				<dc:creator>MEGU</dc:creator>
        
        				
        			</item>
        			<item>

        上記の<item>~は、tplの内容なので、&header=`チャンク`としたテキストが
        そのまま出てきちゃってるみたいなんです。

        また、format/rss.format.inc.php の最後の方に以下のようになっているので
        $header = isset($header) ? $header : template::replace($rss_placeholders,$rss_header);
        $tpl = isset($tpl) ? $tpl : "@CODE:".$rss_tpl;
        $footer = isset($footer) ? $footer : $rss_footer;
        

        「&header=`チャンク名`」でテンプレートが指定できると思いこんでいるのですが、
        そもそもそこからして間違ってているのでしょうか。。
          • 19033
          • 892 Posts
          あの、それと。。
          テンプレートの件とは別の問題なのですが、すみません、こちらの方もできれば。。

          fortmat=`rss`で出力する日付の形式が「Thu, 21 Dec 2007 16:01:07 +0900」
          みたいな感じなので、これを「2007-08-21T16:45+09:00」のの様にしたいのですが。。

          うちのサーバはPHPが4.系なので、dateで「c」が使えません。
          そんなんで、rss.format.inc.phpの以下の部分を
          		return date("r",  intval($resource[$dateSource]) + $modx->config["server_offset_time"]);

          こんなふうにしたのですが
          		return date("Y-m-d\TH:i",  intval($resource[$dateSource])). "+09:00";

          ↑ 変なことしてないでしょうか。。?もっといい方法があったら、どうぞ教えてください。。

          せっかく、format=`rss`というパラメータがあるので、それを使いたいと思うのですが、
          format=`html`に(デフォルト)にして、色々細工?した方が無難なのでしょうか。。
          なんかそんな気もしているんですけど。。でも、せっかく機能がついているので、
          使えるようにしたいなあと。。
            • 33488
            • 429 Posts
            えーと、rss.format.inc.phpを見てみたんですが・・・
            $header = isset($header) ? $header : template::replace($rss_placeholders,$rss_header);
            

            こうなってますね。
            なので、Chunkから持ってくるんじゃなくて書かれているそのものが出ちゃうということになります。
            $header = isset($header) ? $modx->getChunk($header) : template::replace($rss_placeholders,$rss_header);
            

            にすればよい?? ような・・・footerも同じですね
            と、思ったらデフォルトだと変数を実体に置き換えてるようになっていますね。

            $header = isset($header) ? template::replace($rss_placeholders,$modx->getChunk($header)) : template::replace($rss_placeholders,$rss_header);
            

            の方がよいかも・・・、

            日付の方はそれでよいかと・・・、出力が意図した通りであれば、Dateの引数に問題はないかと思います。
              • 19033
              • 892 Posts
              ZeRoさん。ありがとうございます。

              まず、dateの引数の方は、問題ないと言うことで、安心しました。。
              ありがとうございます。

              そしてDittoのheaderとfooterは、テンプレートとしてチャンクを呼べない仕様だったのですね...。
              気がついたのですが、このformatというパラメータは、extendersやconfigの様に、
              ファイルを作って、そのファイル名(拡張子抜き)を指定すれば、どんどん、フォーマットとして
              増やしていけるんですね。。

              どうやったら、やりやすいか、またわかりやすいか、ちょっと考えてみます。
              ありがとうございました。