図書館合金 Part 2

programming and books, music etc.

vue.js でselectの生成、ajax版、オブジェクトの場合

セレクトを生成するためのデータがこういう、

        productOptions: {
            A: [
                {text: "pen", value: "PEN"},
                {text: "pencil", value: "PENCIL"}
            ],
            B:[
                {text: "apple", value: "APPLE"},
                {text: "pinapple", value: "PINAPPLE"}
            ]
       }

オブジェクトだったらどうなるだろう。上記のデータはイメージとして、一つ目のセレクトでAを選んだら二つ目のセレクトがpen, pencilになる、というようなものである。

jsonを返すphpがproduct.phpが存在するとして、

        axios.get('product.php').then(function(response) {
            for (var key in response.data) {
                  productOptions[key] = response.data[key];
            }
        }).catch(function(error) {
            console.log('failure:' + new Date())
        });

これでどうだろうか。

vue.js でselectの生成、selectの値をajaxで取ってくる版

ajaxについてはvue.jsではaxiosというのが推奨されている、とのことです。

github.com

なんでとりえあず、html側にaxios追加。

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<div id="app">
    <select v-model="category">
        <option value="">--選択してください--</option>
        <option v-for="option in catOptions" v-bind:value="option.value">
        {{ option.text }}
        </option>
    </select>
    <span>first Selected: {{ category }}</span>
</div>

んで、jsの方はこんな感じになるのかな。

var app = new Vue({
    el: '#app',
    data: {
        category: '',
        catOptions: []
    },
    created: function() {
          var catOptions = this.catOptions;
          axios.get('category.php').then(function(response) {
            for (var i = 0; i < response.data.length; i++) {
              catOptions.push(response.data[i]);
            }
          }).catch(function(error) {
            console.log('failure');
          })
    }
});

getしてるcategory.phpJSONで返すイメージです。

svgの画像をサーバーにアップしてみたら表示されない!

svgっていう形式の画像があるんですね。 画像なんだけどエディターで開いてみるとテキストなんですよ。 そういうファイルがあって、最近それを初めて使ったんですけど、いざこれをサーバーにアップしたら表示

されない訳です。 どうしたものかと思ったら、htaccessで設定すればよい、ということでした。 以下を追加。

AddType image/svg+xml .svg .svgz

vue.js でselect の生成、その2。動的に生成する。

で、引き続き、一つ目のセレクトを選ぶとそれに応じて二つ目のセレクトが生成される、というのに挑戦。

html側。

<div id="app">
    <select v-model="category" v-on:change="resetSelect">
        <option value="">--選択してください--</option>
        <option v-for="option in catOptions" v-bind:value="option.value">
        {{ option.text }}
        </option>
    </select>
    <span>first Selected: {{ category }}</span>

    <select v-model="product" >
        <option value="">--選択してください--</option>
        <option v-for="option in productOptions[category]" v-bind:value="option.value">
        {{ option.text }}
        </option>
    </select>
    <span>second Selected: {{ product }}</span>
</div>

js側。

var app = new Vue({
    el: '#app',
    data: {
        category: '',
        product: '',
        catOptions: [
            { text: 'One', value: 'A' },
            { text: 'Two', value: 'B' }
        ],
        productOptions: {
            A: [
                {text: "pen", value: "PEN"},
                {text: "pencil", value: "PENCIL"}
            ],
            B:[
                {text: "apple", value: "APPLE"},
                {text: "pinapple", value: "PINAPPLE"}
            ]
        }
    },
    methods: {
        resetSelect: function(){
            this.product = '';
        }
    }
});

v-on:change="resetSelect" の部分とか、<option value="">--選択してください--</option> の空の選択部分とかはなくてもそれなりに動くし、その方がスマートな気もするんだが、やってみてもらうと分かるんだがなんとなく動きがヘンである。 一旦選んでしまうと一旦選択を空にしてやり直すことができない、ってのもなんか気になる。

モッピー!お金がたまるポイントサイト

vue.js でselectの生成

検索するとバージョン0.11の頃の書き方がヒットして混乱するが、v2では

var app = new Vue({
    el: '#app',
    data: {
        selected: 'B',
        options: [
            { text: 'One', value: 'A' },
            { text: 'Two', value: 'B' },
            { text: 'Three', value: 'C' }
        ]
    }
}

と書く。HTML側は、

<div id="app-8">
    <select v-model="selected">
        <option v-for="option in options" v-bind:value="option.value">
        {{ option.text }}
      </option>
    </select>
    <span>Selected: {{ selected }}</span>
</div>

vue.js で v-on:change で複数のファンクションを呼ぶには?

参考: https://stackoverflow.com/questions/38744932/how-to-call-multiple-function-with-v-onclick

<input v-on:change="calcAmount, calcSum">

というように書けるのかなと思ったが、だめらしい。

<input v-on:change="calcBoth">

としておいて、

      methods: {
        calcBoth: function () {
            this.calcAmount();
            this.calcSum();
        }
      }

とするようだ。

モッピー!お金がたまるポイントサイト

Vue.js 2 Cookbook: Build modern, interactive web applications with Vue.js

Vue.js 2 Cookbook: Build modern, interactive web applications with Vue.js

既存のアプリへの vue.js の組み込み

<div id="app">
    <p>{{text}}</p>
</div>

ファイル名 app.jsとして以下の内容。

var Vue = require("vue");
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello Vue!'
    }
})

基本的にはこれだけのソースでとりあえず動作確認ができるのだけど、webpackとか使うのでいろいろ障害がある。

まずは最低限、vue.jsをインストールしておかないといけないので、package.json

  "devDependencies": {
    "vue": "*"
  }

と書くか、あるいは直接

npm install vue --save-dev

などとやる。ここまでは問題ないと思うが。 webpack.config.js に以下のように追記する。

module.exports = {
  resolve: {
      alias: {
        vue: 'vue/dist/vue.js'
      }
  }
};

これを忘れると、

[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

というエラーが出る。

そして、実際にhtmlから読み込むためのファイルを作る。 ファイル名bundle.jsとして、wbpackで合体さす。

webpack app.js bundle.js

で、jsをHTMLの中のどこで読み込むかというのも重要で、

上の方で読み込んだりすると、

[Vue warn]: Cannot find element: #app

というようなエラーが出る。

タグの上で読み込む。

<html>
    <body>
        <div id="app">
            <p>{{text}}</p>
        </div>
        <script src="bundle.js"></script>
    </body>
</html>

Vue.js 2 Cookbook

Vue.js 2 Cookbook

CakePHP2で定数を設定する

app/Config 以下に const.php というファイル名でファイルを作成する。

そこで定数を定義する。

<?php
define('MAIL_FROM', 'test@test.test');

さらに app/Config/bootstrap.php に追記する。

config('const');

もし今からTypeScriptを勉強するとしたらどの本がいいか

TypeScript実践プログラミング Programmer's SELECTION

TypeScript実践プログラミング Programmer's SELECTION

  • amazonのレビューにはやや古いと書かれている。

はじめてのTypeScript2 (I・O BOOKS)

はじめてのTypeScript2 (I・O BOOKS)

  • Visual Studio Code」を使って…というのがちょっと気になる。

  • これは昔からあるやつ。

nodeとnpmのそれ自身のアップデート

nodeのバージョンが古いらしくて以下のように怒られたので。

You are running version 6.8.0 of Node, which will not be supported in future
versions of the CLI. The official Node version that will be supported is 6.9 and greater.

はてどうだったかなと。確かnodeはbrewで入れたような記憶もあるが確かではない。。。 ということで調べてみると、

n

というのがあるんだそうだ。(冗談ではないらしい)

npm install -g n

としてnをインストールして、

sudo n latest

     install : node-v7.10.0
       mkdir : /usr/local/n/versions/node/7.10.0
       fetch : https://nodejs.org/dist/v7.10.0/node-v7.10.0-darwin-x64.tar.gz
######################################################################## 100.0%
   installed : v7.10.0

インストールできた。

実践Node.js プログラミング (Programmer's SELECTION)

実践Node.js プログラミング (Programmer's SELECTION)

jekyllのQiita風テンプレートを使ってみる

これまじで格好よくて最高です。

まずこちらから git clone します。

github.com

git clone https://github.com/mzyy94/jekyll-kieta-theme.git MySite

で、

cd MySite/
bundle install

してから、README.md に書いてある内容を _config.yml にして保存。

vim _config.yml

そしたら

bundle exec jekyll serve

としてブラウザで http://127.0.0.1:4000/

にアクセス。

すげーかっこいい。


Getting Started With Jekyll, The Static Site Generator

アクセス解析Piwikのプラグインを作ってみる

説明が英語なので骨が折れるが、まずは以下のページのとおりに開発環境を構築する。

Getting Started: Setting up

で、上記URLのかなり下の方にあるとおり、consoleコマンドでプラグインのひな形を作成する。

./console generate:plugin --name="MyPlugin"

プラグインの説明を入力しろと言われるので適当に入れて進む。

Enter a plugin description: My Awesome Plugin
Enter a plugin version number (default to 0.1.0):

Plugin MyPlugin 0.1.0 generated.
Our developer guides will help you developing this plugin, check out http://developer.piwik.org/guides
To see a list of available generators execute ./console list generate
Enjoy!

続いて以下のコマンドでプラグインを有効状態にする。

./console plugin:activate MyPlugin

さらにレポートを生成するコマンド実行。

./console generate:report

プラグインの名前を入れて、と出るので、先に自分が作った名前を入力する。

Enter the name of your plugin: MyPlugin
Enter the name of your report, for instance "Browser Families": My first plugin
Enter a documentation that describes the data of your report (you can leave it empty and define it later):
Enter the report dimension, for instance "Browser" (you can leave it either empty or use an existing one):

You should now implement the method called "getMyfirstplugin()" in API.php
Enjoy!

で、pluginsディレクトリにMyPluginディレクトリが出来ていて、その中にAPI.phpができている。
なんと!その中に今コマンドで指定したgetMyfirstpluginメソッドが出来ているではあーりませんか。

    /**
     * Another example method that returns a data table.
     * @param int    $idSite
     * @param string $period
     * @param string $date
     * @param bool|string $segment
     * @return DataTable
     */
    public function getMyfirstplugin($idSite, $period, $date, $segment = false)
    {
        $table = new DataTable();

        $table->addRowFromArray(array(Row::COLUMNS => array('nb_visits' => 5)));

        return $table;
    }

この中の $table->addRowFromArray(... 部分はダミーなので、ここに自分でAPI読み込みを書けばOK。

        $table = \Piwik\API\Request::processRequest('VisitorInterest.getNumberOfVisitsPerVisitDuration', array(
            'idSite' => $idSite,
            'period' => $period,
            'date'   => $date,
        ));

最後に、自動で生成された Reports/GetMyfirstplugin.php を編集する。

protected function init() の中の以下のコメントアウトを外す。

        // $this->metrics       = array('nb_visits', 'nb_hits');
        // $this->subcategoryId = 'PomPlugin_Myfirstplugin';

ブラウザから開いて動作確認する。

気づけばプロ並みPHP 改訂版--ゼロから作れる人になる!

気づけばプロ並みPHP 改訂版--ゼロから作れる人になる!