[Solar-talk] Solar 0.26.0 alpha released, and new site!
Paul M Jones
pmjones at ciaweb.net
Wed Jan 31 11:19:58 PST 2007
Hi guys --
As promised, Solar 0.26 is now available. You can get it from the
usual location.
Also , the new site is up!
<http://solarphp.com/>
In addition to being a lot prettier, the manual pages are easier to
navigate, and the site as a whole is faster due to full-page caching
magic from Clay Loveless.
I'm attaching the full change notes below; because it's been three
months since the last release, they're much longer. There are
various BC breaks as well, but if you've been following SVN, you know
what they are and how to approach them.
As always, please let me know if you have any questions, comments, or
concerns, and thank you for using Solar.
* * *
Solar 0.26.0 Release Notes
==========================
* [BRK] Naming standards change: "submit" is now "process".
Previously, we had "controller", "action", "submit", and
submission buttons
were named 'submit'. Rodrigo Moraes pointed out, and Clay Loveless
verified,
that having buttons named 'submit' makes it difficult to work in
JavaScript
(such as calling a submit() method on a button named 'submit', etc).
To fix this, we need a standards change. Henceforth, we will use
"process"
in place of "submit". So the progression is now "controller",
"action",
"process". Also, locale keys are changed from SUBMIT_* to PROCESS_*.
This release effects the new standard across the entire Solar code
base,
and is essentially a global search-and-replace from 'submit' to
'process'.
Notable exceptions are Solar_Form, Solar_View_Helper_Form,
Solar_View_Helper_FormSubmit.
* [CHG] Global removal of func_num_args() and func_get_arg().
In the interest of speeding things up when possible, this change
introduces
a new global constant: SOLAR_IGNORE_PARAM. This constant is used
when we
need an optional method param that may or may not be present.
Previously, we would check for added optional params using
func_num_args(),
and then get the values of those params using func_get_arg(). The
func_*()
functions are known to be quite slow.
Now, we set the param default value to SOLAR_IGNORE_PARAM. If the
param is
that value, we know it was not passed.
Why do this instead of using null or some other empty value? Because
sometimes you want to pass a null or empty value; using the
SOLAR_IGNORE_PARAM value lets you state that normally no parameter
is to be
passed at all.
Hope this makes sense to everyone.
* [CHG] Removed ending ?> from all scripts to avoid "headers cannot
be sent,
output started at line X" error due to accidental trailing
newlines in
scripts.
* [CHG] Updated example .htaccess file with better rewrite rules.
Also added
some php flag & value defaults.
* [CHG] Changed "e.g." to "for example". This helps the documentation
generator not get stuck on the periods (which indicate the summary is
complete).
* [NEW] Class: Solar_View_Helper_FormXhtml.
* [NEW] Class: Solar_DataFilter. Using PHP's "filter" extension,
combines
methods from Solar_Valid and Solar_Filter into a single class. Will
eventually replace Solar_Valid and Solar_Filter ... but not just yet.
Solar
-----
* [CHG] Method locale() now accepts an object as the first param
* [CHG] Method exception() now accepts an object as the first param
* [ADD] Property $config_base to store inherited Solar_Base class
configs
* [CHG] Per discussions w/Travis Swicegood about testing, move
cleaning of
globals (and config fetching) to independently-testable locations.
Effectively, this means two new methods: cleanGlobals() and
fetchConfig().
* [CHG] The factory() method now checks to see if the new object
itself has a
`solarFactory()` method; if so, it returns the result from *that*
factory.
This allows for factory classes to return specific adapters.
* [CHG] The dependency() method no longer checks that the dependency
object is
an instance of the $class parameter value; this is because factory
classes
will return an adapter instance, not an instance of the factory class
itself.
* [CHG] Method registry() doesn't check if the string $spec is
registered;
lets the registry itself do that. We want it to fail if the string
$spec is
not registered, not pass on to creating a new object.
* [FIX] Method config() now allows empty values as valid config values
(changed from an empty() check to a ! isset() check; thanks, Travis
Swicegood).
* [CHG] The fileExists() method now returns the full-path file-
location it
found instead of boolean true. Still returns boolean false when
the file is
not found. Thanks, Clay, for the suggestion.
* [CHG] Method run() is more friendly to opcode caches (takes the
include()
out of a conditional).
* [BRK] Now uses 'solarFactory' as the Solar::factory() auto-factory
method
name (vice 'factory').
* [CHG] Solar::dump() no longer takes values by reference.
Solar_Access
------------
* [BRK] Converted from "facade" pattern to "factory" pattern. Is now
a factory
class, not a facade, and returns adapter instances instead of an
instance of
itself. Although I note this as a BC-break, you should be able to
continue
using it almost exactly the way you have; i.e., through
Solar::factory().
The only difference should be that you get back an adapter
instance instead
of the facade instance.
Solar_Access_Adapter
--------------------
* [BRK] Now contains all the methods and properties previously
contained in
the Facade wrapper. I note this as a BC break, but if you have
been using
Solar::factory() all along, you should experience few if any
problems on
upgrade.
* [BRK] All 'submit' keys in access lists are now 'process' keys.
Solar_Access_Adapter_File
-------------------------
* [CHG] The fetch() method now checks to see if $this->_config
['file'] exists
and throws an exception if it does not.
Solar_App_Bookmarks
-------------------
* [BRK] All actions and views use a 'process' name and ID for all
submit buttons.
* [BRK] All locale strings for SUBMIT_* are now PROCESS_*.
* [BRK] All calls to _isSubmit() are now _isProcess().
* [DEL] Removed methods actionUserFeed() and actionTagFeed();
replaced by new extension-aware formatting (.rss)
* [ADD] New browse.rss.php view to generate RSS feeds when the .rss
format is specified
* [DEL] Removed "feed" view, supplanted by "browse.rss".
* [CHG] Bookmark actions now assume layout is turned off for RSS format.
* [CHG] Added $_action_format map to say which actions support which
formats.
Solar_Auth
----------
* [BRK] Is now a factory class, not a facade, and returns adapter
instances instead of an instance of itself. Although I note this as a
BC-break, you should be able to continue using it almost exactly
the way
you have; i.e., through Solar::factory(). The only difference
should be
that you get back an adapter instance instead of the facade instance.
* [BRK] Moved locale files to Solar/Auth/Adapter/Locale.
Solar_Auth_Adapter
------------------
* [BRK] Now contains all the methods and properties previously contained
in the facade wrapper. I note this as a BC break, but if you have
been
using Solar::factory() all along, you should experience few if any
problems on upgrade.
* [BRK] No more use of the 'common' config key; since adapters are
factoried (not behind a facade) those elements can become part of the
regular config array.
* [CHG] Streamlined start() method internals.
* [CHG] Removed _setup() method entirely, now using _loadSession()
intelligently.
* [BRK] Renamed isLoginValid() to processLogin().
* [BRK] Renamed _verify() to _processLogin(). Instead of returning
true/false,
it should return an array of user info on success; or, on failure,
return a
string error code or an empty value.
* [NEW] Added processLogout() and _processLogout() methods.
* [CHG] Removed _setInfo() method, modified reset() to take a second
param
for user information.
* [CHG] Now forces a temporary 'ANON' state when attempting to log in.
* [CHG] Method isValid() now loads the session before checking
* [ADD] Added config key 'session_class'. This allows you to pick
what name to
use as the session segment; e.g., different adapters can refer to
the same
session values.
* [CHG] Config key 'session_class' now defaults to
'Solar_Auth_Adapter', not
the actual adapter class name. This mimics the previous facade-based
behavior.
* [BRK] Config keys for 'source_submit', 'submit_login', and
'submit_logout'
are now 'source_process', 'process_login', and 'process_logout'
respectively.
* [NEW] Adds support for automated redirection to a specified URI on
valid
login.
Solar_Auth_Adapter_*
--------------------
* [CHG] Each adapter now sets public values for $this->handle, email,
uri,
and moniker (as needed) instead of the protected versions.
Solar_Auth_Adapter_Htpasswd
---------------------------
* [CHG] Now uses $this->_handle and $this->_passwd directly.
* [BRK] Method _processLogin() now returns user info on success.
Solar_Auth_Adapter_Ini
----------------------
* [CHG] Now uses $this->_handle and $this->_passwd directly.
* [BRK] Method _processLogin() now returns user info on success.
Solar_Auth_Adapter_Ldap
-----------------------
* [CHG] Now uses $this->_handle and $this->_passwd directly.
* [BRK] Method _processLogin() now returns user info on success.
* [BRK] On failure, no longer throws an exception; instead, returns a
string error code and text from the LDAP server.
Solar_Auth_Adapter_Mail
-----------------------
* [CHG] Now uses $this->_handle and $this->_passwd directly.
Solar_Auth_Adapter_Post
-----------------------
* [CHG] Now uses $this->_handle and $this->_passwd directly.
* [BRK] Method _processLogin() now returns user info on success.
Solar_Auth_Adapter_Sql
----------------------
* [CHG] Now uses $this->_handle and $this->_passwd directly.
* [BRK] Method _processLogin() now returns user info on success.
Solar_Auth_Adapter_Typekey
--------------------------
* [CHG] All adapter-specific logic is now in _processLogin(), not
isLoginValid()
* [BRK] Method _processLogin() now returns user info on success.
* [CHG] Method _processLogin() now returns 'ERR_TIME_WINDOW' when the
verification window is expired
Solar_Cache
-----------
* [BRK] Converted Solar_Cache and all adapters from facade pattern to
factory.
Although I note this as a BC-break, you should be able to continue
using
Solar_Cache exactly the way you have; i.e., through Solar::factory
(). The
only difference is that you get back a Solar_Cache_Adapter
instance instead
of a Solar_Cache instance.
Solar_Cache_Adapter
-------------------
* [BRK] Now contains all the methods and properties previously
contained in
the Facade wrapper. I note this as a BC break, but if you have
been using
Solar::factory() all along, you should experience few if any
problems on
upgrade.
Solar_Cache_Adapter_*
---------------------
* [CHG] The save()/fetch()/delete()/deleteAll() methods now check
internally
if $this->_active is true instead of depending on the facade to
check on it,
because we're now using factories instead of facades.
* [BRK] When not active, adapters return null instead of boolean
false when
save/fetch/delete/deleteAll methods are called.
Solar_Cache_Adapter
-------------------
* [CHG] When you call fetch() and the cache is not active, returns
null (used
to be boolean false)
Solar_Cache_Adapter_File
------------------------
* [CHG] Now serializes all non-scalar values. (Previously, the adapter
serialized only objects and arrays).
Solar_Cache_Adapter_Memcache
----------------------------
* [CHG] Now throws a CONNECTION_FAILED exception at construction time
if it
cannot connect to the memcache service.
Solar_Content
-------------
* [ADD] Added config keys for 'areas', 'nodes', and 'tags' for
dependency
injection. Thanks, Rodrigo Moraes.
* [CHG] Now uses Solar::dependency() instead of Solar::factory()
internally
for areas, noted, and tags models. Thanks, Rodrigo Moraes.
Solar_Content_Abstract
----------------------
* [BRK] Renamed fetchWhere() to fetchRow().
Solar_Content_Bookmarks
-----------------------
* [BRK] Renamed fetchWhere() to fetchRow().
Solar_Controller_Front
----------------------
* [ADD] Added _notFound() method to customize behavior when a page-
controller
is not found.
* [CHG] Now properly falls back to the default page-controller when the
requested controller is not found.
* [CHG] Moved inflection of page name from fetch() to _getPageName()
* [CHG] Moved handling of empty page-name from fetch() to _getPageName()
* [FIX] When falling back to the default controller page, now places the
original page-name request on top of the URI stack to preserve it
for the
page-controller as the first param for the default action.
Solar_Controller_Page
---------------------
* [CHG] Setting $this->_view to an empty value turns off the view-
template
processing, for "null" output. (Note that the null output will
still be
inserted into a layout unless you set $this->_layout to an empty
value.)
Thanks to Travis for the discussion that led to this implementation.
* [BRK] Changed property $_submit_key to $_process_key.
* [BRK] Changed method _isSubmit() to _isProcess().
* [BRK] All locale string comparisons on SUBMIT_* are now on PROCESS_*.
* [NEW] Supports rendering of multiple formats based on the last path-
info
element having a dot extension. For example, "foo/bar/baz.xml"
will cause
the _render() method to look for a "baz.xml.php" view script
(instead of
just "baz.php"). This applies to layouts as well as views. To
override the
format, set $this->_format as you wish (default is empty).
* [CHG] Now throws an exception when the layout template is not found.
* [CHG] Using a format extension now turns off layout to begin with,
rather
than using the same layout name with a format extension. Per talk
w/Clay
Loveless.
* [CHG] Now "ignores" .php format requests, resets $this->_format to
null in
such cases.
* [CHG] Now honors only formats listed in the $_action_format array,
on a
per-action basis. This is to fix problems where a param is a valid
value,
but has a dot in it (such as filename.doc or example.com).
* [FIX] Removes blank elements from end of info array.
Solar_Debug_Var
---------------
* [CHG] Method dump() no longer takes values by reference
Solar_Docs_Apiref
-----------------
* [ADD] Now collects constants from the class, albeit without their
docblocks
(the Reflection API does not yet support that).
* [NEW] Now collects the classes with @package and @subpackage tags into
$package and $subpackage properties, respectively. Also warns when no
@package tag is present.
* [FIX] Pulls package name from proper location now.
Solar_Docs_Phpdoc
-----------------
* [ADD] Added @ignore support. Thanks for the patch, Clay Loveless.
* [FIX] Narrative portions no long strip the first character. Thanks
again,
Clay.
* [CHG] Improved summary-extraction logic.
* [NEW] Added more tag parsers: @author, @copyright, @deprec[ated],
@license,
@link, @since, @version, @example, @staticvar.
Solar/Locale/*
--------------
* [BRK] All SUBMIT_* keys are now PROCESS_* keys.
Solar_Log
---------
* [BRK] Converted Solar_Log and all adapters from facade pattern to
factory.
Although I note this as a BC-break, you should be able to continue
using
Solar_Log almost exactly the way you have; i.e., through
Solar::factory().
The only difference should be that you get back a
Solar_Log_Adapter instance
instead of a Solar_Log instance.
Solar_Log_Adapter
-----------------
* [BRK] Now contains all the methods and properties previously
contained in
the Facade wrapper. I note this as a BC break, but if you have
been using
Solar::factory() all along, you should experience few if any
problems on
upgrade.
Solar_Markdown
--------------
* [CHG] Disabling "tidy" is somewhat more loose now; any empty value
for the
'tidy' config key now turns it off, vice only a boolean false.
Solar_Markdown_Wiki_Header
--------------------------
* [CHG] Added support for {#id-attrib} markup, like with
Solar_Markdown_Extra_Header.
Solar_Markdown_Wiki_MethodSynopsis
----------------------------------
* [FIX] Now shows default parameters of integer 0.
Solar_Request
-------------
* [BRK] Renaming "isXml()" to "isXhr()" (Xml Http Request) for
clarity. Per
suggestion from Rodrigo Moraes.
Solar_Role
----------
* [BRK] Converted from "facade" pattern to "factory" pattern. Is now
a factory
class, not a facade, and returns adapter instances instead of an
instance of
itself. Although I note this as a BC-break, you should be able to
continue
using it almost exactly the way you have; i.e., through
Solar::factory().
The only difference should be that you get back an adapter
instance instead
of the facade instance.
Solar_Role_Adapter
------------------
* [BRK] Now contains all the methods and properties previously
contained in
the Facade wrapper. I note this as a BC break, but if you have
been using
Solar::factory() all along, you should experience few if any
problems on
upgrade.
* [FIX] Added config key for 'refresh'.
* [CHG] The load() method now takes a second param, $refresh, to
force or
ignore a refresh regardless of the default setting.
* [CHG] In line with similar issue found with Solar_Auth_Adapter, the
session
class segment now defaults to 'Solar_Role_Adapter' (because
factory returns
different class names).
Solar_Role_Adapter_Sql
----------------------
* [ADD] New 'where' config key like Solar_Auth_Adapter_Sql to pass in
additional multiWhere() conditions.
* [BRK] Default table is now 'roles' (vice 'member_roles').
* [FIX] Default role_col is now 'name' (vice 'role', which is a
reserved word
in many databases).
* [FIX] Now properly performs the database fetch call (thanks, Jeff
Surgeson,
for the bug report).
Solar_Sql
---------
* [CHG] Moved sql exceptions down to adapter level (i.e., from
Solar_Sql_Exception_* to Solar_Sql_Adapter_Exception_*).
* [BRK] Converted Solar_Sql and all adapters from facade pattern to
factory.
Although I note this as a BC-break, you should be able to continue
using
Solar_Sql almost exactly the way you have; i.e., through
Solar::factory().
The only difference should be that you get back a
Solar_Sql_Adapter instance
instead of a Solar_Sql instance.
Solar_Sql_Adapter
-----------------
* [BRK] Now contains all the methods and properties previously contained
in the facade wrapper. I note this as a BC break, but if you have
been
using Solar::factory() all along, you should experience few if any
problems on upgrade.
* [BRK] The public method buildSelect() is now a protected
_buildSelect().
* [BRK] The exec() method is replaced by query().
* [NEW] Added protected methods [_create|_drop|_next]Sequence(),
_dropIndex(), etc. for factory adapters to support the related public
methods.
* [ADD] Added quick and dirty profiling mechanism. Includes new
'profiling'
config key and $profile property, new method getProfile() to get the
underlying adapter query profile, and new method setProfiling() turns
profiling off and on.
* [CHG] Now uses PDO prepared-statement emulation; this should be a
speed
boost. No longer checks the query statement for "direct" non-prepared
execution.
* [ADD] Added new fetch*() methods to eventually replace the select()
method.
* [CHG] Method select() now uses the fetch*() methods internally, but
should
be maintaining backwards-compatibility.
* [CHG] Methods fetchRow() and fetchOne() now automatically set LIMIT
1, thus
selecting a single row before returning results. Thanks to Clay
Loveless and
Travis Swicegood for pointing out the need for this.
* [CHG] Method fetchAssoc() now allows returning of a
Solar_Sql_Rowset, per
request from Clay.
* [CHG] The query() method always returns a PDOStatement now.
* [BRK] Renamed method listTables() to fetchTableList().
* [NEW] Added method fetchTableCols() to get the schema for a table.
* [CHG] The query() method always returns a PDOStatement object.
* [CHG] Now uses "emulated prepares", which speeds things up a great
deal
in some cases, but requires PHP 5.1.3 or later for it to be useful.
* [CHG] Now uses $this->_native instead of $native.
* [CHG] On query failure, now throws
Solar_Sql_Adapter_Exception_QueryFailed
instead of PDOException. Carries more info about the failure than
PDOException does. Suggested by Travis Swicegood.
Solar_Sql_Adapter_Mysql
-----------------------
* [BRK] changed the native type of 'bool' from DECIMAL(1,0) to TINYINT
(1)
Solar_Sql_Adapter_Pgsql
-----------------------
* [FIX] The _nextSequence() method now properly quotes the sequence
name.
Solar_Sql_Adapter_Sqlite
------------------------
* [DEL] Removed the 'mode' config key, as it is never used.
Solar_Sql_Select
----------------
* [FIX] Method quoteInto() now returns the quoted value (thanks Antti
Holvikari).
Solar_Sql_Table
---------------
* [ADD] New 'create' config key turns auto-creation off and on;
useful in
production environments to reduce number of queries.
* [CHG] Now lazy-connects to the database only on first query
attempt, not at
construction time. This helps delay the database connection until
actually
needed. See the new _connect() method and the new $_connected
property.
Methods save(), insert(), update(), delete(), and select() honor
this.
* [NEW] Added _newSelect() method to create a Solar_Sql_Select tool
for you,
injecting the same SQL connection as the table itself is using.
Previously,
we used Solar::factory() to create Solar_Sql_Select objects on the
fly, but
that would not inject the exact same SQL connection object. This
way, you
don't have to remember. Thanks to Clay for pointing this out.
* [CHG] Deprecated method fetchWhere(); use the new method name
fetchRow()
instead.
* [FIX] Method _autoSetup() now sets $this->_name properly from the
class
name.
* [ADD] Added method getColName() to get fully-qualified name
("tablename.colname") for a column.
* [ADD] Added setter methods (and __get() support) for the fetchAll()
and
fetchRow() class values. Thanks for the suggestion, Rodrigo Moraes.
Solar_Uri
---------
* [FIX] The setQuery() method now works when magic_quotes_gpc is
turned on
(the parse_str() function honors that setting). Thanks to Travis
for noting
this.
Solar_Session
-------------
* [CHG] Now the regenerateId() method only regenerates if headers
have not been sent.
Solar_Valid
-----------
* [FIX] Use chr(255) as regex delimiter instead of English "pounds"
character.
Thanks for noting this problem, Antti Holvikari.
Solar_View_Helper_Js
--------------------
* Updated to Prototype 1.5.0 final.
* Updated to Script.aculo.us 1.7.0 final.
Solar_View_Helper_TypekeyLink
-----------------------------
* Adds a config key 'process_key' with a default value of 'process'.
This
helps avoid double-logins by checking the current process value.
--
Paul M. Jones <http://paul-m-jones.com>
Solar: Simple Object Library and Application Repository
for PHP5. <http://solarphp.com>
Join the Solar community wiki! <http://solarphp.org>
Savant: The simple, elegant, and powerful solution for
templates in PHP. <http://phpsavant.com>
More information about the solar-talk
mailing list