S
S
seddi2016-01-29 20:35:34
Yii
seddi, 2016-01-29 20:35:34

How to simplify controller functions?

In the controller, here is such an assembly, how to simplify it, transfer it to the model, or add separate functions here?

/**
     * view Month
     */
    public function actionMonth()
    {
        $month = date('n', $_GET['time']); // с 1 месяца по 12
        $year = date('Y', $_GET['time']); // 2011

        $customers = Sheel::find()
            ->onCondition('date_execution >= :time1 AND date_execution < :time2')
            ->params([
                ':time1' => ($firstDay = date("Y-m-d", mktime(0, 0, 0, $month, 1, $year))),
                ':time2' => date("Y-m-d", mktime(0, 0, 0, $month + 1, 1, $year)),
            ])
            ->orderBy('date_execution DESC')
            ->joinWith('recipies')
            ->with('company')
            ->all();
        $res = [];
        foreach ($customers as &$item) {
            $res[] = [
                'id_sheel'=>$item->id_sheel,
                'parent_recipies'=>$item->parent_recipies,
                'id_company'=>$item->company->id_company,
                'name_company' => $item->company->name_company,
                'address' => $item->address,
                'recipies' =>
                    $item->recipies->porous_recipies . " " .
                    $item->recipies->size_min . " " .
                    $item->recipies->type_recipies . " " .
                    $item->recipies->brand_recipies . " " .
                    "№ " . $item->recipies->number_recipies,
                'amount_sheel' => $item->amount_sheel,
                'date_execution' => $item->date_execution,
            ];
        }
        $result =new ArrayDataProvider(['allModels' => $res]);

        return $this->render('month', [
            'result' => $result,
            'firstDay' => $firstDay,

        ]);

    }


    /**
     * view Company
     */
    public function actionCompany() 
    {
        $company =$_GET['company']; // с 1 месяца по 12
        $month = date('n', $_GET['time']); // с 1 месяца по 12
        $year = date('Y', $_GET['time']); // 2011
        $customers = Sheel::find()
            ->onCondition('parent_company = :name AND date_execution >= :time1 AND date_execution < :time2')
            ->orderBy('date_execution DESC')
            ->params([
                    ':name' => $company,
                    ':time1' => ($firstDay = date("Y-m-d", mktime(0,0,0,$month,1,$year))),
                    ':time2' => date("Y-m-d", mktime(0,0,0,$month+1,1,$year)),
            ])
            ->orderBy('date_execution DESC')
            ->joinWith('recipies')
            ->with('company')
            ->all();
        $res = [];
        foreach ($customers as &$item) {
            $res[] = [
                'id_sheel'=>$item->id_sheel,
                'parent_recipies'=>$item->parent_recipies,
                'id_company'=>$item->company->id_company,
                'name_company' => $item->company->name_company,
                'address' => $item->address,
                'recipies' =>
                    $item->recipies->porous_recipies . " " .
                    $item->recipies->size_min . " " .
                    $item->recipies->type_recipies . " " .
                    $item->recipies->brand_recipies . " " .
                    "№ " . $item->recipies->number_recipies,
                'amount_sheel' => $item->amount_sheel,
                'date_execution' => $item->date_execution,
            ];
        }
        $result =new ArrayDataProvider(['allModels' => $res]);

        //  VarDumper::dump($res);
        return $this->render('company', [
           // 'materials' => $materials,
            'company' => $company,
            'result' => $result,
            'firstDay' => $firstDay,

        ]);

    }
    /**
* 
* view Address
*/
public function actionAddress()
{ 
    $company =$_GET['id']; 
    $addreses =  Sheel::findAll(['id_sheel' => $company]);
    foreach ($addreses as $key=>$one){
     $addres =$one->address;
            };
     $month = date('n', $_GET['time']); // с 1 месяца по 12
    $year = date('Y', $_GET['time']); // 2011
        $customers = Sheel::find()
            ->onCondition('address = :name AND date_execution >= :time1 AND date_execution < :time2')
            ->orderBy('date_execution DESC')
            ->params([
                            ':name' => $addres,
                            ':time1' => ($firstDay = date("Y-m-d", mktime(0,0,0,$month,1,$year))),
                            ':time2' => date("Y-m-d", mktime(0,0,0,$month+1,1,$year)),
            ])
            ->orderBy('date_execution DESC')
            ->joinWith('recipies')
            ->with('company')
            ->all();
        $res = [];
        foreach ($customers as &$item) {
            $res[] = [
                'id_sheel'=>$item->id_sheel,
                'id_company'=>$item->company->id_company,
                'name_company' => $item->company->name_company,
                'recipies' =>
                    $item->recipies->porous_recipies . " " .
                    $item->recipies->size_min . " " .
                    $item->recipies->type_recipies . " " .
                    $item->recipies->brand_recipies . " " .
                    "№ " . $item->recipies->number_recipies,
                'amount_sheel' => $item->amount_sheel,
                'date_execution' => $item->date_execution,
            ];
        }
        $result =new ArrayDataProvider(['allModels' => $res]);

    return $this->render('address', [
        'result' => $result,
        'firstDay' => $firstDay,

    ]);

}

Answer the question

In order to leave comments, you need to log in

3 answer(s)
D
dimabdc, 2016-01-29
@seddi

You can (and should) separate identical pieces of code into separate functions:

/**
     * view Month
     */
    public function actionMonth()
    {
        $rangeData = $this->_getDateRange();

        return $this->render('month', [
            'result' => $this->_getSheel(),
            'firstDay' => $rangeData['firstDay'],
        ]);

    }

    /**
     * view Company
     */
    public function actionCompany()
    {
        $company =$_GET['company']; // с 1 месяца по 12
        $rangeData = $this->_getDateRange();

        //  VarDumper::dump($res);
        return $this->render('company', [
            // 'materials' => $materials,
            'company' => $company,
            'result' => $this->_getSheel('parent_company', $company),
            'firstDay' => $rangeData['firstDay'],
        ]);

    }
    
    /**
     *
     * view Address
     */
    public function actionAddress()
    {
        $company =$_GET['id'];
        $addreses =  Sheel::findAll(['id_sheel' => $company]);
        foreach ($addreses as $key=>$one){
            $addres = $one->address;
        };
        $rangeData = $this->_getDateRange();

        return $this->render('address', [
            'result' => $result,
            'firstDay' => $rangeData['firstDay'],
        ]);

    }

    /**
     * Get date range
     * 
     * @return array
     */
    protected function _getDateRange()
    {
        $month = date('n', $_GET['time']); // с 1 месяца по 12
        $year = date('Y', $_GET['time']); // 2011

        return [
            'firstDay' => date("Y-m-d", mktime(0, 0, 0, $month, 1, $year)),
            'lastDay' => date("Y-m-d", mktime(0, 0, 0, $month + 1, 1, $year))
        ];
    }

    /**
     * Get sheel
     * 
     * @param mixed $name
     * @param mixed $value
     * @return ArrayDataProvider
     */
    protected function _getSheel($name = null, $value = null)
    {
        $rangeData = $this->_getDateRange();

        $params = [
            ':time1' => $rangeData['firstDay'],
            ':time2' => $rangeData['lastDay'],
        ];
        $where = 'date_execution >= :time1 AND date_execution < :time2';

        if ($name) {
            $where .= " AND :$name = :name";
            $params[":$name"] = $value;
        }

        $customers = Sheel::find()
            ->andWhere($where, $params)
            ->orderBy('date_execution DESC')
            ->joinWith('recipies')
            ->with('company')
            ->all();
        $res = [];
        foreach ($customers as &$item) {
            $res[] = [
                'id_sheel'=>$item->id_sheel,
                'parent_recipies'=>$item->parent_recipies,
                'id_company'=>$item->company->id_company,
                'name_company' => $item->company->name_company,
                'address' => $item->address,
                'recipies' =>
                    $item->recipies->porous_recipies . " " .
                    $item->recipies->size_min . " " .
                    $item->recipies->type_recipies . " " .
                    $item->recipies->brand_recipies . " " .
                    "№ " . $item->recipies->number_recipies,
                'amount_sheel' => $item->amount_sheel,
                'date_execution' => $item->date_execution,
            ];
        }
        return new ArrayDataProvider(['allModels' => $res]);
    }

D
Deniska Petrov, 2016-01-30
@shakatakas

I don’t quite understand why you write the sql query manually, if possible:

Sheel::find()->where([
    'and',
    ['>=', 'date_execution', $rangeData['firstDay']],
    ['<', 'date_execution', $rangeData['lastDay']],
]);

Actions..
public function actionAddress()
    {
        $company =$_GET['id'];
    }
/// 
  /**
     * view Company
     */
    public function actionCompany() 
    {
        $company =$_GET['company'];

In the
essence of this, I did not understand at all if you need one last or any address. Just make a request with a limit and sorting to select the desired address.
foreach ($addreses as $key=>$one){
     $addres =$one->address;
            };

Here it is.
$res[] = [
                'id_sheel'=>$item->id_sheel,
                'parent_recipies'=>$item->parent_recipies,
                'id_company'=>$item->company->id_company,
                'name_company' => $item->company->name_company,
                'address' => $item->address,
                'recipies' =>
                    $item->recipies->porous_recipies . " " .
                    $item->recipies->size_min . " " .
                    $item->recipies->type_recipies . " " .
                    $item->recipies->brand_recipies . " " .
                    "№ " . $item->recipies->number_recipies,
                'amount_sheel' => $item->amount_sheel,
                'date_execution' => $item->date_execution,
            ];

Is it mandatory? Can't you change the view to fit the model?
And write hidden helper methods in the controller via private. You can also take out some of the data in helper. Use all the features of the framework. Look carefully, you repeat the "orderBy" code, or I didn't understand something.
->onCondition('address = :name AND date_execution >= :time1 AND date_execution < :time2')
            ->orderBy('date_execution DESC')
            ->params([
                            ':name' => $addres,
                            ':time1' => ($firstDay = date("Y-m-d", mktime(0,0,0,$month,1,$year))),
                            ':time2' => date("Y-m-d", mktime(0,0,0,$month+1,1,$year)),
            ])
            ->orderBy('date_execution DESC')

S
seddi, 2016-01-30
@seddi

dimabdc dimabdc from special thanks, what you need, I also wanted to break it, because there will be a couple more views

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question