1 2012-04-15 18:43:31

Тема: Вопросы по написанию плагинов

Не могу понять как нужно выводить шаблон при обработке формы.

шаблон index плагина:


    
'multipart/form-data', 'formmethod'=>'post')); echo Form::radio('clearpasswd'); echo __('Reset password'); echo Html::br(1); echo Form::radio('changepasswd'); echo __('Change password'); echo Html::br(2); echo Form::label('newpasswd', __('Enter new password')); echo Form::input('newpasswd', $newpasswd); echo Html::br(2); echo Form::submit('send_passwd', __('Apply changes')); echo Form::close(); ?>

шаблон error -


    

вывод индекса:

public static function content(){
            $newpasswd = '';
            $lines = '';
            // Display view
            View::factory('passwordreset/views/frontend/index')
                    ->assign('newpasswd', $newpasswd)
                    ->assign('lines', $lines)
                    ->display();
        }

обработка формы:

public static function main(){
            // Get send request over post metod
            // -------------------------------------    
            if (Request::post('send_passwd')) {
                $lines = file("Z:\home\monstra\www\passwd1");
                // если ошибка чтения
                if (!$lines) {
                    $error = __('Error read passwd');
                    // Display view
                    View::factory('passwordreset/views/frontend/error')    
                        ->assign('error', $error)
                        ->display();
                    break;
                }
                //foreach 
                $newpasswd='';
                // Display view
                View::factory('passwordreset/views/frontend/index')
                    ->assign('lines', $lines)
                    ->assign('newpasswd', $newpasswd)                    
                    ->display();
            }
        }

если я не ставлю break, то выводятся последовательно два шиблона - error и index. если ставлю, то выводится вот это -


    
Ошибка открытия файла

Тестовая версия

т.е. без остальных элементов индексного шаблона темы.

как правильно нужно делать?

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

2 2012-04-15 18:59:56

Re: Вопросы по написанию плагинов

Что это ? Эта штука перезаписывает зачем то пароль ?

Сайт Awilum

Поделиться

3 2012-04-15 19:01:06 (2012-04-15 19:01:43 отредактировано El'Drako)

Re: Вопросы по написанию плагинов

да это просто левый текстовый файл в несколько строк. для тренировки. к файлам монстры он отношения не имеет.
и пока только читается wink

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

4 2012-04-15 19:02:20

Re: Вопросы по написанию плагинов

По поводу вьюхи. Если ее надо вывести где нибудь потом, то можно ее записать в переменную не выводя методом display()
Посмотрите плагин Контакт.

$output = View::factory('blog/views/frontend/index')
        ->assign('var', 'value')
        ->render();  
echo $output;

Сайт Awilum

Поделиться

5 2012-04-15 19:07:00

Re: Вопросы по написанию плагинов

зачем потом? здесь приведено обычное действие: форма -> submit -> вывод страницы результата или ошибки.

но почему-то после вывода шаблона error далее выводится index (когда в условии после display() нет break).
если же поставить break, то выводится только содержимое шаблона error без остального от шаблона дефолтной темы.

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

6 2012-04-15 19:12:41

Re: Вопросы по написанию плагинов

форма -> submit -> вывод сообщения результата или ошибки.


     */
    class Contact {
        public static function _shorcode($attributes) {
            return Contact::form($attributes['recipient']);
        }
        public static function form($recipient) {
            $name  = Request::post('contact_name'); 
            $email = Request::post('contact_email');                    
            $body  = Request::post('contact_body'); 
            $errors = array();
            if (Request::post('contact_submit')) {
                if (Request::post('contact_name') == '' || Request::post('contact_email') == '' || Request::post('contact_body') == '') {
                    $errors['contact_empty_fields'] = __('Empty required fields!');
                }
                if ( ! Valid::email(Request::post('contact_email'))) {
                    $errors['contact_email_not_valid'] = __('Email address is not valid!');
                }
                if (count($errors) == 0) {
                    $recipient = $recipient;
                    $subject = $name;
                    $header = "From: ". $name . " \r\n";
                    if (mail($recipient, $subject, $body, $header)) {
                        Notification::setNow('success', 'A letter has been sent!');
                    } else {
                        Notification::setNow('error', 'A Letter was not sent!');
                    }
                }
            }
            return View::factory('contact/views/frontend/form')
                    ->assign('name', $name)
                    ->assign('email', $email)
                    ->assign('body', $body)
                    ->assign('errors', $errors)
                    ->render();            
        }
        public static function display($recipient) {
            echo Contact::form($recipient);          
        }
    }

Сайт Awilum

Поделиться

7 2012-04-15 19:24:04 (2012-04-15 19:25:33 отредактировано El'Drako)

Re: Вопросы по написанию плагинов

хорошо, оставим в покое ошибку, раз мой вопрос не совсем верно понят.

форма. шаг1. шаблон step1 - submit - форма. шаг2. шаблон step2 - submit - результат.
итого 4 шаблона: index, step1, step2, done.

как их вывести, обрабатывая запрос post?

исходная страница выводится в public static function content(). так?
запросы обрабатываются в public static function main(), исходя из примера песочницы?

обычная структура:

если пост=шаг1, то обрабатываем и выводим шаг2 или ошибку.
если пост=шаг2, то обрабатываем и выводим результат или ошибку.

что получается у меня при попытке вывести второй шаблон написано выше.
в контакте же пример с одним шаблоном.

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

8 2012-04-15 19:38:10

Re: Вопросы по написанию плагинов

по адресу ххххх загрузится шаблон index

public static function content(){
            $newpasswd = '';
            $lines = '';
            // Display view
            View::factory('passwordreset/views/frontend/index')
                    ->assign('newpasswd', $newpasswd)
                    ->assign('lines', $lines)
                    ->display();
        }

И по этому же адресу еще раз у вас загружается шаблон index при сабмите формы

public static function main(){
            // Get send request over post metod
            // -------------------------------------    
            if (Request::post('send_passwd')) {
                $lines = file("Z:\home\monstra\www\passwd1");
                // если ошибка чтения
                if (!$lines) {
                    $error = __('Error read passwd');
                    // Display view
                    View::factory('passwordreset/views/frontend/error')    
                        ->assign('error', $error)
                        ->display();
                    break;
                }
                //foreach 
                $newpasswd='';
                // Display view
                View::factory('passwordreset/views/frontend/index')
                    ->assign('lines', $lines)
                    ->assign('newpasswd', $newpasswd)                    
                    ->display();
            }
        }

main() и content() обрабатываются на одной странице(по одному адресу) если там и там выводить один и тот же шаблон, то выводится будет два одинаковых шаблона.

p.s.
Может быть я капитан очевидность))), а может я не понял все же проблему... перечитав 0 пост

Сайт Awilum

Поделиться

9 2012-04-15 19:44:09

Re: Вопросы по написанию плагинов

форма. шаг1. шаблон step1 - submit - форма. шаг2. шаблон step2 - submit - результат.
итого 4 шаблона: index, step1, step2, done.

как их вывести, обрабатывая запрос post?

if (Request::post('something')) {
вьюшка
}

Сайт Awilum

Поделиться

10 2012-04-15 19:58:11

Re: Вопросы по написанию плагинов

Набросал маленький пример... Оно ?

';
    } elseif (Request::post('submit2')) {
        echo 'Done';
    } else {
        echo '
'; } ?>

Тут:
Submit 1 - index - first step
Submit 2 - second step
Done. - result page/view

Сайт Awilum

Поделиться

11 2012-04-15 20:15:30

Re: Вопросы по написанию плагинов

        // Set Sandbox content
        public static function content(){
            if (Request::post('submit1')) {
                View::factory('sandbox/views/frontend/step2')->display();
            } elseif (Request::post('submit2')) {
                View::factory('sandbox/views/frontend/done')->display();
            } else {
                View::factory('sandbox/views/frontend/step1')->display(); 
            } 
        }
Done!

Сайт Awilum

Поделиться

12 2012-04-15 20:19:44

Re: Вопросы по написанию плагинов

Еще такой вот вариант


    /**
     * Sandbox simple class
     */
    class Sandbox extends Frontend {
        public static $output = '';
        // Sandbox main function
        public static function main(){
            if (Request::post('submit1')) {
                Sandbox::$output = View::factory('sandbox/views/frontend/step2')->render();
            } elseif (Request::post('submit2')) {
                Sandbox::$output = View::factory('sandbox/views/frontend/done')->render();
            } else {
                Sandbox::$output = View::factory('sandbox/views/frontend/step1')->render(); 
            } 
        }
        // Set Sandbox title
        public static function title(){
            return 'Sandbox title';
        }
        // Set Sandbox keywords
        public static function keywords(){
            return 'Sandbox keywords';
        }
        // Set Sandbox description
        public static function description(){
            return 'Sandbox description';
        }
        // Set Sandbox content
        public static function content(){
            echo Sandbox::$output;
        }
        // Set Sandbox template
        public static function template() {
            return 'index';
        }
    }

Сайт Awilum

Поделиться

13 2012-04-15 20:22:49

Re: Вопросы по написанию плагинов

main() и content() обрабатываются на одной странице(по одному адресу) если там и там выводить один и тот же шаблон, то выводится будет два одинаковых шаблона.

тогда нафига их два, если всё можно делать в одном?

с этим разобрались.

Набросал маленький пример... Оно ?

именно кучи подобных elseif я и хочу избежать.

я понял, где ошибка - надо спать больше. -_-

public static function content(){
            $newpasswd = '';
            $lines = '';
            // Get send request over post metod
            // -------------------------------------    
            if (Request::post('send_passwd')) {
                $lines = file("Z:\home\monstra\www\passwd1");
                // если ошибка чтения
                if (!$lines) {
                    $error = __('Error read passwd');
                    // Display view
                    View::factory('passwordreset/views/frontend/errors')    
                        ->assign('error', $error)
                        ->display();
                }
                return;
            }
            // Display view
            View::factory('passwordreset/views/frontend/index')
                    ->assign('newpasswd', $newpasswd)
                    ->assign('lines', $lines)
                    ->display();
        }

здесь нужен правильный выход из функции, а не обрыв скрипта по exit.

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

14 2012-04-15 20:36:52

Re: Вопросы по написанию плагинов

main() класса запускается раньше чем content() и раньше хука frontend_pre_render

да, в main() нужно грузить что либо и распедаливать тоже в нем можно.
и все что загрузили (таблицы, поля и тд..) отправляем переменные класса (Можно посмотреть плагин Pages) и юзаем их

P.S.
Это относятся только к плагину КОТОРЫЙ = КОМПОНЕНТ СИСТЕМЫ

Сайт Awilum

Поделиться

15 2012-04-15 20:45:07 (2012-04-15 20:45:33 отредактировано El'Drako)

Re: Вопросы по написанию плагинов

т.е. по сути тогда content() можно не юзать, а делать всё в main()? ведь осуществляется просто последовательный вызов двух функций. или есть исключения?

про content() и компонент системы я понял - хук в плагине контакта нагляден.

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

16

Re: Вопросы по написанию плагинов

main() - главная функция/метод класса (ПЛАГИНА КОМПОНЕНТА) стартует сразу после инициализации ядра. Предназначена для загрузки чего либо и бизнес логики плагина...

content() - функция/метод класса (ПЛАГИНА КОМПОНЕНТА) стартует после инициализации ядра -> обработка всех экшенов на хук frontend_pre_render и обрабатывается в site.php (да, на данный момент просто записывается, но...)
По сути отвечает за отображение данных/контента (ПЛАГИНА КОМПОНЕНТА)  и пост обработку: фильтрацию например.

и в шаблонах мы пишем то так:

который дергает content() функция/метод класса (ПЛАГИНА КОМПОНЕНТА)

Сайт Awilum

Поделиться

17 2012-04-15 21:28:14

Re: Вопросы по написанию плагинов

подводя итог - грубо говоря в main() рассчитываем, в content() - сортируем и выводим?
но опять же тогда возникает повторение кода при необходимости выбора обработки под каждый случай входных параметров.

всё, что я сейчас понял - пиши там, где работает так, как тебе надо.

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

18 2012-04-15 21:58:19

Re: Вопросы по написанию плагинов

Можно все тупо распедалить и в content() но если ты выберешь title,description,keywords своего плагина в content() и запишешь их , то они тебе не покажутся нигде! ... вот наглядный пример:


Так писать нельзя. Работать не будет!

    class Sandbox extends Frontend {
        public static $title = '';
        public static $keywords = '';
        public static $description = '';
        public static function title(){
            return Sandbox::$title;
        }
        public static function keywords(){
            return Sandbox::$keywords;
        }
        public static function description(){
            return Sandbox::$description;
        }
        public static function content() {
            Sandbox::$title = 'My plugin title';
            Sandbox::$keywords = 'My plugin keywords';
            Sandbox::$description = 'My plugin description';
            return 'some content here';
        }
    }

Так нужно писать!

    class Sandbox extends Frontend {
        public static $title = '';
        public static $keywords = '';
        public static $description = '';
        public static $content = '';
        public static function main() {
            Sandbox::$title = 'My plugin title';
            Sandbox::$keywords = 'My plugin keywords';
            Sandbox::$description = 'My plugin description';
            Sandbox::$content = 'some content here';
        }
        public static function title(){
            return Sandbox::$title;
        }
        public static function keywords(){
            return Sandbox::$keywords;
        }
        public static function description(){
            return Sandbox::$description;
        }
        public static function content() {
            return Sandbox::$content;
        }
    }


всё, что я сейчас понял - пиши там, где работает так, как тебе надо.

Пишешь там где надо (есть заранее определенный, наглядный каркас - sandbox (ПЛАГИН КОМПОНЕНТ))!
Конечно пишешь так как тебе надо.

В Template CMS с  этим еще хуже...

Есть предложения как распедалить POST иначе ?

Сайт Awilum

Поделиться

19 2012-04-16 04:24:22

Re: Вопросы по написанию плагинов

Есть предложения как распедалить POST иначе ?

ну, как показывает практика, нагляднее и проще использовать такой каркас:

public static function content(){
            $lines = '';
            // Get send request over post metod
            // -------------------------------------   
            if (Request::post('step1')) {
           
                $lines = "";
                // если ошибка чтения
                if (!$lines) {
                    $error = __('Error');
                    // Display view
                    Sandbox::$output = View::factory('passwordreset/views/frontend/errors')   
                        ->assign('error', $error)
                        ->render(); return;
                }
                // Display view
                Sandbox::$output = View::factory('passwordreset/views/frontend/step2')   
                        ->assign('lines', $lines)
                    ->render();
                return;
            }

            // Get send request over post metod
            // -------------------------------------   
            if (Request::post('step2')) {
           
                $lines2 = "";
                $lines= Request::post('lines');
                // если ошибка чтения
                if (!$lines2) {
                    $error = __('Error');
                    // Display view
                    Sandbox::$output = View::factory('passwordreset/views/frontend/errors')   
                        ->assign('lines2', $lines2)
                        ->assign('lines', $lines)
                        ->render(); return;
                }
                if ($lines2 != $lines) {
                // Display view
                Sandbox::$output = View::factory('passwordreset/views/frontend/done')   
                        ->assign('lines', $lines)
                        ->assign('lines2', $lines2)
                    ->render();
                return;
            }

           
            // Display view
            Sandbox::$output = View::factory('passwordreset/views/frontend/index')
                    ->assign('lines', $lines)
                    ->render();
        }

        // Set Sandbox content
        public static function content(){
            echo Sandbox::$output;
        }

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

20 2012-04-16 04:26:07

Re: Вопросы по написанию плагинов

однако, как же на форуме не хватает подсветки кода.

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

21 2012-04-16 04:27:44

Re: Вопросы по написанию плагинов

Так нужно писать!

а мне нравится так. Если я правильно понял, не нужно будет почти один и тот же код писать в title, description, keywords

Поделиться

22 2012-04-16 04:35:33

Re: Вопросы по написанию плагинов

а мне нравится так.

по поводу

        public static $title = '';
        public static $keywords = '';
        public static $description = '';
        public static $content = '';

никто и не спорил.

Страдание фигнёй на рабочем месте развивает боковое зрение, слух, скорость реакции и бдительность в целом.

Поделиться

23 2012-04-16 04:57:46

Re: Вопросы по написанию плагинов

JINN, что тебе нравится ? я же написал почему писать надо так, потому что так как тебе нравится писать работать не будет. Так как тайтл не будет знать ничего о странице (смотреть на плагин Pages)

(!) В Template CMS для того что бы загрузить одну страницу, она для title, keywords, description, date, author и тд. столько же раз запускает функцию загрузки страницы! то есть все данные для страницы грузятся и при вызове title и при вызове keywords и тд.. Это же сколько нагрузки было на одну страницу!

(!) Эта проблема была решена в Монстре! Функция/метод main() грузится ОДИН РАЗ И ПЕРЕД  title, keywords, description, date, author !

Сайт Awilum

Поделиться

24 2012-04-16 04:59:19

Re: Вопросы по написанию плагинов

El'Drako смотри еще раз пример и запусти его.

толку что ты их напишешь

        public static $title = '';
        public static $keywords = '';
        public static $description = '';
        public static $content = '';

и будешь использовать ПЕРВЫЙ вариант, так как их ты не увидишь нигде на странице!

Сайт Awilum

Поделиться

25 2012-04-16 05:11:10

Re: Вопросы по написанию плагинов

JINN, что тебе нравится ? я же написал почему писать надо так, потому что так как тебе нравится писать работать не будет.

Либо я тебя не понял, либо ты меня. Прочитай свой пост, где ты писал как не надо и как надо. Мне понравился тот кусок кода, где:

public static function main() {
            Sandbox::$title = 'My plugin title';
            Sandbox::$keywords = 'My plugin keywords';
            Sandbox::$description = 'My plugin description';
            Sandbox::$content = 'some content here';
        }

Поделиться