Labyrinth of Wisdom

-This is My Archive-


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

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みたいなタグ作ってくれないですかねー。

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\取引先\レコードの名前

【Apex】Visualforceで一定の文字数で改行して表示する方法

Visualforceで一定の文字数を指定して自動改行をするメソッドを作ったので、自分用にメモ。 意外と使いどころが多いんじゃないかと思います。

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の理解が深まればと思います。

【Apex】複数条件での検索 (動的SOQL)

複数の入力フォームに値を入力し、その値を検索条件として値を取得するコードのサンプルです。 例えば下記の様なフォームがあるとします。



このフォームの場合、レコードの検索条件としては下記の4パターンが考えられます。

・名前も年齢も入力されていない
 →全てのレコードを取得

・名前のみ入力されている
 →名前の前方・後方一致で当てはまるレコードを取得

・年齢のみ入力されている
 →年齢が一致するレコードを取得

・名前も年齢も入力されている
 →名前が前方・後方一致かつ、年齢が一致するレコードを取得

つまりユーザの操作によって4パターンのSOQLが発行されることになります。

if(String.isBlank(inputName) && String.isBlank(inputAge)){
    // 名前も年齢も入力されていない
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c];
}else if(!String.isBlank(inputName) && String.isBlank(inputAge)){
    // 名前のみ入力されている
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c WHERE Name LIKE :name]
}else if(String.isBlank(inputName) && !String.isBlank(inputAge)){
    // 年齢のみ入力されている
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c WHERE Age__c = :age]
}else{
    //名前も年齢も入力されている
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c WHERE Name LIKE :name AND Age__c = :age]
}

この方法では、WHERE句のみが違う同じようなコードを何回も書かないといけません。 今回は入力フォームが二つなので4パターンで済みますが、これがもっとたくさんある場合はその都度同じようなSOQLの文を書かないといけないので面倒です。

おまけに名前の検索時は%田中%みたいに自分でワイルドカード(%)を付けてやらないと前方・後方一致検索できません。

これを解決するのが動的SOQLと呼ばれるものです。 先ほどのコードに書いてあるSOQLは静的SOQLと呼ばれます。

動的SOQLはDatabase.query(String)メソッドを使用して、引数に文字列でSOQL文を渡してやることでレコードを取得します。

// 静的SOQL
Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c];

// 動的SOQL
Hoge__c[] hogeList = Database.query('SELECT Name, Age__c FROM Hoge__c');

動的SOQLはSOQL文が文字列なので、Database.query(String)メソッドを呼び出す前に、条件分岐でsoql文を作り変えてやれば画面の入力値に応じて発行されるsoql文が変化します。

先ほどの静的SOQLで書いたコードを動的SOQLで書き直したコントローラのサンプルコードを記載します。

public class SampleSearchController {

    // フォーム入力用変数
    public String inputName {get;set;}
    public String inputAge {get;set;}

    // 検索するオブジェクト
    public Hoge__c[] hogeList{get;set}

    // コンストラクタ
    public SampleSearchController(){
    hogeList = new List<Hoge__c>();
    }

    // 検索メソッド
    public void search(){
        String soql = 'SELECT Id, Name, Age__c FROM Hoge__c';
        String where = ' WHERE '
        String soqlName = 'Name LIKE \'%' + String.escapeSingleQuotes(inputName) + '%\'';
        String soqlAge = 'Age__c = ' + String.escapeSingleQuotes(inputAge);

        if(!String.isBlank(inputName) && !String.isBlank(inputAge)){
            // 名前も年齢も入力されている
            soql += where + soqlName + ' AND ' + soqlAge;
        }else if(!String.isBlank(inputName) && String.isBlank(inputAge)){
            // 名前のみ入力されている
            soql += where + soqlName;
        }else if(String.isBlank(inputName) && !String.isBlank(inputAge)){
            // 年齢のみ入力されている
            soql += where + soqlAge;
        }

        System.debug(soql);
        hogeList = Database.query(soql);
    }

}

このようにSOQL文を文字列で扱うことで、入力された値によって動的にSOQL文を変化させることが出来ます。 ついでにワイルドカード(%)も変数の中に埋め込んでいるので、入力フォームにワイルドカード(%)を入れなくても前方・後方一致検索ができます。