Labyrinth of Wisdom

-This is My Archive-


【Salesforce】独自クラスのオブジェクトを作成して画面に表示 (内部クラス)

一通りプログラミングやってきた方には基本的なことだと思うので今さらな内容だと思うんですが、独自クラスでオブジェクトを作るという事の意味が何となく分かったのでメモ。

内部クラスInnerClass

TestInnerClassControllerクラスにInnerClassのリスト型変数icListをフィールド変数としてセットし、get/setしてVFから値を取得・配置できるようにします。

public class TestInnerClassController{

    // フィールド変数
    public InnerClass[] icList {get; set;}
}

このInnerClassという型はSalesforceで用意されている型ではないので、自分でどういう型なのかを設定してやる必要があります。

これが独自クラスを作成するという事になります。

今回はTestInnerClassControllerクラスの中にInnerClassクラスを作るので、内部クラスになります。

    // 内部クラス
    public class InnerClass{
        public String name {get; set;}
        public Integer age {get; set;}
    }

このInnerClassクラスはどういう型なのかというと、String型の変数nameとInteger型の変数ageを変数として持っており、get/setできるようにしています。

これでInnerClassクラスの設定は終わりました。

独自クラスを扱う

InnerClassクラスの設定が終わったので、Salesforceで用意されているString型のように呼び出して使用することが出来ます。

コンストラクタでicListをnewします。

for文を3回ループさせて、icListに要素を追加していきます。

InnerClass型なので、変数nameageを使うことが出来ます。

    // コンストラクタ
    public TestInnerClassController(){
        icList = new List<InnerClass>();
        for(Integer i=0; i<3; i++){
            InnerClass ic = new InnerClass();
            ic.name = 'テスト太郎' + i +'号';
            ic.age = 20 + i;
            icList.add(ic);
        }
        System.debug(icList);
    }

VFで表示する

独自クラスの変数icListに値が格納されたので、Visualforceのapex:pageBlockTableタグなどで複数件表示することが出来ます。

<apex:page controller="TestInnerClassController" >
    <apex:pageBlock title="内部クラステスト" >
        <apex:pageBlockTable value="{!icList}" var="ic">
            <apex:column >
                <apex:outputText value="{!ic.name}" />
            </apex:column>
            <apex:column >
                <apex:outputText value="{!ic.age}" />
            </apex:column>
        </apex:pageBlockTable>
    </apex:pageBlock>
</apex:page>

こんな感じになります。 f:id:Labyrinth_of_Wisdom:20180125111149p:plain

自分で独自クラスを定義してやれば、画面上だけで使用するチェックボックスとかを無駄にオブジェクトのカスタム項目に作らなくていいので便利ですね。

最終的なコントローラはこんな感じです。

public class TestInnerClassController{

    // フィールド変数
    public InnerClass[] icList {get; set;}

    // 内部クラス
    public class InnerClass{
        public String name {get; set;}
        public Integer age {get; set;}
    }

    // コンストラクタ
    public TestInnerClassController(){
        icList = new List<InnerClass>();
        for(Integer i=0; i<3; i++){
            InnerClass ic = new InnerClass();
            ic.name = 'テスト太郎' + i +'号';
            ic.age = 20 + i;
            icList.add(ic);
        }
        System.debug(icList);
    }
}

【Salesforce】表示のみのチェックボックス作成方法

Visualforceで表示のみのチェックボックスを、<apex:outputField>以外で表現する方法ないのかなと思って調べたらありました。

tyoshikawa1106.hatenablog.com

以下サンプルです。

public class CheckBoxController{
    public Boolean checkBox {get; private set;}

    // コンストラクタ
    public checkBoxController(){
        checkBox = true;
    }
}
<apex:page controller="CheckBoxController">
    <apex:image value="/img/checkbox_{!IF(testCheckBox, '', 'un')}checked.gif" title="{!IF(testCheckBox, 'Checked', 'Not Checked')}" />
</apex:page>

<apex:image>valuetitle属性に対象の変数を入れてやればOK。 チェックボックスの画像を引っ張ってきて表示するみたいですね。

少々面倒ですが、この方法を使用すればクラス内で定義したBoolean型の変数もVisualforceでチェックボックス型として使用できます。

apex:outputCheckBoxみたいなタグ作ってくれないですかねー。

【Salesforce】Dropbox for Salesforceで独自のフォルダ階層を作成する

はじめに

DropboxSalesforceを連携する必要があったので試してみました。

基本的な設定は下記リンクを参照してもらえればOKです。 www.terrasky.co.jp

リンク先にもある通り、各種オブジェクトのレコード詳細画面からDropboxにデータをアップすると、基本設定だとフォルダの階層が以下になります。 ※対象オブジェクトを取引先として話を進めます。

\Dropbox\SalesforceDocuments\取引先\レコードの名前

今回僕がやりたかったのは、これを下記の様なフォルダ階層にしたいという事でした。

\Dropbox\SalesforceDocuments\取引先\得意先\レコードの名前

取引先の中でも得意先とそうじゃないものにフォルダ分けしたい、みたいな感じですね。

設定方法

方法はDropboxの公式に載ってました。リンク先の独自のフォルダ名構造を作成するという所です。

Salesforce 向け Dropbox:管理者の高度な設定 – Dropbox

ただ具体例がないのでよく分からないなと思い、色々試してみたら何とか出来ました。

まずカスタム項目「得意先」チェックボックス型で作成します。API名は「Tokuisaki」です。

次にカスタム項目「カスタム Dropbox パス」を数式のテキスト型で作成します。API名は「Custom_Dropbox_Path」です。

返ってくる値の式を以下のようにします。

IF(Tokuisaki__c, '取引先/得意先/' & Name & '/',  '取引先/' & Name & '/')

これで得意先のチェックがついた取引先レコードにファイルをアップしたら、独自のフォルダ階層が実現できます。

\Dropbox\SalesforceDocuments\取引先\得意先\レコードの名前

得意先にチェックがついてなかった場合は通常通りのフォルダ階層になります。

\Dropbox\SalesforceDocuments\取引先\レコードの名前

【Salesforce】一定の文字数で改行して画面に表示する方法

Visualforceで一定の文字数を指定して自動改行をするメソッドを作ったので、自分用にメモ。

意外と使いどころが多いんじゃないかと思います。PDFページとか文字が突き抜けでしまうので。 cloudcompass.seesaa.net

Apexクラス

第一引数に改行したい文字、第二引数に改行したい文字数を指定。

\r\nを削除している行がありますが、これはオブジェクトのテキストエリア型などから値を取得してくる場合に有効なので書いています。

decimalStRowsを取得する部分も、Salesforceが勝手に四捨五入するという動きがあるので、確実に処理するためにDecimal型にしてます。(これをやらないと値が揺れる)

public class kaigyoTextController {
      
    public String kaigyoText {get;private set;}
    
    public kaigyoTextController(){
        kaigyoText = autoKaigyo('あいうえおかきくけこ', 4);
    }
    
    private String autoKaigyo(String st, Integer kaigyoLength){
        String rtnSt;
        Integer stLength = st.length();
    // 改行コード削除
        st = st.replaceAll('\r\n','');

        // 文字が空白、または文字数が指定改行文字数以下の場合はそのままの値を返す
        if(String.isBlank(st) || stLength <= kaigyoLength){
            rtnSt = st;
        }else{
            // 小数点を出す為にDecimal型で計算
            Decimal decimalStRows = Decimal.valueOf(stLength) / Decimal.valueOf(kaigyoLength);
            // 切り上げ処理で内容の行数を取得
            Integer stRows = Integer.valueOf(decimalStRows.round(System.RoundingMode.UP));
            // 最初の改行まで取得+改行コード付与
            rtnSt = st.substring(0, kaigyoLength) + '<br/>';
            // 2行目以降をループ処理
            for(Integer i = 1; i < stRows; i++){
                if(kaigyoLength*(i + 1) < stLength){
                    rtnSt += st.substring(kaigyoLength*i, kaigyoLength*(i + 1)) + '<br/>';
                }else{
          // 最後の文字まで取得
                    rtnSt += st.substring(kaigyoLength*i);
                }
            }
        }
        return rtnSt;
    }
}

Visualforce

フィールド変数kaigyoTextをgetしているのでそれを表示しているだけです。 ただし一点注意点として、escape属性をFalseにしてやらないと、コントローラで追加した<br/>が効かないので注意してください。

<apex:page controller="TestFormController" >
    <apex:outputText value="{!kaigyoText}" escape="false" />
</apex:page>

f:id:Labyrinth_of_Wisdom:20171005115511p:plain

Sublime Textのユーザ設定・プラグインメモ

Sublime Text再インストール時などにユーザ設定を調べながらやり直すのが面倒なので、自分用にまとめてみました。 良いなと思う設定は是非パクってください。 パクリパクられしていきましょう。

フォントのインストー

Ricty Diminishedというプログラミングがしやすいフォントがあるので、まずこれをインストールします。 フォントにこだわりがなければしなくてもいいです。

nelog.jp

ユーザ設定

  1. ツールバーの[Preferences]→[Setteings]をクリック
  2. 別ウィンドウが開き、左側にデフォルトのユーザ設定、右側にカスタム用のユーザ設定が表示される
  3. カスタム用のユーザ設定に下記をコピペして保存
{
    "draw_white_space": "all", // スペースやタブを可視化する
    "fallback_encoding": "UTF-8", // 文字コードを自動判別できなかった時のデフォルト文字コード
    "font_face": "Ricty Diminished", // フォント
    "font_size": 11, //フォントサイズ
    "highlight_line": true, // 現在行をハイライト
    "ignored_packages": ["Vintage"],
    "line_padding_top": 5, //行間
    "overlay_scroll_bars": "disabled", // 水平スクロールバーが常に表示されるようにする
    "remember_open_files": false, // Sublimeを終了する直前に開いていたファイルを記憶するかどうか
    "rulers": [0,200],
    "show_encoding": true, // 文字コードをステータスバーに表示
    "translate_tabs_to_spaces": true, // タブをスペースに変換
    "trim_trailing_white_space_on_save": true, // 保存時に空白を除去する
    "word_wrap": true //自動改行
}

設定項目については下記を参照

qiita.com

プラグイン

  • All Autocomplete
  • BracketHighlighter
  • Color Highlighter
  • ConvertToUTF8
  • IMESupport
  • OmniMarkupPreviewer
  • SideBarEnhancements
  • TrailingSpaces

qiita.com

【Discogs】リリース作品の別バージョン作成について(マスターリリース)

はじめに

同じ作品でも初回限定版や各国にローカライズしたバージョン(日本版など)があると思います。

Discogsではそのバージョン違いを、マスターリリースという機能を使ってまとめることができます。 今回はそのマスターリリースの使用方法について説明していきたいと思います。

サンプルとしてKendrick Lamarのページを使います。

マスターリリースについて

f:id:Labyrinth_of_Wisdom:20170608095022p:plain

「Overly Dedicated」という作品はMP3のデータ配信とCDrでのリリースがあったようです。 近年よくある手法で、要は媒体が違うだけですね。

マスターリリースを使えばこのような表示方法にすることが可能になります。

f:id:Labyrinth_of_Wisdom:20170608095954p:plain

ページのサイドバーに「マスターリリースを作成」というボタンがあります。 これをクリック。

f:id:Labyrinth_of_Wisdom:20170608100128p:plain

すると上記のような画面になります。 ここでまとめたいリリース作品にチェックを入れ、「作成する」ボタンを押します。

今回は仮に「HiiiPoWeR」という作品を対象にします。 (実際は別バージョンは出ていないので作成しません)

また、マスターリリース作成時にはまとめたいリリース作品のURL最後尾にある7桁の数字が必要になるので、別途メモをしておいてください。

*HiiiPoWeR URL*
https://www.discogs.com/ja/Kendrick-Lamar-HiiiPoWeR/release/3776731

f:id:Labyrinth_of_Wisdom:20170608102940p:plain

キーリリース項目に、メインとなるバージョンのURL最後尾7桁の数字を入力します。

リリース項目に、メインバージョンも含めた全てのバージョンの数値を入力していきます。

これでマスターリリースが作成され、バージョン違いが表示されるようになります。

リリースのコピーについて

マスターリリースの作成方法は分かったけど、同じようなリリース何個も作成しないといけないの?となると思うので、リリースのコピー方法についても解説します。

f:id:Labyrinth_of_Wisdom:20170608104115p:plain

「リリースを編集」をクリックします。

f:id:Labyrinth_of_Wisdom:20170608104209p:plain

「下書きへコピー」をクリックします。

f:id:Labyrinth_of_Wisdom:20170608104506p:plain

アカウントメニューの「下書き」をクリックします。

f:id:Labyrinth_of_Wisdom:20170608104656p:plain

するとコピーしたリリースの下書きが作成されているので、「編集/送信」をクリックしてリリースを編集していきます。

【Discogs】アーティストの別名義登録について

Discogsでアーティストの別名義を登録したい時があると思いますが、その方法についてメモします。

大きく分けて、[エイリアス][バリエーション]と呼ばれる二つの方法があります。

サンプルとして使いやすいので、RhymesterMummy-D氏のDiscogsページを使用します。

f:id:Labyrinth_of_Wisdom:20170531113805p:plain

www.discogs.com

エイリアス

エイリアス…別名

[Mummy-D]という名義は主にMC/Rapper時に使用されるメインとなる名義です。

それとは別に氏はProducerとして[Mr.Drunk]という名義も持っています。

さらに作詞の時等は本名の[Daisuke Sakama]という名義も使います。

このように、同一人物ですが全く違う名前を持っているアーティストにはエイリアスを設定します。

設定方法としては、別名義のアーティスト名をエイリアス欄に記入するだけ。 設定が終わると、エイリアス欄にで別名義のリンクが作成され、クリックするとその別名義のページに飛びます。

因みに、別名義でのアーティストページが存在しない場合は、記入してもエラーになります。

バリエーション

氏のバリエーションの項目を見てみてください。 同じような、しかし微妙に異なる名義がいくつも並んでいるのが分かりますか?

氏は客演も沢山あるのですが、曲によってはグループ名を表記していたりすることもあるので、本来の[Mummy-D]とは少し違う表記が沢山あったりします。

例えば[Mummy-D From Rhymester]みたいなやつです。

他にもよくあるのが、カタカナ表記のアーティストがローマ字表記だったりとか、そういった別名義まではいかないけど表記がちょっと違うというのがバリエーションになります。

f:id:Labyrinth_of_Wisdom:20170531113906p:plain

設定方法のサンプルとして、[Mummy-D From Rhymester]でリリースしている作品を使用します。 因みにバリエーション設定されている名義は表記の後ろに*が付きます。

f:id:Labyrinth_of_Wisdom:20170531114125p:plain

これは作品の編集画面ですが、Mummy-D氏の項目を見てください。 アーティスト名の箇所には[Mummy-D]と書いてあります。

その横に[ANV入力欄]と呼ばれる項目があるのですが、そこに[Mummy-D From Rhymester]と記載されています。

この[ANV入力欄]に記入した値がそのアーティストの名義バリエーションになります。

極端な話、ここで田中太郎とか書いてもそのアーティストのバリエーションになってしまいます。 (Discogsのマナーに反するのでやったら駄目ですよ)

まとめ

全部バリエーションにしたらいいんじゃない?という風に思う方もいらっしゃると思うのですが、名義が違いすぎるものはエイリアスとして登録するのがDiscogsの基本理念ぽいです。(一回それで指摘ありました)

なので下記の様な考え方で進めていけばいいかなと思います。

エイリアス:別のアーティスト
バリエーション:表記違い

Discogsは翻訳があまり進んでないので分かりにくい箇所が多々あるのですが、今回の記事で少しでもDiscogsの理解が深まればと思います。