Gridview счётчик

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Zik_UA
Сообщения: 22
Зарегистрирован: 2017.02.03, 00:19

Gridview счётчик

Сообщение Zik_UA »

Есть таблица с данными. 10000 строк таблицы.
в таблице есть колонки (длина и долгота).
Мне нужно посчитать расстояние.

Я посчитал проудену расстояние для каждой строки и у меня получилось

lng | lat | Расстояние
49.82981500 | 49.82981500 | 1
49.82981500 | 49.82981500 | 2
49.82981500 | 49.82981500 | 1
49.82981500 | 49.82981500 | 4

а мне нужно чтобы добавляло каждый элемент к предыдущему

lng | lat | Расстояние
49.82981500 | 49.82981500 | 1
49.82981500 | 49.82981500 | 3
49.82981500 | 49.82981500 | 4
49.82981500 | 49.82981500 | 8

Мой код View

Код: Выделить всё

	<?php Pjax::begin(['enablePushState' => false, 'enableReplaceState' => false]); ?>
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'date_s',
            'status',
            'lat',
            'lng',
            'speed',
            [
            	'header' => 'Відстань',
            	'content'=>function($data){
        			return $data->getLong();
   				 },
            ],
        ],
    ]); ?>
<?php Pjax::end(); ?></div>
Функцыя в моделе

Код: Выделить всё

	public function getLong() {

    	if ($this->id != 1) {
    		$get = self::find()->where(['<', 'id', $this->id])->orderBy('id DESC')->limit(1)->one();

    		$data = sqrt(pow(($this->lat - $get->lat),2)+pow(($this->lng - $get->lng),2));

    		return $data;

    	}

    	return 0;
    	
    }
Помогите решить как это делать !!!!!!!
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Gridview счётчик

Сообщение Alexum »

Можно создать свой класс колонки, который будет наследоваться от DataColumn, в приватном поле хранить сумму предыдущих столбцов. Вычисляемое значение должно быть в 'value' ну или вычисления делать внутри класса колонки.

Код: Выделить всё

<?php
namespace common\components;

use yii\grid\DataColumn;

/**
 * Class SumColumn
 * @package common\components
 */
class SumColumn extends DataColumn
{
    /**
     * @var int
     */
    private $_sum = 0;

    /**
     * @param mixed $model
     * @param mixed $key
     * @param int $index
     * @return string
     */
    public function getDataCellValue($model, $key, $index)
    {
        $value = parent::getDataCellValue($model, $key, $index);
        return $this->_sum += $value;
    }
}

// В колонке GridView не забываем указать класс

[
            'class' => common\components\SumColumn::className(),
          ...
],

Только работать будет на текущей странице. При переключении на другую страницу (если пагинация используется) счётчик пойдёт с нуля.
Zik_UA
Сообщения: 22
Зарегистрирован: 2017.02.03, 00:19

Re: Gridview счётчик

Сообщение Zik_UA »

Зделал! Выводит 0 !!!!
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Gridview счётчик

Сообщение Alexum »

Прямо так и выводит c кучей восклицательных знаков? :) Я же написал, что в колонке значение нужно помещать в 'value' а не 'content'.
Zik_UA
Сообщения: 22
Зарегистрирован: 2017.02.03, 00:19

Re: Gridview счётчик

Сообщение Zik_UA »

Спасибо. Зделал. А чтоб з пагинацыей работало можно как то зделать!
Zik_UA
Сообщения: 22
Зарегистрирован: 2017.02.03, 00:19

Re: Gridview счётчик

Сообщение Zik_UA »

И как зделать сортировку по етой колонке?
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Gridview счётчик

Сообщение someweb »

Интересно, как вы себе представляете сортировку по этому полю? У вас по ТЗ значение зависит от предыдущего. Сортировать можно если только расстояние будет вычислено заранее. Добавьте поле в табличку.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Ответить