1

毎年開催されるイベントの予約サイトをリニューアル中です。各イベントには、現在完全に静的な独自のページがあります。各ページは、見出し、説明、および開催地別に並べ替えられた日付のリストで構成されています。毎年、新しい日付が利用可能になると、誰かが入り込んでそれぞれの HTML を手動で変更する必要がありますが、これは明らかに骨の折れる作業です。

たとえば、日付を保存する CSV ファイル (断片的に追加することができます) を作成して、ページが読み込まれるときにそこから関連する日付を取得することで、このプロセスをある程度自動化したいと考えています。私はサーバー側の経験はありませんが、jQuery については少し知識があり、AJAX などでこれを行うことができるはずだと感じていますが、どうすればよいでしょうか?

4

4 に答える 4

2

あなたの場合はivoszzさんのアイデアが一番だと思います。データベースと PHP を取得したい場合は、データベース自体にデータを取得する方法が必要になります。これにより、まったく新しいワームの缶が開かれます。確かに、データベース + サーバー側フロントエンドは業界標準ですが、要件に対して大きすぎるように感じます。

単純なテキスト ファイルから読み取ると、JSON を jQuery で表示する方法を簡単に学習できます。このコードを記述する必要があるのは 1 回だけです。

その後、変更があった場合はいつでも、単純なワークフローを使用できます。Excel を使用して、事前に記録された形式を使用してイベントを入力します。次に、Excel ファイルを .csv としてエクスポートします。小さなプログラムを使用して CSV を読み取り、JSON にシリアル化します。出力をサーバー上の所定の場所にコピーします。すべての準備が整いました。

あなたの不在中に他の誰かがサイトを更新しなければならない場合、必要なのは Excel、変換ツール (小さい)、およびサーバーのパスワードだけです。この回答の最後に変換ツールのコードを掲載しています。

または、コードを使用して ASP .NET WebForms プロジェクトを作成することもできます。コードによって作成されたオブジェクトをシリアル化する代わりに、.aspx ページを作成し、サーバー側コードを使用してそのページにデータを表示できます。ただし、これにはいくつかの欠点があります。

  • .net Web フォームは JavaScript よりも学習曲線が急勾配であり、結果のコードはおそらくサーバー側のコントロールを使用することになるでしょう。適切な方法を知らない限り、CSS でスタイルを設定するのは困難です。
  • 独自のサーバーの代わりに安価なホスティング パッケージを使用している場合は、プロバイダーのサーバーに必要な .net バージョンがあることを確認する必要があります。また、.net Web プロジェクトには通常すべてのライブラリが含まれているため、おそらくより多くのスペースを消費します。
  • 入力データの構造がまったく変わらない場合は、コンバーターを一度コンパイルして、それをブラック ボックスとして扱い始めることができます。表示方法の変更は、JSON 読み取りコードで行うことができ、ブラウザーで直接デバッグできます。.net ソリューションの場合、Visual Studio をインストールしておく必要があります。
  • .net Web フォームは将来性のあるスキルではありません。Microsoft は、より便利な新しい Web テクノロジである .NET MVC を作成しました。古いテクノロジを今すぐ学習し始めることはお勧めしません。一方、MVC は静的ページと動的ページを簡単に混在させることができないため、既存の静的ページが多数ある場合、このプロジェクトを MVC にすることはお勧めできません。おそらくコンテンツを使用することはできますが、ルーティング システム全体を書き直し、すべての内部リンクを置き換える必要があります。

csv を JSON に変換する C# アプリケーションのコードを次に示します。コンパイルしたら、.exe を csv と同じディレクトリ (DataSource.csv) に配置します。それをダブルクリックします。同じディレクトリに autoOutput.json という名前の新しいファイルが生成されます。.csv ファイルの各行は、event name; venue; date; cost;フォーマットで構築する必要があります。Excel の の右側にコメントなどを追加できますがcost、それらは破棄されます。行の順序は関係ありません。イベント名が一意である限り、それで始まるすべての会場と日付はそのイベントに属するものとして解釈されます。イベント名と会場の組み合わせが一意である限り、すべての日付はその会場でのそのイベントに関するものとして解釈されます。

短すぎて読み取れなかった行に関する情報については、私は何もしていません。ファイルに追加するか、その内容を警告と交換できます。次に、変換を行う人は、警告がなくなるまでcsvをいじる必要があります。または、ファイルに残してみても、表示のためにロードするときに無視することができます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web.Script.Serialization; 

namespace ElendilEvents2JSON
{
    public class Event
    {
        public String Name { get; set; }
        public List<EventInVenue> venues { get; set; }

    }

    public class EventInVenue 
    {
        public String VenueName { get; set; }
        public List<EventInstance> Dates { get; set; }
    }

        public class EventInstance
    {
        public String When { get; set; }
        public String Cost { get; set; }

    }

    class Program
    {
        static void Main(String[] args)
        {
            //read the file 
            List<int> unreadable;
            List<Event> events = readFile(@".\SourceData.csv", out unreadable);

            //write the file using the normal JSON serializer. Will output just everything as a single line. If the data structure is changed, it will output in the new structure. 
            string autoOutput;
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            autoOutput = serializer.Serialize(events); 
            File.WriteAllText(@".\autoOutput.json", autoOutput); 
        }

         public static List<Event> readFile(string path, out List<int> unreadableLines)
        {
            //get the contents out of the file
            var lines = System.IO.File.ReadLines(path);
            // split each line into an array of strings
            var csv = lines
                .Select(line => line.Split(';'))
                .ToArray();

            //will hold all events 
            List<Event> events = new List<Event>();
            //will hold the numbers of all lines which were OK
            List<int> unreadable = new List<int>();

            //read each line, if you want to skip header lines, change the zero
            for (int lineCounter = 0; lineCounter < csv.Length; lineCounter++)
            {
                string[] line = csv[lineCounter];

                if (line.Length >= 4)
                {
                    string eventName = line[0];

                    Event currentEvent;
                    //if we haven't yet created the event, create it now and add it to the dictionary 
                    if (!events.Select(ev => ev.Name).Contains(eventName))
                    {
                        currentEvent = new Event { Name = eventName };
                        //the venues of the new event are still empty
                        currentEvent.venues = new List<EventInVenue>();
                        events.Add(currentEvent);
                    }
                    else currentEvent = events.Where(ev => ev.Name == eventName).Single();

                    // the same as above: we have the event now, if the current venue isn't yet on its list, enter it, else use the old one
                    string venueName = line[1];
                    EventInVenue currentVenue;
                    if (!currentEvent.venues.Select(ven => ven.VenueName).Contains(venueName))
                    {
                        currentVenue = new EventInVenue { VenueName = venueName };
                        currentVenue.Dates = new List<EventInstance>();
                        currentEvent.venues.Add(currentVenue);
                    }
                    else currentVenue = currentEvent.venues.Where(ven => ven.VenueName == venueName).Single(); 

                    string date = line[2];
                    string cost = line[3];

                    EventInstance currentEventInstance = new EventInstance { When = date, Cost = cost };
                    currentVenue.Dates.Add(currentEventInstance);
                }
                else
                    //if the line was too short
                    unreadable.Add(lineCounter + 1);

            }
            unreadableLines = unreadable;
            return events;
        }
    }
}
于 2013-10-25T16:50:14.327 に答える
1

このような単純なことを行うために、PHP の学習を開始する必要はありません。jQuery を少し知っている場合は、JSON ファイルをサーバーに追加するだけです。events.jsonこの構造で:

[
  {
     "event": "Event name",
     "description": "description of the event",
     "dates": [
       {
         "date": "20131028",
         "place": "Dublin"
       }, {
         "date": "20131030",
         "place": "London"
       }
     ]
   }, {
       ... another event here with the same structure...
   }
]

でロードしjquery.get、いくつかのテンプレート ライブラリ (例: underscore) を使用し、ページ内に単純なテンプレートを作成して、イベントと詳細を表示します。home.html最後に、イベントのリストを表示しevent.html、イベントに関する詳細を表示するための2 つのページ (または 1 つだけ) しかありません。

現在、編集events.jsonにより、ホームページと詳細ページでイベントが追加および変更されます。これは大まかな例です。要件に応じてカスタマイズする必要があります。

于 2013-10-25T12:00:22.507 に答える