ASP.NET MVC から wordpress のデータを扱う(1)

という訳で、今度は ASP.NET MVC から wordpress のデータを扱っていきます。これで CakePHP と比較すると、ASP.NET MVC が何処まで優れている/劣っているのかが分かるかと。

CakePHP から wordpress のデータを扱う | Moonmile Solutions Blog
www.moonmile.net/blog/archives/1888
CakePHP から wordpress のデータを扱う(2) | Moonmile Solutions Blog
www.moonmile.net/blog/archives/1896
CakePHP から wordpress のデータを扱う(3) | Moonmile Solutions Blog
www.moonmile.net/blog/archives/1922

wordpress のデータベースは SQL Server には対応していないので、テーブルの作成とインポートは別途行っています。実は、このあたり苦労したので…後で情報として残しておきますね。

ASP.NET MVC アプリの場合は LINQ to Entities を使うと楽なので、ズルをしてこれを使います。モデルの作成が楽というのがあるのですが。LINQ が使えるというのがミソでして。

■ビューを作る

ASP.NET MVC のビュー作成は、EDM(Entity Data Model)を使うと自動生成してくれるので、これを利用します。wp_posts クラスを指定します。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcWordpress.wp_posts>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
	Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Index</h2>

    <table>
        <tr>
            <th>
                ID
            </th>
            <th>
                post_author
            </th>
            <th>
                post_date
            </th>
            <th>
                post_title
            </th>
            <th>
                post_category
            </th>
            <th>
                guid
            </th>
        </tr>

    <% foreach (var item in Model) { %>
    
        <tr>
            <td>
                <%: item.ID %>
            </td>
            <td>
                <%: item.post_author %>
            </td>
            <td>
                <%: String.Format("{0:g}", item.post_date) %>
            </td>
            <td>
                <%: item.post_title %>
            </td>
            <td>
                <%: item.post_category %>
            </td>
            <td>
                <%: item.guid %>
            </td>
        </tr>
    
    <% } %>

    </table>

</asp:Content>

■コントローラーを作る

EDM の場合、クラス名を変更できない(と思う)ので、「wp_」のようなプレフィクスはそのまま残ってしまいますね。これは、CakePHP のほうが prefix の設定ができる分、有利です。
更に云えば、T100,T200,T300 のような管理しやすいが他人には分かりにくいテーブル名の場合は、そのままクラス名として使われてしまいますね。CakePHP の Model はテーブル名を変更できるので、これも CakePHP のほうがよいかなと。

public class PostsController : Controller
{
    //
    // GET: /Post/

    public ActionResult Index()
    {
        wordpressEntities ent = new wordpressEntities();
        var model = from t in ent.wp_posts
                    where t.post_status == "publish"
                    select t;
        return View(model);
    }
}

ASP.NET MVC では、PostsController クラスで post_status をチェックしています。これは、EDM のクラスにはメソッドが追加できない(と思う)ので、findPosts メソッドを追加できないからなんですよねぇ。多分、拡張メソッドを使ってメソッドを追加するんでしょうが、単純にメソッドを追加、とはいかないようです。

■モデルは EDM そのままで

モデルは CakePHP と同様に EDM そのものを使います。wp_posts だけを返すのであれば、これで十分です。

■モデルのラッパークラスを作ってみる

ASP.NET MVC では、コントローラーでデータ加工をすることが多いので(EDMをモデルとして直接使う場合は特に)、コントローラーの各メソッドでクエリを書きます。
が、post_status = ‘publish’ のような、フラグ(他にも削除フラグとかなんとか)を、いちいちコントローラーでチェックするのは抵抗があるし、間違いも発生しやすいものです。
なので、wp_posts モデルをラップした Post クラスを作って CakePHP の時のように findPosts メソッドを作ってみます。

public class Post : wp_posts
{
    public IQueryable<wp_posts> FindPosts()
    {
        wordpressEntities ent = new wordpressEntities();
        var model = from t in ent.wp_posts
                    where t.post_status == "publish"
                    select t;
        return model;
    }
}

単純ですが、wp_posts クラスを継承したクラスを作ります。この継承が意味があるかどうかは別として、ひとまず wp_posts と同じものを指しているというつもりです。

コントローラーの Index メソッドは Posts::FindPosts メソッドを使って次のように書きます。

public ActionResult Index()
{
    Models.Post post = new Models.Post();
    var model = post.FindPosts();
    return View(model);
}

まあ、こんな風にしたほうが分かりやすいかな、と。
本来は、wp_posts.FindPosts() な形で書きたいですね。

お次は、最近投稿した記事一覧を表示させます。

カテゴリー: ASP.NET, Wordpress パーマリンク

ASP.NET MVC から wordpress のデータを扱う(1) への1件のコメント

  1. masuda のコメント:

    追記。
    EDM のデザイナで、エンティティのクラス名を変更できます。wp_users を User のように変えていけば、CakePHP のように命名規約で揃えられます。

コメントは停止中です。