За последние 24 часа нас посетили 72028 программистов и 1650 роботов. Сейчас ищут 912 программистов ...

Небольшие вопросы по Yii2

Тема в разделе "Yii", создана пользователем Walk, 2 авг 2017.

  1. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Чтобы под каждый небольшой вопрос не создавали отдельную тему - считаю будет полезно сделать общую тему для небольших вопросов по Yii2

    __________________________________

    И начну первым - вопрос чисто риторический - почему генератор кода Gii, который идет в комплекте с Yii2, и который, по-сути, должен генерировать образцовый для подражания код, делает ссылки вида:
    site.ru/catalog/update?id=1

    а не
    site.ru/catalog/update/1

    ?

    Laravel, на сколько помню, генерирует код (и, соответственно, ссылки) во втором формате.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Это два нормальных подхода, субъективно второй красивее и всё
     
  3. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Спрашивал в команде как лучше делать - сказали, что лучше по второму.

    Еще один, относительно практический, относительно риторический вопрос - смотрю в рабочем проекте куча css и js кода в конце, думал накосячили предыдущие программисты, но... заглянул в базовую сборку Yii2 Basic - там тоже самое.

    Как это? Это же:
    1. как минимум некрасиво
    2. дольше грузится страница (отдельные css и js файлы кешируются браузером)

    И второй вопрос - это как-то можно исправить?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А где в 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, не юзал никогда правда
     
  5. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    laravel artisan
    Не обещаю, что страница по ссылке ответит на все вопросы - но направление указал. Там через artisan make много что можно делать.

    Спасибо, надо будет поискать.
    Кстати, непонятно, почему по дефолту urlManager отключен в Yii2...

    и за эту ссылку тоже спасибо
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Да там просто очень. Все урлы надо генерить только а-ля Url::to("["catalog/update", "id" => 1]); Если у тебя настроено для такого сочетание параметров правило в конфиге менеджера урлов, то оно будет применено. К примеру, попробуй правило
    PHP:
    1. "<controller>/<action>/<id>" => "<controller>/<id>"
    --- Добавлено ---
    Не всем надо ЧПУ, без него тоже неплохо можно жить
     
    denis01 нравится это.
  7. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Сейчас делаю страницу, на которой будет отображаться информация о нескольких записях, при этом на этой же странице можно любую из них отредактировать или добавить новую + все на pjax.

    Столкнулся с проблемой, что в форме добавления новой записи уже добавляются данные из последней записи:

    [​IMG]

    Код вида:

    PHP:
    1. use yii\helpers\Html;
    2. use yii\widgets\ActiveForm;
    3. use yii\widgets\Pjax;
    4.  
    5. ?>
    6.  
    7. <h1>Список элементов</h1>
    8.  
    9. <table border="1" style="width: 100%;">
    10.     <tr>
    11.         <td>
    12.             <p><b>Страна</b></p>
    13.         </td>
    14.         <td>
    15.             <p><b>Код</b></p>
    16.         </td>
    17.         <td>
    18.             <p><b>Население</b></p>
    19.         </td>
    20.         <td>
    21.             <p></p>
    22.         </td>
    23.     </tr>
    24.     <?php foreach ($tests as $test): ?>
    25.         <tr>
    26.             <td>
    27.                 <p><?= $test->name ?></p>
    28.             </td>
    29.             <td>
    30.                 <p><?= $test->code ?></p>
    31.             </td>
    32.             <td>
    33.                 <p><?= $test->population ?></p>
    34.             </td>
    35.             <td>
    36.             </td>
    37.         </tr>
    38.         <tr>
    39.             <td>
    40.                 <?php $form = ActiveForm::begin(); ?>
    41.  
    42.                 <?= $form->field($test, 'name')->textInput(['maxlength' => true]) ?>
    43.             </td>
    44.             <td>
    45.                 <?= $form->field($test, 'code')->textInput(['maxlength' => true]) ?>
    46.             </td>
    47.             <td>
    48.                 <?= $form->field($test, 'population')->textInput() ?>
    49.  
    50.                 <?= $form->field($test, 'id')->hiddenInput()->label('') ?>
    51.  
    52.                 <?= '<input type="hidden" name="Test[type]" value="2" />' ?>
    53.             </td>
    54.             <td>
    55.                 <div class="form-group">
    56.                     <?= Html::submitButton('Отредактировать', ['class' => 'btn btn-success']) ?>
    57.                 </div>
    58.  
    59.                 <?php ActiveForm::end(); ?>
    60.             </td>
    61.         </tr>
    62.     <?php endforeach; ?>
    63. </table>
    64. <br /><br /><br />
    65.  
    66. <h2>Добавить новую запись</h2>
    67.  
    68. <?php $form = ActiveForm::begin(); ?>
    69.  
    70. <?= $form->field($test, 'code')->textInput(['maxlength' => true]) ?>
    71.  
    72. <?= $form->field($test, 'name')->textInput(['maxlength' => true]) ?>
    73.  
    74. <?= $form->field($test, 'population')->textInput() ?>
    75.  
    76. <div class="form-group">
    77.     <?= Html::submitButton('Добавить', ['class' => 'btn btn-success']) ?>
    78. </div>
    79.  
    80. <?php ActiveForm::end(); ?>
    Мне отчасти понятно, почему так происходит, но непонятно как исправить - чтобы форма для добавления новой записи была пустой.

    Проблема решилась, надо было добавить 'value'=>false
    PHP:
    1. <?= $form->field($test, 'code')->textInput(['maxlength' => true, 'value'=>false]) ?>
    2.  
    3. <?= $form->field($test, 'name')->textInput(['maxlength' => true, 'value'=>false]) ?>
    4.  
    5. <?= $form->field($test, 'population')->textInput(['value'=>false]) ?>
     
    #7 Walk, 8 авг 2017
    Последнее редактирование: 8 авг 2017
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    [off]
    как-то ты китай населением обделил. на миллиард с лишним...
    [/off]
     
  9. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    /delet
     
    #9 Walk, 8 авг 2017
    Последнее редактирование: 8 авг 2017
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А контроллер покажи, этот action
    --- Добавлено ---
    Вообще, лично я pjax не люблю, делаю такие штуки без него (но с AJAX). Но с другой стороны, кто тебе мешает пересоздать/очистить модель, если сохранение прошло успешно?
    --- Добавлено ---
    Кстати, а что тут в PJAX обёрнуто? Что-то я не вижу
     
  11. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Зачем? o_O

    По теме - почти все сделал, осталась одна очень странная проблема - при обновлении информации у существующих записей кнопка "Отредактировать" работает только один раз, потом на неё можно жать сколько угодно - никакой реакции. И в консоли никаких ошибок.

    Если pjax убрать - все норм.

    Код:
    Вид
    Контроллер
    Модель
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Вангую, что события навешивал:
    Код (Javascript):
    1. $("#selector").click(....);
    Такие события отрабатывают только на элементах, которые были загружены сразу, а на динамически изменяемых не работает. Чтоб работало, надо делать
    Код (Javascript):
    1. $("body").on("click", "#selector", ....);
     
  13. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    @mkramer спасибо за вариант, завтра на работе попробую.
     
  14. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Трачу кучу времени на написание правильных генераторов форм через ActiveForm:: и Html::, случаем нет никаких генераторов этих самых генераторов? Вводишь туда нужный html, а он генерирует строку для генерации этой же html строки через ActiveForm:: и Html::

    Меня прям аж трисет, что на то, что я могу написать на чистом html за 3 секунды, приходится тратить час, чтобы разобраться как это сделать через генератор форм, который, типа, облегчает процесс написания этих форм... ага... облегчает.
     
  15. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    валидация, заполнение, получение данных

    gii посмотри, он форму по модели делает и ещё CRUD в gii посмотри
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну ActiveForm - штука специфическая, его для админок удобно пользовать, когда стандартный дизайн bootstrap прокатывает. На фронте я обычно использую Html, с ним всё в порядке
    PHP:
    1. Html::activeTextInput($model, "field", ["class" => "some-class"]);
    --- Добавлено ---
    Ну и самый крайний случай, такое нужно обычно для чекбоксов и селектов, для которых Html больше чем надо генерит:
    PHP:
    1. <input name="<?= Html::getInputName($model, "field"); ?>" type='checkbox'>
     
  17. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Например, надо сделать такой инпут:
    PHP:
    1. <input type="hidden" name="type" value="2" />
    Пишу:
    PHP:
    1. <?= Html::activeHiddenInput() ?>
    а какие параметры нужно передать?
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    active::: - это если нужно, чтоб с модели взялось значение, и в модель загружалось. Если модель не нужна, можно оставить просто HTML, или
    PHP:
    1. <?= Html::hiddenInput("type", 2); ?>
    Всё в доке есть. Даже на русском, если с английским проблемы. http://yiiframework.domain-na.me/doc/guide/2.0/ru/helper-html#input-fields выдели вечер, прочти всё от начала до конца. Хотя бы по диагонали.
     
  19. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Спасибо

    Чушь. Полная чушь. Доки - самый бесполезный источник информации

    И ваша ссылка лишь подтверждает это, что там сказано по поводу name и value:

    "Cформированных на основе моделей" - откуда я должен был догадаться, что там может быть и просто текст?

    И не надо говорить, что "ну там же сказано, для форм ввода" - а про указание name и value в других формах там ничего и не сказано.

    Я это узнал только из вашего примера. Вот анализируя 100500 примеров как-то и разбираюсь в этих генераторах. Доки ничем не помогают. И да, информацию по ссылке уже читал.
     
    #19 Walk, 10 авг 2017
    Последнее редактирование: 10 авг 2017
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Представляете, я не родился со знанием Yii2, и это у меня даже не первый был фреймворк. Первым был Kohana. Но мне хватило английской документации, чтоб понять, как работают ActiveForm. Правда, по началу я пытался писать свои ActiveField для нестандартной вёрстки, но потом понял, что эта работа себя не оправдывает, проще взять из хелпера Html active* функции. А вообще, я не заменяю всю вёрстку на вызовы хелперов - а зачем? Проект на yii2 остаётся проектом на php.
     
  21. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Случаем нет никакого генератора, который SQL запросы переделает в запрос вида:

    PHP:
    1. ->select('name')->from('table')->where(['like', 'yes']);
    ?
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Не встречал. А что, для ларки имеется?
     
  23. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Не встречал, но вдруг умные люди сделали а мы не знаем...
     
  24. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    В ActiveForm случаем нет проверки на вес файла? Например добавить в эту строку параметр размера файла:

    PHP:
    1. <?= $form->field($model, 'imageFile')->fileInput()->label('Новый логотип') ?>
    и если он превышает - сразу выводит ошибку, мол файл слишком тяжелый.
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    На сервере при валидации есть. На клиенте - надо соответствующий JS написать самому, насколько мне известно.