Wednesday, January 9, 2019

Liferay DXP 7.1 リリース

明けましておめでとうございます。小川です。
本年もよろしくお願いします。

昨年下期にLiferay DXP 7.1がリリースされました。
なので、今回は前バージョン7.0からの変更点をいくつか紹介しようと思います。

前提として、
本記事の対象者は管理者や利用ユーザを想定しています。
(ディベロッパー向けの変更点についてはほとんど触れていません。)
変更点は大小様々ありますが、比較的大きな変更点に絞っています。

下記のような流れで紹介していきます。

主な変更点を簡単に説明します。
 ①コンテンツページ
 ②ページ管理
 ③ナビゲーションメニュー
 ④フォーム
 ⑤GDPRサポート
 ⑥Adaptive Media
 ⑦ワークフロー管理

2. ナビゲーションメニューについて
1. で取り上げた変更点の1つであるナビゲーションメニューにフォーカスし、詳しく説明します。

では、本題に入ります。


検証環境
OS:macOS High Sierra 10.13.6
Liferay :Liferay 7.1.1 CE GA2


1. Liferay DXP 7.1の主な変更点と説明


さっそくですが、主な変更点を挙げ説明していきます。

①コンテンツページ


ページを作成する際に選択できるページ種別にコンテンツページが増えました。


コンテンツページはフラグメントと呼ばれるコンテンツをページ上に配置することができるページです。
フラグメントは下図のようなフラグメントエディタを用いて作成することができ、作成したフラグメントはページエディタを用いてページ上に配置することができます。


また、特定のタグを用いることで指定領域(テキストと画像)をページ上で直接編集することができます。加えて、ポートレットの埋め込みが可能です。標準ポートレットだけでなく、自分で作成したポートレットも埋め込むことができます。

簡単な使い方はこちらのサイトにある動画を見てもらうとわかりやすいかと思います。

コンテンツ作成者がコンテンツの雛形(フラグメント)のみ作成し、マーケティング担当者がコンテンツ自身に手を加えることなく、テキストや画像を目的や状況に応じてページ上で編集するような使い方があるかなと思います。

②ページ管理

下図のようにページ階層を可視化して管理できるようになりました。
ここでページの作成、設定、削除ができます。サイト内のページ管理を単一の画面に集めることで管理しやすくなると思います。



③ナビゲーションメニュー

ナビゲーションメニューとは下図のように「サイト内のページを表示しクリックすることで対象ページに移動できるメニュー」です。
今回、どのようにアップデートされたのかは次節で詳しく説明します。


④フォーム

フォームは大幅にアップデートされた部分だと思います。条件付きルールなどより高度なフォームが作成できるようになりました。新フォームに関して説明すると長くなりそうなので、次回のブログで詳しく説明しようと思います。

⑤GDPRサポート

GDPRに対応するための下記の機能が追加されています。

●Sanitizing User Data
これまでユーザを削除する機能はありましたが、ユーザに関連するコンテンツまでは対応していませんでした。本機能ではユーザに関するコンテンツまで削除することにより、GDPRの要件に対応しています。

●Exporting User Data
ユーザをExportする機能はこれまでもありましたが、上記と同様にユーザに関する個人データ(コンテンツやコメント等)も抽出できるようになりました。

⑥Adaptive Media

これはアクセスする各デバイスに応じて画像解像度を制御する機能となります。この機能によりデバイスやネットワークへの負担を軽減することができます。

⑦ワークフロー管理

ワークフローの設定等はすべてコントロールパネル内の1つのエリアにまとめられ、またワークフローの複製やバージョン管理が可能となりました。


2. ナビゲーションメニューについて


今回、ナビゲーションメニューの扱い方が大きく変わりました。以前のバージョンから利用している方はどのように使うのかわかりづらいと思うので、本節ではナビゲーションメニューにフォーカスします。

前バージョンとの大きな違いはナビゲーションメニューを自由に作成・設定できるようになった点です。自身で様々なパターンのナビゲーションメニューを作成し、ナビゲーションメニューポートレットからどのナビゲーションメニューを使用するか選択することができるようになりました。
文字だけではわかりづらいと思うため、ナビゲーションメニューの作成から設定までを詳しく説明します。

管理者メニューの[Build]→[Navigation Menus]でナビゲーションメニュー画面に遷移します。そこで右上の[+]からナビゲーションメニューを作成します。今回は下図のように”Test Navi Menu”という名のものを作成しました。
(”Default”と”Default Private"ははじめからあるナビゲーションメニューです。)



”Test Navi Menu”を開きます。まだ何もありません。


右上の[+]→[Page]を選択するとサイト内にあるページを選択することができます。


必要なページを選択します。(今回は4つのページを選択しました。)
これでナビゲーションメニューの作成完了です。


次にナビゲーションメニューの設定を行います。ページに配置してあるナビゲーションメニューポートレットの設定を開きます。



先ほど作成したナビゲーションメニューを選択します。


これで設定も完了です。
自分で作成したナビゲーションメニューが下記のように表示されました。


おそらく慣れるまでは使いにくいと思われるかもしれません。しかし、ナビゲーションメニューに自由度を持たせることで、複雑なサイトマップに対応しやすくなったり、特定のページ、コンテンツへの誘導性も高まるのではないでしょうか。

ちなみに、ナビゲーションメニューを階層(サブメニュー的に)で表示させたい場合は下記のように対象ページをドラッグして動かすことで簡単に実現することができます。




3. まとめ


いかがでしたか。簡単ではありましたが大きな変更点について紹介できたかと思います。今回詳しく紹介できなかったフラグメントやフォーム、登場しなかった変更箇所についても今後紹介していければと思います。

4. おまけ


いろいろ触ってみて感じたことを少しだけ挙げておきます。
●起動時間が短縮された気がする。従来の半分ぐらい。
●ディベロッパー向けになるかもしれませんが、画面上でGOGOシェルを実行できたり、サーバー情報を見れたりします。人によっては便利かもですね。



Friday, September 21, 2018

Alfresco:Share UIで行うコンテンツモデリング

こんにちは。たなかです。

小学生の子供達の夏休みが終わり、給食も始まったのでお弁当作りから解放されました。

長期休暇のあとは給食のありがたみをいつにも増して感じます。

今回はShare UI上管理ツールのモジュールマネージャでモデル作成をしてみたいと思います。
使用しているバージョンは、201707 GAです。


管理ツールのメニューからモデルマネージャをクリックします。


モデルの作成ボタンを押して必要事項を入力し、作成します。



次に作成したモデルをクリックしてタイプとアスペクトを作ります。

まずは、カスタムタイプの作成を行います。


作成したタイプにプロパティを作成します。


続いてアスペクトと、タイプのプロパティと同じようにアスペクトのプロパティを作成します。


各タイプとアスペクトのレイアウトをレイアウトデザイナーで設定します。
レイアウトデザイナーでの設定は必須です。
設定を行わずに有効化しても表示されないのでご注意ください。

自分でレイアウトを設定したい場合は説明に従い設定することもでき、デフォルトレイアウトの設定やデフォルトレイアウトを元にカスタマイズを行うこともできます。

デフォルト設定を適用してみます。


レイアウト設定が完了したら、保存します。

モデルのメニューリストから登録したモデルを有効化します。

有効化されたことを確認したら、

タイプを設定したいコンテンツのメニューからタイプの変更を選択し、設定します。


先に作成したカスタムタイプ(aegif:customType)というタイプがリストに存在しています。

タイプを設定すると文書詳細のプロパティエリアにタイププロパティが表示されました。


アスペクトの管理でアスペクトの付与、取り外しもできます。

タイプがないアスペクトのみのモデルの設定も行なってみたいと思います。

先ほどと同様、レイアウトデザイナーでレイアウトを保存しておきます。



有効化する前は、文書のアスペクト管理で確認しても該当のアスペクトが表示されていません。


モデルを有効化します。

再度先ほどの文書のアスペクト管理を確認すると、有効化したアスペクトが表示されています。

タイプは1つのノードに1つしか設定できませんが、アスペクトは複数設定することができます。

アスペクトを付与してみました。



設定した文書のメニューリストのプロパティエリアに追加したアスペクトのプロパティが表示されました。



一度タイプを設定するとShare UIからは変更ができないようになっているため、
すでにタイプを設定した下記コンテンツはタイプを変更しようとしてもリストには何も表示されていません。

反対にアスペクトは自由に取り外しが可能です。


モデルマネージャで行うコンテンツモデリングでは、簡易的に作成することが可能なので、細かい設定などを行いたい場合はShare UI上からはできません。
英語表記と日本語表記を分けたい場合もcontent-model.propertiesとcontent-model_ja.propertiesのようなファイルを言語別に用意して各ファイルに設定する必要があります。

Share UI上でモデルを作成し、モデルのアクションメニューからエクスポートを行うと作成したモデルのxmlファイルがダウンロードできるのでそれを利用して詳細を設定する、ということも可能です。


今回は、Share UIから設定するコンテンツモデリングについてご紹介させていただきました。

Wednesday, August 1, 2018

Demystifying Liferay categories: leftCategoryId / rightCategoryId

Liferay allows site administrators to define a "vocabulary" containing categories such as:

  • Cheese
  • Bread
  • Butter

Web content can then be classified using these categories, for instance a news article about canapé would be assigned the categories "Cheese" and "Bread".

Create a Liferay page, put a "Category Navigation" application and an "Asset Publisher" on it, link them and voilà! You have a nice page where relevant articles appear depending on the category you clicked.

Categories can have sub-categories:



Left and right


When you click on a category, you will notice this parameter in the URL: categoryId=21434

You can inspect this category by putting it in the "parentCategoryId" field of this Liferay API page:
https://yourserver/api/jsonws?signature=%2Fassetcategory%2Fget-child-categories-1-parentCategoryId#serviceResults

You will notice that each category has a "leftCategoryId" and a "rightCategoryId" field. What are those!?

They help Liferay easily display items in the category navigation widget. Here is how they are stored in database:

mysql> SELECT leftCategoryId, rightCategoryId, name FROM AssetCategory WHERE vocabularyId=21431 ORDER BY leftCategoryId;
+----------------+-----------------+-----------+
| leftCategoryId | rightCategoryId | name      |
+----------------+-----------------+-----------+
|              2 |               7 | Cheese    |
|              3 |               4 | Camembert |
|              5 |               6 | Roquefort |
|              8 |               9 | Bread     |
|             34 |              35 | Butter    |
+----------------+-----------------+-----------+
5 rows in set (0.00 sec)

When you click on a category, for instance "Cheese", Liferay will use the category identifier to get the Cheese row, and get the left and right, here "2 and "7". Liferay will then use these identifiers in the following SQL request:

SELECT categoryId, name FROM AssetCategory WHERE (groupId = ___) AND (leftCategoryId BETWEEN ___ AND ___);

... where the first blank is the Liferay site identifier, and the second and third are the first and last categories of the vocabulary, in our example 2 and 7. Let's run it:

mysql> SELECT categoryId, name FROM AssetCategory WHERE (groupId = 20181) AND (leftCategoryId BETWEEN 2 AND 7);
+------------+-----------+
| categoryId | name      |
+------------+-----------+
|      21433 | Cheese    |
|      21703 | Camembert |
|      21704 | Roquefort |
+------------+-----------+
3 rows in set (0.01 sec)

Voilà! You get all of the categories whose articles should appear on the page when you click "Cheese".

You might ask: Why not just use parentId to get all categories whose parent is the Cheese categories, and then recursively their own sub-categories using the same technique?
Answer: It would not scale. For vocabularies with n levels of sub-categories, the recursion would trigger O(n!) SQL requests, whereas the left/right strategy uses O(1) SQL requests. This technique is called nested set model. Its drawback is that left/right information must be rebuilt every time an administrator moves or deletes a category.

Rouelle du Tarn, by Tangopaso - Wikimedia Commons, Public domain

Applicable to Liferay 6.2 and Liferay 7.0
Nicolas Raoul

Monday, May 21, 2018

Alfresco勉強会を終了します!


イージフの戸谷です。

唐突なエントリタイトルですが44回にわたり続けてきたAlfresco勉強会を終了することにしました。
次回勉強会の日程が設定されていない状態を続けるのも良くないので、ここで終了の理由を書いておきたいと思います。
心配される方もいらっしゃるかもしれないですが、イージフがAlfrescoを扱わなくなる、ということでは全くありませんのでご安心ください!

終了するに至った理由はいくつかあるのですが、その中で最も大きかったことは私を含めた弊社メンバが発表したいと考えていた内容と、参加される方が期待される内容にズレが生じていた、ということでした。弊社メンバはAlfrescoの技術的な(ともすればマニアックな)情報を発表したい。一方で参加される方のほとんどはAlfrescoでは何ができるのか、どういう使い方をするのか知りたいという方が多かったため、結果としてAlfrescoの使い方について毎回説明するセッションを設けつつ、技術的な発表についてはボリュームを少なくするなど調整しながら勉強会を実施していました。ただこれは発表者、参加者双方にフラストレーションを溜めやすい構造になっていたように思います。

そこで今後技術情報については全てこのLaboブログで発信します。そうすることで弊社メンバが伝えたい情報粒度で勉強会の場よりも自由に情報発信ができるようになると考えています。

一方でこれまで勉強会が実質的に担っていたAlfrescoの使い方を知っていただく場については、今後弊社主催のAlfrescoの無料ワークショップという型式で定期的に開催しようと考えています。内容や時期については現在準備中ですので詳細が決まったらLaboブログでも連絡いたします。弊社で取り扱っているOSSのポータルプロダクトであるliferayについても同様に技術情報はLaboブログで発信し、無料ワークショップの開催を検討しています。

型式は変わりますが今後もAlfrescoも技術情報は継続的に発信していきますので、ぜひLaboブログをよろしくおねがいします。

How to install Alfresco 6 on Linux

Hello, I am Nicolas! So, you want to try Alfresco on Linux? Alfresco used to provide a user-friendly wizard installer, but starting from Alfresco 6 they only provide a Docker image. It is not much more complicated, if you follow the instructions below. I have tested on Ubuntu Linux 2018.04, if the instructions are different for other distributions of Linux please write a comment, thanks!

Step 1: Install Docker

If you don't have Docker yet, install the package:

sudo apt install docker.io docker-compose

Then add your user to the docker group (replace "nico" with your username):

sudo usermod -aG docker nico

For this change to take effect, either log out and log in again, or just type this into your terminal, as your user:

newgrp docker

Step 2: Install Alfresco

If you don't have Git yet, install the package:

sudo apt install git

Then, as your normal Linux user, go to any folder that has 500 kilobytes of free space (yes that part is very small as it is a kind of installer rather Alfresco itself), for instance your home folder, and execute these commands one after the other:

git clone git@github.com:Alfresco/acs-community-deployment.git
cd acs-deployment/docker-compose
docker-compose up

That's it, your new Alfresco is now being downloaded and started! Go have a break.

Using your Alfresco 6

The Alfresco user interface (called Alfresco Share) is at http://localhost:8080/share

The CMIS and WebDAV URLs, as well as some administration tools such as the Node Browser and the WebScripts Home, can be found at http://localhost:8082/alfresco

Alfresco 6 uses Solr to index content, and the Solr console is available at http://localhost:8083/solr

To stop Alfresco, just press CTRL-C in ther terminal where you have launched "docker-compose up". This will not reset your changes nor lose your documents. To start Alfresco again, just launch the same "docker-compose up" command in the acs-community-deployment/docker-compose folder.

 


Going further

As you might have guessed, Alfresco is split into several Docker containers.
To see them all, type the following:

docker container ls

This shows you all of your containers. Have a look at the last column:

[...] NAMES
[...] dockercompose_share_1
[...] dockercompose_solr6_1
[...] dockercompose_alfresco_1
[...] dockercompose_postgres_1

The containers are listed in reverse startup order:
- Alfresco Share (the web interface)
- Alfresco Search Services (the Solr engine and database)
- Alfresco Content Repository (the repository)
- Postgres (the main database)

To see the logs for all containers in real-time, type this:
docker-compose logs --follow share alfresco solr6 postgres

Let's say you want to modify a configuration file or check memory consumption on the Postgres container. Copy the name of Postgres in the "NAMES" column (for instance mine is dockercompose_postgres_1) and paste it inside this command:

docker exec -it dockercompose_postgres_1 bash

That's it, now you have a terminal inside your container!

If you like Alfresco and want to install it on a production server, Alfresco recommends Kubernetes instead of Docker, more on this later!