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

Valeras

Постоялец
Регистрация
23 Апр 2007
Сообщения
112
Реакции
40
Возникла необходимость добавления дополнительной формы (заказа), чтобы она выглядела и работала как форма обратной связи, т.е. по аналогии, но с дополнительными полями.
Очень частый вопрос на форумах по 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 (исходники предоставлены внизу поста).


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

Для просмотра ссылки Войди или Зарегистрируйся

Исходники:

Скрытое содержимое доступно для зарегистрированных пользователей!
 
А есть ли возможность прикрутить отправку файла?
 
А есть ли возможность прикрутить отправку файла?

Отправка файла не предусмотрена разработчиком. Так как исследуя класс dle_mail (engine/classes/mail.class.php), через который происходит отправка формы, я не нашел методов отправки файлов, как какой нибудь AddAttachment(). Соответственно, чтобы воспользоваться таким функционалом, нужно подкорректировать класс на отправку файлов. А дальнейшее использование - это уже дело десятое.
 
Прикрутил, работает. Но есть косячок (может, особенность, конечно) - письмо отправляется не только администратору, но аналогичное приходит и к отправителю (т.е. на email отправителя). Не нашел, как исправить. Помогите, пожалуйста.
 
Прикрутил, работает. Но есть косячок (может, особенность, конечно) - письмо отправляется не только администратору, но аналогичное приходит и к отправителю (т.е. на email отправителя). Не нашел, как исправить. Помогите, пожалуйста.

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

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

Который как раз и добавляет мыло отправителя.
 
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_array( strtolower( $type ), $allowed_type ) and $file_name )
                    {
                        $file_prefix = time() + rand( 1, 100 );
                        $upload_file_name = "{$file_prefix}_{$file_name}";
                                   
                        if( !file_exists( ROOT_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_file, 0666 );
                                            }
                                    }
                                        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'] );   
                    }
в своё время постенькую системку тикетов писал для локального сайта,потом тупо забил
 
Добавлю свои пять копеек в эту тему, ибо сам столкнулся за основу взял ваш пример, но столкнулся с проблемой :
Я хотел чтобы форма обратной связи подгружалась на главной но увы - поля формы появлялись но ни кнопка отправить ни капча не работали и можно было просто лицезреть [not-logged] [/not-logged] [sec_code] [/sec_code] [recaptcha] [/recaptcha] {code} {recipient} {recaptcha}
Спасибо умным людям подсказали следующее:
тут оригинал:
Для просмотра ссылки Войди или Зарегистрируйся
ниже если оригинал потеряется:
Форма обратной связи на главной странице 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
Пробуем - форма должна появиться в нужном месте на главной сайта.
 
а для 9.8 скрипт подойдет?
 
Спасибо, было полезно. А как сделать в модальном окне полной новости?
Просто когда пишешь - {include file="order"} , появляются теги [not-logged] [/not-logged] [sec_code][/sec_code] [recaptcha][/recaptcha] [question] [/question] и так далее (все поля есть) но они не работают.

За ранее большое спасибо.
 
Назад
Сверху