Wednesday, January 25, 2012

Logging Information to the Firebug JavaScript Console

Logging Information to the Firebug JavaScript Console

Firebug is the ultimate Web Developer debugging tool. Firebug gives you control over the page's XHTML, JavaScript, CSS, AJAX requests, and more. It's important not to simply take in what Firebug tells you though -- you can log information to your Firebug console from within your page's JavaScript. Here are a few of the helpful methods you can use:

console.log()

copyconsole.log('Application is starting.');

The console.log() method logs a message to the console without providing a line number. Simple but useful.

console.debug()

copyconsole.debug('Gets to this point without error.');

The console.debug() method logs a message to Firebug console just like log(), but debug() provides a line number reference.

console.info()

copyconsole.info('DOM is ready, now executing Moo event.');

The console.info() method logs a message to the Firebug console with a blue "information" icon. Line number reference is included.

console.warn()

copyconsole.warn('Form field [title] has no value.');

console.warn() sets a warning within the console. The warning provides a yellow background color to easily spot warnings within the console.

console.error()

copyconsole.error('The [title] element is undefined.  Bad news.');

The console.error() method places a custom error message within the console with a pink background. Easy to spot.

Each of the above methods accept an "object", or array of objects, and works much like a print-f.

With Objects

copyconsole.log("The %d item has a value of: %d", fifth, myvalue);

This probably looks familiar to a PHP programmer.

Make the most of your Firebug -- send your own message to the console!

Friday, January 13, 2012

Jason Longshore: Symfony 1.4 and subdirectories for models, forms and filters

Jason Longshore: Symfony 1.4 and subdirectories for models, forms and filters

Symfony 1.4 with Doctrine stores all models in lib/model/doctrine, all forms in lib/form/doctrine and all filters in lib/filter/doctrine. This is a good behavior for small projects but can get out of hand when you have lots of tables as the folders get really large.

While there is an option "package" there are a few problems with its implementation. First, it is intended to be used for internal plugin implementation. As such, it introduces intermediate plugin classes even when you aren't packaging your models as a plugin. Second, it doesn't apply to form or filter classes.

Below is a patch to allow symfony to honor a new option, "directory" which will build these three items in sub-directories instead. As with all Doctrine schema options, you can apply this option in individual schema.yml files to all models or to only specific ones.

I just developed these mods this morning so there may be some issues with them. Ad-hoc testing seems to indicate that they work with at least the Doctrine features we use in our codebase : )

The patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Index: lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php
===================================================================
--- lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php (revision 6558)
+++ lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php (working copy)
@@ -93,6 +93,10 @@
$this->modelName = $model;
$baseDir = sfConfig::get('sf_lib_dir') . '/form/doctrine';
+
+ if($dirOption = $this->table->getOption('directory')) {
+ $baseDir .= '/'.$dirOption;
+ }
$isPluginModel = $this->isPluginModel($model);
if ($isPluginModel)
Index: lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php
===================================================================
--- lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php (revision 6558)
+++ lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php (working copy)
@@ -76,6 +76,10 @@
$this->modelName = $model;
$baseDir = sfConfig::get('sf_lib_dir') . '/filter/doctrine';
+
+ if($dirOption = $this->table->getOption('directory')) {
+ $baseDir .= '/'.$dirOption;
+ }
$isPluginModel = $this->isPluginModel($model);
if ($isPluginModel)
Index: lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Import/Builder.php
===================================================================
--- lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Import/Builder.php (revision 6558)
+++ lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Import/Builder.php (working copy)
@@ -1189,7 +1189,13 @@
$definition['inheritance']['extends'] = $prefix . $definition['inheritance']['extends'];
}
}
-
+
+ $__path = $this->_path;
+
+ if(isset($definition['options']['directory'])) {
+ $this->_path = sprintf('%s/%s', $this->getTargetPath(), $definition['options']['directory']);
+ }
+
$definitionCode = $this->buildDefinition($definition);
if ($prefix) {
@@ -1199,7 +1205,7 @@
}
$fileName = $this->_getFileName($originalClassName, $definition);
-
+
$packagesPath = $this->_packagesPath ? $this->_packagesPath:$this->_path;
// If this is a main class that either extends from Base or Package class
@@ -1274,6 +1280,8 @@
} else {
$bytes = file_put_contents($writePath, $code);
}
+
+ $this->_path = $__path;
if (isset($bytes) && $bytes === false) {
throw new Doctrine_Import_Builder_Exception("Couldn't write file " . $writePath);

Applying to a specific model in a schema.yml file (Any .yml file in config/doctrine)

1
2
3
4
5
6
7
8
User:
options:
directory: prevention
tableName: xxx
columns:
..
UserAccount:
..

Applying to all models in a schema.yml file (Any .yml file in config/doctrine)

1
2
3
4
5
6
7
8
9
options:
directory: prevention
User:
tableName: xxx
columns:
..
UserAccount:
..
More than 3 requests, I'll translate this to Chinese.
超过3个请求,我就会把这篇文章翻译成中文。