PHP:文字列を指定した文字数で出力する

phpで変数に格納している文字列を出力する際に、指定した文字数を超えたら「…」などで表示したい場合があります。
サイトのトップページや一覧ページなど、表示する文字数が決まっている場合に使用することが多いと思います。

mb_strimwidthを使用すれば、文字列の長さを調節することができます。

mb_strimwidthを使用して、文字列指定した文字数出力する方法をメモします。


文字列を指定した文字数で出力(mb_strimwidth)

・半角文字列の場合

$str = '0123456789';
$str = mb_strimwidth($str, 0, 7, '…', 'UTF-8');
echo $str;

【出力結果】

012345…

・全角文字列の場合

$str = 'あいうえお';
$str = mb_strimwidth($str, 0, 7, '…', 'UTF-8');
echo $str;

【出力結果】

あいう…

半角文字を1文字、全角文字を2文字として扱います。
また、追加した文字も文字数に数えます。

Fuelphp:Fuelphpでcoreクラスを拡張する方法

フレームワークを使用してシステムを開発しているとコアクラスを変更したり、処理を追加したい場合があります。
あまりコアクラスは変更したくないので、コアクラスを拡張して処理を記述します。

今回はFuelphpcoreクラス拡張し、処理を追加したり、オーバーライドする方法をメモします。


Fuelphpでcoreクラスを拡張する

Paginationクラスを拡張する場合、「fuel/app/classes」の直下に「pagination.php」を作成します。
作成した「pagination.php」に処理を追加したり、オーバーライドしたい処理を記述します。
※「fuel/core/classes/pagination.php」をオーバーライドします。

<?php

class Pagination extends Fuel\Core\Pagination
{
    // 処理を記述

}

処理を記述したら、「fuel/app/bootstrap.php」を下記のように編集します。
作成した「pagination.php」を読み込むように記述します。

Autoloader::add_classes(array(
	// Add classes you want to override here
	// Example: 'View' => APPPATH.'classes/view.php',
	'Pagination' => APPPATH.'classes/pagination.php',
));

「bootstrap.php」に拡張したクラスを追加すれば、拡張した処理を使用することができます。


Fuelphp:日本語のエラーメッセージを設定する

FuelphpValidationクラスを使用し、エラーを出力した際にエラーメッセージ日本語で出力する方法をメモします。
最初の設定では英語で表示されるので。

エラーメッセージは日本語で出力することが多いと思うので、最初に設定してると実装しやすくなると思います。

また、エラーメッセージを個別に設定して、設定ファイルの内容を上書きする方法をメモします。


日本語のエラーメッセージを設定

設定ファイルで日本語のファイルを読み込むように設定します。
「fuel/app/config/config.php」の「language」の箇所を「ja」に変更します。

    /**
     * Localization & internationalization settings
     */
    'language'           => 'ja', // Default language
    'language_fallback'  => 'en', // Fallback language when file isn't available for default language
    'locale'             => 'ja_JP.utf8', // PHP set_locale() setting, null to not set

    'encoding'  => 'UTF-8',

日本語のエラーメッセージファイルを設定します。
「fuel/app/lang/ja/validation.php」を作成し、日本語のエラーメッセージを記述します。
※エラーメッセージは出力したい内容に変更してOKです。

<?php

return array(
    'required'      => ':label は必須入力です。',
    'min_length'    => ':label は、:param:1 文字以上で入力して下さい。',
    'max_length'    => ':label は、:param:1 文字以下で入力して下さい。',
    'exact_length'  => ':label は、:param:1 文字で入力して下さい。',
    'match_value'   => ':label は、使用できない文字が含まれています。使用可能な文字 [:param:1] ',
    'match_pattern' => ':label は、:param:2で入力して下さい。',
    'match_field'   => ':label は、:param:1 と異なっています。',
    'valid_email'   => ':label は メールの形式で入力して下さい。',
    'valid_emails'  => ':label に、有効でないメールアドレスが含まれています。',
    'valid_url'     => ':label は、有効なURLではありません。',
    'valid_ip'      => ':label は、有効なIPアドレスではありません。',
    'numeric_min'   => ':label には、:param:1 より大きい数値を入力して下さい。',
    'numeric_max'   => ':label には、:param:1 より小さい数値を入力して下さい。',
    'valid_string'  => ':labelは:param:2で入力してください。',
);

上記の設定が完了したら、設定したエラーメッセージで出力されます。

fuelphp_error1

個別に設定する場合は「set_message()」を使用して設定します。

$validation = \Validation::forge();

$validation->set_message('required', ':label は必ず入力してください。');

$validation->add('name', 'name')
    ->add_rule('trim')
    ->add_rule('required');

エラーメッセージが「set_message()」で指定した内容で出力されます。


Fuelphp:バリデーションのルールを追加する

Fuelphpで用意されているバリデーションのルール以外に
自分で作成したバリデーションを追加したい場合があります。

コアクラス拡張することによって、新しいバリデーションのルールを作成することができます。

今回はFuelphpValidationクラス拡張し、バリデーションのルールを追加する方法をメモします。


バリデーションのルールを追加する方法

「fuel/app/classes」に「myvalidation.php」を作成します。

作成した「myvalidation.php」に追加したいバリデーションのルールを記述します。
下記は半角英数字チェックを追加した場合です。
追加する時は「_validation_」プレフィックスを付けて作成します。

<?php
class MyValidation
{
    // 半角英数字チェック
    public static function _validation_alphanum($data)
    {
        if(!empty($data)) {
            if (preg_match("/^[a-zA-Z0-9]+$/", $data)) {
                return true;
            }
            else {
                return false;
            }
        }
        return true;
    }
}

作成したバリデーションを使用する場合は下記のように記述します。
「add_callable()」で作成したバリデーションのクラスを読び出します。
後は「add_rule()」に作成したバリデーションを記述します。

$validation = \Validation::forge();
$validation->add_callable('myvalidation');

$validation->add('id', 'ID')
	->add_rule('required')
	->add_rule('alphanum');
$validation->run();

エラーメッセージを設定する場合は「fuel/app/lang/ja/validation.php」に新しいエラーメッセージを追加します。

return array(
	'alphanum' => ':labelは、半角英数字で入力してください。',
);

php:PECL APCのエラーが出た時の対処方法

PHPフレームワークのCakePHPCodeIgniterで作っているサイトでいつの間にかに
下記のエラーが大量に表示されていました。

Unable to allocate memory for pool.

色々検索してみると、APCという拡張モジュールのバグみたいです。

PECL APCのエラー(Unable to allocate memory for pool.)が出た時の対処方法をメモします。
下記のサイトを参考にさせていただきました。

PECL apcのエラー Unable to allocate memory for pool.


APCのエラー対処方法

サーバにSSHでログインし、「/etc/php.d/apc.ini」ファイルを修正します。
修正内容は下記のように変更します

apc.mmap_file_mask=/tmp/apc.XXXXX

↓(変更します)

apc.mmap_file_mask=/dev/zero

変更を保存したら、httpdをrestartします。

/etc/init.d/httpd restart

再起動後、サイトを確認するとエラーの表示が消えて正常に表示されました。


APC(Alternative PHP Cache)

PHPの中間コードのキャッシュや最適化を行い、PHPを高速化する拡張モジュールです。