Ответы пользователя по тегу Yii
  • Как исключить из роута в main.php модуль test?

    @devian3000
    Примерно так. Регулярку только проверьте.
    <module: (?!test)\w+>/<controller: \w+ >
    Ответ написан
    1 комментарий
  • Как мне замокать компонент который работает с БД?

    @devian3000
    Можно ещё так, если PHPUnit.
    (Делаем фейковый объект с нужными методами)
    И в начале
    Yii::$container->set('db', $mockObject );
    Ответ написан
    Комментировать
  • Как оптимизировать такой код?

    @devian3000
    Какая версия Yii? если вторая, то проще сделать наверное так.

    <?php
    
    public static function getFullInfo($id)
      {
        $driverCar = DriverCar::findOne([
          'mifar_card_id' => $id
        ]);
        if (empty( $driverCar ) ) return false;
    	//Если тут одна сущность то делаем так
    	// Но у объекта дожны быть методы getCar и getDriver в которых используется $this->hasOne()
        $car = $driverCar->сar;
        $driver = $driverCar->driver;
    
        $object = array();
    	
        if ($driverCar->сar->use_group_tariff && $driverCar->сar->group_tariff_id)
        {
          $groupTariff = GroupTariff::findOne([
            'id' => $driverCar->сar->group_tariff_id
          ]);
    	  $object = [
    		'town' => $groupTariff->town,
    		'town_center' => $groupTariff->town_center,
    		'km_price' => $groupTariff->km_price,
    	  ]
        }
        else
        {
          $driverTariff = DriverTariff::findOne([
            'driver_id' => $driverCar->driver->id
          ]);
    	  $object = [
    		'town' => $driverTariff->town,
    		'town_center' => $driverTariff->town_center,
    		'km_price' => $driverTariff->km_price,
    	  ]
        }
    	
    	$object = array(
    	    'company' => $driverCar->сar->getCarBrand();
    		'model' => $driverCar->сar->model;
    		'color' => $driverCar->сar->color;
    		'object' = $driverCar->сar->number;
    		'full_name' = $driverCar->driver->getFullName();
    		'serial_number' = $driverCar->driver->serial_number;
    	);
    	
    
        return (object)$object;
      }
      
    //Или так от структуры зависит и логики
      
    class Driver extends ActiveRecord{
    	
    	public function getCar()
    	{
    		return $this->hasOne(Car::className(),['mifar_card_id' => 'id' ])
    			->viaTable('{{%driverCar}}',['driver_id' => 'id']);
    	}
    	
    	public function getTariff(){
    		return $this->hasOne(DriverTariff::className(),['driver_id' => 'id'])
    	}
    	
    }
    
    class Car extends ActiveRecord{
    	
    	public function getTariff(){
    		return $this->hasOne(GroupTariff::className(), ['id' => 'driver_id'])
    	}
    	
    }
      
    interface IGetTariff{
    	public function getTown();
    	public function getTownCenter();
    	public function getKmPrice();
    }
      
    class GroupTariff extends ActiveRecord implements GetTariff{}
    class DriverTariff extends ActiveRecord implements GetTariff{}
      
    class FullDriverCarInfo extends Model{
    	
    	public static function getFullInfo( $driverId ){
    		$driver = Driver::findOne('id'=>$driverId);
    		if( empty($driver) ) return;
    		
    		/** @var $tariff IGetTariff */
    		if( $driver->сar->use_group_tariff && $driver->сar->group_tariff_id ){
    			$tariff = $driver->car->getTariff();
    		}else{
    			$tariff = $driver->getTariff();
    		}
    		
    		$result = array(
    			'town' => $tariff->getTown(),
    			'town_center' => $tariff->getTownCenter(),
    			'km_price' => $tariff->getKmPrice(),
    			'company' => $driver->сar->getCarBrand();
    			'model' => $driver->сar->model;
    			'color' => $driver->сar->color;
    			'object' = $driver->сar->number;
    			'full_name' = $driver->getFullName();
    			'serial_number' = $driver->serial_number;
    		);
    		
    		//Так если это отдельная модель
    		$this->setAttributes( $result );
    		
    		return $this;
    		
    		//Или
    		return (object)$result;
    		
    	}
    	
    }


    Это так, примерно. Можно намного лучше написать, но идею надеюсь донёс.
    Ответ написан
    Комментировать
  • С чем связано одновременное создание одинаковых объектов в MySql и Yii2?

    @devian3000
    решение в лоб - сделайте уникальные индексы на столбцы на уровне БД.
    Если это реализовано только на уровне кода то может происходить вот так.

    Отправляются два запроса.
    Первый запрос валидируется, проверяется что email уникален и отправляется на запись.
    В этот момент проверяется второй запрос, если первый не успел записаться в базу, то получается что email снова уникален, и вторая запись уходит в базу и т.д.

    Перекрывать надо на уровне БД.
    Да и на фронте через REST блокировать отправку до того момента пока не вернётся ответ.
    Ответ написан
    Комментировать
  • Как сделать обновление значения в базе?

    @devian3000
    Эм, более простое решение, AJAX.
    Добавьте по-мимо скрытого INPUT name="ID", кнопку обновить, и триггер на отправку через Ajax на нажатие.
    Это избавит от прохода с проверками на изменение значения поля, уберёт одну лишнюю отрисовку, после смену названия.
    Ответ написан
    1 комментарий
  • Как динамически добавлять нужные поля через ajax в yii2?

    @devian3000
    А как храните данные?
    А разные ли модели используете для каждого типа объявлений?
    В общем это решение не на уровне фреймворка, а над ним.
    Формируйте динамические вьюхи в зависимости от типа объектов, можно рефлексией пользоваться, можно внедрить просто Мэппинг, в общем решений куча, выберите по душе.
    Ответ написан
    2 комментария
  • Yii2 Yandex Google Map, как реализовать и хранить в базе?

    @devian3000
    В базах есть поля для геометок. В myself postgres точно есть. Принимать Ajax-ом. Во время ставки метки. Или post ом из формы.
    Ответ написан
    Комментировать
  • Как в Yii2 в dataProvider указать условие выбора?

    @devian3000
    Не надо использовать array_filter на DataProvider!

    Откройте документацию, там всё написано
    nix-tips.ru/yii2-razbiraemsya-s-gridview.html

    Если в примере, то используйте searchModel!

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'rowOptions'=>function ($model, $key, $index, $grid){
            $class=$index%2?'odd':'even';
            return [
                'key'=>$key,
                'index'=>$index,
                'class'=>$class
            ];
        },
    ]); ?>
    Ответ написан
    Комментировать
  • Какой выбрать CRUD для стандартного db RBAC в YII2?

    @devian3000
    Да можно работать напрямую с базой.
    Там логика по выборке, по добавлению можно делать что угодно, если соблюдать связи.

    Для управления ролями правилами и т.д. я считаю что данный функционал избыточен ИМХО.
    Но если нужно, лучше написать самому под задачу. Будет проще чем кастомизировать те что есть.
    Ответ написан