-- 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/
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/Basic-dojo-help-and-programmatic-dojo-example-tp19319767p19326278.html
> Sent from the Zend Framework mailing list archive at Nabble.com.
>
--
Matthew Weier O'Phinney
Software Architect | [EMAIL PROTECTED]
Zend Framework | http://framework.zend.com/