Ответы пользователя по тегу PHP
  • Как в yii2 получить 2 параметра в поле?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Добавьте просто скрытое поле для передачи id_field, а в основное поле передавайте только данные:

    <?php foreach ($fields as $field): ?>
        <?= Html::activeHiddenInput($model, "[$field->id]id_field", ['value' => $field->id]) ?>
        <?= $form->field($model, "[$field->id]data")->textInput(['value' => $model->data]) ?>
    <?php endforeach; ?>


    В результате вы получите примерно такую структуру post запроса:

    Field_Data[1][id_field] = 1
    Field_Data[1][data] = "значение поля 1"
    Field_Data[2][id_field] = 2
    Field_Data[2][data] = "значение поля 2"


    А уже в контроллере обрабатывайте полученные поля как вам нужно:

    if (Yii::$app->request->post('Field_Data')) {
        foreach (Yii::$app->request->post('Field_Data') as $fieldData) {
            $model = new FieldData();
            $model->id_field = $fieldData['id_field'];
            $model->data = $fieldData['data'];
            if ($model->validate()) {
                $model->save();
            }
        }
    }
    Ответ написан
    1 комментарий
  • Как нынче делают WSS?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Как сказал человек выше, лучшим будет использование реверс-прокси на Nginx. Причин этому достаточно, во-первых, высокая производительность, особенно если у вас проект высоконагружаемый, отлично работает с SSL.

    Вот пример конфигурации Nginx для правильной работы:

    server {
        listen 443 ssl;
        server_name your-domain.com;
    
        ssl_certificate /etc/nginx/ssl/your_domain.crt;
        ssl_certificate_key /etc/nginx/ssl/your_domain.key;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
    
        # Прокси для WebSocket
        location /wss/ {
            proxy_pass http://localhost:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
        location / {
            proxy_pass http://localhost:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    Ответ написан
  • Почему последовательный вызов работает, а в одну строку нет?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Метод getOfers() должен возвращать объект класса, а не true.

    class ProductAmount
    {
        function __construct($array = array()) { 
            ...
        }
    
        function getOfers($items = []) {
            ...
            return $this;
        }
    
        function getProfuctStore($inListStore = 'N') {
            ...
            return $this;
        }
    
        function setListStore($inListStore = 'Y') {
            ...
            return $this;
        }
    }


    $obj = new ProductAmount();
    $res = $obj->getOfers([229411])->getProfuctStore('Y')->setListStore('Y');
    Ответ написан
    Комментировать
  • Как загрузить пользовательское изображение на сервер?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <label for="file">Выберите изображение:</label>
        <input type="file" name="file" id="file" required>
        <button type="submit">Загрузить</button>
    </form>


    <?php
    $target_dir = "img/";
    
    $target_file = $target_dir . basename($_FILES["file"]["name"]);
    
    $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
    $check = getimagesize($_FILES["file"]["tmp_name"]);
    if($check !== false) {
        if (file_exists($target_file)) {
            echo "Файл уже существует.";
        } else {
            if ($_FILES["file"]["size"] > 2000000) {
                echo "Файл слишком большой.";
            } else {
                $allowed_types = array('jpg', 'jpeg', 'png', 'gif');
                if (in_array($imageFileType, $allowed_types)) {
                    move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)
                }
            }
        }
    }
    ?>
    Ответ написан
  • Как работать с исходящим вебхуком в Битрикс используя PHP?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Например, вот так:

    $file = 'deal_updates.txt';
    
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);
    
    if (isset($data['event']) && $data['event'] === 'ONCRMDEALUPDATE') {
        $dealId = $data['data']['FIELDS']['ID'];
        $newStatus = $data['data']['FIELDS']['STATUS_ID'];
    
        $updateDate = date('Y-m-d H:i:s');
    
        $log = "Deal ID: $dealId | New Status: $newStatus | Updated at: $updateDate\n";
    
        file_put_contents($file, $log, FILE_APPEND);
    }
    
    http_response_code(200);
    echo 'OK';


    А вообще я бы рекомендовал вам ознакомиться с документацией:
    https://dev.1c-bitrix.ru/learning/course/index.php...
    Ответ написан
    Комментировать
  • Как можно укоротить код в foreach?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Ты можешь эти ключи вынести в отдельный массив и не перечислять их в foreach:

    $array = [];
    $requiredKeys = ['id', 'name', 'photo'];
    
    foreach ($babysitters as $babysitter) {
        $babysitterData = new \stdClass;
    
        foreach ($requiredKeys as => $key) {
            $babysitterData->${'babysitter_' . $key} = $babysitter->$key;
        }
    
        $array[] = $babysitterData;
    }
    Ответ написан
  • Как заставить sphinxsearch 3.6.1 выводить несколько полей?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Дело в том, что в Sphinx по умолчанию при запросе SphinxQL возвращаются только id и поля, указанные в индексе. Для вывода конкретных полей нужно указать их в запросе явным образом:

    $sql = "SELECT id, title, content FROM prezumciya_index WHERE MATCH('$query') LIMIT 1000";
    Ответ написан
  • PHP Отправка xml в EDI kontur через API?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Возможно вы некорректно формируете массив байтов, либо не задаёте необходимый Content-Type в шапке запроса.
    Вот пример корректного запроса:

    $xmlContent = '<?xml version="1.0" encoding="UTF-8"?><message>Пример сообщения</message>';
    
    $xmlBytes = unpack('C*', $xmlContent);
    
    $byteString = implode(array_map("chr", $xmlBytes));
    
    $url = 'https://edi.kontur.ru/V1/Messages/SendMessage';
    
    $ch = curl_init($url);
    
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/octet-stream',
        ...
    ));
    
    curl_setopt($ch, CURLOPT_POSTFIELDS, $byteString);
    
    $response = curl_exec($ch);
    
    if (curl_errno($ch)) {
        echo 'Ошибка cURL: ' . curl_error($ch);
    } else {
        echo 'Ответ сервера: ' . $response;
    }
    
    curl_close($ch);
    Ответ написан
  • Как правильно в Generatepress добавить функцию, которая работала в «обычном» темплейте?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Чтобы ваша функция работала в теме GeneratePress, её нужно добавить в файл functions.php вашей дочерней темы (если вы используете дочернюю тему) или в раздел кастомных функций через админку, если вы не хотите изменять файлы темы напрямую.
    Ответ написан
    Комментировать
  • Как сделать динамическое добавление на ajax, чтобы записи не дублировались?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    1. Используй метод .off() для удаления предыдущих обработчиков событий перед добавлением нового.
    2. Исправь код AJAX, чтобы ограничить количество перерисовок элементов.

    $("#modal").off('submit').on('submit', function (e) { 
        e.preventDefault();
        var form_data = $(this).serialize();
    
        $.ajax({
            type: "POST",
            url: "user/add.php",
            data: form_data,
            success: function (html) {
                document.getElementById("shadow").style.display = "none";
                document.getElementById("modal").style.display = "none";
                $('#modal').trigger('reset');
                $("#main").append(html);
            }
        });
    });


    add.php:

    require "../database/Task.php";
    
    if (isset($_POST['title']) && isset($_POST['description'])) {
        $task_mess = new Task;
        $task_mess->add_task($_POST['title'], $_POST['description']);
    
        $new_task = $task_mess->get_last_task();
    
        echo "<div class='task'>
                <h3>{$new_task['title']}</h3>
                <p>{$new_task['description']}</p>
              </div>";
    }
    Ответ написан
    2 комментария