Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
12:35
21 дек
#
?
написал:

Добрый день.

Не отправляются письма с заказом ни клиенту, ни администратору. Почта администратора указана в настройках движка. Домен на кириллице, вида домен.рф. Почта администратора вида contact@домен.рф. Почтовые ящики клиентов обычного вида.

В чём может быть проблема? Нужен ли где-нибудь "включить" галочку о том, чтобы такие письма приходили?

Спасибо.

15:16
21 дек
#
написал:

Посмотрите с помощью WebMail-агента или специального раздела, касающегося почты и её настроек в панели управления хостингом, появились ли возвратившиеся письма.

Текстовый доступ к таким письмам иногда получается через ftp://ваш.сайт/Maildir/new (имена папок могут быть другими). В заголовках возвратов обычно указана причина.

Если выяснить ничего не удалось, проведите эксперименты по хождению писем с/на разные ящики:

  • указать в админпанели емейл от сервисов Mail.ru, Yandex, GMail
  • идут ли письма по действиям с клиентской стороны
  • по действиям с админпанели

На всякий случай, рекомендую прочесть ветку Как распечатать заказ в админке. В конце ветки описано решение ситуации, когда в шаблоне есть собственные макеты писем, и именно такие не идут, а без собственных макетов - доходят.

21:52
02 янв
#
?
написал:

Найдено решение: чтобы письма отправлялись, нужно в Настройки -> Настройки сайта -> Емейл админа указывать почтовый адрес не в виде contact@домен.рф, а в виде Punycode, для примера выше так contact@xn--97gk0fnk.xn--p1ai. Для конвертации можно использовать сервис, например, этот: punycoder.com

Остался вопрос: письма на почту приходят с темой Вы оформили заказ №14 на сайте xn--97gk0fnk.xn--p1ai - где и каким образом можно подправить код, чтобы домен указывался в понятном виде?

10:41
03 янв
#
?
написал:

От разработчика: Спасибо Андрею за краткий и вместе с тем обстоятельный пошаговый ответ.

Красивое решение. Не затирется новой версией. Действует по принципу do_action как в Wordpress.

1 Взять с php.net класс IDN декодирования punycode в utf.

<?php
class IDN {
    private static function punyAdapt...
    private static function decodeDigit...
    private static function utf8...
    private static function decodePart...
    public static function decodeIDN...
}
?>

2 Изменить класс согласно именам произвольных моделей в Impera.

<?php
require_once(dirname(__FILE__) . '/BasicModel.php');

class IdnANYModel extends BasicANYModel {
    private static function punyAdapt...
    private static function decodeDigit...
    private static function utf8...
    private static function decodePart...
    public static function decodeIDN...
}
?>
  • 2.1 Заменить в теле класса все IDN:: на IdnANYModel::.

3 Сохранить в папке моделей как objects\.any-models\Idn.php. Первая буква файла заглавная.

4 Написать хелпер шаблона, где выполнить do_action1 декодирования урла сайта.

<?php
class TemplateEmulator {
    protected $cms;

    public function __construct ( & $cms ) {
        $this->cms = & $cms;
        $this->do_action1();
    }

    private function do_action1 () {
        $root = explode('/', $this->cms->root_url);
        $root[0] = $this->cms->idn->decodeIDN($root[0]);
        $root = implode('/', $root);
        $this->cms->root_url = & $root;
        $this->cms->smarty->assignByRef('root_url', $this->cms->root_url);
    }
}
?>

5 Сохранить хелпер как design\имя-шаблона\html\helper.php.

Комментарий разработчика

В ситуации, когда мы абсолютно уверены, что сайт установлен в корне хостинга и никогда не будет перемещён в подпапку, из метода do_action1 можно удалить explode-implode отделение домена от имени подпапки и сократить метод до такого вида:

private function do_action1 () {
    $root = $this->cms->idn->decodeIDN($this->cms->root_url);
    $this->cms->root_url = & $root;
    $this->cms->smarty->assignByRef('root_url', $this->cms->root_url);
}

Если в шаблоне не используете переменную $root_url, последнюю строку метода тоже можно убрать.

11:18
03 янв
#
?
написал:

Ни в одном паблик шаблоне и намёка нет на использования $root_url.

Установка. Это на локалхост могут ставить в папку. На боевом сайте всё в корне. Логично. Зачем в папку?

Следовательно для единственного action хелпер оптимизируется помаксимуму. Зачем там петля через protected $cms?

<?php
class TemplateEmulator {
    public function __construct ( & $cms ) {
        $cms->root_url = $cms->idn->decodeIDN($cms->root_url);
    }
}
?>
11:34
03 янв
#
?
написал:
Андрей написал:2. Изменить класс согласно именам произвольных моделей в Impera.

Андрей, забыли написать подпункт "Заменить в теле класса все IDN:: на IdnANYModel::".

13:09
03 янв
#
?
написал:

2 разработчик: Пожалуйста.

2 Артем: Пусть каждый оптимизирует по своей ситуации. Я предложил классический способ, универсальный надеюсь.

2 Сергей: спасибо)) Разработчик исправите мой пост? Не знаю как самому сделать.

Уже исправил.

13:22
17 мар
#
?
написал:

Коллеги, приветствую!

Наше решение имеет очень серьезную проблему. В момент когда формируется заказ, и идет редирект на страницу заказа:

$this->security->redirectToPage('http://' . $this->root_url . '/order/' . $item->code);

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



Мне кажется, правильнее поддержку национальных доменов делать на уровне движка... Либо перед редиректом кодировать автоматически домен, либо перед выводом в шаблон декодировать. Есть ещё решения для моей проблемы?

17:49
17 мар
#
?
написал:

Тут gitt показал, как перекрыть всё что хотим. Можем изменить redirectToPage, если домен национальный? Да. Чтоб менял рут урла на исходный.

<?php
    require_once(dirname(__FILE__) . '/../../../objects/.any-models/Security.php');

    class SecurRusDomain extends SecurityANYModel {
        public function redirectToPage ( $url ) {
            $root = $this->cms->root_url;
            $size = $this->cms->text->length($root);
            $test = $this->cms->text->substr($url, 0, $size);
            if ($test == $root) {
                $url = $this->cms->root_url_orig . $this->cms->text->substr($url, $size);
            }
            parent::redirectToPage($url);
        }
    }

    class TemplateEmulator {
        public function __construct ( & $cms ) {
            $old = $cms->root_url;
            $cms->root_url = $cms->idn->decodeIDN($old);
            if ($old != $cms->root_url) {
                $cms->root_url_orig = $old;
                $cms->security = new SecurRusDomain($cms);
            }
        }
    }
?>
19:15
17 мар
#
?
написал:

Разработчик, для чего я пишу код короче?

public function redirectToPage ( $url ) {
    $size = mb_strlen($this->cms->root_url);
    if (mb_substr($url, 0, $size) == $this->cms->root_url)
        $url = $this->cms->root_url_orig . mb_substr($url, $size);
    parent::redirectToPage($url);
}

Я стремлюсь чтобы код был понятен и записан по возможности универсальными методами движка.

22:23
17 мар
#
?
написал:

Документация по универсальным методам движка есть? Нет.

mb_substr любой PHPист поймёт что выполнится, а this->cms->text->substr только предполагать.

23:21
17 мар
#
?
написал:

Добрый вечер! Савсибо за ответы, ход ваших мыслей понятен.

Но есть опять неточность:

if ($test == $root) {

тут вроде как должны сверяться домены, но здесь не учитывается что перед доменом стоит http://

23:45
17 мар
#
?
написал:

И ещё одна проблема, похоже редирект на кривой домен происходит до того как дело доходит до хелпера. То есть редирект идет стандартным методом, а не нем который дописали мы ((

15:48
18 мар
#
?
hotwine написал:
if ($test == $root) {

Test это кусок url. От начала. Размером root символов.

Не домен а началы урла сравнивают.

Абсолютно один итог получится. Даже http вначале или будет путь вконце.

false | домен.рф == xn--97gk0fnk.xn--p1ai
false | http://домен.рф == http://xn--97gk0fnk.xn--p1ai
false | http://домен.рф/сайт-в-папке == http://xn--97gk0fnk.xn--p1ai/сайт-в-папке

И когда root соедржит уже рекоденый домен.

true | домен.рф == домен.рф
true | http://домен.рф == http://домен.рф
true | http://домен.рф/сайт-в-папке == http://домен.рф/сайт-в-папке
18:56
18 мар
#
?
написал:

Наверное мы говорим о разном:

$url = 'http://домен.рф/order/1013445aa54f0eb88a51fa3e407d5fe8'; // урл на который делаем редирект
$root = $this->cms->root_url;                     // домен.рф (в этом свойстве хранится домен без http://)
$size = $this->cms->text->length($root);          // 8 символов
$test = $this->cms->text->substr($url, 0, $size); // в итоге тут получится 'http://д'
if ($test == $root) {                             // это сравнение вернет false

Вобщем этот кусок кода я переписал через parse_url(), и стало корректно, но вопрос собственно в другом!

Когда идет редирект после создания заказа, то редирект, судя по всему, срабатывает ДО МОМЕНТА когда инится класс SecurRusDomai, и соотвественно обратного кодирования урла не происходит, и редирект ведет в никуда.

14:52
19 мар
#
?
hotwine написал:

Упсы(

не знал особеность root_url. Артем наверно тоже.

Тогда вы правы.

21:24
21 мар
#
?
написал:
Максим написал:похоже редирект на кривой домен происходит до того как дело доходит до хелпера

Отдебажить по шагу обращение к корзине, поймете почему редирект пролетает.

  • .htaccess
  • index.php
  • ClientPage, это cms
    • helper, здесь вы поставили хук cms->security->redirectToPage
    • ClientCart, это cms->module
      • редирект успешного заказа, cms->module->security->redirectToPage
      • иначе helper->prepare (подробности)
      • рендер cart.tpl
    • helper->prepare
    • рендер index.tpl
  • echo

Хук установлен на cms. Модуль корзины в этот момент еще отсутствует. Редирект возникнет из security модуля, на котором хука нет.

23:03
21 мар
#
?
написал:

Спасибо за подробный ответ! А что делать то в моей сиутации?

21:37
23 мар
#
?
gitt написал:

Очевидно же, расширить модуль корзины. Технология известна.

1 Админпанель страницы » Зарегистрированные модули, выключить старый модуль Cart.

2 Там же добавить новый модуль CartEx.

3 Закрыть теневые адреса в .htaccess новым модулем.

RewriteCond  %{QUERY_STRING}  ^(.*&)?module=Cart(&.*?)?$
RewriteRule  ^index\.php$     index.php?%1module=CartEx%2  [L]

4 Создать папку и файл objects/cartex/CartEx.php. Регистр символов соблюдать.

5 Написать код расширения корзины. Туда же хук Артема, различие root_url и url исправлено.

<?php
    /* ============================================================================
    |                                                                             |
    |  В измененном Security исправляем метод редиректа.                          |
    |                                                                             |
    ============================================================================ */

    require_once(dirname(__FILE__) . '/../.any-models/Security.php');

    class SecurRusDomain extends SecurityANYModel {
        public function redirectToPage ( $url ) {
            $root = 'http://' . $this->cms->root_url;
            $size = $this->cms->text->length($root);
            $test = $this->cms->text->substr($url, 0, $size);
            if ($test == $root) $url = 'http://' . $this->cms->root_url_orig . $this->cms->text->substr($url, $size);
            parent::redirectToPage($url);
        }
    }

    /* ============================================================================
    |                                                                             |
    |  При сохранении корзины пользуемся измененным Security.                     |
    |                                                                             |
    ============================================================================ */

    require_once(dirname(__FILE__) . '/../cart/Cart.php');

    class ClientCartEx extends ClientCart {
        public function save_order ( $params = null, & $item = null ) {
            $this->security = new SecurRusDomain($this);
            parent::save_order($params, $item);
        }
    }
?>

6 Добавить код Артема в хелпер.

<?php
    /* ============================================================================
    |                                                                             |
    |  Запоминаем исходное написание домена, если декодирован в национальный.     |
    |                                                                             |
    ============================================================================ */

    class TemplateEmulator {
        public function __construct ( & $cms ) {
            $old = $cms->root_url;
            $cms->root_url = $cms->idn->decodeIDN($old);
            if ($old != $cms->root_url) $cms->root_url_orig = $old;
        }
    }
?>
22:13
23 мар
#
?
hotwine написал:

П1 безполезный. Выполнив п3 сделаете старый модуль недоступным даже трижды включеным.

Перекрытый redirectToPage не учтно что у латин доменов root_url_orig будет отсутствовать.

23:51
23 мар
#
?
написал:

Вот как исправить, чтобы под любой домен.

<?php
    class TemplateEmulator {
        public function __construct ( & $cms ) {
            $cms->root_url_orig = $cms->root_url;
            $cms->root_url = $cms->idn->decodeIDN($cms->root_url);
        }
    }
?>
04:28
24 мар
#
?
написал:
П1 безполезный. Выполнив п3 сделаете старый модуль недоступным даже трижды включеным.

Господа, вы htacess, наверное, не читали. Там целая программа. Даже более. Там вся жисть прописана. С ошибками, конечно, но прописана.

Я уже устал разрабу сообщать об очевидных ошибках, которые остались еще со времен симплы - ноль эмоций. Патамуша он луше знает, что нужна маей закзчице. Причем попралять - НЕ БУДЕТ! Не его это дело, выдавать обн7овления. Все уже готово, пользуйтесь (диоты)

08:13
24 мар
#
?
написал:

Спасибо, ребята! Буду пробовать...

08:30
24 мар
#
?
написал:

Так, я правильно понимаю, что редирект исправится только на странице корзины? Но, если где-то в другом разделе будет редирект, то он тоже не будет работать?

12:35
01 апр
#
?
написал:

Проблема ещё имеет место быть! Кто может помочь?

Написание ответа

Перед публикацией рекомендуется использовать Предпросмотр, чтобы увидеть конечный вид сообщения.


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.