Ответы пользователя по тегу Yii
  • Как получить даные по вложеному документу?

    @Cage
    db.product.find({"category.id":12})
    это в консоли mongodb, а в php нужно пользоваться используемым инструментом
    если только библиотека mongodb, без оберток, то как то так:
    $client = new MongoDB\Client("...");
    $collection = $client->{имя базы данных}->{имя коллекции}
    $collection->find(["category.id"=>12])
    Ответ написан
    Комментировать
  • Как можно сохранить вложеный докумнет mongoDB в yii2?

    @Cage

    в документации написано следующее
    Пока не существует явной поддержки вложенных документов, но также никакого явного ограничения на него нет. Вы можете создать собственное решение или использовать расширение сторонних разработчиков, как yii2tech/embedded для использования этой функции.

    это к ошибке отношения не имеет.

    Не любит php при использовании магических методов работать с изменением нескалярных данных
    пробуйте так:
    $addFeild = $product->addFeild
    $addFeild->article=$model->value;
    Ответ написан
  • Yii1 Не работает serrialize() формы, почему?

    @Cage
    $.post("<?=$this->createUrl('/ajax/ansferToRequestShipping');?>",$("#edit<?=$request->id?>").serialize()...

    значения по умолчанию будут считываться
    Ответ написан
  • Как сделать сортировку в Yii по данным смежной таблицы?

    @Cage
    Попробуй так:
    1.
    $criteria->with[] = 'contacts';
    вынести из под условий
    2. сюда
    'contacts.phone'=>array( 
          'header'=>'Phone',
          'value'=>'$data->contacts->phone',
          'filter'=>CHtml::activeTextField($model,'phone')	
        ),

    добавить
    'name'=>'contacts.phone',
    3. Настройки для CDataProvider удобнее использовать так:
    return new CActiveDataProvider(get_class($this), array(
                'criteria'=>$criteria,
                'sort'=>[
                    'defaultOrder' => 'contacts.email ASC',
                    'attributes' => [
                        'contacts.phone' => [
                            'asc' => 'contacts.phone ASC',
                            'desc' => 'contacts.phone DESC'
                        ],
                        'contacts.email' => [
                            'asc' => 'contacts.email ASC',
                            'desc' => 'contacts.email DESC'
                        ],
                        '*'
                    ]
                ],
            ));
    Ответ написан
    Комментировать
  • Как сделать фильтрацию и сортировку данных из смежных таблиц в Yii1?

    @Cage
    Первый вариант не работал потому что при рендере фильтра он пытался обратиться к свойству "User phone" модели Users, как вы понимаете такого свойства нет.
    Во втором случае он не обращается к св-ву потому что вы ему явно прописали значение filter, кстати неправильно - там должен быть html код.
    В данном случае лучше действовать так:
    1 . В модели Users добавьте св-во (именно св-во класса а не поле в БД) phone,
    class Users extends CActiveRecord {
      public $phone;
      ...
    }


    2. Пропишите его в методе rules() класса Users
    ['phone','safe', 'on' => 'search']

    3. в настройках виджета используйте следующую конструкцию для этой колонки
    [
      'header'=>'Здесь заголовок колонки',
      'value'=>function($data){ return $data->contacts->phone;} // или просто '$data->contacts->phone',
      'filter'=>CHtml::activeTextField($model,'phone')
    ],


    4. В методе search класса Users добавьте следующий код
    if ($this->phone){
      $criteria->with[] = 'contacts';
      $criteria->compare('contacts.phone', $this->phone) // третьим параметром добавьте true если будете искать неполное совпадение
    }


    Теперь объяснение всей этой лабуды
    1. Свойство в модели необходимо для хранения значения когда будет использоваться поиск.
    2. Добавление св-ва в метод rules необходимо для безопасного присваивания атрибута, это когда в экшене вы будете делать так
    $model = new Users('search');
    if (array_key_exists('Users', $_GET)){
      $model->attributes = $_GET['Users'];
    }

    3. Виджет на самом деле настраивается очень гибко там может быть много вариантов я написал один из них как самый простой, для понимания как рендерится фильтр можно посмотреть метод CDataColumn::getFilterCellContent() например можно было бы использовать и следующую конструкцию:
    [
      'name'=>'phone',
      'value'=>function($data){ return $data->contacts->phone;} // или просто '$data->contacts->phone',
    ],

    4. Собственно это реализация поиска по номеру телефона. могут быть и другие варианты реализации, но этот самый правильный и удобный.
    Ответ написан
  • Yii2, Как обратиться к свойству модели вызывая геттер?

    @Cage
    Вы для начала определитесь что вы хотите получит в результате вызова статического (кстати почему статического?) метода getDateUpdate?
    варианты:
    1. Некую дату из константы определенной внутри класса модели, как это сейчас (только константа не определена).
    2. Некую дату из статического свойства класса модели, тогда код будет выглядеть так:
    public static function getDateUpdate()
    {
    	return DateFormat::load()->dateToBigString(self::$date_update);
    }

    3. Все таки значение атрибута конкретного объекта модели, тогда никакой статики и геттер будет выглядеть так:
    public function getDateUpdate()
    {
        return DateFormat::load()->dateToBigString($this->date_update);
    }
    Ответ написан
    1 комментарий
  • Как не обновлять страницу при авторизации в модальном окне в Yii?

    @Cage
    используйте CHtml::ajaxSubmitButton вместо CHtml::submitButton
    подробнее можно почитать здесь
    Ответ написан
    Комментировать
  • Почему при указанном условии в связи с типом HAS_MANY, при отсутствии данных в связанной таблице, не находит основную запись?

    @Cage
    Потому что у вас указано условие для выборки
    'condition' => 'commentariesToDetail.module = :module',

    соответственно вы пытались выбрать все записи Publications у которых есть комментарии со значением поля 'module' равным Commentaries::MODULE_PUBLICATIONS

    уберите условие или замените эту строку на следующую :
    'on' => 'commentariesToDetail.module = :module',
    Ответ написан
    1 комментарий
  • Почему в Yii не все данные формы передаются в модель?

    @Cage
    Links rules: (добавил description в массив save)

    Все таки safe a не save
    Вы его добавили для сценария "search", а для вновь созданного объекта используется по умолчанию сценарий "insert"
    добавьте как было ранее указано отдельной строкой.
    public function rules() {
      return array(
        array('url, name', 'required', 'message'=>'Обязательно для заполнения'),
        array('id_category', 'required', 'message' => 'Выберите категорию'),
        array('description', 'safe'),
        array('id, url, name, id_category', 'safe', 'on'=>'search'),
      );
    }
    Ответ написан
    Комментировать
  • Почему в Yii не все данные формы передаются в модель?

    @Cage
    Вам же написали
    array('description', 'safe'),
    safe ничего не валидирует, а только сообщает что эти данные можно безопасно присваивать.

    или же если не хотите писать это в rules() сделайте так:
    public function actionCreateLink() {
      $model=new Links;
      if(isset($_POST['Links'])) {
        $model->setAttributes($_POST['Links'], false);
        echo '<pre>';
        print_r($_POST['Links']);
        print_r($model->attributes);
        echo '</pre>';
      }
    }

    но это небезопасно!
    Ответ написан
    Комментировать