2

SOとGoogleを検索しましたが、必要なものが見つかりません。

CodeIgniter 2を使用して単純なイベントカレンダーを 作成しています。CodeIgniterのドキュメントによると、これは基本的なコード構造であり、機能しています...

// $data[2] contains the data for day #2, etc.

$data[2] = '<a href="#">event title 1</a>';
$data[8] = '<a href="#">event title 2</a><br/><a href="#">event title 3</a>';
$data[13] = '<a href="#">event title</a>';
$data[24] = '<a href="#">event title</a>';

// {content} in template is where $data is inserted for each day

$prefs = array (
    // my calendar options
    'template'  => '
        {cal_cell_content}{day}<br/>{content}{/cal_cell_content}
        {cal_cell_content_today}<div class="highlight">{day}<br/>{content}</div>{/cal_cell_content_today}'
);

$this->load->library('calendar', $prefs);

$year   = ($year === FALSE ? date('Y') : $year);
$month  = ($month === FALSE ? date('m') : $month);

echo $this->calendar->generate($year, $month, $data);

次に、データベーステーブルを設定する方法を説明します...

  • 各イベントにはtitleフィールドがあり、それがを作成し$slugます。(~/events/view/title-slug

  • 各イベントにはdateフィールドがあり、データ形式は次のとおりです。mm/dd/yyyy

$data[]ここで、特定の月/年のデータベースにクエリを実行し、各変数に挿入するデータを抽出する方法を考えています。

次のことを行う必要があるようです。

  • monthデータベーステーブルに、、、dayおよびの新しい列を作成しますyear

  • 検証された後、date入力データを取得し、date列に保存します。

  • 入力データを分割し、各部分を、、、および列dateに保存します。monthdayyear

year次に、データベースに&を照会し、monthこれらの結果をループして$data[]、それぞれの配列を作成しますday

これは私がこの問題に取り組むべき正しい方法ですか?、、、および列dateだけでなくmonth、列も持つことは非常に冗長なようです。()列だけで実行できますか?単純すぎます?複雑すぎますか?日付を入力するための複数のフィールドをユーザーに提供することは避けたいので、最終的には、適切なデータ形式を確保するのに役立つjQuery日付ピッカーを使用します。dayyeardatemm/dd/yyyy

これは単純な問題のように思えるかもしれませんが、簡単なコード例をオンラインで見つけることができませんでした。私が見つけたもののほとんどは古くなっている(CI2ではなくCI)か、私が行っていることには複雑すぎるか、すでに日付(~/events/view/yyyy/mm/dd)を含むURIセグメントを持つ毎日のコンテンツアイテムを使用しています。


編集

これが私のモデルが現在どのように設定されているかです:

return $this->db->get_where('events', array('yyyy' => $year, 'mm' => $month))->result_array();
4

2 に答える 2

1

すべてをそのままにして、月と年を別々の列として返すようにクエリを構造化することができます。

SQLの場合:

SELECT id, 
       title, 
       description, 
       MONTH(date_field) as event_month, 
       YEAR(date_field) as event_year 
FROM my_table
... etc ...

およびActiveRecord(ここから取得):

$this->db->select('id');
$this->db->select('title');
$this->db->select('description');
$this->db->select("MONTH(date_field) AS event_month");
$this->db->select("YEAR(date_field) AS event_year");
$query = $this->db->get('my_table');
$results = $query->result();
于 2013-03-07T22:07:30.637 に答える
0

まず、組み込みのMySQL日付関数を利用するために、date列をMySQLの「日付」形式に変更しました。yyyy-mm-dd

私の元の$queryは次のとおりです。ここで、'yyyy''mm'は冗長な「年」列と「月」列です。

$this->db->get_where('events', array('yyyy' => $year, 'mm' => $month))->result_array();

組み込みのMySQL日付関数を使用して、次のように変更しただけです。

$this->db->get_where('events', array('YEAR(date)' => $year, 'MONTH(date)' => $month))->result_array();

これで問題は解決しました。これで、「年」と「月」の余分な列を維持する必要がなくなりました。


さらに、 MySQLの「エイリアス」関数を使用して、列の「日」部分をdate呼び出される仮想列に割り当てることができます。dd

$this->db->select('DAY(date) AS dd');

ただし、CIのデフォルトを上書きするため、これは失敗しますselect('*')select()したがって、最初に関連するすべての列を実行する必要があります。そうしないと、エラーが発生します。

$this->db->select('*');
$this->db->select('DAY(date) AS dd');

そして、それをすべてモデルにまとめます。

// select all relevant columns
$this->db->select('*');

/* use MySQL date functions to creates virtual column called 'dd' containing
"day" portion of the real 'date' column. */
$this->db->select('DAY(date) AS dd'); 

/* use MySQL date functions to match $year and $month to "year" and "month"
portions of real 'date' column. */  
return $this->db->get_where('events', array('YEAR(date)' => $year, 'MONTH(date)' => $month))->result_array();
于 2013-03-17T00:32:06.900 に答える