リード開発メモ

大阪のソフトウェア会社です。 技術的な事柄についてのメモとしてブログを始めます。

PHP

PHP タイムゾーンが8時間ずれている

XAMPP に含まれる PHP のタイムゾーンの初期設定は Europe/Berlin となっているようだ。そのため date 関数などで時刻を取得すると8時間ずれている。

日本時間に合わせるには php.ini を編集し、date.timezone を Asia/Tokyo に変更する。
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone = Europe/Berlin
date.timezone = Asia/Tokyo

以上。

PHP Zend Framework 2 を使ってみる(その5)

前回は Zend Framework 2 でフォームを作成した。このときはコントローラ内でフォームの要素をひとつひとつ追加して作成したが、今回は Form クラスを継承した独自クラスを作ることにする。

いつものとおり、ZendSkeletonModule を改造する。モジュール名、ネームスペースは FormTest2、コントローラ名は Form2Controller とした。

まず、Form クラスを継承した独自クラスを作る。Form クラスを継承した独自クラスのソースコードは、Controller フォルダの同階層に Form フォルダを作り、ここにまとめて置く。今回は以下のファイル名で作成する。
C:\xampp\htdocs\ZendSkeletonApplication\module\FormTest2\src\FormTest2\Form\ContactForm.php
ContactForm.php は以下のとおり。
<?php
namespace FormTest2\Form;
 
use Zend\Captcha\AdapterInterface as CaptchaAdapter;
use Zend\Form\Element;
use Zend\Form\Form;
 
class ContactForm extends Form
{
    protected $captcha;
 
    public function setCaptcha(CaptchaAdapter $captcha)
    {
        $this->captcha = $captcha;
    }
 
    public function prepareElements()
    {
        $this->add(array(
            'name' => 'name',
            'options' => array(
                'label' => 'Your name',
            ),
            'attributes' => array(
                'type'  => 'text',
            ),
        ));
        $this->add(array(
            'type' => 'Zend\Form\Element\Email',
            'name' => 'email',
            'options' => array(
                'label' => 'Your email address',
            ),
        ));
        $this->add(array(
            'name' => 'subject',
            'options' => array(
                'label' => 'Subject',
            ),
            'attributes' => array(
                'type'  => 'text',
            ),
        ));
        $this->add(array(
            'type' => 'Zend\Form\Element\Textarea',
            'name' => 'message',
            'options' => array(
                'label' => 'Message',
            ),
        ));
        $this->add(array(
            'type' => 'Zend\Form\Element\Captcha',
            'name' => 'captcha',
            'options' => array(
                'label' => 'Please verify you are human.',
                'captcha' => $this->captcha,
            ),
        ));
        $this->add(new Element\Csrf('security'));
        $this->add(array(
            'name' => 'send',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Submit',
            ),
        ));
    }
}

コントローラ側のソース、Form2Controller.php は以下のようになる。 フォーム作成の細かい処理が ContactForm .php に移ったことで、コントローラのフォーム作成処理はずいぶん簡単になった。
<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/FormTest2 for the canonical source repository
 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */
 
namespace FormTest2\Controller;
 
use Zend\Mvc\Controller\AbstractActionController;
 
use Zend\Captcha;
use Zend\Form\Element;
use Zend\Form\Form;
 
class Form2Controller extends AbstractActionController
{
    public function indexAction()
    {
        $form = new \FormTest2\Form\ContactForm();
        $form->setCaptcha(new Captcha\Dumb());
        $form->prepareElements();
 
        return array('form' => $form);
    }
 
    public function fooAction()
    {
        $request = $this->getRequest();
        if ($request->isPost()) {
            return array('datas' => $request->getPost());
        }
        return $this->redirect()->toRoute('formtest2');
    }
}

ビュー側のソースは変更不要であるが、index.phtml を以下のように変更してみた。前回よりは幾分シンプルに書ける。
<?php
// within a view script
$form = $this->form;
$form->prepare();
 
// Assuming the "form2/foo" route exists...
$form->setAttribute('action', 'form2/foo');
 
// Set the method attribute for the form
$form->setAttribute('method', 'post');
 
// Render the opening tag
echo $this->form()->openTag($form);
?>
<div class="form_element">
<?php
    $name = $form->get('name');
    echo $this->formRow($name);
?></div>
 
<div class="form_element">
<?php
    $email = $form->get('email');
    echo $this->formRow($email);
?></div>
 
<div class="form_element">
<?php
    $subject = $form->get('subject');
    echo $this->formRow($subject);
?></div>
 
<div class="form_element">
<?php
    $message = $form->get('message');
    echo $this->formRow($message);
?></div>
 
<div class="form_element">
<?php
    $captcha = $form->get('captcha');
    echo $this->formRow($captcha);
?></div>
 
<?php echo $this->formElement($form->get('security')) ?>
<?php echo $this->formElement($form->get('send')) ?>
 
<?php echo $this->form()->closeTag() ?>

続いて foo.phtml のソース。変更していない。
<div>
<strong>datas:</strong>
<?php var_dump($this->datas); ?>
</div>

実行してみる。初期表示。
zendframework2-8

入力後、ボタンを押した状態。
zendframework2-9

以上。

PHP Zend Framework 2 を使ってみる(その4)

今回は Zend Framework 2 でフォームを作成する。

いつものとおり、ZendSkeletonModule を改造する。モジュール名、ネームスペースは FormTest1、コントローラ名は Form1Controller とした。

コントローラ側のソース、Form1Controller.php は以下のとおり。

<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/FormTest1 for the canonical source repository
 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */
 
namespace FormTest1\Controller;
 
use Zend\Mvc\Controller\AbstractActionController;
 
use Zend\Captcha;
use Zend\Form\Element;
use Zend\Form\Form;
 
class Form1Controller extends AbstractActionController
{
    public function indexAction()
    {
        $name = new Element('name');
        $name->setLabel('Your name');
        $name->setAttributes(array('type' => 'text'));
 
        $email = new Element\Email('email');
        $email->setLabel('Your email address');
 
        $subject = new Element('subject');
        $subject->setLabel('Subject');
        $subject->setAttributes(array('type' => 'text'));
 
        $message = new Element\Textarea('message');
        $message->setLabel('Message');
 
        $captcha = new Element\Captcha('captcha');
        $captcha->setCaptcha(new Captcha\Dumb());
        $captcha->setLabel('Please verify you are human.');
 
        $csrf = new Element\Csrf('security');
 
        $send = new Element('send');
        $send->setValue('Submit');
        $send->setAttributes(array('type' => 'submit'));
 
        $form = new Form('contact');
 
        $form->add($name);
        $form->add($email);
        $form->add($subject);
        $form->add($message);
        $form->add($captcha);
        $form->add($csrf);
        $form->add($send);
 
        return array('form' => $form);
    }
 
    public function fooAction()
    {
        $request = $this->getRequest();
        if ($request->isPost()) {
            return array('datas' => $request->getPost());
        }
        return $this->redirect()->toRoute('formtest1');
    }
}


また、ビュー側のソース、index.phtml は以下のようにした。
<?php
// within a view script
$form = $this->form;
$form->prepare();
 
// Assuming the "form1/foo" route exists...
$form->setAttribute('action', 'form1/foo');
 
// Set the method attribute for the form
$form->setAttribute('method', 'post');
 
// Get the form label plugin
$formLabel = $this->plugin('formLabel');
 
// Render the opening tag
echo $this->form()->openTag($form);
?>
<div class="form_element">
<?php
    $name = $form->get('name');
    echo $formLabel->openTag() . $name->getOption('label');
    echo $this->formLabel($name);
    echo $this->formInput($name);
    echo $this->formElementErrors($name);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $email = $form->get('email');
    echo $formLabel->openTag() . $email->getOption('label');
    echo $this->formLabel($email);
    echo $this->formInput($email);
    echo $this->formElementErrors($email);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $subject = $form->get('subject');
    echo $formLabel->openTag() . $subject->getOption('label');
    echo $this->formLabel($subject);
    echo $this->formInput($subject);
    echo $this->formElementErrors($subject);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $message = $form->get('message');
    echo $formLabel->openTag() . $message->getOption('label');
    echo $this->formLabel($message);
    echo $this->formTextarea($message);
    echo $this->formElementErrors($message);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $captcha = $form->get('captcha');
    echo $formLabel->openTag() . $captcha->getOption('label');
    echo $this->formLabel($captcha);
    echo $this->formCaptcha($captcha);
    echo $this->formElementErrors($captcha);
    echo $formLabel->closeTag();
?></div>
 
<?php echo $this->formElement($form->get('security')) ?>
<?php echo $this->formElement($form->get('send')) ?>
 
<?php echo $this->form()->closeTag() ?>

続いて foo.phtml のソース。ポストされたデータを表示するだけである。
<div>
<strong>datas:</strong>
<?php var_dump($this->datas); ?>
</div>

実行してみる。初期表示。
zendframework2-6

入力後、ボタンを押した状態。
zendframework2-7

以上。

PHP Zend Framework 2 を使ってみる(その3)

前回はモジュールを追加したが、最低限のことしか行っていないため、もう少し手を加えてみる。
そこで公式ページの Mvc の Quick Start にある HelloController を作ってみる。

やはり今回もモジュールの雛形 ZendSkeletonModule から出発する。GitHub のサイトからダウンロードし、これを解凍、フォルダ名を HelloWorld とリネームし、前回配置した ZendSkeletonApplication の module フォルダ内に配置する。このあたりは前回を参照のこと。フォルダの階層は以下のようになる。
C:\xampp\htdocs\ZendSkeletonApplication\module\HelloWorld


ZendSkeletonApplication の下の configにある application.config.php も前回と同様に書き換える。連想配列の 'modules' に 'HelloWorld' を追加しただけである。
<?php
return array(
    // This should be an array of module namespaces used in the application.
    'modules' => array(
        'Application',
        'ZendSkeletonModule',
        'HelloWorld',
    ),

    // These are various options for the listeners attached to the ModuleManager
    'module_listener_options' => array(
         :
         :

今回はモジュール名を変えるので、変更する箇所が増える。モジュール名、ネームスペースは HelloWorld とする。まずはこれらを変更する。

・Module.php 内の namespace 指定を HelloWorld に変更
・src フォルダ内の ZendSkeletonModule を HelloWorld にリネーム
・view フォルダ内の zend-skeleton-module を hello-world にリネーム

次に、コントローラを作成する。内容は公式ページの Quick Start にある HelloController をコピペする。その際、namespace のモジュール名の部分は HelloWorld に書き換えること。作成するファイルと内容は以下のとおり。
C:\xampp\htdocs\ZendSkeletonApplication\module\HelloWorld\src\HelloWorld\Controller\HelloController.php

<?php
namespace HelloWorld\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class HelloController extends AbstractActionController
{
    public function worldAction()
    {
        $message = $this->params()->fromQuery('message', 'foo');
        return new ViewModel(array('message' => $message));
    }
}
以下のとおりになる。なお、元々あった SkeletonContoller は削除して構わない。

次に、ビューを作成する。こちらも内容は公式ページの Quick Start にある内容をコピペする。作成するファイルと内容は以下のとおり。
C:\xampp\htdocs\ZendSkeletonApplication\module\HelloWorld\view\hello-world\hello\world.phtml

<h1>Greetings!</h1>
 
<p>You said "<?php echo $this->escapeHtml($message) ?>".</p>
元々あった index.phtml、foo.phtml は削除して構わない。


最後に config フォルダにある module.config.php を書き換える。変更内を列挙する。
・ZendSkeletonModule を HelloWorld に変更(4箇所)
・Skeleton を Helloに変更(2箇所)
・SkeletonController を HelloController に変更
・module-name-here を helloworld に変更
・route の指定を /module-specific-root から /hello/world に変更
・action の指定を index から world に変更

変更後は以下のようになると思う。
<?php
return array(
    'controllers' => array(
        'invokables' => array(
            'HelloWorld\Controller\Hello' => 'HelloWorld\Controller\HelloController',
        ),
    ),
    'router' => array(
        'routes' => array(
            'helloworld' => array(
                'type'    => 'Literal',
                'options' => array(
                    // Change this to something specific to your module
                    'route'    => '/hello/world',
                    'defaults' => array(
                        // Change this value to reflect the namespace in which
                        // the controllers for your module are found
                        '__NAMESPACE__' => 'HelloWorld\Controller',
                        'controller'    => 'Hello',
                        'action'        => 'world',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    // This route is a sane default when developing a module;
                    // as you solidify the routes for your module, however,
                    // you may want to remove it and replace it with more
                    // specific routes.
                    'default' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array(
        'template_path_stack' => array(
            'HelloWorld' => __DIR__ . '/../view',
        ),
    ),
);
以上で、準備は整ったので、ブラウザで次のURLにアクセスしてみる。

http://localhost/ZendSkeletonApplication/public/hello/world/


正常に実行できた場合は以下のような画面が表示される。
zendframework2-4

HelloController は message パラメータを受け取り、ビューに渡すようになっているが、その動作を確認するため message パラメータを指定してアクセスしてみる。
http://localhost/ZendSkeletonApplication/public/hello/world?message=bar

実行結果は以下のようになるはずである。 zendframework2-5

以上。

PHP Zend Framework 2 を使ってみる(その2)

今回はモジュールを追加してみる。

モジュールの雛形 ZendSkeletonModule も GitHub のサイトに存在するので以下からダウンロードする。右のほうに「Download ZIP」 というボタンがあるので、ここからダウンロードできる。

https://github.com/zendframework/ZendSkeletonModule

今回ダウンロードすると zendframework-ZendSkeletonModule-zf-release-2.0.0beta5-26-gd53d631.zip というファイル名だった。これを解凍し、フォルダ名を ZendSkeletonModule とリネームし、前回配置した ZendSkeletonApplication の module フォルダ内に配置する。フォルダの階層は以下のようになる。
C:\xampp\htdocs\ZendSkeletonApplication\module\ZendSkeletonModule


次に、ZendSkeletonApplication の下の configにある application.config.php を以下のように書き換える。連想配列の 'modules' に 'ZendSkeletonModule' を追加しただけである。
<?php
return array(
    // This should be an array of module namespaces used in the application.
    'modules' => array(
        'Application',
        'ZendSkeletonModule',
    ),

    // These are various options for the listeners attached to the ModuleManager
    'module_listener_options' => array(
         :
         :

以上で、最低限の準備は整ったので、ブラウザで次のURLにアクセスしてみる。

http://localhost/ZendSkeletonApplication/public/module-specific-root


正常に実行できた場合は以下のような画面が表示される。
zendframework2-2

これは上の URL はコントローラ名とアクション名が省略されており、以下の URL と同じ結果となる。
http://localhost/ZendSkeletonApplication/public/module-specific-root/skeleton/index

また、以下の URL にアクセスしてみると、下の画面が表示されるはずである。skeleton はコントローラ名、foo はアクション名となっている。
http://localhost/ZendSkeletonApplication/public/module-specific-root/skeleton/foo

zendframework2-3


URL に出てくる module-specific-root であるが、これは module.config.php で指定されているので、任意の文字列に変更できる。

以上。

アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

livedoor 天気