エントリー

カテゴリー「プログラム」の検索結果は以下のとおりです。

MCImageManager導入メモ

TinyMCEは高機能なエディタですが、ファイルをアップロードする機能はありません。つまり本文に画像などを掲載したければ、あらかじめFTPなどでアップロードされたファイルのURLを指定する必要があります。

ですが、公式プラグインのMCImageManager(シェアウェア)を導入すれば、直接画像をアップロードして本文に掲載することができます。

以降はTinyMCEにMCImageManagerを導入するメモです。

準備

あらかじめTinyMCEを導入し、MCImageManagerも購入しておきます。

MCImageManagerの設定と設置

tiny_mce/plugins/ 内に、購入した imagemanager をアップロードします。

tiny_mce/plugins/imagemanager/files/ のパーミッションを 707 に設定します。(files/ 内に元々あるファイルはサンプルなので、削除しても大丈夫です。)

tinymce/tiny_mce/plugins/imagemanager/config.php でファイルのパスを設定します。22行目あたりにある

$mcImageManagerConfig['preview.wwwroot'] = ''; // absolute or relative from this script path, try to leave blank system figures it out.
$mcImageManagerConfig['preview.urlprefix'] = "{proto}://{host}/"; // domain name

この部分を、一例ですが以下のように変更します。(imagemanager への / からのパスと http:// からのパスを、環境に合わせて設定します。)

$mcImageManagerConfig['preview.wwwroot'] = '/var/www/html/tiny_mce/plugins/imagemanager/'; // absolute or relative from this script path, try to leave blank system figures it out.
$mcImageManagerConfig['preview.urlprefix'] = "http://www.example.com/tiny_mce/plugins/imagemanager/"; // domain name

tinymce/tiny_mce/plugins/imagemanager/login_session_auth.php で認証情報を設定します。4行目あたりにある

$username = "demo";
$password = ""; // Change the password to something suitable

この部分に、MCImageManagerにアクセスするためのユーザー名とパスワードを設定します。半角英数字で任意の値を設定します。

TinyMCEの設定

TinyMCEの pluginsimagemanager を追加します。例えば

plugins: 'advimage,advlink,contextmenu,inlinepopups,table',

と設定されている場合、以下のように ,imagemanager を追加します。

plugins: 'advimage,advlink,contextmenu,inlinepopups,table,imagemanager',

日本語化

MCImageManagerの画面は英語で表示されますが、日本語での表示にすることができます。

Languages for "MCImageManager" から「Japanese」をダウンロードします。

ダウンロードした ja.xmltiny_mce/plugins/imagemanager/language/im/ 内にアップロードします。

tinymce/tiny_mce/plugins/imagemanager/config.php の16行目あたりにある

$mcImageManagerConfig['general.language'] = "en"; // en, sv

この部分を以下のように変更します。(enja に変更。)

$mcImageManagerConfig['general.language'] = "ja"; // en, sv

これで、MCImageManagerが日本語で表示されます。

起動方法

MCImageManagerを導入すると、TinyMCEの「画像を挿入/編集」画面の「画像のURL」の隣に「閲覧」アイコンが表示され、それをクリックするとMCImageManagerが起動します。login_session_auth.php で設定したユーザー名とパスワードを入力して認証します。

PHPでファイルを圧縮&解凍(shell_exec()版)

PHPでファイルを圧縮&解凍する方法のメモ。shell_exec()zip コマンドと unzip コマンドを呼び出すので、多少環境を選ぶかも。ロリポップサーバーでは動作した。

/usr/bin/zip のようにパスを指定しなければダメなサーバーもあるみたい。

圧縮だけなら、PHPで圧縮ファイル作成(zip) の方法でも可能。

ファイルを圧縮

zip コマンドで、test ディレクトリを圧縮。圧縮後のファイル名は test.zip

<?php

if (shell_exec('zip -r test.zip test')) {
  exit('OK');
} else {
  exit('NG');
}

?>

ファイルを解凍

unzip コマンドで、test.zip を解凍。

<?php

if (shell_exec('unzip test.zip')) {
  exit('OK');
} else {
  exit('NG');
}

?>

PHP初級講座のスライド

某所で(主に)Webデザイナーさん向けにPHPの基礎を喋ってきたので、そのスライドを置いておきます。

カーソルキーの「←」で戻り、「→」で進みます。もしくは画面クリックでも進みます。モダンブラウザなら見られるはず。
口頭で説明しつつのセミナーなので、スライドだけ見ると少し言葉足らずではある。(´・ω・`)

XAMPPでPerlを動作させるメモ

Perl+CGIの実行に何かと手間取ったのでメモ。

XAMPPのインストール手順

Windows版でPerlを動作させる

XAMPP付属のPerlを使うと何かと面倒でPerlのパスも長いので、別途ActiviePerlを C:\usr\local にインストール。(ごく普通にインストールすればOK。)

Perlのパスは #!/usr/local/bin/perl で動く。

ユーザーディレクトリを使う場合、C:\xampp\apache\conf\extra\httpd-userdir.confAddHandler などの設定を追加する。

Mac版でPerlを動作させる

Perlのパスは #!/Applications/XAMPP/xamppfiles/bin/perl#!/usr/bin/perl で動く。後者は、MacにもともとインストールされているPerl。

ターミナルに perl -e 'print "Hello, world!\n"' と入力して実行すれば、CGIではないPerlの動作確認ができる。

改行コードを「LF(UNIX)」にしておく。

ターミナルから chmod 755 xxx.cgi のようにして、プログラムに実行権限を与える。ファイルの読み書きなどを行うなら、同様に権限を設定する。

ユーザーディレクトリを使う場合、/Applications/XAMPP/xamppfiles/etc/extra/httpd-userdir.confAddHandler などの設定を追加する。

PHPでExcelデータを表示するメモ

PHPでExcelファイルの内容を一覧表示するためのメモ。

Excelファイルを扱うのは厄介ですが、PHPExcel を使えば比較的容易に扱うことができます。Excelファイルを作成したりファイルの内容を一括で取得して配列に突っ込んだり…のサンプルは多いものの、fget_csv() みたいに一件ずつ処理していくサンプルが少なかったので自分用に方法をメモ。

主に、以下のページを参考にしています。

以下、xlsxxls ファイルの内容をテキストデータとして取得するメモ。最終的には配列に突っ込んでいるけど、個別に処理するのも難しくないです。

<?php

echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>Excel</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>Excel</h1>\n";
echo "<pre>\n";

//読み込むExcelファイル
$file = './sample.xlsx';

//ライブラリを読み込む
require_once '../Classes/PHPExcel/IOFactory.php';

//ファイルを読み込む
if (preg_match('/\.xlsx$/', $file)) {
  $type = 'Excel2007';
} elseif (preg_match('/\.xls$/', $file)) {
  $type = 'Excel5';
} else {
  exit('error');
}
$reader = PHPExcel_IOFactory::createReader($type);
$excel  = $reader->load($file);

//シートオブジェクトの取得
$sheets = $excel->getAllSheets();
//$sheets[0] = $excel->getSheet(0);

$data = array();

//シートごとに処理
foreach ($sheets as $s => $sheet) {
  //シート名を取得
  $data[$s]['title'] = $sheet->getTitle();

  //列数と行数を取得
  $row_max = $sheet->getHighestRow();
  $col_max = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) - 1;

  //セルごとにテキストデータを取得
  $content = array();
  $flag    = false;
  for ($r = 1; $r <= $row_max; $r++) {
    for ($c = 0; $c <= $col_max; $c++) {
      $text = get_text($sheet->getCellByColumnAndRow($c, $r));

      if (!is_null($text) and $flag == false) {
        $flag = true;
      }

      $content[$r][$c] = $text;
    }
  }
  if ($flag == false) {
    $content = array();
  }

  //データをセット
  $data[$s]['content'] = $content;
}

//結果を出力
print_r($data);

echo "</pre>\n";
echo "</body>\n";
echo "</html>\n";

exit;

/* 指定したセルの文字列を取得 */
function get_text($cell = null)
{
  if (is_null($cell)) {
    return null;
  }

  $value = $cell->getValue();

  if (is_object($value)) {
    //オブジェクトが返ってきたら、リッチテキスト要素を取得
    $rich_texts = $value->getRichTextElements();

    //配列で返ってくるので、そこからさらに文字列を抽出
    $texts = array();
    foreach ($rich_texts as $rich_text) {
      $texts[] = $rich_text->getText();
    }

    //連結する
    $text = implode('', $texts);
  } else {
    if (empty($value)) {
      $text = null;
    } else {
      $text = $value;
    }
  }

  return $text;
}

?>

PHPでRSSを解析するメモ

ブログのRSSを解析して記事一覧を表示…とかをするためのメモ。

「RSS2.0と宣言されているのにデータの一部がAtomで配信されている。」とか時々あるので、宣言は信用せずに「それらしいデータがないか探す」という方針で実装。

feed_load_file() を実行すれば、階層のある連想配列でデータをまとめて返すので、あとは表示するだけ…という仕様にしています。

<?php

$feed = feed_load_file('http://freo.jp/info/news/feed');

echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>RSSの解析</title>\n";
echo "</head>\n";
echo "<body>\n";

if (empty($feed)) {
  echo 'エラー';
} else {
  echo '<strong>形式</strong>';
  echo '<hr />';
  echo $feed['type'];
  echo '<hr />';
  echo '<strong>概要</strong>';
  echo '<hr />';
  echo 'title : ' . $feed['channel']['title'] . '<br />';
  echo 'link : ' . $feed['channel']['link'] . '<br />';
  echo 'description : ' . $feed['channel']['description'] . '<br />';
  echo '<hr />';
  echo '<strong>記事</strong>';
  echo '<hr />';

  foreach ($feed['item'] as $item) {
    if (strtotime($item['date']) > time()) {
      continue;
    }

    echo 'title : ' . $item['title'] . '<br />';
    echo 'link : ' . $item['link'] . '<br />';
    echo 'description : ' . $item['description'] . '<br />';
    echo 'content : ' . $item['content'] . '<br />';
    echo 'date : ' . $item['date'] . '<br />';
    echo '<hr />';
  }
}

echo "</body>\n";
echo "</html>\n";

exit;

feed_load_file() の内容は、長いので続きで。

続きを読む

file_get_contents()でgetリクエストとpostリクエストを送るメモ

PHPの file_get_contents() を使えばファイルの内容を表示できますが、指定したサーバーにgetやpostのリクエストを送ることもできます。

WebAPIを扱うときなど、たまに過去のコードを探すので自分用にメモ。

get

<?php

$result = file_get_contents('http://www.example.com/get.php?test1=test1&test2=テスト2');
echo '<pre>' . $result . '</pre>';

?>

http://www.example.com/get.php に対して test1=test1test2=テスト2 をgetで送信し、結果を画面に表示。

post

<?php

$result = file_get_contents(
  'http://www.example.com/post.php',
  false,
  stream_context_create(
    array(
      'http' => array(
        'method' => 'POST',
        'header' => implode(
          "\r\n",
          array(
            'Content-Type: application/x-www-form-urlencoded'
          )
        ),
        'content' => http_build_query(
          array(
            'test1' => 'test1',
            'test2' => 'テスト2'
          )
        )
      )
    )
  )
);
echo '<pre>' . $result . '</pre>';

?>

http://www.example.com/post.php に対して test1=test1test2=テスト2 をpostで送信し、結果を画面に表示。

PHPで日付を扱うメモ

ごく基本的な機能だけど、コピー&ペーストのために定期的に過去のコードを漁るので自分用にメモ。

<?php

//日時を表示
echo date('Y-m-d H:i:s');

//曜日を表示
$weeks = array('日', '月', '火', '水', '木', '金', '土');
echo $weeks[date('w')];

//日時を指定して表示
echo date('Y-m-d H:i:s', strtotime('2012-07-01'));
echo date('Y-m-d H:i:s', strtotime('2012-07-04 16:30:21'));

?>

Silexでセッションとデータベースとテンプレートを使うメモ

Silexの機能をいくつか使ってみたのでメモ。

主にSilexユーザーガイドを参考にしていますが、自分のやりやすいように解説と違っている箇所があります。Silex自体の導入はSilex導入メモに記載しています。

Silexでセッションを使う

セッションを使う仕組みは、標準で用意されている。

$app->register(new Silex\Provider\SessionServiceProvider(), array(
));

でセッションプロバイダーを使うことを宣言。あとは $app['session'] にアクセスすれば、セッションを扱うための命令を呼び出せる。

以下は参考コード。

<?php

require_once __DIR__ . '/silex/vendor/autoload.php';

$app = new Silex\Application();
$app['debug'] = true;

$app->register(new Silex\Provider\SessionServiceProvider(), array(
));

$app->get('/', function() use($app) {
  $app['session']->start();

  if ($app['session']->has('count')) {
    $count = $app['session']->get('count');
  } else {
    $count = 0;
  }

  $app['session']->set('count', ++$count);

  return 'count=' . $app['session']->get('count');
});

$app->run();

exit;

?>

Silexでデータベースを使う

Doctrine経由でデータベースに接続する仕組みが、標準で用意されている。ただしDoctrineそのものは同梱されていないので、自分で導入する必要がある。

まずはDoctrineからファイルをダウンロードする。解凍して作成されたファイルを silex/vendor/doctrine/ 内に配置する。

test / index.php
  |
  +-- silex / LICENSE
        |
        +-- src / ~略~
        |
        +-- vendor / autoload.php
              |
              +-- composer / ~略~
              |
              +-- doctrine / doctrine-mapping.xsd
              |       |      LICENSE
              |       |      package.xml
              |       |      UPGRADE_TO_2_0
              |       |      UPGRADE_TO_2_1
              |       |      UPGRADE_TO_2_2
              |       |      UPGRADE_TO_ALPHA3
              |       |      UPGRADE_TO_ALPHA4
              |       |
              |       +-- bin / ~略~
              |       |
              |       +-- Doctrine / ~略~
              |
              +-- pimple / ~略~
              |
              +-- symfony / ~略~

次に

$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
  'db.options' => array(
    'dbname'   => 'データベース名',
    'user'     => 'データベース接続ユーザー名',
    'password' => 'データベース接続パスワード',
    'host'     => '接続先',
    'driver'   => 'ドライバ',
  ),
  'db.dbal.class_path'   => __DIR__ . '/silex/vendor/doctrine',
  'db.common.class_path' => __DIR__ . '/silex/vendor/doctrine'
));

でDoctrineプロバイダーを使うことを宣言。あとは $app['db'] にアクセスすれば、データベースを扱うための命令を呼び出せる。

以下は参考コード。

<?php

require_once __DIR__ . '/silex/vendor/autoload.php';

$app = new Silex\Application();
$app['debug'] = true;

$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
  'db.options' => array(
    'dbname'   => 'test',
    'user'     => 'xxxx',
    'password' => 'yyyy',
    'host'     => 'localhost',
    'driver'   => 'pdo_mysql',
  ),
  'db.dbal.class_path'   => __DIR__ . '/silex/vendor/doctrine',
  'db.common.class_path' => __DIR__ . '/silex/vendor/doctrine'
));

$app->get('/', function() use($app) {
  $stmt = $app['db']->query('SELECT * FROM address');

  $result = '';
  while ($row = $stmt->fetch()) {
      $result .= $row['no'] . ' / ' . $row['name'] . ' / ' . $row['tel'] . '<br />';
  }

  return $result;
});

$app->run();

exit;

?>

Silexでテンプレートを使う

Twig経由でテンプレートを使用する仕組みが、標準で用意されている。ただしTwigそのものは同梱されていないので、自分で導入する必要がある。

まずはTwigからファイルをダウンロードする。解凍して作成されたファイルを silex/vendor/twig/ 内に配置する。

test / index.php
  |
  +-- silex / LICENSE
        |
        +-- src / ~略~
        |
        +-- vendor / autoload.php
              |
              +-- composer / ~略~
              |
              +-- pimple / ~略~
              |
              +-- symfony / ~略~
              |
              +-- twig / .travis.yml
                    |    AUTHORS
                    |    CHANGELOG
                    |    composer.json
                    |    LICENSE
                    |    package.xml.tpl
                    |    phpunit.xml.dist
                    |    README.markdown
                    |
                    +-- bin / ~略~
                    |
                    +-- doc / ~略~
                    |
                    +-- ext / ~略~
                    |
                    +-- lib / ~略~
                    |
                    +-- test / ~略~

次に

$app->register(new Silex\Provider\TwigServiceProvider(), array(
  'twig.path'       => __DIR__ . '/views',
  'twig.class_path' => __DIR__ . '/silex/vendor/twig/lib',
));

でTwigプロバイダーを使うことを宣言。(twig.path は、テンプレートを配置するためのディレクトリ)あとは $app['twig'] にアクセスすれば、Twigを扱うための命令を呼び出せる。

以下は参考コード。

<?php

require_once __DIR__ . '/silex/vendor/autoload.php';

$app = new Silex\Application();
$app['debug'] = true;

$app->register(new Silex\Provider\TwigServiceProvider(), array(
  'twig.path'       => __DIR__ . '/views',
  'twig.class_path' => __DIR__ . '/silex/vendor/twig/lib',
));

$app->get('/', function() use($app) {
  $variables['test1'] = 'これはテストです。';
  $variables['test2'] = array('テスト1', 'テスト2', 'テスト3');

  return $app['twig']->render('test.html', $variables);
});

$app->run();

exit;

?>

テンプレートは views ディレクトリ内に test.html を作成し、以下の内容を記述する。

<html>
<head>
<meta charset="utf-8" />
<title>title</title>
</head>
<body>
<h1>テスト</h1>
<p>{{ test1 }}</p>
<ul>
  <!--{% for test in test2 %}-->
  <li>{{ test }}</li>
  <!--{% endfor %}-->
</ul>
</body>
</html>

Silex導入メモ

Silexを試してみたので導入メモ。

Silexとは

PHP5.3以降で利用できる、ライトウェイトなフレームワーク。Symfony2のクラスを利用しているらしい。Symfony2では大げさすぎる場合に使えるみたい。

利用方法

公式サイトから silex.phar をダウンロードしてrequireするだけで使える。現在はphar形式にはなっていない。

pharとは

「PHp ARchive」の略で、複数のファイルをまとめたもの。

動かない

ロリポップサーバーで Class 'Silex\Application' not found とか表示された。どうやら、環境によってはpharファイルの利用は問題があるらしい。pharをバラせば普通のPHPファイルになるので、それを使えばいい。

pharコマンドを使える環境でroot権限で、silex.phar に対して以下を実行。(rootでないと「ライセンスエラー」とか表示された。)

$ phar extract -f silex.phar

作成されたファイルを、まるごと silex フォルダに突っ込む。そして silex.phar の読み込み処理を

//require_once __DIR__ . '/silex.phar';
require_once __DIR__ . '/silex/vendor/autoload.php';

のようにするとSilexを使える。

ディレクトリ構成

参考に、ディレクトリ構成とプログラムの内容全文。

  • test ディレクトリ内で動作させるとする
  • Silexは test/silex/ に配置するとする
  • 本番環境では test/silex/ にアクセス制限をかけたり、公開ディレクトリ外に設置するとよさそう
  • LICENSEファイルや説明書ファイルなどは、動作には不要(自分でどのファイルか判りやすいように書いているだけ)
test / index.php
  |
  +-- silex / LICENSE
        |
        +-- src / ~略~
        |
        +-- vendor / ~略~

test/index.php の内容は以下のとおり。

<?php

require_once __DIR__ . '/silex/vendor/autoload.php';

$app = new Silex\Application();
$app['debug'] = true;

$app->get('/', function() use($app) {
  return 'index';
});

$app->run();

exit;

?>

ブラウザソフトから index.php にアクセスして、index と表示されれば成功。

各機能の使用方法はSilexでセッションとデータベースとテンプレートを使うメモに記載。

ページ移動

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed