[Book]「伝説の社員」になれ! 成功する5%になる秘密とセオリー

要約

将来の見えない若手ビジネスパーソンにとって魅力的でかつ現実
的なキャリア目標、それが本書でいう「伝説の社員」です。

いったん「伝説の社員」になれば、あとは起業するのも、他社に引き抜かれるの
も、出世して企業幹部になるのも、本人の自由です。

不透明なキャリアの最終形を思い悩むより、まずは「伝説の社員」になる。

これまで、数多くの成功者たちをインタビューした経験から、
そのために必要な心構えとノウハウ、テクニックを盛り込みました。

Amazonより

目次

第一章 自分の値段は自分でつける!
第二章 付加価値をつければ人生が変わる!
第三章 最強の自分マーケティング
第四章 「伝説の社員」になれ!


感想

若いビジネスマンは特に!
残り長い社会人生の中で自分自身のマーケットバリューを高められるかが、残りの社会人生の成功と失敗を分ける大きな違いとなってきます。
そのためのエッセンスが凝縮されている、そんな本です。

最初にどんなにいい企業に就職しても、どんなに期待値の高い仕事を行っていても、会社の後ろ盾がなくなったときに「本当に一人でやっていけるのか」
そんなことを考えさせれました。

つまらない仕事も、常にビジネスに変えられるような。
プロジェクトの中の一メンバーとして働いている中でも経営者の視点で仕事に取り組めるか。
24時間働き続けられるか。

日本の減点主義文化の中で、10の失敗を恐れず1の成功を求める極意がつまっています。

[WEB]Webydoを使ってみる

Webydoとは

WEBサイトを自分でデザインしたい、けどエンジニアはいないし、外注もしたくない。そんなときに利用できるサービスです。
WEB上でテンプレート(もしくは白紙のページ)を選択し、GUI上でレイアウトの編集をするだけで簡単に自分のWEBサイトが作れてしまいます。

コーディングなしで、静的なWEBサイトがつくれてしまう

登録してみる

以下のリンクをクリックして、登録してください(もちろん無料)。
Webydoに登録

メール等の情報を入力
webydo_1_登録

登録のステップは以上。

サイトをつくってみる

ホーム画面から新規作成のボタンを押下します
webydo_2_新規作成

用意されたテンプレート群から、作りたいサイトに近いテンプレートを選択します
webydo_3_オプション選択
デザインベースで選択する場合
webydo_4_デザイン選択
レイアウトベースで選択する場合
webydo_5_レイアウト選択
WEB上のキャンパスでエディタ等を駆使して編集ー、以下テストでつくったサンプルサイトです
webydo_6_完成

サンプルサイト

[Symfony]Cookieにsecure属性を付与する

Symfonyで設定する方法

個別に実装を書く必要はありません。factories.ymlに以下を追加するだけです。

all:
(省略)
  storage:
    class: sfSessionStorage
    param:
      session_cookie_secure: true
(省略)

以前の記事でも紹介しましたが、Javaの場合は以下のサイトをご参照ください。
[Java]SSL環境下でCookieにsecure属性を付与する
※この記事はTomcatのバージョンが低く – ver5 – 、SSLアクセレレータ配下でデフォルトのオプション(server.xml)で設定できない場合の実装方法です。
Tomcatのバージョンが高い – ver6以降 – 場合はSSLアクセレレータ配下で通信がHTTP(HTTPSでない)の場合でもデフォルトのオプションでsecure属性をつけてくれます。

すごく簡単。

[Symfony]jsonレスポンスを返す設定方法

外部API

最近では、WebサービスとしてAPIが多く提供されています(Google Map API…)。そのコンテンツを充実させるのに注力するために、ここでは外部APIとしてよくある「json」レスポンスを返す方法について紹介します。

例)
Google Map API
ATND API

jsonレスポンスを返すための設定

この記事はPHPとSymfonyをベースとした実装方法を紹介していきます。従ってPHPおよびSymfonyの基礎知識はある前提で紹介していきます。

まず、レスポンスとしてjsonを返すので、アプリケーションのcontent-Typeをapplication/jsonにします。また、HTMLとしてのレスポンスを返す必要がないのでhas_layoutもfalseとします。それらの設定はview.ymlにて設定可能です。

default:
  http_metas:
    content-type: application/json; charset=UTF-8
#   通常の場合
#   content-type: text/html

...

  has_layout: false
# 通常の場合
# has_layout: true
  layout: layout

[PHP]HTTPリクエスト実行時にタイムアウトを指定する

タイムアウトを設定する要件

WEBシステムを作成していて、外部との通信に処理がかかった場合にタイムアウトを検知して、ハンドリングを行いたいという要件はよくある話、PHPで実装した場合にはまったのでメモ。

PHPでHTTPリクエストを実行する方法

大きく以下の三つがあります。
1. file_get_contents
2. fsockopen
3. curl

タイムアウトを検証するために

適当なPHPファイルを用意します。こんな感じで書いておけば、OK.

<?php
// 10秒スリープ
sleep(10);
?>

file_get_contentsで動かなかった実装

/**
  * HTTPリクエストを実行します。
  * @param string $url HTTPリクエストを実行する対象URL
  * @param string $header 送信するHTTPヘッダ
  * @param string $post 送信するPOSTパラメータ
  */
function request($url, $header, $post) {
	$options = array(
		'method' => 'POST',
		'header' => $header,
		'content' => $content,
		'timeout' => 30
	));
	$context = stream_context_create($options);
	$f = file_get_contents($url, false, $context);

	var_dump($f);
}

timeoutで指定すれば問題ないと思ったのですが、そんなことはなかった、、、いろいろ調べた結果「stackoverflow」に無理だよと。

curlでの動く実装

/**
  * HTTPリクエストを実行します。
  * @param string $url HTTPリクエストを実行する対象URL
  * @param string $header 送信するHTTPヘッダ
  * @param string $post 送信するPOSTパラメータ
  */
function request($url, $header, $post) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_POST, TRUE);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	
	$f = curl_exec($ch);
	curl_close($ch);
	
	var_dump($f);
}

これで、問題なく動きました。

file_get_contentsでどうにかこうにかできないかと相当やりましたが、無理です。curlを使いましょう。

[Book]「また会いたい」と思われる人の38のルール

要約

たった1秒の「反応」で、人生は劇的に変わる!

仕事も恋愛も、相手から「また会いたい」と思われてこそ、
目標を達成できるのです。

そのために最重要視すべきことは、「反応をよくする」ということです。

それを実践するだけで、仕事の幅もみるみる広がり、
いいことが次々と舞い込んでくるようになるのです。

◎人生はたった1秒の反応で決まる!
◎表情の印象は5ミリで変わる!
◎姿勢が運勢を左右する
◎恐いくらい本性が出る手癖、足癖
◎ほめられたら、第一声は『ありがとう』
◎人間関係もビジネスも『損して得取れ』
◎相手の心に届く『巻き込みアクション』をする
◎人と縁を切ることを恐れるな
◎相手にとって『意外に失礼な言葉』を使うな
◎いつも笑顔でいるのはやめよう!
◎ドン引きされる余計な一言は使うな
◎好かれようとするのはやめよう!

等々、実践すれば、その場ですぐに効果があらわれる
ルールが満載です。

Amazonより

目次

Part1 「また会いたい」と思われる人の考え方のルール
Part2 「また会いたい」と思われる人の見た目のルール
Part3 「また会いたい」と思われる人の行動のルール

感想

日々何気なく行っているコミュニケーションも、頭を使いながらすることで、最終的な結末も変わってくる。そう考えると、日々の会話も慎重に・大事にしなければならないなと思わされる。


[Book]ヤクザ式 ビジネスの「かけひき」で絶対に負けない技術

要約

市場原理主義が支配する弱肉強食の現代は、“勝つためには何でもあり”のヤクザ界に近づいている。すなわち、不況が続くビジネス界を生き抜くための手っ取り早い方法は、ヤクザの交渉術を学び、駆使することだ。週刊誌記者時代に数多くのヤクザを取材してきた著者が、相手を制し、責任を取らせ、自分に有利な結果を導く最強の交渉術を徹底解説。

Amazonより

目次

第1章 タフネゴシエーションを制する技術
第2章 ライバルに差をつける技術
第3章 部下を思いのままに操る技術
第4章 上司を相手に自分の価値を高める技術
第5章 クライアントの心をつかむ技術
第6章 勝利の種をまく技術
第7章 大逆転を呼び込む技術

感想

ヤクザとビジネスを関連づけて、よりよいビジネスマンとしての立ち振る舞いを説いた本。印象に残った言葉をつらつら綴っていきます。

・ミステリアスであれ。相手に自分の底を握らせるな。

・相手にケツを持たせる。

・失敗した部下へかける言葉は「それでどうするの?」、部下に考えさせ行動させる。言い訳することが以下に無意味かを身をもって知らしめる。

・人間は、能力に負荷をかけて成長するというが、「部下に能力以上の仕事を与え、成功体験を積ませる」という手法は誤っている。失敗することで、業務に与える影響が小さいような仕事でプレッシャーをかけるべき。

・優秀なビジネスマンは自分自身を売り込むのではなく、自分が描く会社のビジョンを売り込み、副次的に自分の仕事を手に入れる。

・言葉の手形をきらし、それをベースにばんばんプレッシャーをかける。

・適材適所の人間配置ではなく、適所に適材を配置する。部下を育てようとは甘い、雑草だと思い踏みつぶせ。生えてこないやつは一生のびない。

・部下を飴でつるのではなく、危機感を持った状況を演出しよう。

・問題の責任を第三者に転嫁し、自分と相手は被害者であると思わせ連帯感を生む技術。

・結果と次のアクションに要点を絞って報告しよう。

・クライアントから情報を求めるだけではなく、まず自分から提供しよう。情報を提供できる人間になれば、少なくとも会って悪い気はしない。

[株]HumbleFinanceを使ってみた

作ったもの

Go To Chart Navi

Humble Finance

チャートをHTML5で描画してくれるJavascriptフレームワークです。これを使ってWEBページを作ってみます。

Humble Software Development

他に使ったライブラリとか

CHAPI! – 株価API
株価を検索するためのフリーAPIです。IKACHI Projectなる団体が管理しているらいです。
ここが提供する四本値データと銘柄データを利用してチャート描画に必要なデータを収集しています。

IKACHI Project

Prototype
Humble Financeの動作条件として必須なJavascriptフレームワーク。

Prototype

JQuery
Javascriptフレームワーク。Prototypeと文法上競合するので記述方法に気をつけます。

JQuery

KickStart
cssフレームワーク。

KickStart

さあ、どうぞ

PHP & Symfonyで実装しました。

Go To Chart Navi

[Symfony]SymfonyアプリケーションにKCAPTCHAを取り込む

CAPTCHA

CAPTCHAとはコンピュータが認識できない揺れた英数字を表示し、コンピュータによるスパムを防止するための機能である。

CAPTCHAとは

KCAPTCHAを単体で動作させる

まず、KCAPTCHAを以下のリンクからダウンロードする。
KCAPTCHA

ダウンロードしたパッケージをそのまま公開ディレクトリに配置し、単体で動作することを確認しよう。内包されているindex.phpにアクセスすると以下のように表示される。

SymfonyアプリケーションにKCAPTCHAを導入する

KCAPTCHAはRAW PHPで記述されており、Symfonyアプリケーション配下に取り込むとうまく動作しない。そこで、公開ディレクトリに配置し、Symfonyとは別のアプリケーションとして動作させることを考える。

単体で動作することは確認したので、Symfonyから呼び出して使う。Symfonyのテンプレートからimgタグを利用して以下のように呼び出す。

apps/frontend/module/XXXX/templates/XXXX.php

...
<img src="<?php echo $sf_request->getRelativeUrlRoot() . '/captcha/' ?>index.php ?>">
...

これで、問題なく表示されるはず。次に認証の実装を考える。KCAPTCHAをSymfonyと独立させたことで、KCAPTHCAがセッションに保存した認証文字列はSymfonyから正規ルートでアクセスすることは不可能である。クッキーからセッション情報を取り出して、無理やり認証文字列を取り出す必要がある。以下、action.class.phpの実装となる。(KCAPTCHAのセッション情報はキーを「captcha_keystring」として保存する)

apps/frontend/module/XXXX/actions/action.class.php

$sessionCaptcha = '';
$phpSessionData = file_get_contents(session_save_path() . '/sess_' . $request->getCookie('PHPSESSID'));
$arr = explode(";", $phpSessionData);
foreach ($arr as $value) {
    if (preg_match("/^captcha_keystring/", $value) === 1) {
        $arr1 = explode(":", $value);
        $sessionCaptcha = $arr1[2];
    }
}

COOKIEからPHPのセッションを取り出し、captcha_keystringをキーとし、その値を取得するというロジックである。これと、入力された文字列を比較し、認証を行う。

[PHP]PEAR::PagerをPOST遷移するときに$optionsで指定したonclickを有効にする方法

PEAR::Pagerとは

一覧で表示を行う場合にページを自動的に分割して表示する機能を提供してくれるPEARライブラリです。詳細な実装および設定方法に関しては以下のサイトを参照ください。
ページング(PEAR::Pager)

POSTで遷移する場合にonclickがきかない問題

PEAR::Pagerのオブジェクトを生成する方法はfactoryファンクションを利用するのですが、この引数として配列形式のオプションを渡してあげるとPEAR::Pagerの詳細な振る舞いについて定義することが可能となっています。このオプションでhttpMethodをPOSTにした場合にonclickがきかなくなります。関数定義とオプションの一覧を下記表に示します。

Pager::factory()
object &factory (array $options)
引数:
 $options オプションを格納した配列
戻り値:
 Pagerクラスオブジェクト。失敗した場合はPEAR_Errorオブジェクト

$optionsにて設定可能なオプションは以下の通りです。

オプション名 内容
itemData array 対象となるアイテムを格納した配列
totalItems integer 対象となるアイテム数(itemDataが未指定の場合に使用)
perPage integer 1ページごとに表示されるアイテム数
delta integer 現在のページの前後に表示するページ番号の数
mode string 動作モードを指定。ジャンプ型(Jumping)またはスライド型(Sliding)
httpMethod string 使用するHTTPメソッド。「GET」または「POST」
formID string httpMethodでPOSTを指定した場合のHTMLフォームを指定
importQuery boolean 変数と値がクエリ文字列からインポートするならTRUE
currentPage integer 初期ページ番号
expanded boolean TRUEの場合、ウィンドウサイズは2×delta+1
linkClass string リンクのスタイルのためのCSSクラス
urlVar string ページ番号を示すためのクエリ変数名(デフォルトは「pageID」)
path string ページへの絶対パス(ページ名は除く)
fileName string ページ名。appendがTRUEなら”%d”
fixFileName boolean FALSEなら、オプションfileNameは上書きされません
append boolean TRUEならpageIDはクエリ文字列としてURLに追加。FALSEならfileNameに従ってURLに埋め込まれる(デフォルトは「TRUE」)
altFirst string 最初のページのリンクに表示されるalt文。デフォルトは「first page」
altPrev string 前のページのリンクに表示されるalt文。デフォルトは「previous page」
altNext string 次のページのリンクに表示されるalt文。デフォルトは「next page」
altLast string 最後のページのリンクに表示されるalt文。デフォルトは「last page」
altPage string ページ番号の前に表示されるalt文。デフォルトは「page」
prevImg string 前のページのリンクである「<<」の代替文字。タグも可能
nextImg string 次のページのリンクである「&lgt;>」の代替文字。タグも可能
separator string ページ番号を分けるための区切り文字。カンマやハイフンの他にタグも可能
spacesBeforeSeparator integer 区切り文字の前のスペース数
spacesAfterSeparator integer 区切り文字の後のスペース数
curPageLinkClassName string 現在のページのリンクのスタイルのためのCSSクラス
curPageSpanPre string 現在のページのリンクの前のテキスト
curPageSpanPost string 現在のページのリンクの後のテキスト
firstPagePre string 最初のページ番号の前の文字。任意の文字列の他にタグも可能
firstPageText string 最初のページ番号の文字
firstPagePost string 最初のページ番号の後の文字。任意の文字列の他にタグも可能
lastPagePre string 最後のページ番号の前の文字。任意の文字列の他にタグも可能
lastPageText string 最後のページ番号の文字
lastPagePost string 最後のページ番号の後の文字。任意の文字列の他にタグも可能
clearIfVoid boolean 1ページしか無い場合にPageリンクを表示しないかどうか
useSessions boolean TRUEの場合、ページごとに表示するアイテム数は$_SESSION[$_sessionVar]変数に保存
closeSession boolean TRUEの場合、セッションはR/Wされた後にクローズする
sessionVar string perPageの値を格納するセッション変数名(1ページに複数のPagerを使用する場合に利用)
showAllText string generated by getPerPageSelectBox()で生成されたセレクトボックスでの’show all’オプションのために使用されるテキスト
pearErrorMode constant raiseError()でPEAR_ERRORモードを使用するかどうか(デフォルトは「PEAR_ERROR_RETURN」)

POSTで遷移する場合にonclickがきかない問題はなぜ発生するのか

ViewをレンダリングするPEAR::Pagerライブラリを見ればそれは一発です。Pager/Common.phpの問題のコードは以下となります。

    /**
     * Renders a link using the appropriate method
     *
     * @param string $altText  Alternative text for this link (title property)
     * @param string $linkText Text contained by this link
     *
     * @return string The link in string form
     * @access private
     */
    function _renderLink($altText, $linkText)
    {
        if ($this->_httpMethod == 'GET') {
            if ($this->_append) {
                $href = '?' . $this->_http_build_query_wrapper($this->_linkData);
            } else {
                $href = str_replace('%d', $this->_linkData[$this->_urlVar], $this->_fileName);
            }
            $onclick = '';
            if (array_key_exists($this->_urlVar, $this->_linkData)) {
                $onclick = str_replace('%d', $this->_linkData[$this->_urlVar], $this->_onclick);
            }
            return sprintf('<a href="%s"%s%s%s%s title="%s">%s</a>',
                           htmlentities($this->_url . $href, ENT_COMPAT, 'UTF-8'),
                           empty($this->_classString) ? '' : ' '.$this->_classString,
                           empty($this->_attributes)  ? '' : ' '.$this->_attributes,
                           empty($this->_accesskey)   ? '' : ' accesskey="'.$this->_linkData[$this->_urlVar].'"',
                           empty($onclick)            ? '' : ' onclick="'.$onclick.'"',
                           $altText,
                           $linkText
            );
        } elseif ($this->_httpMethod == 'POST') {
            $href = $this->_url;
            if (!empty($_GET)) {
                $href .= '?' . $this->_http_build_query_wrapper($_GET);
            }
            return sprintf("<a href='javascript:void(0)' onclick='%s'%s%s%s title='%s'>%s</a>",
                           $this->_generateFormOnClick($href, $this->_linkData),
                           empty($this->_classString) ? '' : ' '.$this->_classString,
                           empty($this->_attributes)  ? '' : ' '.$this->_attributes,
                           empty($this->_accesskey)   ? '' : ' accesskey=\''.$this->_linkData[$this->_urlVar].'\'',
                           $altText,
                           $linkText
            );
        }
        return '';
    }

    // }}}
    // {{{ _generateFormOnClick()

    /**
     * Mimics http_build_query() behavior in the way the data
     * in $data will appear when it makes it back to the server.
     *  For example:
     * $arr =  array('array' => array(array('hello', 'world'),
     *                                'things' => array('stuff', 'junk'));
     * http_build_query($arr)
     * and _generateFormOnClick('foo.php', $arr)
     * will yield
     * $_REQUEST['array'][0][0] === 'hello'
     * $_REQUEST['array'][0][1] === 'world'
     * $_REQUEST['array']['things'][0] === 'stuff'
     * $_REQUEST['array']['things'][1] === 'junk'
     *
     * However, instead of  generating a query string, it generates
     * Javascript to create and submit a form.
     *
     * @param string $formAction where the form should be submitted
     * @param array  $data       the associative array of names and values
     *
     * @return string A string of javascript that generates a form and submits it
     * @access private
     */
    function _generateFormOnClick($formAction, $data)
    {
        // Check we have an array to work with
        if (!is_array($data)) {
            trigger_error(
                '_generateForm() Parameter 1 expected to be Array or Object. Incorrect value given.',
                E_USER_WARNING
            );
            return false;
        }

        if (!empty($this->_formID)) {
            $str = 'var form = document.getElementById("'.$this->_formID.'"); var input = ""; ';
        } else {
            $str = 'var form = document.createElement("form"); var input = ""; ';
        }

        // We /shouldn't/ need to escape the URL ...
        $str .= sprintf('form.action = "%s"; ', htmlentities($formAction, ENT_COMPAT, 'UTF-8'));
        $str .= sprintf('form.method = "%s"; ', $this->_httpMethod);
        foreach ($data as $key => $val) {
            $str .= $this->_generateFormOnClickHelper($val, $key);
        }

        if (empty($this->_formID)) {
            $str .= 'document.getElementsByTagName("body")[0].appendChild(form);';
        }

        $str .= 'form.submit(); return false;';
        return $str;
    }

    // }}}
    // {{{ _generateFormOnClickHelper

    /**
     * This is used by _generateFormOnClick().
     * Recursively processes the arrays, objects, and literal values.
     *
     * @param mixed  $data Data that should be rendered
     * @param string $prev The name so far
     *
     * @return string A string of Javascript that creates form inputs
     *                representing the data
     * @access private
     */
    function _generateFormOnClickHelper($data, $prev = '')
    {
        $str = '';
        if (is_array($data) || is_object($data)) {
            // foreach key/visible member
            foreach ((array)$data as $key => $val) {
                // append [$key] to prev
                $tempKey = sprintf('%s[%s]', $prev, $key);
                $str .= $this->_generateFormOnClickHelper($val, $tempKey);
            }
        } else {  // must be a literal value
            // escape newlines and carriage returns
            $search  = array("\n", "\r");
            $replace = array('\n', '\n');
            $escapedData = str_replace($search, $replace, $data);
            // am I forgetting any dangerous whitespace?
            // would a regex be faster?
            // if it's already encoded, don't encode it again
            if (!$this->_isEncoded($escapedData)) {
                $escapedData = urlencode($escapedData);
            }
            $escapedData = htmlentities($escapedData, ENT_QUOTES, 'UTF-8');

            $str .= 'input = document.createElement("input"); ';
            $str .= 'input.type = "hidden"; ';
            $str .= sprintf('input.name = "%s"; ', $prev);
            $str .= sprintf('input.value = "%s"; ', $escapedData);
            $str .= 'form.appendChild(input); ';
        }
        return $str;
    }

ここで問題となるのはリンクをレンダリングする関数の「function _renderLink($altText, $linkText)」です。POSTとGETで実装が分岐しています。POST箇所のonclickのレンダリングを見てみると、L.37「$this->_generateFormOnClick($href, $this->_linkData)」でやっているようです。しかし、onclickをレンダリングする実装に$optionsで指定した「$this->_onclick」が呼ばれている実装はありません。これが原因。GETメソッドの場合はL.20で呼ばれているのに。

解決方法

POSTのonclickレンダリングで、$this->_onclickを設定してあげればよいのです。以下、実装です。

    // }}}
    // {{{ _generateFormOnClick()

    /**
     * Mimics http_build_query() behavior in the way the data
     * in $data will appear when it makes it back to the server.
     *  For example:
     * $arr =  array('array' => array(array('hello', 'world'),
     *                                'things' => array('stuff', 'junk'));
     * http_build_query($arr)
     * and _generateFormOnClick('foo.php', $arr)
     * will yield
     * $_REQUEST['array'][0][0] === 'hello'
     * $_REQUEST['array'][0][1] === 'world'
     * $_REQUEST['array']['things'][0] === 'stuff'
     * $_REQUEST['array']['things'][1] === 'junk'
     *
     * However, instead of  generating a query string, it generates
     * Javascript to create and submit a form.
     *
     * @param string $formAction where the form should be submitted
     * @param array  $data       the associative array of names and values
     *
     * @return string A string of javascript that generates a form and submits it
     * @access private
     */
    function _generateFormOnClick($formAction, $data)
    {
        // Check we have an array to work with
        if (!is_array($data)) {
            trigger_error(
                '_generateForm() Parameter 1 expected to be Array or Object. Incorrect value given.',
                E_USER_WARNING
            );
            return false;
        }

        $onclick = str_replace('%d', $this->linkData[$this->_urlVar], $this->onclick);
        $str = $onclick;

        if (!empty($this->_formID)) {
            $str = 'var form = document.getElementById("'.$this->_formID.'"); var input = ""; ';
        } else {
            $str = 'var form = document.createElement("form"); var input = ""; ';
        }

        // We /shouldn't/ need to escape the URL ...
        $str .= sprintf('form.action = "%s"; ', htmlentities($formAction, ENT_COMPAT, 'UTF-8'));
        $str .= sprintf('form.method = "%s"; ', $this->_httpMethod);
        foreach ($data as $key => $val) {
            $str .= $this->_generateFormOnClickHelper($val, $key);
        }

        if (empty($this->_formID)) {
            $str .= 'document.getElementsByTagName("body")[0].appendChild(form);';
        }

        $str .= 'form.submit(); return false;';
        return $str;
    }

追加したのはL.38, L.39です。これで、$optionsで設定したonclickがきくはず。