Best Practice for including Javascript in Zope Applications
Hello, I'm new to developing for zope, and I have a quick question regarding some best practices when using Javascript in zope applications. I would like to use Ext JS (http://www.extjs.com/ ) in an application that I am writing. It is a fairly extensive library, so I didn't really want to copy/paste every single file into a dtml method. I looked all over the place for some discussion on this subject, but only found things relating to plone (which apparently has a javascript registry); however, I wish to stay away from plone for this particular application. What should I do to use these libraries? Is there a canned solution for this sort of thing? Thank you much! -Matt
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Matt Hollingsworth wrote:
I'm new to developing for zope, and I have a quick question regarding some best practices when using Javascript in zope applications.
I would like to use Ext JS (http://www.extjs.com/ ) in an application that I am writing. It is a fairly extensive library, so I didn't really want to copy/paste every single file into a dtml method. I looked all over the place for some discussion on this subject, but only found things relating to plone (which apparently has a javascript registry); however, I wish to stay away from plone for this particular application.
What should I do to use these libraries? Is there a canned solution for this sort of thing?
The simplest route: - Create a "File" object in the ZMI for each separate javascript library (e.g., 'extlibrary.js'). - Upload the static content of the library file to that object. - Include a link to the JS library in your master page template, e.g.:: <script type="text/javascript" src="/extlibrary.js" /> Tres. - -- =================================================================== Tres Seaver +1 540-429-0999 tseaver@palladion.com Palladion Software "Excellence by Design" http://palladion.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFHevP1+gerLs4ltQ4RAvjPAJ9DzvRiALdpBCJWmgk/Iy5NE+WTgACfSwkP GpI0Nt2CC08qn7o4B+e/xcw= =dijk -----END PGP SIGNATURE-----
--On 1. Januar 2008 21:16:21 -0500 Tres Seaver <tseaver@palladion.com> wrote:
What should I do to use these libraries? Is there a canned solution for this sort of thing?
The simplest route:
- Create a "File" object in the ZMI for each separate javascript library (e.g., 'extlibrary.js').
- Upload the static content of the library file to that object.
- Include a link to the JS library in your master page template, e.g.::
<script type="text/javascript" src="/extlibrary.js" />
Larger JS frameworks like Dojo tend to be split across several files and directories. The fun starts when such frameworks load/reload stuff using relative URLs. A co-worker using Dojo intensively had to invest some time in order to integrate such a JS monster properly. As far as I remember Extjs also uses multiple files (but not as much as Dojo does)..so please check in advance. Andreas
--On 2. Januar 2008 06:16:06 +0100 Andreas Jung <lists@zopyx.com> wrote:
--On 1. Januar 2008 21:16:21 -0500 Tres Seaver <tseaver@palladion.com> wrote:
What should I do to use these libraries? Is there a canned solution for this sort of thing?
The simplest route:
- Create a "File" object in the ZMI for each separate javascript library (e.g., 'extlibrary.js').
- Upload the static content of the library file to that object.
- Include a link to the JS library in your master page template, e.g.::
<script type="text/javascript" src="/extlibrary.js" />
Larger JS frameworks like Dojo tend to be split across several files and directories. The fun starts when such frameworks load/reload stuff using relative URLs. A co-worker using Dojo intensively had to invest some time in order to integrate such a JS monster properly. As far as I remember Extjs also uses multiple files (but not as much as Dojo does)..so please check in advance.
Another point: consider using CMF and putting your library files into a directory system view on the filesystem. This makes your life much easier. -aj
Andreas Jung wrote:
...
Larger JS frameworks like Dojo tend to be split across several files and directories. The fun starts when such frameworks load/reload stuff using relative URLs. A co-worker using Dojo intensively had to invest some time in order to integrate such a JS monster properly. As far as I remember Extjs also uses multiple files (but not as much as Dojo does)..so please check in advance.
Another point: consider using CMF and putting your library files into a directory system view on the filesystem. This makes your life much easier.
Or just upload via WEBDAV. One of the biggest advantages of Zope is the isolation from physical file system. Regards Tino
Andreas Jung wrote:
...
Larger JS frameworks like Dojo tend to be split across several files and directories. The fun starts when such frameworks load/reload stuff using relative URLs. A co-worker using Dojo intensively had to invest some time in order to integrate such a JS monster properly. As far as I remember Extjs also uses multiple files (but not as much as Dojo does)..so please check in advance.
Another point: consider using CMF and putting your library files into a directory system view on the filesystem. This makes your life much easier.
Or just upload via WEBDAV. One of the biggest advantages of Zope is the isolation from physical file system.
Regards Tino
Hello, Thanks to everyone for your help. I thought about Tres's solution and quickly discovered that I would be doing a *lot* of clicking/typing if I wanted to upload all of the files necessary to make the ExtJS framework available. I'll look into the WebDAV idea; I didn't think of that until you mentioned it. However, I came up with another possible solution that may be generally useful after some (a lot actually) of coaxing. I threw this together in the time between my new year's festivities :) : it's incredibly sloppy at the moment, but before I worried about cleaning it up, I wanted to get some feedback from you guys about it (pardon the annoying formatting problems): def package_home(gdict): """Returns the location of the file that calls the function. You must pass it globals() as the argument for it to work right. :Parameters: gdict : dict A dictionary containing all of the global definitions for the module. This is accessible via the python built-in function globals() :return: The fully qualified path for the directory in which the calling module is residing :rtype: string """ filename = gdict["__file__"] return os.path.dirname(filename) class FileSystemResource(Implicit,Item): """FileSystemResource is meant to make it easy to access file system objects through Zope. It works by taking over the object traversal process to recursively return resources, simulating a directory structure, until it finally reaches the end (__call__()), when it accesses the file and returns it. If you do js = FileSystemResource() in the class that you are publishing, then http://www.domain.com/yourId/js/all.js would return the contents of all.js. :Authors: - Matt :Date: 2007-1-1 """ def __init__(self,path,name,cache=True,persist=False,sync=True,rootdir=package_h ome(globals())): """Create a FileSystemResource with the specified name""" self.path = path self.name= name self.cache = cache self.persist = persist self.sync = sync self.rootdir = rootdir if cache: self._cache = {} ######### # Hooks # ######### def __before_publishing_traverse__(self,obj,REQUEST): """Just print the request path so I can debug easier""" #print "REQUEST.path: " + str(REQUEST.path) print "REQUEST.path: " + str(REQUEST.path) def __bobo_traverse__(self, request, key): """Takes the key, meshes it with the request, and generates the object from that""" full_path = os.path.join(self.path,key) if self.cache: if self._cache.has_key(key): o = self._cache[key] fsr = o[0] mod_time = o[1] file_size = o[4] #If modtime isn't the same, refresh the resource latest_access_time = time.localtime() num_accesses = o[3] + 1 new_entry = (fsr,mod_time,latest_access_time,num_accesses,file_size) self._cache[key] = new_entry return new_entry[0] else: o = FileSystemResource(full_path,name=None) #Set the modification time mod_time = "time" #TODO: Implement latest_access_time = time.localtime() num_accesses = 1 file_size = 0 #TODO: Implement self._cache[key] = (o,mod_time,latest_access_time,num_accesses,file_size) return o o = FileSystemResource(full_path) print "Returning object " + str(o) return o ############### # ! End Hooks # ############### def cleanCache(self): #TODO: Not implemented (placeholder vars so I'll remember what's in the tuples) for key,value in self._cache.items(): file_location = key file_obj = value[0] mod_time = value[1] latest_access_time = value[2] num_accesses = value[3] file_size = value[4] def getResource(self,path): """Gets the resource sepcified by the given path. The path should be relative to this particular object's path. :Parameters: path The path (relative to this object's path) of the file or folder that you are looking for :return: Returns the content of the specified resource :rtype: Zope File object """ #TODO: Implement def __call__(self,REQUEST): """Gets the representation of the file on the filesystem""" #TODO: Cache results #TODO: Make it possible to use non-memory cached files fname = os.path.abspath(os.path.join(self.rootdir,self.path)) type = guess_type(fname)[0] if not os.path.exists(fname): raise FileNotFoundException("File " + fname + " was not found on the file system.") print "Opening file " + fname f = open(fname) data = "" for line in f: data +=line tmp_file = File(data) ret = FileReadFile(tmp_file) #Set the response content type REQUEST.response.setHeader("Content-Type",type) return ret.read() def __str__(self): """Gets the string representation of this FileObject""" return self.path This class is working like a charm as it stands (I have js=FileSystemResource("js","Javascript Repository") in my published object), but it is terribly sloppily implemented for the time being, especially in regard to binary files (doing for line... instead of going over chunks) and to caching/memory issues (there is no caching except for the intermediate objects and everything is loaded into memory first [big files = unusable]). And someone could just pass ../'s to the path to get anywhere on the file system they wanted, I suppose. All of these could easily be fixed of course, but I wanted feedback before I put more than 30 minutes into the prospect :) Thanks for all your help! -Matt
On Jan 1, 2008, at 7:20 PM, Matt Hollingsworth wrote:
Hello,
I’m new to developing for zope, and I have a quick question regarding some best practices when using Javascript in zope applications.
I would like to use Ext JS (http://www.extjs.com/ ) in an application that I am writing. It is a fairly extensive library, so I didn’t really want to copy/paste every single file into a dtml method. I looked all over the place for some discussion on this subject, but only found things relating to plone (which apparently has a javascript registry); however, I wish to stay away from plone for this particular application.
What should I do to use these libraries? Is there a canned solution for this sort of thing?
Thank you much!
-Matt _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
You can ftp the files to a "static" directory on the file system and use LocalFS to access them. http://wiki.zope.org/zope2/LocalFS
I am writing an application that uses extjs as the front end and zope on the back and they work together really well. I am using a webserver to server the extjs library and everything else comes out of zope. So far I have had no trouble with relative links or files broken up in different locations. It may be because I have fully committed to having an extjs front end. I typically serve a page out of zope, it calls the extjs library as well as custom JavaScript files. The web2.0 style page then makes multiple xhr calls back to zope to load smaller html and json fragments. Works like a charm and has the additional benefit of letting me cache the majority of the front end in the webserver and in the users browser. Have fun because you have just come across a wonderful combination...extjs and zope! Tim On Jan 2, 2008 6:38 AM, Tom Von Lahndorff <tom@modscape.com> wrote:
On Jan 1, 2008, at 7:20 PM, Matt Hollingsworth wrote:
Hello,
I'm new to developing for zope, and I have a quick question regarding some best practices when using Javascript in zope applications.
I would like to use Ext JS (http://www.extjs.com/ ) in an application that I am writing. It is a fairly extensive library, so I didn't really want to copy/paste every single file into a dtml method. I looked all over the place for some discussion on this subject, but only found things relating to plone (which apparently has a javascript registry); however, I wish to stay away from plone for this particular application.
What should I do to use these libraries? Is there a canned solution for this sort of thing?
Thank you much!
-Matt _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
You can ftp the files to a "static" directory on the file system and use LocalFS to access them. http://wiki.zope.org/zope2/LocalFS__________________________________________...
Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
Yep! I have had very good luck with it so far; my little hack that I posted works like a (klutzy) charm and ExtJS is great with zope. The ExtJS folks are very well organized, and the library is quite powerful. It's working great. However, my application doesn't have quite the segregation that yours does; ExtJS and zope (DTML in particular) are much more intermingled, and can't be easily separated. This application is actually a frontend for a Java library that controls instruments at CERN (a research lab I work for), and I love the solution that it has presented. It works like a charm. (in case you're curious, it makes use of a wonderful python library I ran across called JPype (http://jpype.sourceforge.net) to execute the Java code) I am going to be accessing Zope through apache with the VHM, but there are multiple reasons why I don't want to serve the js through apache. This same principle is the reason that I don't want to upload things through FTP or WebDAV. I'm making a product, and I would like to keep it atomic, i.e., I want the only install procedure to be "copy product folder to instance/Products". Uploading via WebDAV, or hosting the javascript using separate software, defeats that purpose. The solution that Tom proposed (LocalFS) seems to be what I want, but the problem is that I think it is way too out of date; it crashed my zope server (2.10.5) when I installed it. It says nothing can be found after I add an instance through the ZMI, and this is after I fixed a deprecated import ( from OFS.content_types import find_binary -> from zope.app.content_types import find binary). I had to completely remove the product to get my Zope instance to work again. I'm getting the feeling that there isn't really a (recent) canned solution for accessing file system content, which is... strange at best, considering all the power that zope has at its disposal. You would think that accessing the file system would be present just because it is so simple to do. I'm not complaining, as I'm *very* happy with zope, I'm just surprised :). I realize that zope's principle is to store everything in the database, but this is unacceptable for content such as video files, right? I mean the ZODB file would be absolutely humongous (and slow? I don't know for sure how it's implemented). If there isn't already a working solution, I would be happy to come up with one; I could just hack out the parts of LocalFS that work, add a few features, and repackage it into a new product. It's not difficult to do (my little trivial solution already would work fine if I did a non-dumb implementation of the file-serving logic), and as much as I would like to use it for other projects, it would be worth my time. For example, I want to make a little video/music server as a personal project unrelated to my current one, and I really don't want to store things in the ZODB if I can help it... 1 video = +1 gig ZODB? :S I don't know much about zope obviously, so if I get some vehement objections to this route, I'll pick another :) Thanks! -Matt -----Original Message----- From: Tim Nash [mailto:thedagdae@gmail.com] Sent: Wednesday, January 02, 2008 2:03 PM To: Tom Von Lahndorff Cc: Matt Hollingsworth; zope@zope.org Subject: Re: [Zope] Best Practice for including Javascript in Zope Applications I am writing an application that uses extjs as the front end and zope on the back and they work together really well. I am using a webserver to server the extjs library and everything else comes out of zope. So far I have had no trouble with relative links or files broken up in different locations. It may be because I have fully committed to having an extjs front end. I typically serve a page out of zope, it calls the extjs library as well as custom JavaScript files. The web2.0 style page then makes multiple xhr calls back to zope to load smaller html and json fragments. Works like a charm and has the additional benefit of letting me cache the majority of the front end in the webserver and in the users browser. Have fun because you have just come across a wonderful combination...extjs and zope! Tim On Jan 2, 2008 6:38 AM, Tom Von Lahndorff <tom@modscape.com> wrote:
On Jan 1, 2008, at 7:20 PM, Matt Hollingsworth wrote:
Hello,
I'm new to developing for zope, and I have a quick question regarding some best practices when using Javascript in zope applications.
I would like to use Ext JS (http://www.extjs.com/ ) in an application that I am writing. It is a fairly extensive library, so I didn't really want to copy/paste every single file into a dtml method. I looked all over the place for some discussion on this subject, but only found things relating to plone (which apparently has a javascript registry); however, I wish to stay away from plone for this particular application.
What should I do to use these libraries? Is there a canned solution for this sort of thing?
Thank you much!
-Matt _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
You can ftp the files to a "static" directory on the file system and use LocalFS to access them.
http://wiki.zope.org/zope2/LocalFS__________________________________________ _____
Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
Matt, Please keep us updated on your strategy for serving extjs. I am also considering making my application a product for distribution but I was thinking along the lines of an install script for macs that would set up the apache webserver. I also like your approach. BTW, I haven't done it, but couldn't you just store an object in zodb that has a pointer to your video on the filesystem and access the video via a zope product? But maybe that is what LocalFS does, I haven't checked. see ya in the extjs forum. Just do a search for "zope" Tim On 1/2/08, Matt Hollingsworth <mr.hworth@gmail.com> wrote:
Yep! I have had very good luck with it so far; my little hack that I posted works like a (klutzy) charm and ExtJS is great with zope. The ExtJS folks are very well organized, and the library is quite powerful. It's working great. However, my application doesn't have quite the segregation that yours does; ExtJS and zope (DTML in particular) are much more intermingled, and can't be easily separated. This application is actually a frontend for a Java library that controls instruments at CERN (a research lab I work for), and I love the solution that it has presented. It works like a charm. (in case you're curious, it makes use of a wonderful python library I ran across called JPype (http://jpype.sourceforge.net) to execute the Java code)
I am going to be accessing Zope through apache with the VHM, but there are multiple reasons why I don't want to serve the js through apache. This same principle is the reason that I don't want to upload things through FTP or WebDAV. I'm making a product, and I would like to keep it atomic, i.e., I want the only install procedure to be "copy product folder to instance/Products". Uploading via WebDAV, or hosting the javascript using separate software, defeats that purpose.
The solution that Tom proposed (LocalFS) seems to be what I want, but the problem is that I think it is way too out of date; it crashed my zope server (2.10.5) when I installed it. It says nothing can be found after I add an instance through the ZMI, and this is after I fixed a deprecated import ( from OFS.content_types import find_binary -> from zope.app.content_types import find binary). I had to completely remove the product to get my Zope instance to work again.
I'm getting the feeling that there isn't really a (recent) canned solution for accessing file system content, which is... strange at best, considering all the power that zope has at its disposal. You would think that accessing the file system would be present just because it is so simple to do. I'm not complaining, as I'm *very* happy with zope, I'm just surprised :). I realize that zope's principle is to store everything in the database, but this is unacceptable for content such as video files, right? I mean the ZODB file would be absolutely humongous (and slow? I don't know for sure how it's implemented).
If there isn't already a working solution, I would be happy to come up with one; I could just hack out the parts of LocalFS that work, add a few features, and repackage it into a new product. It's not difficult to do (my little trivial solution already would work fine if I did a non-dumb implementation of the file-serving logic), and as much as I would like to use it for other projects, it would be worth my time. For example, I want to make a little video/music server as a personal project unrelated to my current one, and I really don't want to store things in the ZODB if I can help it... 1 video = +1 gig ZODB? :S
I don't know much about zope obviously, so if I get some vehement objections to this route, I'll pick another :)
Thanks!
-Matt
-----Original Message----- From: Tim Nash [mailto:thedagdae@gmail.com] Sent: Wednesday, January 02, 2008 2:03 PM To: Tom Von Lahndorff Cc: Matt Hollingsworth; zope@zope.org Subject: Re: [Zope] Best Practice for including Javascript in Zope Applications
I am writing an application that uses extjs as the front end and zope on the back and they work together really well. I am using a webserver to server the extjs library and everything else comes out of zope. So far I have had no trouble with relative links or files broken up in different locations. It may be because I have fully committed to having an extjs front end. I typically serve a page out of zope, it calls the extjs library as well as custom JavaScript files. The web2.0 style page then makes multiple xhr calls back to zope to load smaller html and json fragments. Works like a charm and has the additional benefit of letting me cache the majority of the front end in the webserver and in the users browser.
Have fun because you have just come across a wonderful combination...extjs and zope! Tim
On Jan 2, 2008 6:38 AM, Tom Von Lahndorff <tom@modscape.com> wrote:
On Jan 1, 2008, at 7:20 PM, Matt Hollingsworth wrote:
Hello,
I'm new to developing for zope, and I have a quick question regarding some best practices when using Javascript in zope applications.
I would like to use Ext JS (http://www.extjs.com/ ) in an application that I am writing. It is a fairly extensive library, so I didn't really want to copy/paste every single file into a dtml method. I looked all over the place for some discussion on this subject, but only found things relating to plone (which apparently has a javascript registry); however, I wish to stay away from plone for this particular application.
What should I do to use these libraries? Is there a canned solution for this sort of thing?
Thank you much!
-Matt _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
You can ftp the files to a "static" directory on the file system and use LocalFS to access them.
http://wiki.zope.org/zope2/LocalFS__________________________________________ _____
Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
Hello, Ok, I came up with a solution that I like; today I spent a little while making it so I don't have to load things into memory before they are served. Now it works quite nicely for serving out js/css/gui pics. I won't post what I did right now, as I haven't really cleaned it up and I'm ashamed of how it looks at the moment, but I'll post the usage of it to see if anyone would like to use it after I clean it up: ... from util import FileSystemResource #it's just in a utility module for my current project at the moment ... MyZopeObject(Implicit,Item,Whatever): #"js" and "css" are paths that are considered relative to my package directory (not the cwd for zope). It can be absolute too, if desired. js = FileSystemResource("js","Javascript Repository") css = FileSystemResource("css","CSS Repository") Now, say that there is ext-all.js in a directory called "/path/to/zope/Products/MyProduct/js/". You could then link to the java script file by going to http://domain.com:8080/myZopeObject/js/ext-all.js. In particular, in dtml, I have a standard_html_header that looks something like this: ==standard_html_header.dtml== <html> <head> <!--Set the title--> <title><dtml-var title></title> <dtml-comment><script src="&dtml-absolute_url;/js/navbar.js"/><!--GUTS navbar--></dtml-comment> <link rel="stylesheet" type="text/css" href="&dtml-absolute_url;/js/resources/css/ext-all.css"> <!--Source in local_js unless the variable isn't defined--> <dtml-try > <dtml-in expr="local_js"> <script src="&dtml-absolute_url;/js/&dtml-sequence-item;"/> </dtml-in> <dtml-except><!--Do nothing--> </dtml-try> </head> <!--Start the body--> <body class="&dtml-id;-body" id="&dtml-id;-body"> <!--Set basic pre-nav header--> <dtml-unless NO_HEADER> <h1 id="main-title">This is a title.</h1> </dtml-unless> ==!End standard_html_header.dtml== Then in MyZopeObject, I wrap up my DTML in a method like so: ..<other class stuff>... _main = DTMLFile("dtml/main",globals()) def main(self): main_js=["ext-all.js","main.js"] return _main(self.REQUEST,local_js = main_js) I did the whole local_js thing so I could control what JS got dropped into what pages without having to write a different header for each one. I will probably also do the same thing for the css just in case I want page-specific css files. This is what I'm doing at the moment, and it's working great. If this would be useful to someone else, I'll give it more than an hour and a half of thought, rewrite it more intelligently, and make it available. Otherwise, thanks to everyone for their comments! -Matt -----Original Message----- From: Tim Nash [mailto:thedagdae@gmail.com] Sent: Thursday, January 03, 2008 12:38 PM To: Matt Hollingsworth Cc: zope@zope.org Subject: Re: [Zope] Best Practice for including Javascript in Zope Applications Matt, Please keep us updated on your strategy for serving extjs. I am also considering making my application a product for distribution but I was thinking along the lines of an install script for macs that would set up the apache webserver. I also like your approach. BTW, I haven't done it, but couldn't you just store an object in zodb that has a pointer to your video on the filesystem and access the video via a zope product? But maybe that is what LocalFS does, I haven't checked. see ya in the extjs forum. Just do a search for "zope" Tim On 1/2/08, Matt Hollingsworth <mr.hworth@gmail.com> wrote:
Yep! I have had very good luck with it so far; my little hack that I posted works like a (klutzy) charm and ExtJS is great with zope. The ExtJS folks are very well organized, and the library is quite powerful. It's working great. However, my application doesn't have quite the segregation that yours does; ExtJS and zope (DTML in particular) are much more intermingled, and can't be easily separated. This application is actually a frontend for a Java library that controls instruments at CERN (a research lab I work for), and I love the solution that it has presented. It works like a charm. (in case you're curious, it makes use of a wonderful python library I ran across called JPype (http://jpype.sourceforge.net) to execute the Java code)
I am going to be accessing Zope through apache with the VHM, but there are multiple reasons why I don't want to serve the js through apache. This same principle is the reason that I don't want to upload things through FTP or WebDAV. I'm making a product, and I would like to keep it atomic, i.e., I want the only install procedure to be "copy product folder to instance/Products". Uploading via WebDAV, or hosting the javascript using separate software, defeats that purpose.
The solution that Tom proposed (LocalFS) seems to be what I want, but the problem is that I think it is way too out of date; it crashed my zope server (2.10.5) when I installed it. It says nothing can be found after I add an instance through the ZMI, and this is after I fixed a deprecated import ( from OFS.content_types import find_binary -> from zope.app.content_types import find binary). I had to completely remove the product to get my Zope instance to work again.
I'm getting the feeling that there isn't really a (recent) canned solution for accessing file system content, which is... strange at best, considering all the power that zope has at its disposal. You would think that accessing the file system would be present just because it is so simple to do. I'm not complaining, as I'm *very* happy with zope, I'm just surprised :). I realize that zope's principle is to store everything in the database, but this is unacceptable for content such as video files, right? I mean the ZODB file would be absolutely humongous (and slow? I don't know for sure how it's implemented).
If there isn't already a working solution, I would be happy to come up with one; I could just hack out the parts of LocalFS that work, add a few features, and repackage it into a new product. It's not difficult to do (my little trivial solution already would work fine if I did a non-dumb implementation of the file-serving logic), and as much as I would like to use it for other projects, it would be worth my time. For example, I want to make a little video/music server as a personal project unrelated to my current one, and I really don't want to store things in the ZODB if I can help it... 1 video = +1 gig ZODB? :S
I don't know much about zope obviously, so if I get some vehement objections to this route, I'll pick another :)
Thanks!
-Matt
-----Original Message----- From: Tim Nash [mailto:thedagdae@gmail.com] Sent: Wednesday, January 02, 2008 2:03 PM To: Tom Von Lahndorff Cc: Matt Hollingsworth; zope@zope.org Subject: Re: [Zope] Best Practice for including Javascript in Zope Applications
I am writing an application that uses extjs as the front end and zope on the back and they work together really well. I am using a webserver to server the extjs library and everything else comes out of zope. So far I have had no trouble with relative links or files broken up in different locations. It may be because I have fully committed to having an extjs front end. I typically serve a page out of zope, it calls the extjs library as well as custom JavaScript files. The web2.0 style page then makes multiple xhr calls back to zope to load smaller html and json fragments. Works like a charm and has the additional benefit of letting me cache the majority of the front end in the webserver and in the users browser.
Have fun because you have just come across a wonderful combination...extjs and zope! Tim
On Jan 2, 2008 6:38 AM, Tom Von Lahndorff <tom@modscape.com> wrote:
On Jan 1, 2008, at 7:20 PM, Matt Hollingsworth wrote:
Hello,
I'm new to developing for zope, and I have a quick question regarding some best practices when using Javascript in zope applications.
I would like to use Ext JS (http://www.extjs.com/ ) in an application that I am writing. It is a fairly extensive library, so I didn't really want to copy/paste every single file into a dtml method. I looked all over the place for some discussion on this subject, but only found things relating to plone (which apparently has a javascript registry); however, I wish to stay away from plone for this particular application.
What should I do to use these libraries? Is there a canned solution for this sort of thing?
Thank you much!
-Matt _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
You can ftp the files to a "static" directory on the file system and use LocalFS to access them.
http://wiki.zope.org/zope2/LocalFS__________________________________________
_____
Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
participants (6)
-
Andreas Jung -
Matt Hollingsworth -
Tim Nash -
Tino Wildenhain -
Tom Von Lahndorff -
Tres Seaver