Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2009-02-06 00:53:24

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: 新API「TemplateExtraFields」を使ったプラグインの見本

http://forum.nucleuscms.org/viewtopic.php?p=87672#87672より転載

以下、ftruscot 氏の投稿(超訳)
コアに新しいイベントを追加して、リファレンス用のプラグインを書きました。
getEventList()メソッドに新しいイベント「TemplateExtraFields」を追加すれば、このイベントを利用する事が出来る様になります。
追加したいテンプレートフィールドを「fieldname=>fielddesc」の連想配列で定義するだけで、管理エリアの個々のテンプレートに追加されます。
これらのテンプレートはプラグイン内の doSkinVar() メソッド(あるいはそれと同様の部分)でテンプレートフィールドの内容を取得し、テンプレート内のテンプレート変数を置き換えることが出来ます。

ここにあげるリファレンス用プラグインは、データベースにテーブルを作成し、authors と quotes を格納します。そして格納されたデータはスキン変数が書かれた場所に、定義されたテンプレートを使用して書き出します。

<?php 
/* NP_TemplateTest plugin */

/* This plugin is a demo to show how the TemplateExtraFields plugin should be used. */

/*
    Version history:
    * v 1.0 - initial release.
*/

class NP_TemplateTest extends NucleusPlugin {
   function getName() {   return 'TemplateTest';    }
   function getAuthor()  { return 'Frank Truscott';    }
   function getURL() { return 'http://revcetera.com/ftruscot/'; }
   function getVersion() {   return '1.00'; }
   function getDescription() {
      return 'Demo of TemplateExtraFields API event';
   }

   function supportsFeature($what)
   {
      switch($what)
      { 
      case 'SqlTablePrefix':
         return 1;
      default:
         return 0;
      }
   }

   function getEventList() { return array('TemplateExtraFields'); }

   function install() {
      global $CONF;
        $this->createOption("template_test_header", "Default format to use if header template field not set", "textarea", 'Hi, <%membername%>. Read these funny quotes. <ul>');
      $this->createOption("template_test_body", "Default format to use if body template field not set", "textarea", '<li><%author%>: <%quote%></li>');
      $this->createOption("template_test_footer", "Default format to use if footer template field not set", "textarea", '</ul>');

      sql_query("CREATE TABLE IF NOT EXISTS ".sql_table('plug_template_test')." (`author` varchar(128) NOT NULL default '', `quote` text) TYPE=MyISAM");

      $query = "INSERT INTO ".sql_table('plug_template_test')." VALUES ";
      $query .= "('Fred Mertz','I\'m sorry you\'re so fat you broke my glasses.'), ";
      $query .= "('Ethel Mertz','You\'ll live off that fat for a few more minutes'), ";
      $query .= "('Ether Mertz','I don\'t know, Lucy')";
      sql_query($query);
    }

   function uninstall() {
      sql_query("DROP TABLE ".sql_table('plug_template_test'));
   }

   function init() {
      //Ideally we would provide a language file and include the right one from here according to plugin documentation
      /*
      // include language file for this plugin
      $language = ereg_replace( '[\\|/]', '', getLanguageName());
      if (file_exists($this->getDirectory().$language.'.php'))
         include_once($this->getDirectory().$language.'.php');
      else
         include_once($this->getDirectory().'english.php');
      */
      // But we're doing it statically
      // include language file for this plugin
        $language = ereg_replace( '[\\|/]', '', getLanguageName());
        if ($language == 'french') {
            define('_TEMPLATE_TEST_HEADER', 'TemplateTest La Tete');
         define('_TEMPLATE_TEST_FOOTER', 'TemplateTest Le Pied');
         define('_TEMPLATE_TEST_BODY', 'TemplateTest Le Corps');
      }
        else {
            define('_TEMPLATE_TEST_HEADER', 'TemplateTest Header');
         define('_TEMPLATE_TEST_FOOTER', 'TemplateTest Footer');
         define('_TEMPLATE_TEST_BODY', 'TemplateTest Body');
      }
   }

   function event_TemplateExtraFields(&$data) {
      /* Add an element in the $data['fields'] array using your plugin name as the key and an associative array containing the field name and field label*/
      /* note that your field names should be lowercase and include the name of your template as shown below. This will ensure that all template field names are unique. */
      $data['fields']['NP_TemplateTest'] = array(
               'templatetest_header'=>_TEMPLATE_TEST_HEADER,
               'templatetest_body'=>_TEMPLATE_TEST_BODY,
               'templatetest_footer'=>_TEMPLATE_TEST_FOOTER
            );
      //doError(print_r($data,1));
   }

   function doSkinVar($skinType,$template = '',$author = '') {
      global $blog, $CONF, $manager,$member;

      $template =& $manager->getTemplate($template);
      if (trim($template['templatetest_header']) == '')
         $template['templatetest_header'] = $this->getOption('template_test_header');
      if (trim($template['templatetest_body']) == '')
         $template['templatetest_body'] = $this->getOption('template_test_body');
      if (trim($template['templatetest_footer']) == '')
         $template['templatetest_footer'] = $this->getOption('template_test_footer');

      $header['membername'] = $member->getDisplayName();
      if ($header['membername'] == '') $header['membername'] = 'guest';
      $header['blogid'] = $blog->getID();
      if ($author) {
         $where = " WHERE author='".addslashes($author)."'";
         $header['author'] = $author;
      }
      else $where = '';
      /* possible variables in the templatetest_header are <%membername%> and <%blogid%> */
      echo TEMPLATE::fill($template['templatetest_header'],$header);

      /* possible variables in the templatetest_body are <%author%>, <%quote%>, <%membername%> and <%blogid%> */

      $query = "SELECT * FROM ".sql_table('plug_template_test').$where;
      $res = sql_query($query);
      while ($row = mysql_fetch_assoc($res)) {
         $row['membername'] = $member->getDisplayName();
         if ($row['membername'] == '') $row['membername'] = 'guest';
         $row['blogid'] = $blog->getID();

         echo TEMPLATE::fill($template['templatetest_body'],$row);

      }
      /* possible variables in the templatetest_footer are <%membername%> and <%blogid%> */
      echo TEMPLATE::fill($template['templatetest_footer'],$header);
   }

} 

?>

オフライン

#2 2009-02-06 10:09:24

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: 新API「TemplateExtraFields」を使ったプラグインの見本

これって、佐藤(な)さんの、Special Template Parts みたいなものでしょうか。

オフライン

#3 2009-02-06 10:36:48

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: 新API「TemplateExtraFields」を使ったプラグインの見本

katsumi さんの発言:

これって、佐藤(な)さんの、Special Template Parts みたいなものでしょうか。

ざっとコード見た感じだとそんな感じですね。
TEMPLATE::fill() じゃなくてコアのパーサ使ったら、普通のテンプレート変数もパース出来て嬉しさ2倍。

オフライン

Board footer