А какой из этих правил валидации отвечает за вес файла? - `boolean`: [[BooleanValidator]] - `captcha`: [[\yii\captcha\CaptchaValidator]] - `compare`: [[CompareValidator]] - `date`: [[DateValidator]] - `datetime`: [[DateValidator]] - `time`: [[DateValidator]] - `default`: [[DefaultValueValidator]] - `double`: [[NumberValidator]] - `each`: [[EachValidator]] - `email`: [[EmailValidator]] - `exist`: [[ExistValidator]] - `file`: [[FileValidator]] - `filter`: [[FilterValidator]] - `image`: [[ImageValidator]] - `in`: [[RangeValidator]] - `integer`: [[NumberValidator]] - `match`: [[RegularExpressionValidator]] - `required`: [[RequiredValidator]] - `safe`: [[SafeValidator]] - `string`: [[StringValidator]] - `trim`: [[FilterValidator]] - `unique`: [[UniqueValidator]] - `url`: [[UrlValidator]] - `ip`: [[IpValidator]]
И FileValidator, и ImageValidator, как дочерний класс первого. http://www.yiiframework.com/doc-2.0/guide-tutorial-core-validators.html#file
Разобрался: PHP: public function rules() { return [ [['imageFile'], 'file', 'extensions' => 'jpg, png, gif', 'maxSize' => 1000000], ]; }
Как в GridView::widget() можно указать произвольную колонку с произвольным значением? В документации, как обычно, все очень поверхностно. Ответ, желательно, сразу в виде примера, как-то так: Код (Text): GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'code', 'name', 'population', 'id', [ 'attribute' => 'imageFile', 'format' => 'html', 'value' => function($data) { return '<img src="/uploads/'.$data->imageFile.'" width="200" alt="" />'; } ], ['class' => 'yii\grid\ActionColumn'], ], ]);
Потому что, согласно документации, если "value" - строка, то она трактуется как имя атрибута тоже. Поставь анонимную функцию, будет счастье. Код (Text): [ "value" => function () { return "123"; } ], --- Добавлено --- Для чего нужны строки, тоже написано: А если что-то произвольное, то нужен callable
Мне этот термин ничего не говорит. Гугл, кстати, по запросу "php имя атрибута", "php атрибут" тоже ничего внятного не говорит. Спасибо, работает. Риторический вопрос - всегда удивляло, зачем эти объяснения, ссылки на документации, когда простой пример намного понятней?
Интересно ты программируешь на yii2. Поля моделей в yii2 называют атрибутами. Они могут быть как объявленными в классе, так и динамически считываемыми из таблицы (ActiveRecord). Ссылки нужны, для того, чтобы дать нормальное понимание.
Потому что пример не объясняет принцип, проще запомнить 1 принцип, чем 1000 фактов, тебе просто нужно было почитать код DataColumn класса и из него всё выяснить, если текст не понятен, но и пример легко гуглится
Не знал. Меня учили, что у объектов есть только свойства и методы. 1. Ссылки на документацию не являются сокровенной тайной. 2. Если человек задает вопросы, то логично предположить, что документация ему не помогла. 3. Отправлять человека обратно читать документацию - аналогично простому отправлению на три буквы. Спрашивается, зачем? Не хочешь отвечать - пройди мимо. Конечно просто. Всего то почитать код DataColumn, а также Column от которого он наследуется, а также код Object, от которого наследуется Column, а также понять смысл пустого интерейса Configurable. Возможно опытным программистам это и легко - но начинающим - это далеко не просто, и далеко не быстро. Когда я вижу такой код: PHP: if ($provider instanceof ActiveDataProvider && $provider->query instanceof ActiveQueryInterface) { /* @var $model Model */ $model = new $provider->query->modelClass; $label = $model->getAttributeLabel($this->attribute); } elseif ($provider instanceof ArrayDataProvider && $provider->modelClass !== null) { /* @var $model Model */ $model = new $provider->modelClass; $label = $model->getAttributeLabel($this->attribute); } elseif ($this->grid->filterModel !== null && $this->grid->filterModel instanceof Model) { $label = $this->grid->filterModel->getAttributeLabel($this->attribute); То мне над каждой строчкой надо тупить минут 5, чтобы понять что куда идет, откуда берется, и как взаимосвязано. А таких строчек там не мало. И, опять же, по-моему не трудно догадаться, что если человек спрашивает элементарные вопросы на форумах, значит он нуб, а если он нуб - то разобраться в коде ему трудно. По факту наоборот. Эти принципы - ни о чем не говорят. А вот конкретные примеры показывают как решать конкретные задачи, и анализируя тысячи таких примеров приходит понимание как оно в целом работает.
Я не читал код DataColumn, ответ на этот вопрос нашёл в официальной доке, которой и процитировал. Правильно учили. Но это у объектов в целом. А разработчики Yii2 в рамках своего фреймворка ввели ещё термин атрибут. В документации написано об этом. Имеют право Точно так же, как и всякие активные формы, активные запросы и прочее, и прочее. Вот это понять важно, кстати, на этом весь yii2 построен. Object автоматически инициализирует все поля на основе переданного в конструктор массива. Для этого, правда, либо поля должны быть public, либо должен быть реализован сеттер (который будет автоматически вызван). Так же, кстати, Object превращает код типа PHP: $obj->fignya = "something"; в код PHP: $obj->setFignya("something"); , и с геттером - аналогично. Соответственно, это умеют все его наследники, кроме тех, что перекрывают этот функционал (из известных мне перекрывает ActiveRecord). Следующий уровень иерархии, класс Component, добавляет к этому функционалу события и поведения. Тоже из доки узнал, если что
Думаю все использовали Gii и видели стандартный код и функционал, который он генерирует. По умолчанию он берет все поля из таблицы, и делает из полученных данных таблицу через GridView::widget Вопрос - а если нужно в получаемых данных взять одно значение из другой таблицы - это можно как-то легко и элегантно сделать? Попробовал - не получилось. Можно конечно все переписать с нуля, но хочется найти более простое и правильное решение. Что сделал: 1. Изменил запрос, чтобы он получал дополнительное поле из другой таблицы (SQL запрос проверял - работает): PHP: public function search($params) { $query = Osagocompanies::find(); $query ->select([ 'main.id', 'main.company_name', 'main.company_link', 'main.insurance_users_id', 'main.photo', 'main.view', 'insurance_users.company_name as id_name', ]) ->from('e-osago_companies as main') ->leftJoin('insurance_users', '`main`.`insurance_users_id` = `insurance_users`.`user_id`'); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $this->load($params); if (!$this->validate()) { return $dataProvider; } $query->andFilterWhere([ 'company_name' => $this->company_name, 'company_link' => $this->company_link, 'photo' => $this->photo, ]); $query->andFilterWhere(['like', 'company_name', $this->company_name]) ->andFilterWhere(['like', 'company_link', $this->company_link]) ->andFilterWhere(['like', 'photo', $this->photo]); return $dataProvider; } 2. Добавил аттбитут нового поля в модель (что с ним, что без него - без разницы): PHP: public function attributeLabels() { return [ // другие поля 'id_name' => 'id_name', ]; } 3. Добавил поле в GridView::widget PHP: [ 'format' => 'html', "value" => function ($data) { $data->id_name; } ], При выходе данных из модели - return $dataProvider новый параметр есть, но при генерации таблицы в GridView::widget параметр исчезает.
Лучшее решение - сделать связь (hasOne, hasMany) и использовать with(). И как данные из связанных моделей пихать в Grid в доках описано. А так, можно попробовать id_name объявить в модели публичным свойством, поскольку, думаю, оно туда не пишется (Active Record по дефолту берёт набор атрибутов из show fields).
Читал про такую возможность - там стены текстов, с гулькин нос примеров (как обычно) - прикинул, что я с этим неделю разбираться буду. В итоге: $query = (new Query()) в контроллере и foreach в виде Просто и работает.
Ну так тексты - это главное, а примеры так, чтоб пояснить Но твоё решение тоже норм. ActiveDataProvider хорош, если надо автоматом пагинацию, сортировку подставлять. Если не надо, то можно с ним и не заморачиваться --- Добавлено --- В ларке, кстати, примерно в этом же ключе связи между моделями реализованы.
Неделю бы разбирался и потом бы очень много вопросов отпало, а пока будешь месяцы терять просто ожидая ответы
Мне и так сегодня уже намекнули коллеги, что я слишком много читаю документации. Я не против хоть с утра до вечера их читать и разбираться, вот только боюсь мне работодатель за такую работу платить не захочет.
При добавлении записи в бд через: PHP: Yii::$app->db->createCommand() ->insert('table', [ 'name' => $name ]) ->execute(); Можно как-то просто получить id добавленной записи? Аналогично mysqli_insert_id в нативном пхп?
Спасибо При выполнении запросов через new Query() можно перехватить и посмотреть отправляемый запрос через: PHP: $query->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql А можно каким-то аналогичным образом перехватить SQL запрос создаваемый Yii::$app->db->createCommand() ?