0

created_dateの列を持つレコードのテーブルがあります。日のセクションで発生した日付ごとにこれらのレコードを表示する方法を探しています。したがって、Todayは、今日追加されたレコードのみを表示し、そのテーブルの下には、昨日のレコードのみを表示します。私はそれがある種の配列であり、私がそれを作るよりも単純かもしれないと確信していますが、私はいくつかのループを見て、それをつなぎ合わせることができません。これを試しましたが、レコードを作成するためにそれを使用する方法がわかりません。

for ($i = 0; $i < 30; i++)
{
$timestamp = time();
$tm = 86400 * $i; // 60 * 60 * 24 = 86400 = 1 day in seconds
$tm = $timestamp - $tm;

$the_date = date("m/d/Y", $tm);
}

また、Zendで書かれているので、コントローラー、モデル、ビューに適切なものが必要です。ビューは私が立ち往生しているものだと思います。モデルは日付ごとにデータを取得するだけです。助けてくれてありがとう!

更新日10:279-25-2012これはビューのコントローラーです

    public function detailsAction() 
{
    $request   = $this->getRequest();
    $setId     = $request->getParam('set_id');
    $pageIndex = $request->getParam('page_index', 1);
    $perPage = 15;
    $offset  = ($pageIndex - 1) * $perPage;

    $conn = XXX_Db_Connection::factory()->getSlaveConnection();
    $setDao  = XXX_Model_Dao_Factory::getInstance()->setModule('media')->getSetDao();
    $photoDao = XXX_Model_Dao_Factory::getInstance()->setModule('media')->getPhotoDao();
    $setDao->setDbConnection($conn);
    $photoDao->setDbConnection($conn);

    $set = $setDao->getById($setId);
    if (null == $set) {
        throw new XXX_Exception_NotFound();
    }

    /**
     * Get the list of photo that belongs to this set
     */
    $photos       = $photoDao->getPhotosInSet($setId, $offset, $perPage, true);
    $numPhotos = $photoDao->countPhotosInSet($setId, true);

    /**
     * Paginator
     */
    $paginator = new Zend_Paginator(new XXX_Utility_PaginatorAdapter($photos, $numPhotos));
    $paginator->setCurrentPageNumber($pageIndex);
    $paginator->setItemCountPerPage($perPage);

    $this->view->assign('set', $set);
    $this->view->assign('photos', $photos);

    $this->view->assign('paginator', $paginator);
    $this->view->assign('paginatorOptions', array(
        'path'     => $this->view->url($set->getProperties(), 'media_set_details'),
        'itemLink' => 'page-%d',
    ));
}

関連するモデルは次のとおりです

    public function getById($id) 
{
    $sql = sprintf("SELECT * FROM " . $this->_prefix . "media_set 
                    WHERE set_id = '%s'
                    LIMIT 1", 
                    mysql_real_escape_string($id));
    $rs  = mysql_query($sql);
    $return = (0 == mysql_num_rows($rs)) ? null : new Media_Models_Set(mysql_fetch_object($rs));
    mysql_free_result($rs);
    return $return;
}

    public function getPhotosInSet($setId, $offset = null, $count = null, $isActive = null)
{
    $sql = sprintf("SELECT * FROM " . $this->_prefix . "media_photo AS f
                    INNER JOIN " . $this->_prefix . "media_photo_set_assoc AS fs
                        ON fs.photo_id = f.photo_id AND fs.set_id = '%s'",
                    mysql_real_escape_string($setId));
    if (is_bool($isActive)) {
        $sql .= sprintf(" WHERE f.is_active = '%s'", (int)$isActive);
    }
    $sql .= " ORDER BY f.photo_id DESC";
    if (is_int($offset) && is_int($count)) {
        $sql .= sprintf(" LIMIT %s, %s", $offset, $count);
    }

    $rs   = mysql_query($sql);
    $rows = array();
    while ($row = mysql_fetch_object($rs)) {
        $rows[] = $row;
    }
    mysql_free_result($rs);
    return new XXX_Model_RecordSet($rows, $this);
}

public function countPhotosInSet($setId, $isActive = null)
{
    $sql = sprintf("SELECT COUNT(*) AS num_photos FROM " . $this->_prefix . "media_photo AS f
                    INNER JOIN " . $this->_prefix . "media_photo_set_assoc AS fs
                    ON fs.photo_id = f.photo_id AND fs.set_id = '%s'",
                    mysql_real_escape_string($setId));
    if (is_bool($isActive)) {
        $sql .= sprintf(" WHERE f.is_active = '%s'", (int)$isActive);
    }
    $sql .= " LIMIT 1";
    $rs   = mysql_query($sql);
    $row  = mysql_fetch_object($rs);
    mysql_free_result($rs);
    return $row->num_photos;
}

2012年9月26日更新-新しいメソッドを追加

これをビューに追加しました。日付は希望どおりにヘッダーとして表示されますが、重複も印刷されます。私はそれらを日付の下でグループ化することを探しています:

これはビューです:

<?php if ($this->sets) : ?>
<div class="t_media_list_sets">
<h2><?php echo $this->translator()->widget('title'); ?></h2>

<ul>
    <?php foreach ($this->sets as $set) : ?>
    <?php $curDate = 0; ?>
    <?php $date = $set->created_date; ?>
    <?php if ($date != $curDate) : ?>
        <?php $curDate = $date; ?>
        <?php echo  $curDate; ?>
    <?php endif; ?>

    <li>
        <a href="<?php echo $this->url($set->getProperties(), 'media_set_details'); ?>">
            <?php echo $set->title; ?>
        </a>
        <?php echo $set->description; ?>
    </li>
    <?php endforeach; ?>
</ul>

<div class="clearfix"></div>
</div>
<?php endif; ?>

これが私が使用しているモデルです:表示されている以前のモデルを無視し、ウィジェットを作成しました

    public function setlist($offset = null, $count = null, $exp = null) 
{
    $sql = "SELECT * FROM " . $this->_prefix . "media_set AS s";
    if ($exp) {
        $where = array();

        if (isset($exp['created_user_id'])) {
            $where[] = sprintf("s.created_user_id = '%s'", mysql_real_escape_string($exp['created_user_id']));
        }
        if (isset($exp['keyword'])) {
            $where[] = "s.title LIKE '%" . addslashes($exp['keyword']) . "%'";
        }
        if (isset($exp['is_active'])) {
            $where[] = sprintf("s.is_active = '%s'", (int)$exp['is_active']);
        }

        if (count($where) > 0) {
            $sql .= " WHERE " . implode(" AND ", $where);
        }
    }
    $sql .= " ORDER BY s.created_date DESC";
    if (is_int($offset) && is_int($count)) {
        $sql .= sprintf(" LIMIT %s, %s", $offset, $count);
    }

    $rs   = mysql_query($sql);
    $rows = array();
    while ($row = mysql_fetch_object($rs)) {
        $rows[] = $row;
    }
    mysql_free_result($rs);
    return new XXX_Model_RecordSet($rows, $this);
}
4

4 に答える 4

1
<?php    
$d = array();
for($i = 0; $i < 30; $i++) 
    $d[] = date("d", strtotime('-'. $i .' days'));
?>

このようなタイプの操作についても、このリンクを参照してください

http://www.vision.to/how-to-add-days-weeks-months-to-any-date-.php

于 2012-09-26T02:25:28.203 に答える
1

より簡単に...

for( $i=1; $i<31; $i++ )
{
  $the_date = date("m/d/Y", strtotime("-".$i." days"));
}
于 2012-09-26T02:25:28.580 に答える
1

さて、私の簡単な提案は、最初にデータを日付でフィルタリングすることにより、データをmysql自体に制限することです。例:created_date> = ADDDATE(CURRENT_DATE()、INTERVAL -30 DAY)およびcreated_date <= CURRENT_DATE()、created_datedescで並べ替えます。

次に、phpで取得するときに、フラグでフィルタリングできます。last_date=''行の現在の日付がlast_dateと同じでないかどうかを確認し、別の配列/グループ表示を取得して、印刷/機能を開始します。

これにより、問題がはるかに簡単で単純なパターンで解決されるはずです。

于 2012-09-26T03:01:37.683 に答える
0

調査とウェブ上のいくつかの例の後、私はこれが機能するようになりました。上記と同じモデルですが、ビューを次のように変更しました。

<?php $prevDate = 0; ?>


<?php if ($this->sets) : ?>
<div class="t_media_list_sets">
<h2><?php echo $this->translator()->widget('title'); ?></h2>
<dl>
<?php foreach ($this->sets as $set) : ?>
<?php $date = date('y-m-d', strtotime($set->created_date)); ?>
<?php $theDate = $date ?>
<!-- Date changed -->
<?php if ($theDate != $prevDate) : ?>
    <?php if(!empty($prevDate)): ?>
    <?php  echo '</dl>'; ?>
  <?php endif; ?>
  <!-- Open new list -->
  <?php echo '<dl>'; ?>
  <!-- Show definition term for the group of events -->
  <?php echo '<dt>'; ?>
    <?php echo $theDate ?>
    <?php echo '</dt>'; ?>
<?php endif; ?>
<!-- Display current event -->
<?php echo '<dd>'; ?>
      <a href="<?php echo $this->url($set->getProperties(), 'media_set_details'); ?>">
        <?php echo $set->title; ?>
    </a>
    <?php echo $set->description; ?>
<?php echo '</dd>'; ?>

<!-- Remember date from previous row -->
<?php $prevDate = $theDate; ?>
<?php endforeach; ?>
<!-- Close last definition list -->
<?php echo '</dl>'; ?>    

<div class="clearfix"></div>
</div>
<?php endif; ?>

レイアウトを微調整する必要がありますが、原則は同じです。

于 2012-09-28T23:57:29.263 に答える