Eclipse で CodeIgniter 2.0 のコード補完

(2011/4/21 追記) この記事は古くなっています。Eclipse で CodeIgniter のコード補完を行わせる冴えたやり方 を参照してください。

昨日の記事 Eclipse で CodeIgniter のコード補完 ですが、そのままではコーディングでのコード補完はできましたが、CodeIgniter Reactor がエラーで動作しなくなってました。

そこで改良版としてモデルも含めてコード補完できるコードを生成するコントローラを作成してみました。

application/controllers/eclipse.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Eclipse extends CI_Controller {

	function __construct()
	{
		parent::__construct();
	}

	function index()
	{
		$lines = array();
				
		// libraries
		$_ci_varmap = array('unit_test' => 'unit', 'user_agent' => 'agent');
		$_skip = array(
						'codeigniter', 
						'common',
						'controller',
						'driver',
						'exceptions',
						'hooks', 
					  	'loader',
					  	'model',
						'profiler',
					  	'router');
		
		$libraries = array_merge(glob(BASEPATH . 'core/*.php'), glob(BASEPATH . 'libraries/*.php'));
		
		foreach ($libraries as $filename) {
			$class = basename($filename, '.php');
			$class_var = strtolower($class);
			if (in_array($class_var, $_skip)) {
				continue;
			}
			$class_name = 'CI_' . $class;
			$class_var = ( ! isset($_ci_varmap[$class_var])) ? $class_var : $_ci_varmap[$class_var];
			$lines[] = '$' . $class_var . ' = new ' . $class_name . '();';
		}

		// database
		$lines[] = '$db = new CI_DB_active_record();';
		
		// models
		foreach (glob(APPPATH . 'models/*.php') as $filename) {
    		$class = ucfirst(basename($filename, '.php'));
    		$class_var = $class;
    		$class_name = $class;
			$lines[] = '$' . $class_var . ' = new ' . $class_name . '();';
		}
		
		sort($lines);
		
		echo 'system/core/Controller.php のコンストラクタの最後に以下のコードを追加する' . "\n";
		echo '<pre>' ."\n";
		echo '// Eclipse コード補完のため' . "\n";
		echo 'if (FALSE) {' . "\n";
		
		foreach ($lines as $line)
		{
			echo "\t" . $line . "\n";
		}
		
		echo '}' . "\n";
		echo '</pre>' ."\n";
	}
}

/* End of file eclipse.php */
/* Location: ./application/controllers/eclipse.php */

これを実行すると、Controller クラスに追加するコードを出力します。

CodeIgniter Reactor では CLI での実行も可能です。

$ php index.php eclipse

とすると、以下のように出力されます。

system/core/Controller.php のコンストラクタの最後に以下のコードを追加する
<pre>
// Eclipse コード補完のため
if (FALSE) {
	$agent = new CI_User_agent();
	$benchmark = new CI_Benchmark();
	$calendar = new CI_Calendar();
	$cart = new CI_Cart();
	$config = new CI_Config();
	$db = new CI_DB_active_record();
	$email = new CI_Email();
	$encrypt = new CI_Encrypt();
	$form_validation = new CI_Form_validation();
	$ftp = new CI_Ftp();
	$image_lib = new CI_Image_lib();
	$input = new CI_Input();
	$javascript = new CI_Javascript();
	$lang = new CI_Lang();
	$log = new CI_Log();
	$output = new CI_Output();
	$pagination = new CI_Pagination();
	$parser = new CI_Parser();
	$security = new CI_Security();
	$session = new CI_Session();
	$sha1 = new CI_Sha1();
	$table = new CI_Table();
	$trackback = new CI_Trackback();
	$typography = new CI_Typography();
	$unit = new CI_Unit_test();
	$upload = new CI_Upload();
	$uri = new CI_URI();
	$utf8 = new CI_Utf8();
	$xmlrpc = new CI_Xmlrpc();
	$xmlrpcs = new CI_Xmlrpcs();
	$zip = new CI_Zip();
}
</pre>