1

私は PHP に非常に慣れておらず、CakePHP にはさらに慣れていません。これは私のコードが書かれている目的ですが、私の問題は私の標準的な PHP コードのいくつかにあると思います。

OK、これでこのコードはほとんど機能しますが、選択したユーザーが同時に 1 日以上かかると、間違った結果が返されるようです!

OK、つまり、選択したユーザーの勤続年数を取得することです。それはOKです(少なくとも問題はないと思います)。次に、勤続年数から、勤続年数に基づいて、1 日、次に半日の病気の権利を設定します。

コードが選択されたユーザーを病気にさせ、それで彼らが権利で取ったものを取り去り、最初に完全に取り、それが空になったら半分取ります。しかし、私が言ったように、ユーザーが連続して 1 日以上休みを取った場合でも、休みは 1 日しかないのですか?

foreach ループを開始してカウントを行う場所かもしれませんが、それが正しいかどうかはわかりません。

助けてください??

 function sickDay($id = null) {
    if($this->CURRENT_USER['User']['role_id'] > 3) { //directors and admins
    /*if(empty($this->data) || !isset($this->data['Holiday']['id'])) {

    } else {*/
        //Caculate if it's a full pay, half pay or nothing
        //$data = $this->data['Holiday'];

        //Get Holidaytypes
        $types = $this->Holiday->find(
            'all',
            array(
                'conditions' => array(
                    'Holiday.holidaystype_id' => 3,
                    'Holiday.user_id' => $id
                )
            )
        );

        //Get starting date
        $contracts = $this->Holiday->User->Contract->find(
            'all',
            array(
                'conditions' => array(
                    'Contract.user_id' => $id //$data['user_id']
                ),
                'order' => array(
                    'Contract.startson' => 'ASC'
                )
            )
        );
        //Get How Many sick days
        foreach ($types as $key => $value) {

            $typesDataEnds =  strftime ("%u-%d-%Y", $types[$key]['Holiday']['endson']);
            $typesDataStarts = strftime ("%u-%d-%Y", $types[$key]['Holiday']['startson']);

            $SickTotal = count($typesDataEnds - $typesDataStarts);  
            //echo $SickTotal;

        //Get Contract Start & End Dates
        $start = array_shift($contracts);
        $end = array_pop($contracts);

        $endDate = $end['Contract']['endson'];
        $startDate = $start['Contract']['startson'];

        if (empty($endDate)) {
                $endDate = time('now');
        }
        if (!empty($startDate)) {
            $SortEnd = strftime("%Y", $endDate);
            $SortStart = strftime("%Y", $startDate);
            $YearsService = $SortEnd - $SortStart;

            if ($YearsService <= 1) {
                    $SetFullEntitlement = 5;
                    $SetHalfEntitlement = 5;
                    //echo 'one year';
            } elseif ($YearsService <= 2) {
                    $SetFullEntitlement = 10;
                    $SetHalfEntitlement = 10;
                    //echo 'two years';
            } elseif ($YearsService <= 5) {
                    $SetFullEntitlement = 20;
                    $SetHalfEntitlement = 20;
                    //echo 'up to five years';
            } elseif ($YearsService >= 6) {
                    $SetFullEntitlement = 30;
                    $SetHalfEntitlement = 30;
                    //echo 'five years or more';
            } else {
                    $SetFullEntitlement = 0;
                    $SetHalfEntitlement = 0;
                    //echo 'no sick pay';
            }
        } else {
            $YearsService = 0;
            //echo 'Sorry No Start Date For You Found!';
        }

        while ($SickTotal > 0) {
            if ($SetFullEntitlement != 0) {
                $SetFullEntitlement--;
            } elseif ($SetHalfEntitlement != 0) {
                $SetHalfEntitlement--;
            }
            $SickTotal--;
        }

        echo 'FullPay:';
        echo $SetFullEntitlement;
        echo '<br/><br/>Halfpay:';
        echo $SetHalfEntitlement;

        }

        //debug($SickTotal);
        die();  
        //$this->render('/artists/holidayslist');
    //} //End For if empty check
 } // End for if CURRENT_USER
} //End of Function

アップデート

私はあなたが言ったことを理解しています。はい、%u が私が必要としていることに使用するのが間違っていたことを今知っています。今、私はあなたが言ったことをしましたが、選択したユーザーに対して 0 を返しました。

foreach ($types as $key => $value) {

    $typesDataEnds =  strtotime($types[$key]['Holiday']['endson']);
    $typesDataStarts = strtotime($types[$key]['Holiday']['startson']);

    //$typesDataEnds =  strftime ("%Y-%m-%d", $types[$key]['Holiday']['endson']);
    //$typesDataStarts = strftime ("%Y-%m-%d", $types[$key]['Holiday']['startson']);

    $sickTotal = floor(($typesDataEnds - $typesDataStarts) / 86400);

    echo 'testing: ';
    debug($sickTotal);

    die();

 does more.....

 } //end

私は何か間違ったことをした?

助けてくれてありがとう

グレン。

4

1 に答える 1

0

病欠を計算する行に 3 つの問題があります。

  1. 計算の前に日付をフォーマットしています (フォーマットが間違っています。の意味についてはドキュメント%uを参照してください)。計算には数値が必要です。これは、日付が で解析可能な形式である場合に機能するはずですstrtotime

    $end = strtotime($types[$key]['Holiday']['endson']);
    $start = strrotime($types[$key]['Holiday']['startson']);
    
  2. 次に、2 つの文字列を減算しようとします。それはうまくいきません。しかし、それを使用するstrtotimeと機能します。これは、整数を操作しているためです。

    $sickTotal = floor(($end - $start) / 86400);
    // 86400 seconds in a day
    
  3. 結果には使用しないでくださいcount。これは配列とオブジェクト用です。他のものを渡すと、返されます1(これは、表示されている間違った結果を説明しています。文字列を渡しています)。

計算用の動作デモを作成しました。

于 2012-07-04T04:05:25.913 に答える