First off, welcome to the grand experiment!
You are correct in your suggestion that the online docs, and by
extension, the docs bundled with Habari, should have a section on how
we have architected our AJAX system.
Another one for the chopping block!
chris
On Nov 11, 2008, at 4:55 AM, kanian wrote:
>
> Thanks for the answer Arthus. I will have learn more about what you
> just said.
> It would be great to have sections on ajax in the online docs.
>
> On Nov 10, 8:32 pm, Arthus Erea <[EMAIL PROTECTED]> wrote:
>> Actually, it is quite easy to do AJAX with Habari.
>>
>> First, write your JavaScript and include it using a hook in the
>> theme.
>> For examples of this, just check out the -extras repository.
>>
>> Have the AJAX request sent to example.com/habari/ajax/foobar. (You
>> can
>> generate this URL with URL::get('ajax', array('context' =>
>> 'foobar');)
>>
>> Then, in your function, just implement the ajax_foobar action.
>> (Make a
>> method named action_ajax_foobar).
>>
>> Whatever you do in that function (and only what you do in that
>> function) will be called when the request is sent. No hacking needed,
>> everything can be contained in your plugin file.
>>
>> On Nov 10, 2008, at 11:38 AM, kanian wrote:
>>
>>
>>
>>
>>
>>> I wrote a mail "plugin" based on swiftmailer and using ajax as a
>>> mean
>>> for sending user interactions back to the server. I followed the
>>> discussion about the mail functionality to be added to habari and
>>> habari's design philosophy. So here I am not trying to add a mail
>>> functionality to Habari, nor presenting a release version of my
>>> plugin
>>> per se, but rather I am experimenting with ajax and Habari.
>>> That being, being new to Habari I had to ack the index.php code to
>>> be
>>> able to make my asychronous calls to Habari, since I don't know yet
>>> the "right" way to do ajax with Habari.
>>> The technique I used allows me to load only the plugin concerned
>>> with
>>> the request and return results from that plugin directly in the
>>> response.
>>
>>> Here's how I proceded:
>>> In entry.single.php I added at the relevant place this piece of
>>> code:
>>> <?php if ( Plugins::is_loaded( 'Swiftmailer' ) ): ?>
>>> <span class="post-mail-friend">
>>> <?php $theme->show_mailer_prompt();?>
>>> </span>
>>> <?php endif; ?>
>>
>>> This is inserted by the theming engine as soon as a post is rendered
>>> to the screen.
>>> The theme_show_mailer_prompt( ) method in my plugin just returns a
>>> template that I named 'swiftmailer', whose most relevant part to
>>> this
>>> discussion is :
>>
>>> email post to a friend?
>>> <script language="javascript">
>>> function show_form_callback(responseText,statusCode,xhr)
>>> {
>>> //some code here
>>
>>> $('#send_email').livequery(
>>> 'click',
>>> function(){$("<div>").load("/habari/",
>>> {plugin:'swiftmailer',action:"mail"},send_email_callback)}
>>> );
>>> }
>>
>>> function show_form()
>>> {
>>> $("<div>").load("/habari/",
>>> {plugin:'swiftmailer',action:"show_mail_form"},show_form_callback);
>>> }
>>
>>> //some code here
>>
>>> </script>
>>
>>> So I send a 'plugin' token with the request specifying which plugin
>>> should receive this request, and action to perform by the plugin.
>>> In index.php I act based on the value of that token. The relevant
>>> code
>>> in index.php is :
>>
>>> header( 'Content-Type: text/html;charset=utf-8' );
>>
>>> //used for ajax calls to specific plugins
>>> if(array_key_exists('plugin',$_POST))
>>> {
>>
>>> $plugins = Plugins::list_active();
>>> foreach($plugins as $plugin)
>>> {
>>> $plugin_base = basename($plugin);
>>> if($_POST['plugin'].'.plugin.php'==$plugin_base)
>>> {
>>> include_once($plugin);
>>> Plugins::load($plugin);
>>> Plugins::act('plugins_loaded');
>>> // Start the session.
>>> Session::init();
>>> Plugins::act('init');
>>> Plugins::act($_POST['action']);
>>> exit();
>>> }
>>> }
>>
>>> echo($user_plugins.$_POST['plugin'].$ds.
>>> $_POST['plugin'].'.plugin.php');
>>> exit();
>>
>>> }
>>
>>> Then in my plugin (that I called unsurprisingly
>>> swiftmailer.plugin.php) , I have methods like this one to perform
>>> the
>>> action I want:
>>
>>> public function action_show_mail_form( )
>>> {
>>> $this->theme_load();
>>> echo $this->theme->fetch('swiftmailer_form' );
>>> }
>>
>>> with the theme_load function given here for clarity:
>>> function theme_load()
>>> {
>>> $themes = new Themes();
>>> $this->theme = $themes->create();
>>> }
>>
>>> Now what I would like to how many Habari design principles I have
>>> violated here :))
>>> Moer seriously how to do this properly with Habari?- Hide quoted
>>> text -
>>
>> - Show quoted text -
>
> >
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/habari-dev
-~----------~----~----~----~------~----~------~--~---