Модуль Дополнительная форма (заказа) на базе формы обратной связи DLE 9.5

Тема в разделе "DLE", создана пользователем Valeras, 9 авг 2012.

Информация :
Актуальная версия DataLife Engine 11.1
( Final Release v.11.1 | Скачать DataLife Engine | Скачать 11.1 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 10.0 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Модераторы: killoff
  1. Valeras

    Valeras Постоялец

    Регистр.:
    23 апр 2007
    Сообщения:
    107
    Симпатии:
    36
    Возникла необходимость добавления дополнительной формы (заказа), чтобы она выглядела и работала как форма обратной связи, т.е. по аналогии, но с дополнительными полями.
    Очень частый вопрос на форумах по DLE. Модули форм, которые предлагаются на просторах Интернета - что бесплатные и платные не очень подходят. Так как нужно, иногда одна форма, а не пакет, которую раз настроил и забыл.
    Дополнительная форма делалась под версию DLE 9.5, но думаю, что этот метод подойдет и для последующих версий DLE.

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

    Пример использования:

    (Попросили - сделал, чем занимается заказчик меня мало интересует, только как исключение - чтобы не оружием, наркотиками и детской порнографией :)

    Итак, форма заказа под названием order или модуль order.

    1. Нам нужен шаблон по аналогии с feedback.tpl, это order.tpl в общей папке Вашего шаблона. Туда его добавляем.
    2. Нам нужно исполнение нового модуля прописываем в файле.

    /engine/engine.php

    Найти:
    PHP:
        case "alltags" :
        include_once 
    ENGINE_DIR '/modules/tagscloud.php';
        break;

    После вставить:
    PHP:
      case "order" :
            include_once 
    ENGINE_DIR '/modules/order.php';
        break;

    3. После того как указали обработчик копируем с переименованием файл engine/modules/feedback.php в engine/modules/order.php

    4. Производим корректировку файла engine/modules/order.php в зависимости от ваших полей, которые необходимы в форме. У меня удалена проверка капчи по сравнению с модулем engine/modules/feedback.php.
    Как вариант ответ на вопрос: "Как избавиться от капчи в форме обратной связи?".
    Изменения можно увидеть в сравнив оба файла engine/modules/feedback.php и engine/modules/order.php (исходники предоставлены внизу поста).

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

    Для этого нам необходим AJAX обработчик который находится engine/ajax/order.php. Берем обработчик engine/ajax/feedback.php с переименованием файл engine/ajax/order.php. Производим корректировку engine/ajax/order.php в большей части это копирование и вставка из обработчика engine/modules/order.php.
    Изменения можно увидеть, сравнив оба файла engine/ajax/feedback.php и engine/ajax/order.php (исходники предоставлены внизу поста).


    В итоге получаем дополнительный модуль, сделанный по аналогии и не как не соприкасающийся с формой обратной связи.
    Соответственно, путь к вашей форме будет:

    http://ваш_сайт/index.php?do=order

    Исходники:

     
    Cepera-exp, IRONHiDE, droni4 и 3 другим нравится это.
  2. olegr

    olegr Создатель

    Регистр.:
    11 окт 2008
    Сообщения:
    13
    Симпатии:
    1
    А есть ли возможность прикрутить отправку файла?
     
  3. Valeras

    Valeras Постоялец

    Регистр.:
    23 апр 2007
    Сообщения:
    107
    Симпатии:
    36
    Отправка файла не предусмотрена разработчиком. Так как исследуя класс dle_mail (engine/classes/mail.class.php), через который происходит отправка формы, я не нашел методов отправки файлов, как какой нибудь AddAttachment(). Соответственно, чтобы воспользоваться таким функционалом, нужно подкорректировать класс на отправку файлов. А дальнейшее использование - это уже дело десятое.
     
    KillerHT нравится это.
  4. ArchangelNN

    ArchangelNN Постоялец

    Регистр.:
    19 дек 2006
    Сообщения:
    134
    Симпатии:
    19
    Прикрутил, работает. Но есть косячок (может, особенность, конечно) - письмо отправляется не только администратору, но аналогичное приходит и к отправителю (т.е. на email отправителя). Не нашел, как исправить. Помогите, пожалуйста.
     
  5. Valeras

    Valeras Постоялец

    Регистр.:
    23 апр 2007
    Сообщения:
    107
    Симпатии:
    36
    Чуть что - сразу косячок.
    (Заказчик программисту:
    - Опа, а я баг нашел!
    программист заказчику:
    - Какой же это баг - это фитча! :dk: )

    То что аналогичное письмо приходит отправителю - так задумывалось.
    Чтобы письмо не приходило отправителю, то в файле engine/ajax/order.php нужно закомментировать строку 149:
    PHP:
    // $multipleRecipients .= $email;
    Который как раз и добавляет мыло отправителя.
     
  6. inmy

    inmy

    Регистр.:
    13 апр 2012
    Сообщения:
    296
    Симпатии:
    200
    PHP:
            $file $_FILES['file']['tmp_name'];
            
    $file_size $_FILES['file']['size'];
            
    $file_name $_FILES['file']['name'];
            
    $file_name str_replace" ""_"$file_name );
            
    $file_name_arr explode".",$file_name );
            
    $type end$file_name_arr );
            
    $allowed_type = array( "rar""zip""tar""gz""txt""jpg""gif""png""bmp""pdf""doc" );
                       
            if( 
    is_uploaded_file$file ) && $file )
                {
                    if( 
    in_arraystrtolower$type ), $allowed_type ) and $file_name )
                        {
                            
    $file_prefix time() + rand1100 );
                            
    $upload_file_name "{$file_prefix}_{$file_name}";
                                       
                            if( !
    file_existsROOT_DIR."/uploads/dir/{$upload_file_name}) )
                                {
                                    
    $upload_file ROOT_DIR."/uploads/dir/{$upload_file_name}";
                                    
    $res = @move_uploaded_file$file$upload_file );
                                    if( 
    $res )
                                        {
                                            if( @
    filesize$upload_file ) > 3145728 )
                                                {
                                                    @
    unlink$upload_file );
                                                    
    $error .= "<li>Файл имеет слишком большой размер</li>";
                                                }
                                                    else
                                                {
                                                    @
    chmod$upload_file0666 );
                                                }
                                        }
                                            else
                                        {
                                            
    $error .= "<li>Файл не загружен</li>";
                                        }
                                }
                                    else
                                {
                                    
    $error .= "<li>Произошла ошибка, файл уже существует. Попробуйте загрузить его ещё раз</li>";
                                }
                            }
                                else
                            {
                                
    $error .= "<li>Данный тип файлов запрещён для загрузки</li>";
                            }
                    }
                        else
                    {
                        if( 
    $file $error .= "<li>Файл не может быть загружен</li>";
                    }
    вот класс для загрузки

    класс отправки с файлами:
    PHP:
    $message str_replace"\n""<br/>\n"$message );
                    
    $message str_replace"\r"""$message );
                    
    $message preg_replace"#\\[code\\](.+?)\\[/code\\]#ies""ReplaceCode( '\\1' );"$message );
                    
    $message $db->safesql$message );
                    
    $user stripslashes$member_id['name'] );
                    
    $user_id $member_id['user_id'];
                    
    $date date"Y-m-d H:i:s" );
                    if( 
    $send_email $send_email $member_id['email'];
                   
                    
    $db->query"INSERT INTO ".PREFIX."_tickets (`title`,`status`,`user_id`,`user`,`date`,`email`,`priority`,`quest`,`answer`,`last_quest`) VALUES ('$subject','1','$user_id','$user','$date','$send_email','$priority','1','0','$date')" );
                    
    $id $db->insert_id();
                   
                    
    $db->query"INSERT INTO ".PREFIX."_tickets_text (`text`,`user_id`,`user`,`official`,`date`,`ticket`,`file`,`file_server`) VALUES ('$message','$user_id','$user','0','$date','$id','$file_name','$upload_file_name')" );
                   
                    if( 
    $tickets_config['email_create'] == "yes" && $tickets_config['email'] != "" )
                        {
                            
    $host $_SERVER['HTTP_HOST'];
                            
    $link_email "http://{$host}/".$config['admin_path']."?mod=tickets&action=read&id={$id}";
                            require_once( 
    ENGINE_DIR.'/data/tickets.tpl.config.php' );
                            include_once 
    ENGINE_DIR.'/classes/mail.class.php';
                            
    $mail = new dle_mail$config );
                            
    $tickets_email['create'] = stripslashes$tickets_email['create'] );
                            
    $tickets_email['create'] = str_replace"%time%"$date$tickets_email['create'] );
                            
    $tickets_email['create'] = str_replace"%user_create%"$user$tickets_email['create'] );
                            
    $tickets_email['create'] = str_replace"%title%"$subject$tickets_email['create'] );
                            
    $tickets_email['create'] = str_replace"%link%"$link_email$tickets_email['create'] );
                            
    $mail->send$tickets_config['email'], "Создан новый тикет"$tickets_email['create'] );   
                        }
    в своё время постенькую системку тикетов писал для локального сайта,потом тупо забил
     
  7. Denvut

    Denvut Создатель

    Регистр.:
    27 сен 2012
    Сообщения:
    45
    Симпатии:
    7
    Добавлю свои пять копеек в эту тему, ибо сам столкнулся за основу взял ваш пример, но столкнулся с проблемой :
    Я хотел чтобы форма обратной связи подгружалась на главной но увы - поля формы появлялись но ни кнопка отправить ни капча не работали и можно было просто лицезреть [not-logged] [/not-logged] [sec_code] [/sec_code] [recaptcha] [/recaptcha] {code} {recipient} {recaptcha}
    Спасибо умным людям подсказали следующее:
    тут оригинал:
    http://helpmeonline.ru/forma-obratnojj-svyazi-na-glavnojj-stranice-dle.html
    ниже если оригинал потеряется:
    Форма обратной связи на главной странице DLE

    Задумалось как-то мне сделать форму обратной связи на главной странице в сайдбаре сайта
    Казалось делов-то, {include file="feedback.tpl"} - и все должно работать. Но не тут-то было... Не работает...
    Пошел спросил у Гугла, у Яндекса... Намеки есть - а вот полного решения нет. Кроме как использовать сторонние модули, или стороннюю форму связи. Но мне хотелось стандартную...
    Методом научного тыка получилось так:
    В папке engine/modules/ создаем файл feed.php.
    В index.php подключаем его в качестве обработчика:
    Найти:
    require_once ROOT_DIR . '/engine/init.php';
    После добавить:
    require_once(ENGINE_DIR. '/modules/feed.php');
    Далее в этом же index.php добавляем переменную:
    Найти:
    $tpl->set ( '{speedbar}', $tpl->result['speedbar'] );
    После добавить:
    $tpl->set('{feed}', $tpl->result['feed']);
    Копируем содержимое feedback.php (папка engine/modules/) в файл feed.php
    В самое начало файла добавляем код:
    $tpl->load_template('feed.tpl');
    И в конце файла заменяем:
    $tpl->compile('content');
    на
    $tpl->compile('feed');
    И в нужном месте в main.tpl вставляем код:
    {feed}
    Теперь создаем в шаблоне файл feed.tpl и копируем в него содержимое feedback.tpl
    Пробуем - форма должна появиться в нужном месте на главной сайта.
     
  8. gon9

    gon9 Постоялец

    Регистр.:
    18 май 2013
    Сообщения:
    52
    Симпатии:
    1
    а для 9.8 скрипт подойдет?
     
  9. Denvut

    Denvut Создатель

    Регистр.:
    27 сен 2012
    Сообщения:
    45
    Симпатии:
    7
  10. artioma

    artioma Писатель

    Регистр.:
    6 авг 2013
    Сообщения:
    6
    Симпатии:
    0
    Спасибо, было полезно. А как сделать в модальном окне полной новости?
    Просто когда пишешь - {include file="order"} , появляются теги [not-logged] [/not-logged] [sec_code][/sec_code] [recaptcha][/recaptcha] [question] [/question] и так далее (все поля есть) но они не работают.

    За ранее большое спасибо.