このサイトは株式会社オープンソース・ワークショップの旧サイトです。
新サイトを参照していただけますようお願いいたします。
https://opensource-workshop.jp/
NetCommons開発TIPS
NetCommons2 の任意のモジュールでjqueryを利用する
こんにちは。
オープンソース・ワークショップの牟田口です。
NetCommons2 のJavaScriptライブラリはprototype.jsですが、jqueryを使いたい時があります。
jqueryを使う時に、jqueryを個別にダウンロードして読み込むと、ウィジウィグの画像添付、ファイル添付が動作しなくなったり、jqueryの多重読み込みで白画面になったりする不具合が出たりします。
そこでNetCommons2でもメニューの一部がjqueryを使っていますので、その仕組みを流用して他のモジュールでも使えるようにする方法を記載します。
1.html/webapp/modules/モジュール名/モジュール名_script.html
<script class="nc_script" type="text/javascript">
if(!iepCls["<{$id}>"]) {
iepCls["<{$id}>"] = new clsIep("<{$id}>");
}
// use jquery
// 実装例: https://github.com/netcommons/NetCommons2/blob/develop/html/webapp/modules/menu/files/js/menu.js#L899
// jqcheckCls変数: https://github.com/netcommons/NetCommons2/blob/develop/html/webapp/modules/common/files/js/jqcheck.js
// jquery実体: https://github.com/netcommons/NetCommons2/blob/develop/html/webapp/modules/comp/files/js/extension/jquery-1.6.4.min.js
// これを書くことでjqueryを読み込んでる
jqcheckCls.jqload("jquery-1.6.4.min", "window.jQuery", function() {
});
</script>
・上記を書くことで、jqueryが読み込まれ、$の代わりにjQueryで書く事が出来ます。
・[補足] NetCommons2ではprototype.jsで$を先に使っているため、jqueryも使う$と衝突します。そのため$の代わりに別の変数jQueryを使って記述します。
・モジュール名_script.htmlは、各テンプレートから参照させるため、モジュールのどのテンプレートでもjQueryが使えるようになります。
・この方法でjqueryを何度も読み込んでも、jqueryの多重読み込みになりませんでした。
JQuery記述例
// 項目表示
jQuery('#discroption').show('slow');
// 項目非表示
jQuery('#discroption').hide('slow');
参考になれば幸いです。
(2019/12/23追記)
Jqueryのライブラリは拡張モジュールを含めると、複数ありました。
本体検索:
html/webapp/modules/comp/files/js/extension/jquery.mobile_addition.js
html/webapp/modules/comp/files/js/extension/jquery-1.6.4.min.js
html/webapp/modules/comp/files/js/extension/jquery.mobile-1.0.1.min.js
⇒共通としてJquery利用
Jqueryの利用
https://github.com/netcommons/NetCommons2/search?q=jquery&unscoped_q=jquery
html/webapp/modules/menu/files/js/menu.js
⇒メニューの一部テンプレートで利用
html/webapp/modules/comp/files/js/extension/jquery.mobile_addition.js
⇒スマホ表示のjqueryモバイルで利用
html/webapp/modules/common/files/js/jqcheck.js
⇒何かチェックしてる?
html/webapp/modules/comp/files/js/plugins/comp_textareamain.js
⇒ウィジウィグの入力にIE+jquery属性入ってるかのIF文。Jquery利用の観点からすると影響なし。
拡張モジュール検索:
multimedia/files/images/jquery.jplayer.js
multimedia/files/images/jquery-1.7.1.min.js
multimedia/files/images/jquery-1.8.3.min.js
⇒動画モジュール再生のjplayerで利用
参考まで。
NetCommons2 loggerでデバッグログをファイル出力する
こんにちは。
オープンソース・ワークショップの牟田口です。
NetCommons2 にはloggerの仕組みがありますが、初期状態は画面出力のため、ファイル出力されず、インストール時の確認やデバッグ時には不便な場合があります。
そこでloggerの出力をファイル出力に変更する方法を記載します。
1. html\webapp\config\global-config.ini を変更
;;DEFAULT_LOGGER = viewDisplayManage
DEFAULT_LOGGER = simpleFile
2. html\webapp\config\define.inc.php の末尾に追記
define('LOG_LEVEL', LEVEL_ERROR);
すると、下記ディレクトリにログが出力されます。
html\webapp\logs\maple.log
[2019/06/02 02:23:57] [error] 存在しないコンポーネントが指定されました : dicon://Session - DIContainerInitializer#doValueBeforeParse
[2019/06/02 02:24:53] [error] 存在しないコンポーネントが指定されました : dicon://Session - DIContainerInitializer#doValueBeforeParse
[2019/06/02 02:24:55] [error] 存在しないコンポーネントが指定されました : dicon://Session - DIContainerInitializer#doValueBeforeParse
参考になれば幸いです。
参考リンク
https://nc2.netcommons.org/bbjx36jrx-6666/#_6666
NetCommons2 ページスタイル 指定できるテーマの違いについて
オープンソース・ワークショップのプログラマの牧野です。
NetCommons2のページスタイルのテーマについて、備忘録として記載しておきます。
NetCommons2では、全体、ページ、ブロック毎にページスタイルを設定できますが、
その時に指定できるテーマについて、差があります。
テーマ種類 | 全体 | ページ | ブロック |
クラシック | 〇 | 〇 | 〇 |
サイドライン | 〇 | 〇 | 〇 |
アンダーライン | 〇 | 〇 | 〇 |
シンプル | 〇 | 〇 | 〇 |
タイトルアクセント | × | × | 〇 |
パネル | 〇 | 〇 | 〇 |
パネル+ライン | 〇 | 〇 | 〇 |
点線 | 〇 | 〇 | 〇 |
アート | 〇 | 〇 | × |
テクスチャ | 〇 | 〇 | × |
アクセシビリティ対応 | 〇 | 〇 | × |
例えば、「タイトルアクセント」は、サイト全体もしくはページ全体に指定ができませんので、ブロックごとに指定する必要があります。
「アート」は、サイト全体もしくはページ全体で指定できますが、ブロックごとに指定する事ができません。
ページスタイルのテーマを指定する時は、上記の事をお気を付けください。
NetCommons2 新着情報のバグ
こんにちは。
株式会社オープンソース・ワークショップの永原です。
NetCommons2 新着情報のバグを見つけたので、とりあえずここにメモ。
発現する条件は以下
- 新着情報を配置している。
- 新着情報に日誌を表示している。(他のモジュールでも起こり得そう)
- 日誌をブロック移動した。
この時、移動した日誌ブロックの記事をクリックすると、
"入力値が不正です。不正にアクセスされた可能性があります。"
とエラーになって、表示できないことがあります。
これは、NetCommons2 の新着情報モジュールのバグです。
- ログインしていること。
- ブロック移動前に新着から該当記事にリンクすること。
- この時点で、そのユーザが該当記事を見たという履歴ができる。
- 履歴データはroom_id を持っていない。
- ブロックを移動する。
- 再び新着をクリック。
- 履歴があるかどうかを判定する際、room_id も含めて確認するので、履歴なしと判定。
- 履歴をINSERTしようとするが、データベースのキーはroom_id がないので、重複エラーになる。
ということで、以下のように修正。
webapp/modules/whatsnew/components/Action.class.php
function setRead() { $_user_id = $this->_session->getParameter("_user_id"); if (empty($_user_id)) { return true; } $whatsnew = $this->_request->getParameter("whatsnew"); if (empty($whatsnew)) { return false; } // 新着の既読確認に romm_id が含まれていたので、削除。by nagahara@opensource-workshop.jp // リンク先のブロックをルーム移動した際、エラーになる。 // エラーは、ここで romm_id を含んで既読確認しているのに、既読データのINSERT は romm_id なしで行おうとするため。 $params = array( "whatsnew_id"=>$whatsnew["whatsnew_id"], "user_id" => $_user_id ); /* $params = array( "whatsnew_id"=>$whatsnew["whatsnew_id"], "user_id" => $_user_id, 'room_id' => $whatsnew['room_id'] ); */
Win7 + IE11の動画ダウンロードについて
こんにちは。
オープンソース・ワークショップの永原です。
Win7 + IE11の動画ダウンロードについて、はまった件があったのでメモです。
対象は当社のシンプル動画モジュール。
ログインする(HTTPS)とダメで、ログアウトしている(HTTP)と再生できるという現象でした。
以下、備忘録として。
原因はIE のSSL 時に Content-disposition: inline にした際、IE がファイル名を認識せず、動画再生で拡張子とファイル形式の不一致エラーがあったこと。
ログイン時にアウトなのは、ログインすると、SSL になるから。
Content-disposition: attachment なら、イケた。しかし、ダウンロードの選択画面が出る。
Content-disposition: inline で動かすためには、動画のデータはHTTP で流す必要がある。
そのため、以下をカスタマイズ。
simplemovie_view_main_init.html で動画のリンクは、http にする。
define.inc.php で、ログイン時の強制HTTPS を動画再生時には無効にする。
movie/View.class.php で、Content-disposition のinline指定
Simplemovie_View_Main_Iframe で動画のリンクは、http にする。
以上
NetCommons2のPHPMailerを最新版に差し替える
こんにちは、牟田口です。
最新版(2016/12/28時点) PHPMailer 5.2.19(70d041b6f5ed4e2ed8e2330b8c5b0f6926fc9781).zip に差し替えてメール飛びました。
すべての動作確認をしたわけではないので、参考程度の情報です。
PHPMailer最新版に差し替える
- PHPMailerの最新版をGithubからzipをダウンロードする
- ダウンロードしたzipを解凍して以下を変更する
- class.phpmailer.phpに1行追加
- require_once("PHPMailerAutoload.php");
確認動作
- 掲示板に投稿してメールが飛びました
- システム管理画面から、会員登録後にメールが飛びました
確認環境
- NC2.4.2.1
- XAMPP
- PHP 5.6.12 (VC11 X86 32bit thread safe)
- PHPMailer 5.2.19(70d041b6f5ed4e2ed8e2330b8c5b0f6926fc9781)
NC2.4.2.1の状態
- NC2のメール送信は、PHPMailer
- バージョン : Version: 2.0.0 rc3 ※ [class.phpmailer.php]参照
- NCに影響あり
- パス : \html\maple\includes\mail\phpmailer
参考
https://github.com/netcommons/NetCommons2/issues/134
以上です。
Let's Encrypt設定資料・更新バッチを更新しました。
こんにちは。
株式会社オープンソース・ワークショップの永原です。
Let's Encrypt設定資料・更新バッチを更新しました。
--- 更新履歴
2016-12-27:NetCommons3の.htaccessに対応した記述を追加
以上、報告でした。
NetCommons2 使用しているテンプレート名をphpで取得する
こんにちは、牟田口です。
php側でテンプレート名を使ってプラグラムの動きを変えたかったので、
やり方を調査しました。
下記PHPで実現できます。
$container =& DIContainerFactory::getContainer();
$block =& $container->getComponent("blocksView");
$block_id = intval($request->getParameter("block_id"));
$block_obj = $block->getBlockById($block_id);
// $block_obj['temp_name']; //←テンプレート名が取得できる
(2018/09/28追記)
view・actionの場合
PHP
var $block_id = null;
var $blocksView = null;
function execute()
{
$block_obj = $this->blocksView->getBlockById($this->block_id);
$block_obj['temp_name']; //←テンプレート名が取得できる
}
maple.ini
[Action]
blocksView = "ref:blocksView"
参考になれば幸いです。
ではでは。
NetCommons2 正常処理の際に、JavaScript Alaert メッセージでサーバ...
永原です。
備忘録。
NetCommons2 正常処理の際に、JavaScript Alaert メッセージでサーバからの文字列を表示する。
Backup_Action_Main_Init で処理している。
// 正常終了(エラーリストに完了メッセージ追加)
の部分。
--- 2016-05-25 追記
action クラスの maple.ini で
warning = "main:error.html"
のように、"main:error.html" を呼び出さないと、設定したメッセージがAlert されないみたい。
NetCommons2 のセッションに保持している権限
永原です。
NetCommons2 のセッションに保持している権限が、いつも覚えられないので、メモ
_auth_id : 参照中のルームへの権限 (_AUTH_xxxx)
_role_auth_id : 権限管理で作成する権限 (_ROLE_AUTH_xxxx)
_user_auth_id : ユーザのベース権限 (_AUTH_xxxx)
システム管理者の見分け方:_role_auth_id == _SYSTEM_ROLE_AUTH_ID
管理者以上の見分け方:_user_auth_id == _AUTH_ADMIN
以上
NetCommons2 のID、パスワードの長さの変更
こんにちは。
永原です。
いつも忘れるので、備忘録的に。
NetCommons2 のID、パスワードの長さの変更方法
--- webapp/config/user.ini
USER_LOGIN_ID_MINSIZE = 4
USER_PASSWORD_MINSIZE = 4
--- webapp/language/japanese/items.ini
USER_ITEM_MES_CHAR_DESCRIPTION="4文字以上の英数字または記号を入力"
ID とパスワードの長さは別に定義できるのに、説明は同じ定数なのよね。
まあ、会員管理 > 項目の「説明」で定数使わずに設定すれば良いのですけどね。
以上
NC3開発、cakephp2.xメモ。$this->request->isPost()は非推奨
こんにちは。牟田口です。
NetCommons3プラグイン開発しています。
cakephp2.xメモです。
$this->request->isPost(); // 非推奨 だった。
$this->request->is('post'); //こっちが正解
情報元
▼ リクエストを調べる - リクエストとレスポンスオブジェクト - CakePHP Cookbook 2.x ドキュメント
http://book.cakephp.org/2.0/ja/controllers/request-response.html#check-the-request
《$this->request->is('post');
$this->request->isPost(); // 非推奨》
NC3開発、cakephp2.x FormHelperメモ
こんにちは。牟田口です。
NetCommos3プラグイン開発しています。
cakephp2.xメモです。
- cakephpの`FormHelper`で`$options['type'] =‘put`は編集フォーム。
- $this->request->dataに、モデルのプライマリキー の値が空でなければ、編集フォームになる。
- 編集フォームの`<input type="hidden" name="_method" value="PUT" />`は、cookbookでは《HTTPメソッド》と表現していた。
- RFC 7231のHTTPメソッドでも、《置換するもの》として定義されていた。
なるほど、納得した。
情報元
▼ フォームの作成 - FormHelper - CakePHP Cookbook 2.x ドキュメント
http://book.cakephp.org/2.0/ja/core-libraries/helpers/form.html#id1
《 <form id="RecipeEditForm" method="post" action="/recipes/edit/5">
<input type="hidden" name="_method" value="PUT" />
注釈
これは編集フォームなので hidden の入力項目が生成され、 デフォルトの HTTP メソッドは上書きされます。》
▼ create() のオプション - FormHelper - CakePHP Cookbook 2.x ドキュメント
http://book.cakephp.org/2.0/ja/core-libraries/helpers/form.html#create
《$options['type'] このキーは生成するフォームのタイプを指定します。 有効な値は ‘post’, ‘get’, ‘file’, ‘put’, ‘delete’ です。》
▼ 4.3.4. PUT - RFC 7231 - HTTP/1.1: Semantics and Content (日本語訳)
http://www.hcn.zaq.ne.jp/___/WEB/RFC7231-ja.html#section-4.3.4
《PUT 要請は:
[ 同封された表現が、ターゲットリソースの状態を置換する ]ものとして定義される。 》
NetCommons3の$this->NetCommonsForm->hidden
こんにちは。牟田口です。
自分用でせっかく調べたので、開発メモを残します。
2016/1/4時点のNetCommons3情報です。
- NetCommonsFormHelper.phpにはhiddenメソッドがないけど、実際のソース上では使っている。
- NetCommonsFormHelper.php内で、さらにhelperを指定していて、「Form」helperを呼んでいた。
- そこと、__callで「FormHelperラップ用マジックメソッド」してた。
- それで、FormHelper.phpのhiddenメソッドが使われていた。
--- 詳細
NetCommonsFormHelper.php
- https://github.com/NetCommons3/NetCommons/blob/5eb054cf27991703519ae97a6ae7643e09a8a72b/View/Helper/NetCommonsFormHelper.php#L27
- https://github.com/NetCommons3/NetCommons/blob/5eb054cf27991703519ae97a6ae7643e09a8a72b/View/Helper/NetCommonsFormHelper.php#L429-L438 __callで「FormHelperラップ用マジックメソッド」
実際のソース上では使っている箇所
<?php echo $this->NetCommonsForm->hidden('Block.id'); ?>
<?php echo $this->NetCommonsForm->hidden('VideoBlockSetting.id'); ?>
<?php echo $this->NetCommonsForm->hidden('VideoBlockSetting.block_key'); ?>
FormHelper.phpのhiddenメソッド
--- おまけ
http://book.cakephp.org/2.0/ja/core-libraries/helpers/form.html#FormHelper::hidden
フォームが編集されると(すなわち、配列 $this->request->data に User モデルに渡されるべき情報が含まれている場合)、生成される HTML の中に id フィールドに対応する値が自動的に追加されます。
上記が便利。
以上です。
NetCommons2のファイルアップロード時にでてくるダイアログについて
こんにちは。牟田口です。
ファイルアップロード時に、アップロード処理の時間が長いと
「アップロードが失敗したか、タイムアウトになった可能性があります。処理を続行しますか?」
とダイアログが出る事がありますが、
カスタマイズ時に非表示にできないか調べました。
https://github.com/netcommons/NetCommons2/blob/537e08b7a2892bacd2eed5dbac3ea45792de0f36/html/webapp/modules/common/files/js/common.js#L2451
/*timeout_flag:0の場合、タイムアウトチェックをしない */
/*********************************************************/
sendAttachment: function(params_obj) {
上記パラメータをセットすれば、できる。
サンプルJS
/**
* ファイルアップロード
*/
uploadFile: function() {
var messageBody = new Object();
messageBody["action"] = "custummodule_action_main_import";
var option = new Object();
option["param"] = messageBody;
option["top_el"] = $(this.id);
option["timeout_flag"] = 0; // タイムアウトチェックをしない
option["callbackfunc"] = function(response) {
commonCls.alert("インポートしました。");
commonCls.sendRefresh(this.id);
}.bind(this);
option["callbackfunc_error"] = function(file_list, res){
commonCls.alert(res);
}.bind(this);
commonCls.sendAttachment(option);
},
ではでは。
NC1.xから2.4.0.xへの移行
--- 環境
--- NCMigration1.0.3を使う
--- 準備NC1
--- 準備NC2
--- 準備NCMigration
--- サイト構成
--- データ移行
--- エラー1
--- 対応1
--- エラー2
INSERT INTO netcommons2_pages_users_link(`room_id`,`user_id`,`role_authority_id`,`createroom_flag`,`insert_time`,`insert_site_id`,`insert_user_id`,`insert_user_name`,`update_time`,`update_site_id`,`update_user_id`,`update_user_name`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?);:Array ( [room_id] => 9615 [user_id] => 6d2ec6f4f918347aef5cfb189bfedcd8d85ff44d [role_authority_id] => 4 [createroom_flag] => 0 [insert_time] => 20150327233503 [insert_site_id] => 0621068e454f23fc44c714e8eaef6f27f41b2662 [insert_user_id] => 6f08a38bcb67340f22bb7122d5e4ebdbe8c4c58d [insert_user_name] => XX5200 [update_time] => 20150327233503 [update_site_id] => 0621068e454f23fc44c714e8eaef6f27f41b2662 [update_user_id] => 6f08a38bcb67340f22bb7122d5e4ebdbe8c4c58d [update_user_name] => HA5217 ) :Duplicate entry '9615-6d2ec6f4f918347aef5cfb189bfedcd8d85ff44d' for key 1:C:\projects\xampp_lite\htdocs\NCMigration\model\utility.php:393
--- 対応2
--- エラー3
--- 対応3
/**
* NC1データベースコネクションオブジェクト設定
*
* @param string $dsn データソース名称(dbType://user:password@host/dbName?new)
* @return void
* @access public
*/
function setNC1ADOConnection($dsn)
{
$dsn = $this->addDSNNew($dsn);
$this->nc1ADOConnection = NewADOConnection($dsn);
if (!empty($this->nc1ADOConnection)) {
// 追記箇所
$adoConnection = $this->nc1ADOConnection;
if (strpos($adoConnection->dataProvider, "mysql") === 0) {
$serverInfo = $adoConnection->ServerInfo();
if (floatval($serverInfo["version"]) >= 4.01) {
$adoConnection->Execute("SET NAMES 'ujis';");
}
}
$this->nc1ADOConnection->SetFetchMode(ADODB_FETCH_ASSOC);
}
}
NetCommons2のFileUploadフィルター調査
こんにちは。牟田口です。
よくアップロード処理の開発でハマるので、FileUploadフィルターについて調べてみた。
### maple.ini
[FileUpload]
name = file_csv ← input type=file属性のname名称。実際のテンプレートに合わせる
allow_extension = "true" ← configテーブルの許す拡張子の一覧から拡張子チェックを行うかどうかのフラグ
maxsize = "" ← 最大ファイル容量=無制限
stopper = "false" ← 無指定だと trueになる。
true:FileUploadフィルタ内で、MIME-Typeチェック、拡張子チェック等行う。チェックエラーの場合、画面に出るエラーメッセージは一律「ファイルアップロードに失敗しました」
false:ファイルの最大ファイル容量チェック、ルームの合計最大ファイル容量チェックのみ行う。
### stopper = "true"チェック
### stopper = "false"でもチェック
### 参考
### おまけ allow_attachment
[FileUpload]
;allow_attachment = _ALLOW_ATTACHMENT_IMAGE
基本、指定しなくて良い。
指定しないと、allow_attachment = _ALLOW_ATTACHMENT_ALL として扱われる。
//configの権限でアップロード可能かどうかを取得
$allow_attachment_flag = $session->getParameter("_allow_attachment_flag");
//maple.iniで allow_attachment の定数取得
$attributes_allow_attachment_flag = $this->constantDef($attributes["allow_attachment"]);
- configのアップロード権限が、_ALLOW_ATTACHMENT_IMAGE
- maple.iniの allow_attachment _ALLOW_ATTACHMENT_ALL
理由はよくわからんのです。
ではでは。
NetCommons2で開発中はsmartyのコンパイルを自動にする
こんにちは。牟田口です。
忘れるのでメモ。
NetCommons2で使っているテンプレートエンジン smarty。
smartyは一度、phpに変換をするコンパイルが必要。
通常は、モジュール管理からモジュールをアップデートすると、
対象モジュールのsmartyがコンパイルされる。
開発中は、smartyテンプレートを変えたら、すぐに画面に反映して欲しいので、自動コンパイルさせたい。
NetCommons2だと、下記パラメータにすればOK
\html\webapp\config\maple.inc.php
define('SMARTY_FORCE_COMPILE', true);
maple.inc.php - github
https://github.com/netcommons/NetCommons2/blob/e89bfb7c3e9253c07c34ac16999b44428473b51e/html/webapp/config/maple.inc.php#L55
本番リリース時は、パフォーマンスが落ちるので、false を推奨。
ではでは。
PHP5.6 をremi からインストールしたら、SimpleXML は明示的にインストール
こんにちは。
永原です。
PHP5.6 をremi からインストールしたら、SimpleXML は明示的にインストールすること。
# yum install --enablerepo=remi --enablerepo=remi-php56 php-xml
これを忘れていて、phpExcel でコケました。
[追記]
php-xml がインストールされていないと、検索モジュールでコケました。
検索の初期画面が出ない現象なので、ちょっとはまりました。
MySQL5.6 はSTRICT_TRANS_TABLES が初期値
こんにちは。
永原です。
MySQL5.6 はSTRICT_TRANS_TABLES が初期値で設定されているんですよね。
my.cnf にしっかりと。
NetCommons2.4.2.1 では、まだ汎用データベースのデータベース作成アクションにバグがあり、この状態ではコケてしまいます。
(他にどこにバグがあるかはわからない)
ということで、以下の通り、MySQL の設定を変更して対応しています。
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=NO_ENGINE_SUBSTITUTION
以上