#1 2014-10-19 19:44

pvl
Пользователь

Ajax. Вопрос из яслей.

Приветствую!
Не являясь программистом ни по образованию ни по роду деятельности, все ж порой поделываю всякие мелочи в свое удовольствие. И вот задумал переделать пару своих поделок чтоб было все по уму. А это подразумевает использование AJAX. Я безусловно почитаю теорию, т.к. раньше всегда обходил ajax стороной, хоть и понимал что ничего сильно сложного там нет. Но при чтении теории хотелось бы поиметь перед глазами работающий пример. Ну а раз речь о SS5, то и пример хотелось бы поиметь из него. Может есть у кого под рукой плагин (или болванка) который бы используя хук $backend_products.%plugin_id%.toolbar_organize_li  открывал диалоговое окно, зачитывал настройки плагина, формировал и отправлял запрос? Естественно, возможны варианты.
Ну или если нет ничего подобного, то может подскажете какой из плагинов в магазине Webasyst работает по такому (ну или приближенному) принципу? Пробежавшись по перечню плагинов не нашел подходящего. А так бы даж купил, расковырял и с ajax'ом разобраться попробовал бы smile
Спасибо.

Неактивен

 

#2 2014-10-20 10:37

rat
Администратор

Re: Ajax. Вопрос из яслей.

wa-apps/shop/plugins/test/js/test.js

Код:

$(function(){
    
    $('body').on('click', '.test-plugin.view-config', function() {
        var link = $(this);
        link.prepend('<i class="icon16 loading"></i>');
        $.get('?plugin=test&action=getConfig', function(response) {
            link.find('.loading').remove();
            $('<h1>Current settings:</h1>' + 
                '<div>' + response + '</div>' + 
                '<p class="red error"></p>')
                .waDialog({
                'width': '400px',
                'height': '200px',
                'buttons': '<input type="submit" value="Update settings">&nbsp;<a href="javascript:void(0)" class="cancel">cancel</a>',
                onSubmit: function(d) {
                    var dialog = $(d);
                    dialog.find('.cancel').after('<i class="icon16 loading"></i>');
                    dialog.find('.error').empty();
                    $.post('?plugin=test&action=saveConfig', $(this).serialize(), function(response) {
                        dialog.find('.loading').remove();
                        if (response.status == 'fail') {
                            dialog.find('.error').append(response.errors.join('<br>'));
                        } else {
                            dialog.trigger('close');
                        }
                   }, 'json');
                   return false;
                },
                onClose: function() {
                    $(this).remove();
                }
            });
        });
        return false;
    });
    
});

wa-apps/shop/plugins/test/lib/actions/backend/shopTestPluginBackendGetConfig.action.php

Код:

<?php

class shopTestPluginBackendGetConfigAction extends waViewAction
{
    public function execute()
    {
        $asm = new waAppSettingsModel();
        $this->view->assign('some_setting', $asm->get('shop.test', 'some_setting'));
    }
}

wa-apps/shop/plugins/test/lib/actions/backend/shopTestPluginBackendSaveConfig.controller.php

Код:

<?php
 class shopTestPluginBackendSaveConfigController extends waJsonController
 {
     public function execute()
     {
         if (strlen($some_setting = waRequest::post('some_setting', '', waRequest::TYPE_STRING_TRIM))) {
            $asm = new waAppSettingsModel();
            $asm->set('shop.test', 'some_setting', $some_setting);
         } else {
             $this->errors[] = _wp('Empty setting value!');
         }
     }
 }

wa-apps/shop/plugins/test/lib/config/plugin.php

Код:

<?php

return array(
    'name' => 'test',
    'handlers' => array(
        'backend_products' => 'backendProducts',
    ),
);

wa-apps/shop/plugins/test/lib/shopTest.plugin.php

Код:

<?php

class shopTestPlugin extends shopPlugin
{

    public function backendProducts()
    {
        $this->addJs('js/test.js');
        return array('toolbar_organize_li' => '
            <li>
                <a href="" class="test-plugin view-config">View plugin config</a>
            </li>
        ');
    }

}

wa-apps/shop/plugins/test/templates/actions/backend/BackendGetConfig.html

Код:

<div class="field">
    <div class="name">[`Some setting`]</div>
    <div class="value"><input name="some_setting" value="{$some_setting}"></div>
</div>

Неактивен

 

#3 2014-10-20 11:50

pashkent
Пользователь

Re: Ajax. Вопрос из яслей.

А реально (как) получить даные через ajax с хелпера? для витрины. Например список фильтров для категории.
Ну или любой другой пример с бд.

Неактивен

 

#4 2014-10-20 14:00

pvl
Пользователь

Re: Ajax. Вопрос из яслей.

rat, спасибо большое!

Неактивен

 

#5 2014-10-20 14:14

rat
Администратор

Re: Ajax. Вопрос из яслей.

Хелпер (если вы имеете в виду это), может добавить содержимое на существующую страницу. Таким образом, AJAX-запрос поможет вам лишь получить содержимое такой страницы. В таком случае вам может понадобиться отдельная страница, на которой нет ничего, кроме содержимого, формируемого таким хелпером.

Однако для создания этой страницы всё равно нужен контроллер — PHP-класс, возвращающий (или не возвращающий) какое-то содержимое при запросе определённого URL. А контроллер нужно писать на PHP, как и хелпер. Так что в итоге будет скорее всего проще реализовать нужную логику сразу в виде контроллера, который и вернёт нужное содержимое, а не городить сложную логику в виде "контроллер - HTML-шаблон - хелпер". А собственные контроллеры нужно создавать в рамках плагина. Так что вместо хелпера вам стоит посмотреть в сторону создания плагина.

Или я не так понял ваш вопрос?

Неактивен

 

#6 2014-10-20 15:01

pashkent
Пользователь

Re: Ajax. Вопрос из яслей.

rat написал:

Или я не так понял ваш вопрос?

Вопрос поняли, спасибо.

Если не сложно, можете привести пример елементарного плагина который, сможет вывести любые данные (с бд) по ajax на витрине?

Большое спасибо.

Неактивен

 

Board footer

Powered by PunBB