-- Ken Petri <[EMAIL PROTECTED]> wrote
(on Friday, 05 September 2008, 07:41 AM -0700):
> Thank you. This interchange was extremely helpful for me. 

Glad I could be of help!

> You and the others working on ZF are doing a fantastic job modernizing
> PHP coding practices.  And this Nabble forum is a great support
> system.

The fun part is that most of us on the "Nabble forum" are actually using
a mailing list. :) Nabble integration was added as an afterthought to a)
provide a browseable archive of messages, and b) appeal to those like
yourself who prefer to use a forum interface. I'm glad that the strategy
is working!

> Matthew Weier O'Phinney-3 wrote:
> > 
> > -- Ken Petri <[EMAIL PROTECTED]> wrote
> > (on Friday, 05 September 2008, 12:30 AM -0700):
> >> After some fiddling around, I downloaded a copy of dojo from the
> >> dojotoolkit.org web site and replaced the code that had shipped with ZF
> >> 1.6.
> >> This fixed the "undefined node" problem and the button began to render.
> >> 
> >> I implemented all of the changes you recommended for the bootstrap and
> >> the
> >> code is now cleaner in the layout.
> >> 
> >> But I have a related question. I have been trying to discover an optimal
> >> way
> >> to hook-up dojo with elements programmatically. Currently, I'm not using
> >> the
> >> form view helpers to render out the elements. I'm just hard coding the
> >> HTML.
> >> 
> >> Here is the significant portion of my index view script:
> >> -------------
> >> <?php $this->dojo()->javascriptCaptureStart() ?>
> >>   function alert1()
> >>   {
> >>     alert("go 1");
> >>   }
> >>   function alert2()
> >>   {
> >>     alert("go 2");
> >>   }
> >> <?php $this->dojo()->javascriptCaptureEnd() ?>
> >> 
> >> <?php $this->dojo()->onLoadCaptureStart() ?>
> >>   function() {
> >> 
> >>     var params1 = {
> >>       label: "I am button 1",
> >>       onClick: alert1
> >>     };
> >>     var params2 = {
> >>       label: "I am button 2",
> >>       onClick: alert2
> >>     };
> >> 
> >>     new dijit.form.Button( params1, dojo.byId("button1"));
> >>     new dijit.form.Button( params2, dojo.byId("button2"));
> >> 
> >>   }
> >> <?php $this->dojo()->onLoadCaptureEnd() ?> 
> >> -------------
> >> 
> >> I then hard code a couple of buttons and give them the proper ids so that
> >> dojo.byId can find them.
> >> 
> >> Is this a reasonable approach. Can you recommend something more
> >> streamlined,
> >> cleaner, clearer? Are there emerging best practices?
> > 
> > Everything you do above for creating the buttons (not the functions they
> > attach to, though) is already possible with the view helpers; it makes
> > no sense to me to write the code manually, as this is what the
> > integration points try to solve.
> > 
> > You can create your buttons like this:
> > 
> >     <?= $this->button('button1', 'I am button 1', array('onClick' =>
> > 'alert1')) ?>
> >     <?= $this->button('button2', 'I am button 2', array('onClick' =>
> > 'alert2')) ?>
> > 
> > which will create all the functionality you need, and, by default, do it
> > programmatically. You would then only need the code you provided for
> > creating the alert1/alert2 functions. There is really zero reason to
> > write the javascript manually as you are doing here.
> > 
> >> Matthew Weier O'Phinney-3 wrote:
> >> > 
> >> > -- Ken Petri <[EMAIL PROTECTED]> wrote
> >> > (on Thursday, 04 September 2008, 01:54 PM -0700):
> >> >> I need some (I hope) very basic help in getting dojo up and working
> >> and
> >> >> some
> >> >> notion of how to do not have to use the declarative syntax would also
> >> be
> >> >> great.
> >> > 
> >> > First off, programmatic usage is the default, so nothing specialy you
> >> > need to do there.
> >> > 
> >> >> Here are the contents of the files in question:
> >> >> bootstrap.php:
> >> >> -------------
> >> >> <?php 
> >> >> // ** Check to see if the environment is already setup **
> >> >> if (isset($bootstrap) && $bootstrap) { 
> >> >>     // Enable all errors so we'll know when something goes wrong. 
> >> >>     error_reporting(E_ALL | E_STRICT);  
> >> >>     ini_set('display_startup_errors', 1);  
> >> >>     ini_set('display_errors', 1); 
> >> >>  
> >> >>     set_include_path('../library');  
> >> >>  
> >> >>     require_once "Zend/Loader.php"; 
> >> >>     Zend_Loader::registerAutoload(); 
> >> >> 
> >> >> } 
> >> >> 
> >> >>  
> >> >> $frontController = Zend_Controller_Front::getInstance(); 
> >> >>
> >> $frontController->setControllerDirectory('../application/controllers'); 
> >> >> $frontController->setParam('env', 'development');
> >> >> 
> >> >> // set up dojo helper
> >> >> $viewRenderer =
> >> >> Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
> >> >> $viewRenderer->initView();
> >> >> Zend_Dojo::enableView($viewRenderer->view); 
> >> > 
> >> > That's all you need to do there. I'd do the following additional stuff:
> >> > 
> >> >     $viewRenderer->view->dojo()->setLocalPath('/js/dojo/dojo/dojo.js')
> >> >                               
> >> > ->addStyleSheetModule('dijit.themes.tundra')
> >> >                                ->disable();
> >> > 
> >> >> //set up the layout
> >> >> Zend_Layout::startMvc(array('layoutPath' =>
> >> >> '../application/views/layouts'));
> >> >> -------------
> >> >> 
> >> >> layout.phtml:
> >> >> -------------
> >> >> <?php echo $this->doctype('XHTML1_STRICT'); ?>
> >> >> 
> >> >> <html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en">
> >> >> <head>
> >> >> <?php echo $this->headTitle(); ?> 
> >> >> <?php echo $this->headMeta(); ?> 
> >> >> <?php echo $this->headLink(); ?> 
> >> >> <?php echo $this->headStyle(); ?> 
> >> >> <?php 
> >> >>   if ($this->dojo()->isEnabled()) :
> >> >>     $this->dojo()->setLocalPath('/js/dojo/dojo/dojo.js')
> >> >>                  ->addStyleSheetModule('dijit.themes.tundra');
> >> >>     echo $this->dojo(); 
> >> >>   endif;
> >> >> ?>
> >> > 
> >> > If you do as I suggest earlier, then all you need to do here is:
> >> > 
> >> >     <?php echo $this-dojo(); ?>
> >> > 
> >> >> <?php echo $this->headScript(); ?> 
> >> >> </head>
> >> >> <body class="tundra">
> >> >> 
> >> >> <?php echo $this->layout()->content; ?>
> >> >> 
> >> >> </body>
> >> >> </html>
> >> >> -------------
> >> >> 
> >> >> and the index view, index.phtml
> >> >> -------------
> >> >> <?php 
> >> >>   $this->dojo()->enable()
> >> >>        ->setDjConfigOption('parseOnLoad', true)
> >> > 
> >> > Only set parseOnLoad if you need to --- i.e., if you're creating markup
> >> > that defines dijits. It looks like you're doing that below, though.
> >> > 
> >> >>        ->requireModule('dijit.form.Button');
> >> >> ?>
> >> >> 
> >> >> <button dojoType="dijit.form.Button" id="helloButton">
> >> >>    Hello World!
> >> >>    <script type="dojo/method" event="onClick">
> >> >>         alert('You pressed the button');
> >> >>     </script>
> >> >> </button>
> >> >>
> >> >> -------------
> >> >> 
> >> >> What happens: 
> >> >> The page loads but I get a JavaScript error that says "node is
> >> undefined"
> >> >> coming from bootstrap.js in the dojo library. The page is blank and,
> >> >> looking
> >> >> at the DOM's view of the HTML (using Firebug) I see only:<div
> >> >> style="display: none;"/>
> >> > 
> >> > Is the path to dojo correct? did dojo.js load? does FireBug report that
> >> > dijit.form.Button loaded?
> >> > 
> >> >> So, something is wrong, but I sure can't figure out what.
> >> >> 
> >> >> Also, if someone has a fix for this, I would certainly appreciate an
> >> >> example
> >> >> of rendering out the same button example but programmatically. I would
> >> >> rather not have all those proprietary attributes in the button code.
> >> > 
> >> > First off, I wouldn't call it proprietary markup -- they're simply
> >> > attributes, plain and simple.
> >> > 
> >> > You can definitely do this programmatically, though:
> >> > 
> >> >     <?= $this->button('helloButton', 'Hello World!') ?>
> >> >     <? $this-dojo->onLoadCaptureStart() ?>
> >> >     function() {
> >> >         dojo.connect('helloButton', 'onclick', 'alert("You pressed the
> >> > button")');
> >> >     }
> >> >     <? $this-dojo->onLoadCaptureEnd() ?>
> >> > 
> >> > should do the trick (unsure of the alert statement in there, but I
> >> think
> >> > it's correct).

-- 
Matthew Weier O'Phinney
Software Architect       | [EMAIL PROTECTED]
Zend Framework           | http://framework.zend.com/

Reply via email to