Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 102 комментария

Артур Шевченко
Артур Шевченко
Андрей
Андрей
Не приходит информация: phone, street, comment
Остальные приходят. В чём может быть причина?
<?php
if($modx->event->name != 'msOnCreateOrder') return;
$token = $modx->getOption('mstelegram_token', null, false);
$recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
$contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->id));
$_products = $msOrder->getMany('Products');
$profile = $msOrder->getOne('UserProfile');

// Список товаров в заказе
$i = 0;
$products = '';
foreach ($_products as $product) {
    $i++;
    $products .= "*{$i}. {$product->name}* \n    `↳ ". round($product->price) ." х {$product->count} шт. = ". round($product->price * $product->count)."` \n";
}

if ($msOrder->delivery == '1') {
    $deli = "Сами заберут \n---------- \nТелефон: {$contacts->phone} \nКомментарий: {$contacts->comment}\n";
    } else if ($msOrder->delivery == '2') {
        $deli = "Доставка {$contacts->city} `{$msOrder->delivery_cost} р.` \n---------- \nТелефон: {$contacts->phone} \nАдрес: {$contacts->city}, {$contacts->street} \nКомментарий: {$contacts->comment}\n";
    }

// Текст сообщения
$message = "
Новый заказ #{$msOrder->id}
на сумму: {$msOrder->cart_cost} р.
----------
{$products}
----------
{$deli}
_Статус заказа придёт повторно_";

$message = urlencode($message);
foreach($recipients as $id){
    $id = trim($id);
    if(!$id) continue;
    $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&parse_mode=markdown&text={$message}";
    $ch = curl_init();
    curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true,));
    $result = curl_exec($ch);
    curl_close($ch);
}
aziomav@likemovie.net
aziomav@likemovie.net
Мы с вами не так близко знакомы, поэтому лучше на Вы все же обращаться)

Клиент добавляет адрес сайта, может добавить сколько угодно их. Это банально поля.
Сайт 1
Сайт 2 и т.д.
К каждому сайту может добавить запросы 1 поле в textarea например.

Ничего фильтровать не надо. У него будет страничка где будет список сайтов добавлен и запросов.

По простому если: сайт 1, сайт 2, сайт 3. И поля запросы 1, запросы 2, запросы 3. Он может их редактировать — менять значения, удалять.

Ничего фильтровать не надо, просто добавить данные, отредактировать или удалить. Чтобы они были на личной странице клиента.
Артур Шевченко
Артур Шевченко
Ты максимально абстрактно описываешь функционал. Что значит «добавить сайт»? Что за «запросы»? Что с этими данными будут делать в последствии: показ, фильтрация, отправка?

От ответов на эти вопросы зависит то, как лучше организовать хранение.
aziomav@likemovie.net
aziomav@likemovie.net
На счет компонентов понятно.

А как можно реализовать будет возможность добавления неограниченного кол-во сайтов для клиента. Т.е. клиент захочет добавить из ЛК не 1, а 5 скажем сайтов или больше и запросы к каждому. Я так понимаю поля в профиле, например через тот же ExtraFields добавляются мной вручную. Не очень понятно как такой момент обыграть
Артур Шевченко
Артур Шевченко
Часть данных храниться в modx_user_attributes. Но это наверное не очень правильно туда лишние данные сохранять.
А что в этом неправильного? Атрибуты пользователя могут быть каким угодно.

Лучше это через компоненты все сделать?
Да, так как компоненты имеют документацию и тот, кто после тебя будет работать с сайтом сможет к ней обратиться и быстрее понять как и что работает.
aziomav@likemovie.net
aziomav@likemovie.net
Функции одинаковые у всех. У каждого клиента должна быть возможность добавить сайт, список запросов и выбрать тариф. По сути все, это информация должны сохранятся, редактироваться и удаляться через интерфейс.

Лучше это через компоненты все сделать?
Просто не очень понятно как данные и где будут храниться под пользователя. Часть данных храниться в modx_user_attributes. Но это наверное не очень правильно туда лишние данные сохранять.
Артур Шевченко
Артур Шевченко
как сделать персональную страницу для каждого пользователя?
Если для всех пользователей должны быть доступны одинаковые функции, то страница должна быть одна и задача сводится не к генерации индивидуальных страниц, в к загрузке персональных данных для авторизованного пользователя.
Для вывода данных пользователя в Modx есть модификатор user. В pdoTools есть сниппет pdoUsers. Можно написать свой сниппет.
Так же очевидно, что кроме стандартных полей требуется хранить ещё какие-то данные пользователя. Для создания полей под эти данные имеет смысл использовать компонент ExtraFields версии не старше 2.0.3.
Когда организуешь место для хранения, нужно будет организовать отправку данных на сервер и обработку ответов. Для этого удобнее всего использовать компонент SendIt.

В целом этих трёх компонентов достаточно для создания личного кабинета любой сложности.
Наумов Алексей
Наумов Алексей
Ну там явное отсутствие объявления переменной $skip в функции.

Можешь попробовать в начале добавить
$skip = 0;
.

Но это всего лишь PHP warning, работать должно и так)

А насчет второй — ну вот где-то ему скобочка не понравилась. Пробуйте частями может как-то файлы подключать? Найти эту скобочку.
Madao
Madao
В моем случае мне подошло данное решение, которое очень костыльное и скорее всего не совсем верное, но для моих нужд работает. Хотя и оставляет в псевдониме точку, если содержит одно из расширений, указанных в массиве. Но это уже, подчеркну в МОЕМ случае, неважно, ибо таких заголовков у меня не будет. Если кто-то предложит работающий универсальный вариант без такого говнокода, думаю буду благодарен не только я.
Меняем код функции translate на такой:
public function translate($title)
    {
        $language = $this->modx->getOption('translitor_language', null, 'ru');
        $separator = '-';

        // Список расширений, которые нужно сохранить, у меня указаны такие
        $extensions = ['jpg', 'jpeg', 'png', 'gif', 'svg', 'ico', 'webp', 'doc', 'docx', 'pdf'];

        // Проверяем, заканчивается ли строка на одно из расширений
        $hasExtension = false;
        $extension = '';
        foreach ($extensions as $ext) {
            if (substr($title, -strlen($ext) - 1) === '.' . $ext) {
                $hasExtension = true;
                $extension = $ext;
                break;
            }
        }

        // Если есть расширение, отделяем его от основной части
        if ($hasExtension) {
            $titleWithoutExtension = substr($title, 0, -strlen($extension) - 1); // Убираем точку и расширение
            $title = $titleWithoutExtension;
        }

        // Транслитерируем текст
        $title = $language ? $this->ascii($title, $language) : $title;

        $flip = $separator === '-' ? '_' : '-';
        $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);
        $title = str_replace('@', $separator.'at'.$separator, $title);

        // Удаляем все символы, кроме букв, цифр, разделителя и пробелов
        $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', $this->lower($title));

        // Заменяем последовательности разделителей и пробелов на один разделитель
        $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);

        // Обрезаем разделители по краям
        $title = trim($title, $separator);

        // Если было расширение, добавляем его обратно
        if ($hasExtension) {
            $title .= '.' . $extension;
        }

        return $title;
    }