Чтобы под каждый небольшой вопрос не создавали отдельную тему - считаю будет полезно сделать общую тему для небольших вопросов по Yii2 __________________________________ И начну первым - вопрос чисто риторический - почему генератор кода Gii, который идет в комплекте с Yii2, и который, по-сути, должен генерировать образцовый для подражания код, делает ссылки вида: site.ru/catalog/update?id=1 а не site.ru/catalog/update/1 ? Laravel, на сколько помню, генерирует код (и, соответственно, ссылки) во втором формате.
Спрашивал в команде как лучше делать - сказали, что лучше по второму. Еще один, относительно практический, относительно риторический вопрос - смотрю в рабочем проекте куча css и js кода в конце, думал накосячили предыдущие программисты, но... заглянул в базовую сборку Yii2 Basic - там тоже самое. Как это? Это же: 1. как минимум некрасиво 2. дольше грузится страница (отдельные css и js файлы кешируются браузером) И второй вопрос - это как-то можно исправить?
А где в Laravel генератор контроллеров, типа gii? Не видел, по крайней мере из коробки. Но не суть site.ru/catalog/update?id=1 - это превращается в site.ru/catalog/update/1 одной строчкой в конфиге url-менеджера, если она есть, сразу будет второй вариант. Просто gii не лезит в твой конфиг, оставляет это тебе --- Добавлено --- http://www.yiiframework.com/doc-2.0/guide-structure-assets.html#combining-compressing-assets - есть хрень для склеивания AssetBundle, не юзал никогда правда
laravel artisan Не обещаю, что страница по ссылке ответит на все вопросы - но направление указал. Там через artisan make много что можно делать. Спасибо, надо будет поискать. Кстати, непонятно, почему по дефолту urlManager отключен в Yii2... и за эту ссылку тоже спасибо
Да там просто очень. Все урлы надо генерить только а-ля Url::to("["catalog/update", "id" => 1]); Если у тебя настроено для такого сочетание параметров правило в конфиге менеджера урлов, то оно будет применено. К примеру, попробуй правило PHP: "<controller>/<action>/<id>" => "<controller>/<id>" --- Добавлено --- Не всем надо ЧПУ, без него тоже неплохо можно жить
Сейчас делаю страницу, на которой будет отображаться информация о нескольких записях, при этом на этой же странице можно любую из них отредактировать или добавить новую + все на pjax. Столкнулся с проблемой, что в форме добавления новой записи уже добавляются данные из последней записи: Код вида: PHP: use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\widgets\Pjax; ?> <h1>Список элементов</h1> <table border="1" style="width: 100%;"> <tr> <td> <p><b>Страна</b></p> </td> <td> <p><b>Код</b></p> </td> <td> <p><b>Население</b></p> </td> <td> <p></p> </td> </tr> <?php foreach ($tests as $test): ?> <tr> <td> <p><?= $test->name ?></p> </td> <td> <p><?= $test->code ?></p> </td> <td> <p><?= $test->population ?></p> </td> <td> </td> </tr> <tr> <td> <?php $form = ActiveForm::begin(); ?> <?= $form->field($test, 'name')->textInput(['maxlength' => true]) ?> </td> <td> <?= $form->field($test, 'code')->textInput(['maxlength' => true]) ?> </td> <td> <?= $form->field($test, 'population')->textInput() ?> <?= $form->field($test, 'id')->hiddenInput()->label('') ?> <?= '<input type="hidden" name="Test[type]" value="2" />' ?> </td> <td> <div class="form-group"> <?= Html::submitButton('Отредактировать', ['class' => 'btn btn-success']) ?> </div> <?php ActiveForm::end(); ?> </td> </tr> <?php endforeach; ?> </table> <br /><br /><br /> <h2>Добавить новую запись</h2> <?php $form = ActiveForm::begin(); ?> <?= $form->field($test, 'code')->textInput(['maxlength' => true]) ?> <?= $form->field($test, 'name')->textInput(['maxlength' => true]) ?> <?= $form->field($test, 'population')->textInput() ?> <div class="form-group"> <?= Html::submitButton('Добавить', ['class' => 'btn btn-success']) ?> </div> <?php ActiveForm::end(); ?> Мне отчасти понятно, почему так происходит, но непонятно как исправить - чтобы форма для добавления новой записи была пустой. Проблема решилась, надо было добавить 'value'=>false PHP: <?= $form->field($test, 'code')->textInput(['maxlength' => true, 'value'=>false]) ?> <?= $form->field($test, 'name')->textInput(['maxlength' => true, 'value'=>false]) ?> <?= $form->field($test, 'population')->textInput(['value'=>false]) ?>
А контроллер покажи, этот action --- Добавлено --- Вообще, лично я pjax не люблю, делаю такие штуки без него (но с AJAX). Но с другой стороны, кто тебе мешает пересоздать/очистить модель, если сохранение прошло успешно? --- Добавлено --- Кстати, а что тут в PJAX обёрнуто? Что-то я не вижу
Зачем? По теме - почти все сделал, осталась одна очень странная проблема - при обновлении информации у существующих записей кнопка "Отредактировать" работает только один раз, потом на неё можно жать сколько угодно - никакой реакции. И в консоли никаких ошибок. Если pjax убрать - все норм. Код: Вид Контроллер Модель
Вангую, что события навешивал: Код (Javascript): $("#selector").click(....); Такие события отрабатывают только на элементах, которые были загружены сразу, а на динамически изменяемых не работает. Чтоб работало, надо делать Код (Javascript): $("body").on("click", "#selector", ....);
Трачу кучу времени на написание правильных генераторов форм через ActiveForm:: и Html::, случаем нет никаких генераторов этих самых генераторов? Вводишь туда нужный html, а он генерирует строку для генерации этой же html строки через ActiveForm:: и Html:: Меня прям аж трисет, что на то, что я могу написать на чистом html за 3 секунды, приходится тратить час, чтобы разобраться как это сделать через генератор форм, который, типа, облегчает процесс написания этих форм... ага... облегчает.
валидация, заполнение, получение данных gii посмотри, он форму по модели делает и ещё CRUD в gii посмотри
Ну ActiveForm - штука специфическая, его для админок удобно пользовать, когда стандартный дизайн bootstrap прокатывает. На фронте я обычно использую Html, с ним всё в порядке PHP: Html::activeTextInput($model, "field", ["class" => "some-class"]); --- Добавлено --- Ну и самый крайний случай, такое нужно обычно для чекбоксов и селектов, для которых Html больше чем надо генерит: PHP: <input name="<?= Html::getInputName($model, "field"); ?>" type='checkbox'>
Например, надо сделать такой инпут: PHP: <input type="hidden" name="type" value="2" /> Пишу: PHP: <?= Html::activeHiddenInput() ?> а какие параметры нужно передать?
active::: - это если нужно, чтоб с модели взялось значение, и в модель загружалось. Если модель не нужна, можно оставить просто HTML, или PHP: <?= Html::hiddenInput("type", 2); ?> Всё в доке есть. Даже на русском, если с английским проблемы. http://yiiframework.domain-na.me/doc/guide/2.0/ru/helper-html#input-fields выдели вечер, прочти всё от начала до конца. Хотя бы по диагонали.
Спасибо Чушь. Полная чушь. Доки - самый бесполезный источник информации И ваша ссылка лишь подтверждает это, что там сказано по поводу name и value: "Cформированных на основе моделей" - откуда я должен был догадаться, что там может быть и просто текст? И не надо говорить, что "ну там же сказано, для форм ввода" - а про указание name и value в других формах там ничего и не сказано. Я это узнал только из вашего примера. Вот анализируя 100500 примеров как-то и разбираюсь в этих генераторах. Доки ничем не помогают. И да, информацию по ссылке уже читал.
Представляете, я не родился со знанием Yii2, и это у меня даже не первый был фреймворк. Первым был Kohana. Но мне хватило английской документации, чтоб понять, как работают ActiveForm. Правда, по началу я пытался писать свои ActiveField для нестандартной вёрстки, но потом понял, что эта работа себя не оправдывает, проще взять из хелпера Html active* функции. А вообще, я не заменяю всю вёрстку на вызовы хелперов - а зачем? Проект на yii2 остаётся проектом на php.
Случаем нет никакого генератора, который SQL запросы переделает в запрос вида: PHP: ->select('name')->from('table')->where(['like', 'yes']); ?
В ActiveForm случаем нет проверки на вес файла? Например добавить в эту строку параметр размера файла: PHP: <?= $form->field($model, 'imageFile')->fileInput()->label('Новый логотип') ?> и если он превышает - сразу выводит ошибку, мол файл слишком тяжелый.
На сервере при валидации есть. На клиенте - надо соответствующий JS написать самому, насколько мне известно.