2

Yesod (UTCTime として保存) で日時を選択するために使用されるカスタム フィールドに取り組んでいます。Trent Richardson の timepickerを使用しています。私は実際にそれをすでに機能させています。唯一の問題は、カスタム フィールドではなくハンドラーに JavaScript ファイルへの静的ルートがあることです。カスタム フィールドに移動すると、エラーが発生します。コードの一部 (主に yesod.form.fields からコピー) を以下に示します。

jqueryDateTimeField :: (RenderMessage site FormMessage, YesodJquery site) => JqueryDaySettings -> Field (HandlerT site IO) UTCTime
jqueryDateTimeField jds = Field
{
    fieldParse = parseHelper $ maybe (Left MsgInvalidDay) Right . readUTC . unpack
  , fieldView = \theId name attrs val isReq -> do
        toWidget [shamlet|
$newline never
<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required="" value="#{showVal val}">
|]
        addScript' urlJqueryJs
        addScript' urlJqueryUiJs
        addScript $ StaticR js_jquery_ui_timepicker_addon_js -- Bad line here
        addStylesheet' urlJqueryUiCss    --error seems to occurs on the line below
        toWidget [julius|
$(function(){
var i = document.getElementById("#{rawJS theId}");
$(i).datetimepicker({
    dateFormat:'yy-mm-dd',
    changeMonth:#{jsBool $ jdsChangeMonth jds},
    changeYear:#{jsBool $ jdsChangeYear jds},
    numberOfMonths:#{rawJS $ mos $ jdsNumberOfMonths jds},
    yearRange:#{toJSON $ jdsYearRange jds}
});
});
|]
  , fieldEnctype = UrlEncoded
}

と言う行がaddScript $ StaticR js_jquery_ui_timepicker_addon_js問題の原因です。このフィールドを呼び出すハンドラーにその行を入れると、それが機能するため、これを知っています。というエラーメッセージが表示されます

DateTime.hs:73:13:
Could not deduce (site ~ App)
from the context (RenderMessage site FormMessage, YesodJquery site)
  bound by the type signature for
             jqueryDateTimeField :: (RenderMessage site FormMessage,
                                     YesodJquery site) =>
                                    JqueryDaySettings -> Field (HandlerT site IO) UTCTime

続きますが、気になるのは、エラーが間違った行で発生しているように見えることです。で始まる行は 73 行目toWidgetです。私の質問は、カスタム フィールドで静的ルートをどのように使用できるかということです。他に提供すべき情報がある場合はお知らせください。ありがとう。

4

1 に答える 1

4

これは、あなたが一般的であるため失敗します。つまり、指定された制約1jqueryDateTimeFieldを満たすすべての Yesod サイトで機能しますが、データ型 ( で定義)で表される、サイト専用に定義されたルート コンストラクターを参照しています。このエラーは、 の使用を考えると、コンパイラは常に同じであると想定していますが、他の制約はコンパイラに対してそれを確認していないことを意味します。StaticRAppFoundation.hsCould not deduce (site ~ App)StaticRsiteApp

これに対する 1 つの解決策はjqueryDateTimeField、型シグネチャを次のように変更して、サイトに固有のものにすることです。

jqueryDateTimeField :: JqueryDaySettings -> Field Handler UTCTime

これは、サイトのハンドラー — のHandler型と同義であることに注意してください。HandlerT App IO

それは機能しますが、より良い解決策は、YesodJqueryurlJqueryUiDateTimePicker関数を使用して日時ピッカー アドオンの URL を取得し、それをスクリプトとして追加することです。urlJqueryUiDateTimePickerサイトを表すAppオブジェクト (この場合はオブジェクト) を受け取り、サイトの下のルートまたはテキストベースの URL のいずれかを返しEither (Route site) Text、javascript ファイルを指します。jqueryDateTimeFieldを使用してスクリプトとして追加できますaddScriptEither。次に、AppYesodJqueryインスタンスを変更して静的ルートを返すことができます。

したがって、次のように置き換えaddScript $ StaticR js_jquery_ui_timepicker_addon_jsます。

app <- getYesod   -- This gets your App object
addScriptEither (urlJqueryUiDateTimePicker app)

のインスタンスのurlJqueryUiDateTimePickerメソッドを変更して、使用するルートを返します。AppYesodJquery

instance YesodJquery App where
    urlJqueryUiDateTimePicker _ = Left $ StaticR js_jquery_ui_timepicker_addon_js

1HandlerT site IO元の型シグネチャでは、ハンドラはwhereが制約をsite満たすと で 表されていました。 データ型 からメッセージを生成する方法を知っている必要があります。では、jQuery、jQuery UI、および jQuery UI 日時ピッカー アドオン (こちらを参照) の静的ファイルにサイトがアクセスできる必要があります。RenderMessage site FormMessageYesodJquery siteRenderMessage site FormMessagesiteFormMessageYesodJquery site

于 2013-08-24T05:04:57.207 に答える