Задать вопрос
  • Решения для нестандартного функционала интернет-магазина (мокапы)?

    slo_nik
    @slo_nik Куратор тега PHP
    Приветствую бандиты!

    Без фамильярностей!!!
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, в модели Catalog создаёте такой статический метод, который получает категории с parent_id равным null
    public static function getParentGroup()
        {
        	return ArrayHelper::map(self::find()->where(['parent_id' => null])->all(), 'id', 'name');
        }

    В форме обращаетесь к нему так
    <?= $form->field($model, 'group')->dropDownList(Catalog::getParentGroup(),
         [
             'prompt' => 'Выбрать группу...',
             'onchange' => '
                $.post(
                 "'.Url::toRoute('/products/create').'",
                 {id : $(this).val()},
                 function(data){
                     $("select#podgroup").html(data).attr("disabled", false)})'
         ]) ?>

    Создаёте отдельный контролер, в котором будете обрабатывать ajax запросы.
    class AjaxController extends Controller
    {
        public function actionAjaxCatalog()
        {
            if(Yii::$app->request->isAjax){
    
            	$id = Yii::$app->request->post('id');
    
                $subcategories = ArrayHelper::map(Caralog::find()->select(['name', 'id'])->where('parent_id=:id', [':id' => $id])->all(), 'id', 'name');
    
                return $subcategories;
    
            }
            return false;
        }
    }

    Значит Ваши выпадающие списки могут выглядеть следующим образом
    <?= $form->field($model, 'group')->dropDownList(Catalog::getParentGroup(),
         [
             'prompt' => 'Выбрать группу...',
             'onchange' => '
                $.post(
                 "'.Url::toRoute('/ajax/ajax-catalog').'",
                 {id : $(this).val()},
                 function(data){
                     $("select#podgroup").html(data).attr("disabled", false)})'
         ]) ?>
    <?= $form->field($model, 'podgroup')->dropDownList($model->isNewRecord ? [] : Catalog::getSubGroup($model->parent_id),
         [
             'prompt' => 'Выбрать подгруппу...',
             'disabled' => $model->isNewRecord ? "disabled" : false
             'onchange' => '
                $.post(
                 "'.Url::toRoute('/ajax/ajax-catalog').'",
                 {id : $(this).val()},
                 function(data){
                     $("select#name").html(data).attr("disabled", false)})'
         ]) ?>
    <?= $form->field($model, 'name')->dropDownList($model->isNewRecord ? [] : Catalog::getSubGroup($model->parent_id),
         [
             'prompt' => 'Выбрать подгруппу...',
             'id' => '$products',
             'disabled' => $model->isNewRecord ? 'disabled' : false
         ]) ?>

    Метод Catalog::getSubGroup($model->parent_id) создайте в модели Catalog по аналогии с getParentGroup(), но в него будете передавать нужный parent_id и получать по нему записи.

    dropDownList($model->isNewRecord ? [] : Catalog::getSubGroup($model->parent_id)

    Это будет означать, что при создании нового Product Вы будете получать пустой, отключённый выпадающий список, а при редактировании будет подставляться выбранное ранее значение.
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, сейчас набросаю Вам как может выглядеть работа с выпадающими списками для Catalog.
    В Вашем коде ещё одна ошибка.
    Если Вам надо будет работать с Catalog в другом действии или контролере, то Вам придётся скопировать весь этот код и Ваши действия будут похожи на мусорную свалку, на которой Вы долго и упорно будете ловить ошибки.
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, теперь займёмся Вашим actionCreate()
    Указал в комментариях Ваши ошибки
    public function actionCreate($id = 0) // этот id не нужен, Вы ничего не предаёте через $_GET
        {
            $model = new Product();
            $id = (int)Yii::$app->request->post('id');
            // куча массивов не нужна
            $products = [];
            $categories = [];
            $subcategories = [];
    
            // эти запросы можно вынести в отдельные методы модели Catalog
            // этим запросам не место в контролере ProductController
            // действие actionCreate() должно создавать только продукт и ничего не должно получать.
            $catalog = Catalog::find()->all() // запрос № 1;
            $categories = ArrayHelper::index (Catalog::find() // этот запрос № 2 лишний
                    ->where(['.parent_id' => "NULL"]) // в таблице есть поле с именем .parent_id? Это ошибка, поэтому и не работает
                    ->all(), 'id');
            if(array_key_exists($id, $categories))
            {
                $subcategories = ArrayHelper::index (Catalog::find() // этот запрос № 3 лишний
                        ->where(['.parent_id' => $id]) // в таблице есть поле с именем .parent_id? Это ошибка, поэтому и не работает
                        ->all(), 'id');
            }
            if(array_key_exists($id, $subcategories))
            {
                $products = ArrayHelper::index (Catalog::find() // этот запрос № 4 лишний
                        ->where(['.parent_id' => $id]) // в таблице есть поле с именем .parent_id? Это ошибка, поэтому и не работает
                        ->all(), 'id');
            }
            
            if ($model->load(Yii::$app->request->post()) && $model->save())
            {
                return $this->redirect(['index', 'id' => $model->id]);
            }
    
            return $this->render('index', [
                'products' => $products, // это не нужно
                'categories' => $categories, // это не нужно
                'subcategories' => $subcategories, // это не нужно
                'products' => $products, // это не нужно
                'items' => $model, // это не нужно
                'id' => $model->id, // это не нужно
                'org' => Organization::getOrgListByUserId(Yii::$app->user->id)
            ]);
        }


    Значит Ваше actionCreat() превращается в такое
    public function actionCreate() 
        {
            $product = new Product();
            
            if ($product->load(Yii::$app->request->post()) && $product->save())
            {
                return $this->redirect(['index', 'id' => $product->id]);
            }
    
            return $this->render('index', [
                'product' => $product
                'org' => Organization::getOrgListByUserId(Yii::$app->user->id) // в это не вникал, но думаю, что надо тоже вынести в отдельный метод, скорей всего в модели User или подставлять в форме напрямую
            ]);
        }


    Всё работу с Catalog необходимо вынести в модель Catalog. Свалив всю работу с Product и Catalog в одно действие Вы оказали себе медвежью услугу. Код тяжело поддерживать и устранять ошибки.
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Мне например не понятно из вашего примера

    Maksim86, это обычный jquery.

    я так понимаю выделяется идентификатор выбранного значения для дальнейшей передачи в action

    Да, для передачи значения на сервер через ajax

    но мне не совсем понятна строка

    $("select#regions").html(data).attr("disabled", false)

    В этой строке подставляется ответ сервера в выпадающий список с id regions

    На чистом jquery всё это выглядит так.

    /* отслеживаем изменения в выпадающем списке с id countries */
    $("#countries").on("change", function(){
        var ID = $(this).val() /* получаем выбранное значение */
       $.ajax({
          url: 'patch/to/php/file', /* отправляем на сервер через ajax */
          type: 'POST' /* методом $_POST */
          data: {id: ID}, /* выбранное значение */
         /* обрабатываем ответ сервера, в responce html код, который содержит <option> c нужными значениями */
          success: function(responce){ 
              /* подставляем в выпадающий список с id regions полученный от сервера html и меняем атрибут disabled c true на false, то есть, включаем выпадающий список */
              $("#regions").html(responce).attr("disabled", false)
          }
       })
    })


    Формируются options со значениями на сервере, в действии контролера actionRegions()

    public function actionListRegions()
        {
             if(Yii::$app->request->isAjax) // проверяем, что данные пришли через ajax
             {
                 $id = (int)Yii::$app->request->post('id'); // получаем из массива $_POST полученный id countries
    
                 // получаем из базы данных нужные regions на основе id countries со статусом "активен", сортируем по алфавиту
                 $regions = Regions::find()
                                     ->where('status=:status',[':status' => Regions::STATUS_ACTIVE])
                                     ->andWhere('country_id=:id', [':id' => $id])
                                     ->orderBy('name_ru')
                                     ->all();
                 // формируем первый option со значением по умолчанию
                 $this->option  = '<option value="0">Выберите регион...</option>';
                 // перебираем в цикле все записи и добавляем к первому option
                 foreach($regions as $region){
                     $this->option .= '<option value="'.$region->id.'">'.$region->name_ru.'</option>';
                 }
             }
           // возвращаем ответ клиенту, этот ответ попадает в success: function(responce)
            return $this->option;
        }


    В моём же примере, если Вы посмотрите исходный код, всё это выглядит так
    <select name="countries" id="countries" onchange="function(){/* тут jquery из примера выше */}"
    <select name="regions" id="regions" disabled="disabled">


    То есть, эта часть кода
    onchange="function(){/* тут jquery из примера выше */}"

    для dropDown описывается в options[] метода

    $form->field($model, 'countries_id')->dropDown(
        $items,
        // options[] для передачи дополнительных параметров для select
        [
           'onchange' => 'function(){ ..... }'
        ]
    )
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, то есть, через option Вы задаёте, какой атрибут задать обычному html тегу.
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, по поводу документации.
    Вы читайте о dropDown.
    Если Вы посмотрите, то увидите, что одним из параметров в этот метод передаётся массив с конфигурацией "options", у Вас в коде он есть. Если описание того, что можно передать в этот массив
    The tag options in terms of name-value pairs.

    For the list of available options please refer to the $options parameter of yii\helpers\Html::activeDropDownList().

    If you set a custom id for the input element, you may need to adjust the $selectors accordingly.

    Видите ссылку на Html::activeDropDownList - переходите и читаете как передавать параметры.
    А передавать их можно как name => value
    То есть
    [
       // name => value
      'id' => 'selector'
       // name => value
      'onclick' => 'function(){ ....}',
       // name => value
      'onchange' => 'function(){ ... }',
       // name => value
      'onclick' => 'alert("click!!!")'
    ]

    Откройте исходный код страницы и посмотрите, что сформирует метод.
    А сформирует он такой html
    <select id="countries-id" class="form-control" name="Countries[id]" onchange="
                            $.post(
                             &quot;/zahoron/admin/ajax/list-regions&quot;,
                             {id : $(this).val()},
                             function(data){
                              $(&quot;select#regions&quot;).html(data).attr(&quot;disabled&quot;, false)
                             }
                            )
                        ">
    <option value="">Выбрать страну...</option>
    <option value="2">Россия</option>
    <option value="3">Украина</option>
    <option value="4">Китай</option>
    </select>

    Так же можно навесить js и на textInput и на Html::a() и тому подобное.
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, так же смотрите debug панель самого framework, там есть контроль ajax запросов. Через эту же панель можно смотреть логи framework-a(не сервера)
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, откуда же я знаю, почему у Вас не работает. По картинкам можно только гадать.
    Смотрите консоль браузера на вкладках "консоль" и "сеть", какие там ошибки, предупреждения. Смотрите логи в runtime, логи сервера.
    Первая ошибка, какая может быть, это 404(страница не найдена). Тогда Вам надо проверить пути какоторые Вы указываете в формах для ajax запросов.
    Вы используете какой-то плагин или сами написали форму?
  • Не работает зависимый dropDoun, что не так делаю?

    slo_nik
    @slo_nik Куратор тега Yii
    Maksim86, как не удалось найти? Всё есть в документации к framework-у.
  • Почему не получается получить href?

    slo_nik
    @slo_nik
    Добрый вечер.
    Потому, что Вы через this обращаетесь к btn-cat, а надо к ссылке.
    Вот как-то так
    $('.btn-cat a ').on('click', function (e)
  • Почему учитель информатики завернул?

    slo_nik
    @slo_nik Куратор тега PHP
    profesor08, а я то тут при чём? давно не пользовался, да и не буду больше.
  • Как быть с отправкой формы на простой верстке?

    slo_nik
    @slo_nik
    Добрый день.
    Очень просто.
    Внести соответствующие правки в файл, который формирует письма.
  • Почему учитель информатики завернул?

    slo_nik
    @slo_nik Куратор тега PHP
    YchenikPTU, почему бы и нет? Я о array_push();
    Чтобы видеть все ошибки выставьте уровень этих самых ошибок на полную. Тогда бы Вы сразу всё увидели.
    И по поводу var_dump();
    Думаю, что надо заменить на более понятные обычному человеку сообщения. Как на обычных сайтах. Вам же не показывают массив, а показывают какие-то сообщения.
    Сделайте так же.
    Тогда, возможно, у преподавателя будут слёзы умиления катиться по небритым, впалым от усталости щекам)
  • Почему учитель информатики завернул?

    slo_nik
    @slo_nik Куратор тега PHP
    YchenikPTU, не мешало бы проверять, что приходит для tokena и phone.
    Так же можно добавить вывод информации о результатах работы кода.
    Ну при попытке запустить Ваш код вываливаются предупреждения.
    5d8a0a6d06d05027021522.png

    Надо бы это исправить.
  • Почему учитель информатики завернул?

    slo_nik
    @slo_nik Куратор тега PHP
    YchenikPTU, ну да, null.
    Вы же реальные данные подставляете для token и phone?
    А он?
    Ну и по поводу вывода ответа.
    Может добавить больше информации? Что бы не null выводился, а понятная информация.
  • Как получить данные из javascript в php (переменную допустим)?

    slo_nik
    @slo_nik Куратор тега PHP
    Владимир, так же сделал бы, отправил ajax.
    Не умеете отлаживать - учитесь, тем более, что простейший вариант я Вам написал
  • Как получить данные из javascript в php (переменную допустим)?

    slo_nik
    @slo_nik Куратор тега PHP
    HistoryART, ну так для начала включите вывод ошибок, затем выставьте уровень ошибок на полную, потом первой строкой в коде сделайте это
    error_reporting(E_ALL);
    А в завершении замените короткие теги обычными.
    Ну и смотрите ошибки в консоли браузера на вкладке "сеть" и в логах сервера.
    Всё это делайте после того, как убедитесь, что ajax действительно отправляется.
  • Как получить данные из javascript в php (переменную допустим)?

    slo_nik
    @slo_nik Куратор тега PHP
    Добрый день.
    Бросьте жуткую привычку писать короткие теги php.
    Что именно у Вас не получается?