プログラム初心者のcakephp2.x・wordpress情報

プログラム初心者のcakephp2.xの技術情報・wordpressやAPI関連も覚書(PHP・mySQL)

google analytics クロスドメイン対応 目標ページが同一ページだった場合。

超久々の更新です。

転職後忙しかった。やっと試用期間から解放!

 

今回は実務で実際に修正を行った、analyticsでのクロスドメイン対応とコンバージョンを計測するページURLが同一だったケースの場合の設定を開設します。

 

よくレンタルカートやレンタルフォームを利用していたり、何らかの事情で、フォームを別ドメインで作成した場合、アクセスは解析できても、コンバージョンの計測ができないケースがあります。

そういう場合でもちょっと調べれば、やり方が載っているので、そのやり方に従って、実施しましょう!

 

★ステップ1 analyticsの設定。

 

トラッキング情報の所で、「ウェブサイトのトラッキング」というメニューで、「複数のトップレベルドメイン」を「ON」にします。

するとトラッキングコードが修正され「_gaq.push(['_setAllowLinker', true]);」が追加されます。

さらに「_gaq.push(['_setDomainName', none']);」に修正してください。

 そうしたら、実際のサイトに設定してください。

 

★ステップ2 クロスリンクを設定

 

カートやフォームへのリンクなどドメインが変わってしまう部分でのリンクを修正します。

 

<a href=“https://www.B.com/” onclick=“_gaq.push([‘_link’, this.href]);return false;”>別ドメインのサイト名</a>

 

続く

LAST DAY 新たな旅立ち 心機一転!

いよいよ本日で現在の会社を退職する。

あまり長くは勤務できなかったが、

会社の方向性・意識に合わなかったし、会社の方針については

家族の同意が得られなかった。

 

まぁー当然といえば当然な結果。

先行きの見通しも悪いし、心機一転すべし!

 

やっぱ自分自身は成長しているけど、会社が今の体制に甘んじていると、

考えにずれがでてくるし、理解されなくなる、

さらに勝手な決めつけをされるともうだめだと思う。

 

 

4月からはやっと本来の自分を取り戻せるな。

 

2013年になったときに掲げた目標に向かってやるぞ!

cakePHP2.xでこの機能あるのかな?ちょっとざっと調べてみた。(ファイルアップロードの続き・・ファイルのリネイム)

機能作成した、ファイルアップロードだが、やはり日本語ファイルの場合問題が生じるので、その部分を修正した。

 

それに伴ってカラム名も一部修正「photo」→「photo0」に修正。

 

コントローラーのadd()を以下のように修正した。

かなり泥臭い、記述になっております。関数かclassにでもした方がいいかな。

 

public function add() {
    if ($this->request->is('post')) {
		$num = 0;
		foreach($this->request->data['User'] as $postData => $postDataValue){
			$filemane = 'photo'.$num;
			if($postData== $filemane){
				if($postDataValue !== ""){
					if($postDataValue['name'] !== ""){
						mb_regex_encoding("Shift_jis");
						if(mb_ereg("^[a-zA-Z0-9 -/:-@\[-\`\{-\~]+$", $postDataValue['name']) != 1){
							$nameArray = explode('.',$postDataValue['name']);
							$nameLast = array_pop($nameArray);
							$this->request->data['User'][$filemane]['name'] = 'img'.date("Ymd_Hms").'-'.$num.'.'.$nameLast;
						}
					}
				}
				$num++;
			}
		}
		if ($this->User->save($this->request->data)) {
			$this->Session->setFlash(__('登録しました。'));
		} else {
			$this->Session->setFlash(__('不備があります。'));
		}
	}
}

 

 リネイムはこの場合適当に処理時間で名前つけちゃってます。

ふい、とりあえずこんなところでよしにするか・・・。

cakePHP2.xでこの機能あるのかな?ちょっとざっと調べてみた。(ファイルアップロード)

cakePHP2.xでファイルアップロードの機能追加について。やっぱり画像投稿してほしいから・・・。この機能は必要だな。

 

この記事参考にしました。cakePHP 2.x 画像アップロードプラグイン”upload”の使い方

 

本当はこのブログにあるように画像を一つのテーブルで管理したかったが、うまくうごかなかった(スキルが足りなくて分からなかった)ので、josegonzalez / uploadの解説にある。オーソドックスな方法で、必要なテーブルに画像名・ディレクトリ名だけ追加するパターンでやってみた。

 

テーブル構成はこちら。画像はとりあえず3枚まで。

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(20)  utf8_unicode_ci NOT NULL,
  `photo` varchar(255)  utf8_unicode_ci DEFAULT NULL,
  `photo_dir` varchar(255)  utf8_unicode_ci DEFAULT NULL,
  `photo1` varchar(255)  utf8_unicode_ci DEFAULT NULL,
  `photo2` varchar(255) utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

 例によって、josegonzalez / uploadからプラグインをダウンロードして、

プラグインフォルダに「Upload」というフォルダ名で設置。app/Config/bootstrap.phpプラグインを読み込む CakePlugin::load('Upload');を記述。

 model内でプラグインを呼び出す。画像の条件設定もいろいろ設定できるが、いずれ設定しよう。

modelはこんな感じで。

class User extends AppModel {
    public $actsAs = array(
        'Upload.Upload' => array(
            'photo' => array(
                'fields' => array(
                    'dir' => 'photo_dir'
                )
            ),
            'photo1' => array(
                'fields' => array(
                    'dir' => 'photo_dir'
                )
            ),
            'photo2' => array(
                'fields' => array(
                    'dir' => 'photo_dir'
                )
            )
        )
    );
}

 コントローラーは特に変わった記述なし。

 

class UsersController extends AppController {
    public function add() {
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('登録しました。'));
            } else {
                $this->Session->setFlash(__('新規登録できませんでした'));
            }
        }
    }

	public function index() {
        $this->User->recursive = 0;
        $this->set('users', $this->paginate());
    }
} 

 

 viewの記述 add.ctp typeをfileに指定しなければならい。

<?php echo $this->Form->create('User', array('type' => 'file')); ?>
<?php echo $this->Form->input('User.username'); ?> 
<?php echo $this->Form->input('User.photo', array('type' => 'file')); ?> 
<?php echo $this->Form->input('User.photo1', array('type' => 'file')); ?> 
<?php echo $this->Form->input('User.photo2', array('type' => 'file')); ?> 
<?php echo $this->Form->input('User.photo_dir', array('type' => 'hidden')); ?> 
<?php echo $this->Form->end('登録'); ?> 

 viewの記述 index.ctp

<p><?php echo $this->Html->link('新規投稿', array('action' => 'add')); ?></p>
<table>
    <tr>
        <th>Id</th>
        <th>username</th>
        <th>Img</th>
    </tr>
    <?php $i = 0; foreach ($users as $post): ?>
    <tr>
        <td><?php echo $post['User']['id']; ?></td>
        <td>
            <?php echo $this->Html->link($post['User']['username'], array('action' => 'view', $post['User']['id']));?>
        </td>
        <td>
    	<?php if($post['User']['photo']): ?>
            <img src="/files/user/<?php echo $post['User']['id'].'/'.$post['User']['photo']; ?>" width="100">
		<?php endif; ?>
		<?php if($post['User']['photo1']): ?>
			<img src="/files/user/<?php echo $post['User']['id'].'/'.$post['User']['photo1']; ?>" width="100">
		<?php endif; ?>
		<?php if($post['User']['photo2']): ?>
			<img src="/files/user/<?php echo $post['User']['id'].'/'.$post['User']['photo2']; ?>" width="100">
		<?php endif; ?>
        </td>
    </tr>
   <?php endforeach; ?>
</table>

 

※一部プラグインのディレクトリ指定部分を修正。app\Plugin\Upload\Model\Behavior\UploadBehavior.php 

 public $defaults = array()の中の「'path' => '{ROOT}webroot{DS}files{DS}{model}{DS}{field}{DS}',」→「'path' => '{ROOT}webroot{DS}files{DS}{model}{DS}',」にした。

field名を削除したのは、画像のディレクトリ構成があまりにも複雑になってしまうため。やっぱり同一ディレクトリ内に同一投稿画像をまとめたかったから・・・。

 

まぁー理想とは違うけど、とりあえず簡単に実現可能だ!

投稿画像のファイル名のリネイムとかも出来るともっといいのかなとか思ったりしているが・・。また今度やってみよう。

cakePHP2.xでこの機能あるのかな?ちょっとざっと調べてみた。(日本語URL&重複チェック・削除フラグで完全削除しない&アソシエーション)

久々にcakePHP2.xねたで・・・。

緩やかに確認進んでいますが・・・一向にサイト作成まではつながっていかない・・。

 

①日本語URLが使いたい。(重複チェックついか)

wordpressとか使ってると普通に投稿のタイトルとかで、URLとして作成できるので、そのほうがいいかなと思っている。cakePHPの場合、デフォルトでIDを推奨しているようで、数字のURLになってしまう。まぁー通常の投稿とかはいいけど、カテゴリとかタグとかは日本語名にしたいなと思いちょっと修正。コレであっているかは分からないが、単純にIDでURL作ってリンクにしているところをタグなどの名前にしてみた。コレはカラム名で「name」とする。

あとは詳細を表示するコントローラーの関数側で、$idを$nameにして、「$this->MtrMemotag->findByName($name);」で値を取得する。そんな感じで実現できました。

ただ、同一名のnameがあると古いほうを優先して取ってきちゃうようなので、同一名のnameが内容にチャックしないといけない。これはmodelのバリデート機能でできる。

 

    public $validate = array(
        'name' => array(
			'required' => array(
				'rule' => 'isUnique',
				'message' => 'このタグ名はすでに使用されています。'
			)
		),);

 

 

②削除フラグで完全削除しない&アソシエーション

データを残して削除フラグを立てる機能を追加した。これは「論理削除」というらしい。コレはいろんなブログで紹介されている「SoftDeletable Behavior 」を使用する。cakePHP1.Xとは少し設定が違うので、結構はまった。DBテーブル的には対象となるテーブルに「deleted(tinyint(1) 0)とdeleted_date(datetime null)」のカラムを追加する。

 

 「SoftDeletable Behavior 」ダウンロードしてまず、ファイル名の確認「soft_deletable.php」→「SoftDeleteBehavior.php」こういう名前でないといけない。それで、app/models/behaviorsに入れます。論理削除を利用したいmodelに「$actsAs = array('SoftDeletable');」を入れる。

更にコントローラ部の通常であれば「$this->’model名’->delete($id)」で削除を実行するのであるが、このビヘイビアは「$this->’model名’->delete()」を呼ぶと「false」を返すため、「if(!$this->’model名’->delete())」でメッセージやリダイレクト先を記述すればOKになる。

 ただ問題はアソシエーションしている場合(1-多、多-多など)。論理削除した場合でも関連性は残るので、アソシエーションしているデータを出力するとデータを表示させてしまう。そのため、少々めんどくさいが、表示部分で「deleted」が「1」の場合は表示しないなどの出し分けにしてしまった。もっとスマートな方法があれば教えてください!

 

必要な機能を洗い出して、いよいよサイト制作できるかな・・・