LifeType 中文開發論壇

開發 => 外掛程式 => 主題作者是: maomaode 於 一月 04, 2006, 09:20:27 上午



主題: 默认启用外挂?
作者: maomaode一月 04, 2006, 09:20:27 上午
Hi,

我问一个问题, 目前外挂在默认方式下都是”未启用“, 我在想是否有选项, 或者通过编写代码使得默认方式变为“启用”
也就是说, 在外挂安装上后, 这个外挂就处于“启用”状态呢?


主題: Re: 默认启用外挂?
作者: lss一月 04, 2006, 09:29:41 上午
hi maomaode:

很多人問過了,請等 1.1 版,或是等不及的話就自己動手吧!

你可以參考 api 文件裡的 bloginfo 類別。我沒記錯的話,外掛的屬性都是存在 bloginfo 裡面的。

lss


主題: Re: 默认启用外挂?
作者: maomaode一月 04, 2006, 09:36:18 下午
Hi lss,

仅修改bloginfo就ok吗? bloginfo好像只是一个dataobject, 可以取出blogsetting, 是把外挂的enable属性设置为true加入blogsetting,是这样吗?可不可以再给点提示,我想实验一下, 谢谢!


主題: Re: 默认启用外挂?
作者: lss一月 04, 2006, 10:15:52 下午
hi maomaode:

抱歉,我果然記錯了 :-$

不是使用 bloginfo ,而是使用 blogSettings 類別,用他的 setValue 方法來將預設的 plugin_xxx_enabled 屬性設為 true 。

以 authimage 為例,修改 pluginauthimage.class.php 裡面的 register() 方法如下:
引用
      function register()
      {
            $config =& Config::getConfig();
            $this->cacheFolder = $config->getValue('temp_folder');
         $this->cacheFolder = $this->cacheFolder.'/authimage/'.$this->blogInfo->getId();
         if( !File::exists( $this->cacheFolder )) {
            File::createDir( $this->cacheFolder );
         }
         
          $blogSettings = $this->blogInfo->getSettings();
         $this->pluginEnabled = $blogSettings->getValue( "plugin_authimage_enabled" );
         if ( empty($this->pluginEnabled) ) {
            $blogSettings->setValue( "plugin_authimage_enabled", true );
            $this->pluginEnabled = $blogSettings->getValue( "plugin_authimage_enabled" );
         }
         $this->length = $blogSettings->getValue( "plugin_authimage_length" );
         $this->key = $blogSettings->getValue( "plugin_authimage_key" );
         $this->expiredTime = $blogSettings->getValue( "plugin_authimage_expiredtime" );
         if ($this->expiredTime == "") $this->expiredTime = 3600;
         $this->default = $blogSettings->getValue( "plugin_authimage_default" );
      }
如入紅色的部份即可。這三行是先判斷 blogSettings 裡面是否已經有儲存 plugin_authimage_enabled 的值,如果沒有,那表示從未設定過,就自動加入預設值為 true ,並重新取得設定後的值。做這樣的修改,只要是還沒儲存過這個 plugin 設定值的 blog 應該都適用。這些修改理論上在防垃圾干擾的外掛應該都可以用吧!請你試試看囉!記得來分享成果哦!

lss


主題: Re: 默认启用外挂?
作者: lss一月 04, 2006, 10:50:54 下午
寫了一篇比較詳細一點點的說明,請看看「 如何預設啟用外掛程式? (http://blog.nlhs.tyc.edu.tw/post/2/97)」

lss


主題: Re: 默认启用外挂?
作者: markwu一月 05, 2006, 12:00:05 上午
其實最好的方式是像 jupload 或是 template editor 讓 adminstrator 來決定要不要開放。 :-)

上面那句話有語病,應該是『我喜歡的方式』。

Mark


主題: Re: 默认启用外挂?
作者: markwu一月 05, 2006, 11:17:21 上午
如果有興趣,可以看看延伸的討論:

http://forums.lifetype.net/viewtopic.php?t=2005

這是用 BlogInfo 來修改,事實上是 BlogInfo 裡面的 BlogSetting。

他可以在註冊的時候就啟動 plugin,但是『既往不咎,展望未來』。

就是只對新 user 有用。

Mark


主題: Re: 默认启用外挂?
作者: maomaode一月 05, 2006, 12:15:38 下午
mark说的对, 应该由管理员来控制会比较好一点,
我已经阅读了lss的文章, 写的蛮详细的,晚上我会来实验一下。谢谢lss
lss的做法是修改某一个插件的代码来达到“默认启用”
最好是能在“外挂列表”上可以钩选某一个外挂是否“默认启用”, 不过这个改动会蛮大, 我先考虑考虑, 再动手去做
any other suggestions/comments?


主題: Re: 默认启用外挂?
作者: markwu一月 05, 2006, 12:22:31 下午
會改蠻多的!但是如果你只是自己要用,那麼hard coding 其實救 okay 了。

以後的升級,就要自己照顧自己了  :-P

Mark


主題: Re: 默认启用外挂?
作者: Psyche三月 16, 2006, 04:22:42 下午
前教各位前輩

有關迴響驗證的外掛,大致上可以運作,只是有很多模版裡並沒有有關 $authimage 的定義,所以是否必須一個一個模版裡去修改 commentform.template 加入以下程式碼!還是說 有其他的方法嗎?

程式碼:
Install:
Add the following code to commentform.template:
{if $authimage->isEnabled()}
<div><label for="authImage">AuthImage</label><input type="text" name="authImage" id="authImage" value="" />&nbsp;{$authimage->show()}</div>
{/if}


主題: Re: 默认启用外挂?
作者: bibicall三月 16, 2006, 06:11:56 下午
前教各位前輩
有關迴響驗證的外掛,大致上可以運作,只是有很多模版裡並沒有有關 $authimage 的定義,所以是否必須一個一個模版裡去修改 commentform.template 加入以下程式碼!還是說 有其他的方法嗎?
沒有別的辦法,因為每個模版都必須要有那一段程式碼
所以你必須一個個的加上去


主題: Re: 默认启用外挂?
作者: Psyche三月 17, 2006, 10:55:47 上午
沒有別的辦法,因為每個模版都必須要有那一段程式碼
所以你必須一個個的加上去
謝謝 bibicall 前輩的回應。

另外,小弟已經在 plugins/authimage/pluginauthimage.class.php 的 function register() 修改為:
程式碼:
function register()
        {
            $config =& Config::getConfig();
            $this->cacheFolder = $config->getValue('temp_folder');
            $this->cacheFolder = $this->cacheFolder.'/authimage/'.$this->blogInfo->getId();
            if( !File::exists( $this->cacheFolder )) {
                File::createDir( $this->cacheFolder );
            }
           
            $blogSettings = $this->blogInfo->getSettings();

            // 由 $blogSettings 物件裡取出 plugin_authimage_enabled 的設定值
            $this->pluginEnabled = $blogSettings->getValue( "plugin_authimage_enabled" );

            // 如果取出的設定值不存在,代表還沒有設定過,
            // 將設定值設為 true ,
            // 並重新取得設定值。
            if ( empty($this->pluginEnabled) ) {
                $blogSettings->setValue( "plugin_authimage_enabled", true );
                $this->pluginEnabled = $blogSettings->getValue( "plugin_authimage_enabled" );
            }
            $this->length = $blogSettings->getValue( "plugin_authimage_length" );
            $this->key = $blogSettings->getValue( "plugin_authimage_key" );
            $this->expiredTime = $blogSettings->getValue( "plugin_authimage_expiredtime" );
            if ($this->expiredTime == "") $this->expiredTime = 3600;
            $this->default = $blogSettings->getValue( "plugin_authimage_default" );
        }
照理說應該已經「預設啟用」,可是如果使用者未經啟用,驗證碼的效果還是無法啟用。還是需要使用者自行設定啟用,驗證碼效果才能運作。

請問,我有疏漏什麼步驟嗎?


主題: Re: 默认启用外挂?
作者: php四月 01, 2006, 11:59:18 上午
确实是这样的。我分析了一下,照这种方法修改后,前台页面在进行评论(回复)的区域是默认会显示出Authimage区域的,但自动生成的图片不显示出来。仔细查看数据库中有关bloginfo的参数,却发现里面根本没有有关Authimage的四个参数,所以这个图片是显示不出来的。而且,即使是新注册用户也是这样的。只有用户在后台启用这个插件后,这些参数才会写入至bloginfo,那个图片才会显示出来。所以,前面所说的默认启用还是不能成功实现。
我想,如果能在新用户注册时,自动在新用户的bloginfo中加入有关Authimage参数,这样应该就行的吧。
还没想好具体实施方法。请教各位大侠。


主題: Re: 默认启用外挂?
作者: php四月 01, 2006, 05:16:36 下午
我已经试验成功,将程序中相关各项参数都赋于一个默认的值就行了。这样,不管该用户是否在控制中心设置是否启用插件,都能成功显示验证码了。
有一个问题,就是用户在控制中心是不能自己修改这个插件的参数了。


主題: Re: 默认启用外挂?
作者: maomaode四月 17, 2006, 10:39:31 下午
To php and Psyche :
 
lss 的回复中有误,
你还需要自己加上
引用
$this->blogInfo->setSettings( $blogSettings );
$blogs = new Blogs();
$blogs->updateBlog( $this->blogInfo->getId(), $this->blogInfo );
这行代码的意思是将blogsettings写回到blogger的设置里, 并写回到数据库里
所以完整的代码应该是
引用
       if ( empty($this->pluginEnabled) ) {
                $blogSettings->setValue( "plugin_authimage_enabled", true );
           $this->blogInfo->setSettings( $blogSettings );
                $blogs = new Blogs();
                $blogs->updateBlog( $this->blogInfo->getId(), $this->blogInfo );
                $this->pluginEnabled = $blogSettings->getValue( "plugin_authimage_enabled" );
            }

即使这样, 你也没有成功, 应该plugin的其他设置还没写到数据库里面, 想办法取的默认值就可以.

Lss, 您可以更新一下你的http://blog.nlhs.tyc.edu.tw/post/2/97吗? thx


主題: Re: 默认启用外挂?
作者: lss四月 18, 2006, 07:35:56 上午
hi maomaode:

謝謝你囉 :-)

當初寫這個部份時,原本就很實驗性質 :-P ,正是要靠大家一起來完善他  :-)

我會先在我的文章中加個連結過來。最近很忙,再找時間研究看看。

lss


主題: Re: 默认启用外挂?
作者: maomaode四月 18, 2006, 04:16:46 下午
这里给出最终解决方案;
将原来的register方法修改成如下:
引用
    $config =& Config::getConfig();
    $this->cacheFolder = $config->getValue('temp_folder');
    $this->cacheFolder = $this->cacheFolder.'/authimage/'.$this->blogInfo->getId();
    if( !File::exists( $this->cacheFolder )) {
      File::createDir( $this->cacheFolder );
    }
         
    $blogSettings = $this->blogInfo->getSettings();
    $this->pluginEnabled = $blogSettings->getValue( "plugin_authimage_enabled" );
    $this->length = $this->_getSetting( "plugin_authimage_length" , 4);
    $this->key = $this->_getSetting( "plugin_authimage_key" , "pLog");
    $this->expiredTime = $this->_getSetting("plugin_authimage_expiredtime", 3600);
    $this->default = $this->_getSetting( "plugin_authimage_default", "marble.gif");

    if ( empty($this->pluginEnabled) ) {
      $blogSettings->setValue( "plugin_authimage_enabled", true );
      $blogSettings->setValue( "plugin_authimage_length", $this->length );
      $blogSettings->setValue( "plugin_authimage_key", $this->key );
      $blogSettings->setValue( "plugin_authimage_expiredtime", $this->expiredTime );
      $blogSettings->setValue( "plugin_authimage_default", $this->default );
     
      $this->blogInfo->setSettings( $blogSettings );
      $blogs = new Blogs();
      $blogs->updateBlog( $this->blogInfo->getId(), $this->blogInfo );

      $this->pluginEnabled = $blogSettings->getValue( "plugin_authimage_enabled" );

再添加如下方法:
引用
  function _getSetting($key, $defaultValue)
  {
    $value = $this->blogInfo->_settings->getValue($key);
    return empty($value) ? $defaultValue : $value;
  }

应该可以工作了, 不过还是有的小毛病
1。 blogsetting段在pluginauthimageupdateconfigaction.class.php中也出现了, 所以有点重复, 可以提取出来
2。 默认值在pluginauthimage.class.php 中和pluginauthimageconfigview.class.php中同时出现, 应该可以提取出来
3。 pluginauthimage.class.php中的updateBlog没有判断是否成功,没有相关错误处理。
4。最大的一个缺点是, 没有办法关闭这个plugin了

因为register这个方法在每个action触发中都会被调用, 所以当pluginauthimageupdateconfigaction被调用时候, register方法又一次被调用, 导致每次写入的都是register方法里设定的值。 参考adminaction.class.php 的setCommonData()方法。

问题还不少,如何改进就留给读者了吧。。。


主題: Re: 默认启用外挂?
作者: maomaode四月 18, 2006, 07:53:10 下午
这个问题最终还是可以解决,
我已经将具体的解决方案写在 LifeType 外挂如何实现默认启动? (http://maomaode.bokeland.com/blog/3/117/2006/04/18/7396)


主題: Re: 默认启用外挂?
作者: maomaode十一月 27, 2006, 03:12:56 下午
1.1.1 是否已经包含了这个功能?
我们还需要按照这个步骤 (http://maomaode.bokeland.com/blog/3/117/2006/04/18/7396)来实现默认启用外挂吗?

或者说什么时候可以包含到核心里呢?


主題: Re: 默认启用外挂?
作者: panying十一月 27, 2006, 03:24:11 下午
其实我曾经做了一个更通用的插件版本, :-P

可以查看: http://www.pactofshadow.com/lifetype/~nest/article/35.html

最新版本可以察看: http://www.pactofshadow.com/lifetype/~nest/article/53.html

实现就是重载blogsettings.php的function getValue( $key, $defaultValue = null ),然后通过插件判断是否读取默认值,并且有个简陋的界面。


主題: Re: 默认启用外挂?
作者: maomaode十一月 27, 2006, 05:37:07 下午
你的例子 (http://www.pactofshadow.com/lifetype/~nest/article/35.html), 只给出了一个authimage 的设置方法, 如果是有多个plugin的情况下, defaultProperty  和 same setting property 会不会因为放入太多的内容, 而显的零乱.

不过这个想法非常好, 也感谢你的分享


主題: Re: 默认启用外挂?
作者: maomaode十一月 27, 2006, 07:42:05 下午
OK, 看样子, 我们的1.1.1里面还没有加入默认启用外挂这个功能,

我又重新做了调整,
下面是我的解决方案:
1. 在/class/plugin/pluginbase下加入下面两个方法:
引用
      function _getSetting($key, $defaultValue)
      {
        $value = $this->blogSettings->getValue($key);
        return empty($value) ? $defaultValue : $value;
      }
     
      function update2Default($defaultValues = null) {
        $plugin_is_virgin = 'plugin_' . $this->id . '_virgin';
       
        $this->virgin = $this->_getSetting( $plugin_is_virgin, true);
       
        if ( empty($this->pluginEnabled) && $this->virgin === true ) {
          $base = 'plugin_' . $this->id . '_';
         
          $this->blogSettings->setValue( $base . 'enabled', true );
          $this->blogSettings->setValue( $base . 'virgin', 'no' );

          if (!empty($defaultValues)) {
            foreach($defaultValues as $key => $value) {
              $this->blogSettings->setValue($base . $key, $value);
            }
          }

          $this->blogInfo->setSettings( $this->blogSettings );
          $blogs = new Blogs();
          $blogs->updateBlog( $this->blogInfo );
          $this->pluginEnabled = $this->blogSettings->getValue( $base . 'enabled' );
        }
       
      }

在你所需要默认的plugin 的register 方法末尾添加如下代码:
引用

            $this->update2Default();
如果你希望加入默认值, 就将以上代码替换为: (以authimage) 为例:
引用
              $defaultValues = array('length' => $this->length,
                                   'key' => $this->key,
                                   'expiredtime' => $this->expiredTime,
                                   'default' => $this->default
                                   );
            $this->update2Default($defaultValues);

更详细的内容可以参考LifeType 外挂如何实现默认启动? (续) (http://maomaode.bokeland.com/blog/3/187/2006/11/27/90543)