Posts Tagged with "Design"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on November 25, 2022 #556

table.blade.phpの修正

次に後半のビューの修正を行います。修正するファイルはindex()アクションの2次ビューであり、ファイルはtable.blade.phpです。修正する行は以下の2行です。

        <th>Category Id</th>
       :
            <
td>{{ $doc->category_id ;}}</td>

このビューの修正する前の画面表示です。

図%%.1
図556.1 indexアクション初期画面

図556.1ではCategory idが数字となっていますが、これを次のように修正します。

        <th>Category</th>
       :
            <
td>{{ $categories[$doc->category_id] }}</td>

このビューの画面表示です。図556.2のようにcategoryが名称に変化しました。

図%%.2
図556.2 indexアクション修正後画面


左矢前のブログ 次のブログ右矢

posted by sakurai on November 24, 2022 #555

DocController index()の修正

yiiと異なり、外部テーブルを認識できないため、コントローラの修正も必要になってきます。前半がコントローラの修正、後半がビューの修正となります。

前半のコントローラの修正としてapp/Http/Controllers/DocController.php内のindexアクションの修正を行います。

    public function index(Request $request)
    {
        
$docs $this->docRepository->all();
        return 
view('docs.index')
            ->
with('docs'$docs);
    }

となっているところを修正します。

まずモデルの定義が必要です。

use App\Models\Category;

次に外部テーブルの要素が必要なので、categoriesに要素を全部集めてビューに渡します。

    public function index(Request $request)
    {
        
$docs $this->docRepository->all();
        
$categories Category::all()->pluck('name','id');
        return 
view('docs.index',compact('docs','categories'));
    }

ここでpluck()compact()の説明をします。pluck()は、all()で集めたモデルのオブジェクトの集合に対して、シンプルに'id'をキーにした'name'をバリューとするarrayを作成するメソッドです。

次に、compact()は例えば'doc'という変数名をキーにしてdocオブジェクトをバリューとするarrayを作成します。この場合は'doc'と'categories'という2つの変数をビューに渡します。このビューへの変数を渡す手法はyiiと全く同じです。


左矢前のブログ 次のブログ右矢

posted by sakurai on November 21, 2022 #554

リレーション定義

コードを見ると、app/Models/Category.phpにおいては、

    public function docs()
    {
        return 
$this->hasMany(AppModelsDoc::class, 'category_id');
    }

これは、A category has many docsと読みます。1対nの関係です。また、app/Models/Doc.phpでは、

    public function category()
    {
        return 
$this->belongsTo(AppModelsCategory::class, 'category_id');
    }

とあり、これはA doc belongs to a categoryと読みます。n対1の関係です。

リレーションを辿る方法

yiiのように、ドット記述だけでリレーションを辿るようなうまい方法はなさそうですが、

$doc->category_id

のようにインデックス値は得られるので、$categories配列に全てのメンバを集めるというひと手間かけた上で

$categories[$doc->category_id]

のように表を引いて名前への変換を行います。

コントローラ、ビューの対応表

以下に画面、コントローラ中のアクション、ビューの対応表を示します。これに従い、それぞれのアクション及びビューを修正します。コントローラはapp/Http/Controllers/DocController.phpであり、ビューは全て、resources/views/docs/の下にあります。修正はコントローラとビューの両方について行います。

表554.1 画面、アクション、ビューの対応表
アイコン コントローラ内
メソッド(アクション)
1次ビューファイル
(黄色がアクションに対応)
2次ビューファイル
一覧表示 index() index.blade.php table.blade.php
fig554-1.png create() create.blade.php fields.blade.php
fig554-2.png show() show.blade.php show_fields.blade.php
fig554-3.png edit() edit.blade.php fields.blade.php


左矢前のブログ 次のブログ右矢

posted by sakurai on November 17, 2022 #553

スキャフォールディング画面

図553.1に初期画面を示します。これはCategoryテーブルを選択したところです。

図%%.1
図553.1 Categoryの初期表示

右上のブルーのAdd Newをクリックし、データを3件入力します。

図%%.2
図553.2 Categoryのデータ表示

同様にDocテーブルを入力します。yii2と同様、標準では外部参照表を認識してくれず、Category idは数字となっています。

図%%.3
図553.3 Docのデータ表示


左矢前のブログ 次のブログ右矢

posted by sakurai on November 16, 2022 #552

imfyOm labsのジェネレータによるスキャフォールディング

Laravelは困りものです。標準のスキャフォールディングが存在しないようです。またLaravel自体の版数も頻繁に上がるたびに完全互換性は無いため、しばしば動作しなくなります。そのため、Laravelによるスキャフォールディングはかなり苦労しました。

最終的にうまくいった、imfyOm labsが開発したlaravel generatorによるスキャフォールディングを紹介します。

ghがインストールされていなければ、以下によりインストールします。太字が入力部分です。

$ sudo dnf install gh

次にgithubトークンが必要なため、githubにログインして、Settings->Developer settings->Personal access tokens->Tokens (classic)により、トークンを取得します。これを環境変数GH_TOKENにセットして、ghを実行します。

$ export GH_TOKEN='xxxxxxxxxxxxx'
$ gh repo clone InfyOmLabs/adminlte-generator example-app

composerをアップデートして、様々なライブラリをインストールします。

$ cd example-app
$ composer update

データベースアクセス可能なように、.env.exampleを.envにコピーし、mysqlのルートパスワードを修正します。

DB_PASSWORD=mysqlルートパスワード

データベース名laravelを作成します。

$ mysql -u root -pmysqlルートパスワード -e 'create database laravel'

アプリケーションのキーを挿入します。これは無くても動作はしますが、セキュリティ上必要です。
参考:https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f

$ php artisan key:generate

モデル名にCategory(単数形)を設定し、コンソールからテーブル定義を入力します。

$ php artisan infyom:api Category <<EOF1
name string text
required
exit
y
EOF1

モデル名にDoc(単数形)を設定し、コンソールからテーブル定義を入力します。

$ php artisan infyom:api Doc <<EOF2
title string text
required|max:512
pages integer text
required|numeric
link string text
required
category_id bigInteger:unsigned:foreign,categories,id select
required|numeric
exit
y
EOF2

マイグレーションを行い、データベースを作成します。laravel固有のメンバが必要なので、既存のデータベースからモデルを作成するよりもこの方法を推奨します。

$ php artisan migrate

これによりmysqlのlaravelデータベースの下にdocsテーブルとcategoriesテーブルが作成されます。テーブルの命名規則は複数形と定まっています。

作成したテーブルからモデルを作成します。

$ php artisan infyom:scaffold Category --fromTable --tableName=categories <<EOF3
y
EOF3

$ php artisan infyom:scaffold Doc --fromTable --tableName=docs <<EOF4
y
EOF4

ルーティング制御であるroutes/web.phpに対してモデルへのルーティングが、以下のように追加されます。

Route::resource('docs'AppHttpControllersDocController::class);
Route::resource('categories'AppHttpControllersCategoryController::class);

ディレクトリの書き込み許可を出します。

$ chmod 777 storage/logs/
chmod 777 storage/framework/sessions/
chmod 777 storage/framework/views/
chmod 777 storage/framework/cache/data/

http://localhost/publicをアクセスし、右上のRegisterからユーザ登録を行います。


左矢前のブログ 次のブログ右矢

posted by sakurai on November 15, 2022 #551

editアクションのビューの修正

続いて鉛筆マークのクリックで表示されるビューである_form.phpを修正します。これはcreateアクションのビューも兼用しています。まず標準の実行結果は図551.1のとおりです。

図%%.1
図551.1 yii2標準のActiveFormによる表示

同じく_form.phpを修正します。自動生成されたコードを見ると、

    <?= $form->field($model'category_id')->textInput() ?>

となっています。このcategory_idを、同様に(リレーション名).(メンバ名)としてみましたが、そう単純には行きませんでした。

単に表示を変えるのではなく、リストから選択する必要があるためです。そのためdropDownListウィジェットを用います。dropDownListが連想配列を必要とするので、categoryモデルが必要ですが、まず必要なモデルやヘルパーライブラリの使用を宣言します。

use yii\helpers\ArrayHelper;
use 
app\models\Category;

categoryモデルを全て配列に入れたあと、arrayHelperという便利な配列操作関数のうちのmap関数を用いて、dropDownListに必要な連想配列を作成します。

    <?= $form->field($model'category_id')->dropDownList(ArrayHelper::map(Category::find()->asArray()->all(), 'id''name')) ?>

これを実行した結果を図551.2に示します。

図%%.2
図551.2 修正したActiveFormによる表示

これでyii2のビューの修正は全て完了です。


左矢前のブログ 次のブログ右矢

posted by sakurai on November 14, 2022 #550

アクションviewのビューの修正

続いて目玉アイコンをクリックした時のビューであるview.phpを修正します。実行結果は図550.1のとおりです。

図%%.1
図550.1 yii2標準のDetailViewによる表示

以下にview.phpのDtailViewの修正法を示します。自動生成されたコードを見ると、

    <?= DetailView::widget([
        
'model' => $model,
        
'attributes' => [
            
'id',
            
'title',
            
'pages',
            
'link',
            
'category_id',
        ],
    ]) 
?>

同様に修正します。

    <?= DetailView::widget([
        
'model' => $model,
        
'attributes' => [
            
'id',
            
'title',
            
'pages',
            
'link',
            
'category.name',
        ],
    ]) 
?>

これを実行した結果を図550.2に示します。

図%%.2
図550.2 修正したDetailViewによる表示

タイトル列がNameですが、これもCategoryに変更したい場合は、'category.name:text:Category'のように修正します。

左矢前のブログ 次のブログ右矢

posted by sakurai on November 11, 2022 #549

アクションindexのビューの修正

index.php/?r=docsとしてドキュメント一覧表を表示します。表549.1に示すように、index.phpにより実行されます。

図%%.1
図549.1 yii2標準のGridViewによる表示

yii2も標準ではリレーション先まで見てくれないため、手修正を行います。前稿のように、views/docs/index.phpの修正法を示します。自動生成されたindex.phpを見ると、

    <?= GridView::widget([
        
'dataProvider' => $dataProvider,
        
'filterModel' => $searchModel,
        
'columns' => [
            [
'class' => 'yiigridSerialColumn'],
            
'id',
            
'title',
            
'pages',
            
'link',
            
'category_id',

これをyii2のGridViewのcolumnsにおいて、(リレーション名).(メンバ名)でリレーション先を表示できるとあるように修正します。

    <?= GridView::widget([
        
'dataProvider' => $dataProvider,
        
'filterModel' => $searchModel,
        
'columns' => [
            [
'class' => 'yiigridSerialColumn'],
            
'id',
            
'title',
            
'pages',
            
'link',
            
'category.name',

これを実行した結果を図549.2に示します。数字ではなく、カテゴリ名が表示されています。

図%%.2
図549.2 修正したGridViewによる表示

タイトル行がNameですが、Categoryに変更したい場合は、’category.name:text:Category'のように修正します。


左矢前のブログ 次のブログ右矢

posted by sakurai on November 9, 2022 #548

yii2によるスキャフォールディング

次にyii2でも同様な作業を行います。yii2のインストール法はcomposerを用います。yii2決定版ガイドのyiiインストール法にあるとおり、以下のコマンドによりbasic applicationを作成します。アプリ名をここではdoctest21としました。同じく太字が入力部分です。

$ composer create-project --prefer-dist yiisoft/yii2-app-basic doctest21

yiiと同様に、適宜config/web.php及びconfig/db.phpを修正して、アプリURI/?r=giiを実行し、giiによりモデルとCRUDを生成します。

まず、giiを有効化します。修正するファイルは、config/web.phpです。

    $config['bootstrap'][] = 'gii';
    
$config['modules']['gii'] = [
        
'class' => 'yiigiiModule',
        
// uncomment the following to add your IP if you are not connecting from localhost.
        
'allowedIPs' => ['127.0.0.1'],
    ];

次にconfig/db.phpを修正し、mysqlを使用することを宣言します。

return [
    
'class' => 'yiidbConnection',
    
'dsn' => 'mysql:host=localhost;dbname=test1',
    
'username' => 'root',
    
'password' => 'XXXXXXXX',
    
'charset' => 'utf8',

アクションとビューの対応表

表548.1に画面、コントローラ中のアクション、ビューの対応表を示します。これに従い、それぞれのアクション及びビューを修正します。コントローラはcontrollers/DocsController.phpであり、docs関連ビューは全て、views/docs/の下にあります。

表548.1 画面、アクション、ビューの対応表
アイコン コントローラ内
メソッド(アクション)
1次ビューファイル
(黄色がアクションに対応)
2次ビューファイル
一覧表示 actionIndex() index.php 無し
fig548-1.png actionCreate() create.php _form.php
fig548-2.png actionView() view.php 無し
fig548-3.png actionUpdate() update.php _form.php


左矢前のブログ 次のブログ右矢

posted by sakurai on November 8, 2022 #547

giiにより生成されたコードの修正法

元に戻って、標準のgiiにより生成されるコードの追加の修正法を示します。前稿までにCListViewの修正を示しましたが、ここではもう一つのCGridViewの修正を行います。

標準のgiiではテーブル表示にCListViewとCGridViewの2種類を選択するとができます。見かけが良いのはCGridViewで、図547.1のようにエクセルライクな表を作成してくれます。

図%%.1
図547.1 標準のCGridViewによる表示

views/docs/index.phpの修正法を示します。自動生成されたindex.phpを見ると、

<?php $this->widget('zii.widgets.grid.CGridView', array(
        
'id'=>'docs-grid',
        
'dataProvider'=>$model->search(),
        
'filter'=>$model,
        
'columns'=>array(
                
'id',
                
'title',
                
'pages',
                
'link',
                
'category_id',
                array(
                        
'class'=>'CButtonColumn',
                ),
        ),
)); 
?>

のように変数ではなくラベルになっています。従って\$model->(リレーション名)->(メンバ名)のように手修正することができないと思っていました。ところがyii2のGridViewのcolumnsにおいて、(リレーション名).(メンバ名)でリレーション先を表示できるとあったため、yiiで実行してみたところ、正常に表示されることが分かりました。この機能はマニュアルに書かれてないようです。

<?php $this->widget('zii.widgets.grid.CGridView', array(
        
'id'=>'docs-grid',
        
'dataProvider'=>$model->search(),
        
'filter'=>$model,
        
'columns'=>array(
                
'id',
                
'title',
                
'pages',
                
'link',
                
'category.name',
                array(
                        
'class'=>'CButtonColumn',
                ),
        ),
)); 
?>

これを実行した結果を図547.2に示します。

図%%.2
図547.2 修正したCGridViewによる表示

図547.1ではCategoryのタイトルで数字となっていたカラムが、Nameのタイトルでカテゴリ名に変化しています。ちなみにこのカラムタイトルは、"attribute:format:label"のようにラベルとして指定可能です。例えば元のままの"Category"としたければ、

                'category.name:text:Category',

のように記述します。

yiiにおいてはgiixを使えばリレーションに関する手修正は必要ないため、ここまでとします。


左矢前のブログ 次のブログ右矢


ページ: